Deucalion Docs
Scheduler Reference
ReferenceAn information-oriented lookup resource. Use it to find specific values and definitions.
adminschedulerbadgeswarningsvalidationdeploymentreference

Badges, Warnings, and Validation Reference

Reference for scheduler badges, validation warnings, deployment rules, and operational metadata display.

Before you start

  • You understand the scheduler layout and job card structure from the views guide.

Expected outcome

You can identify every badge, understand every warning type, and know the validation rules that govern deployment readiness.

Job card badges

Badges appear on job cards (board, timeline), in the planner list, and in the Quick View dialog. They are rendered by schedulingBadges.jsx.

Deployment badges

Deployment badges show the current deployment state and, for deployed jobs, whether the engineer has acknowledged receipt.

BadgeCSS classConditionSource fields
Draftbadge-defaultdeploymentState === "draft" and not deploy-readyjob.deploymentState
Readybadge-successdeployReady === truejob.deployReady
Deployed βœ“badge-accentDeployed and engineer has acknowledgedjob.deploymentState, job.engineerAcknowledgedAt
Deployed β—‹badge-accent-mutedDeployed but awaiting engineer acknowledgementjob.deploymentState, job.engineerAcknowledgedAt

The shared deploymentBadge() function in schedulingBadges.jsx renders these badges consistently across all surfaces.

Operational badges

BadgeAppearanceConditionSource field
πŸ‘₯ NDefault badge with emoji + countcrewSizeRequired > 1job.crewSizeRequired
OOHAccent badgeoutOfHours === truejob.outOfHours
MEWPDefault badge"mewp" in accessEquipmentjob.accessEquipment
ScaffoldDefault badge"scaffold" in accessEquipmentjob.accessEquipment
Tower scaffoldDefault badge"tower_scaffold" in accessEquipmentjob.accessEquipment
LadderDefault badge"ladder" in accessEquipmentjob.accessEquipment
Cherry pickerDefault badge"cherry_picker" in accessEquipmentjob.accessEquipment
Rope accessDefault badge"rope_access" in accessEquipmentjob.accessEquipment
HarnessDefault badge"harness" in accessEquipmentjob.accessEquipment
AccessInfo badge with iconsiteAccessNotes is non-emptyjob.siteAccessNotes

Equipment label mapping

The canonical lowercase equipment values map to display labels:

Stored valueDisplay label
mewpMEWP
scaffoldScaffold
tower_scaffoldTower scaffold
ladderLadder
cherry_pickerCherry picker
rope_accessRope access
harnessHarness

Badge rendering locations

LocationComponentNotes
Board cardsworkspacePrimitives.jsxCompact size
Timeline cardsworkspacePrimitives.jsxCompact size
Planner listSchedulingPlannerList.jsxInline in equipment/crew/OOH columns
Quick ViewSchedulingJobQuickViewDialog.jsxFull size in hero section

Accessibility

  • The crew badge uses aria-label="N crew members required" with aria-hidden="true" on the emoji
  • Equipment and OOH badges use their text content as the accessible name

Validation warnings

The scheduler validates every job against a set of rules. Warnings appear on job cards, in the planner list, and in the Quick View dialog.

Warning severity levels

LevelMeaningDeployment effect
BlockingPrevents deploymentJob cannot be deployed until resolved
WarningNeeds attentionJob can be deployed but should be reviewed
InfoInformationalNo action required

Warning types

WarningSeverityConditionResolution
No engineer assignedBlockingengineerIds is emptyAssign an engineer
No scheduled dateBlockingscheduledDate and targetMonth are both nullSet a date or target month
Site access rules violatedBlocking or WarningJob conflicts with site scheduling constraintsReview site rules and adjust schedule
Engineer availability conflictWarningEngineer is double-booked or outside working hoursReschedule or reassign
Competency mismatchWarningEngineer lacks required competencies for the system typeAssign a qualified engineer
Scheduling window exceededWarningscheduledDate falls outside scheduleWindowStart/EndReschedule within the window
OverdueWarningscheduledDate has passedReschedule or complete
High crew requirementInfocrewSizeRequired > 2Ensure enough engineers available

Warning display

  • Job cards: Warning icon with count; red icon for blocking, amber for warning
  • Planner list: Warning column with count and severity indicator
  • Quick View: Full warning list with descriptions and resolution guidance
  • Focus tabs: Blocked and Flagged tabs filter to warned jobs

Deployment validation

A job is deploy-ready when all of these conditions are met:

ConditionCheck
Engineer assignedengineerIds.length > 0
Date or month setscheduledDate !== null OR targetMonth !== null
Status is activeStatus is not completed, cancelled, or on_hold
No blocking warningsvalidationWarnings.filter(w => w.severity === "blocking").length === 0

Deployment state transitions

Draft  ──(deploy)──▢  Deployed (awaiting β—‹)  ──(engineer opens day run)──▢  Deployed (acknowledged βœ“)
  β–²                       β”‚                                                       β”‚
  └──(scheduling change)β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Any change to scheduledDate, engineerId, or estimatedDurationMinutes resets deploymentState to draft.

Redeploying a job (e.g. after a schedule change) clears engineerAcknowledgedAt back to null, so the job returns to the awaiting state until the engineer opens their day run again.

Deployment acknowledgement

When an engineer opens their day run (GET /my-day-run), all deployed stops in the response are silently marked as acknowledged. This is a fire-and-forget side effect β€” it does not delay the response to the engineer.

How acknowledgement works:

StepWhat happens
Engineer opens My Day RunThe API returns the day-run plan, then asynchronously writes engineerAcknowledgedAt for all deployed stops that haven't been acknowledged yet
Implicit acknowledgementIf an inspection or work order has startedAt set, or a task has completedAt set, the system treats this as implicit acknowledgement even without an explicit timestamp
Preference orderExplicit engineerAcknowledgedAt is always preferred over implicit startedAt / completedAt
RedeploymentClears engineerAcknowledgedAt back to null so the engineer must re-acknowledge
IdempotencyThe DB-level IS NULL guard prevents double-writes; reloading the day run does not create unnecessary transactions

Deployment side effects

Side effectDetail
deployedAt timestampISO datetime of deployment
engineerAcknowledgedAt clearedReset to null on every (re)deployment
deploymentBatchIdGroups jobs deployed together
Email notificationsSent to assigned engineers (fire-and-forget)
History entryLogged with before/after snapshot for audit and undo

Scheduling constraints

RuleConstraint
Date vs monthscheduledDate and targetMonth are mutually exclusive
Target month formatMust match YYYY-MM
Window orderingscheduleWindowEnd must be after scheduleWindowStart
Duration range15-1440 minutes (15 minutes to 24 hours)
Flex range0-120 days
Crew size range1-50

Equipment validation

RuleDetail
Canonical setmewp, scaffold, tower_scaffold, ladder, cherry_picker, rope_access, harness
NormalisationValues lowercased and trimmed on input
DeduplicationDuplicate values removed automatically
Unknown valuesRejected by the server (Zod enum validation)

Assignment validation

RuleDetail
Organisation membershipAssigned engineer must belong to the user's organisation
Field eligibilityEngineer must have canBeScheduled: true
Inspection assignmentCannot clear engineer assignment on inspections

Bulk update validation

RuleDetail
Job count1-100 jobs per bulk update
Required fieldsEach job must include entityType and id
Per-job overridesTake precedence over base-level values
Inspection statusCannot be changed via bulk update
Work order statusCannot be changed via bulk update
Warning checkRejected if update would introduce new blocking warnings

On this page