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 in the work queue, board, timeline, map details, and Quick View drawer. 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.

Statutory due-date badges

Inspection cards use nextInspectionDate to show compliance proximity in both colour and text. The Dispatch Board also exposes the same tiers in its legend.

BadgeCard toneCondition
OverdueCriticalStatutory due date is before the scheduler reference day
Due soonWarningDue within the notice window
Due this monthInfoDue in the intermediate month-range window
ComfortableSuccessDue date is outside the warning windows

The colour accent is never the only signal: queue, board, and timeline cards also render the icon+text badge.

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
Work queue cardsworkspacePrimitives.jsxFull card with queue actions
Board cardsworkspacePrimitives.jsxCompact size
Timeline cardsworkspacePrimitives.jsxCompact size
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 work queue, and in the Quick View drawer.

Severity, workflow tier, and blocking state

Each warning has three related properties:

  • severity is the presentation urgency: info, warning, or critical.
  • tier is the workflow rule: hard, override, or advisory.
  • blocking is the deployment or movement guard. It is true for hard and override warnings, and false for advisory warnings. An override workflow must record accepted evidence before an override-tier change can proceed.

Severity controls how urgently a warning is shown; it is not itself the blocking test.

TierMeaningDeployment effect
HardInvalid assignment, overlap, or site-access conflictResolve before applying or deploying.
OverrideA deliberate exception such as moving locked work, crossing a schedule window, or crossing field-resource availabilityProvide and review the workflow's override evidence before applying.
AdvisoryCapacity, competency, equipment, month-planned, unscheduled, or customer-promise informationReview it; the warning alone does not block the change.

Warning types

WarningTierConditionResolution
Inspection has no field resourceHardAn inspection has no eligible assignmentAssign at least one eligible field resource.
Invalid assignee or overlapHardA selected field resource is ineligible or has overlapping workReschedule or change the crew.
Site access rule conflictHardA visit breaches access dates, blackout dates, notice, or allowed weekdaysAdjust the visit to match the site rules.
Locked visit or schedule-window conflictOverrideA movement crosses Do not move or the permitted windowKeep the promise, or record the explicit override required by the preview.
Field-resource day, shift, or leave conflictOverrideWork falls outside availabilityReassign, reschedule, or record the explicit override.
Competency, equipment, or capacity mismatchAdvisoryThe plan may need different skills, equipment, or workloadReview before applying; choose a better crew or slot where practical.
Month planned or unscheduledAdvisoryThe work has no exact visit timeKeep it as planning demand or book an exact slot before deployment.
Customer promise changedAdvisoryA move affects an offered arrival promiseReview the customer handoff before applying.

Warning display

  • Job cards: Warning icon with count; red icon for blocking, amber for warning
  • Work queue: Warning badges remain visible while jobs wait for a slot
  • Quick View: Full warning list with descriptions and resolution guidance
  • Pipeline filters: Use Draft, Ready, and Deployed to separate deployment state; warnings remain visible on cards

Deployment validation

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

ConditionCheck
Engineer assignedengineerIds.length > 0
Exact scheduled date setscheduledDate !== null
Booking is committedbookingStatus is confirmed or do_not_move
Status is activeStatus is not completed, cancelled, or on_hold
No blocking warningsvalidationWarnings.filter(w => w.blocking).length === 0

Deployment state transitions

Draft  ──(deploy)──▶  Deployed (awaiting ○)  ──(engineer opens day run)──▶  Deployed (acknowledged ✓)
  ▲                       │                                                       │
  └──(scheduling change)──┴───────────────────────────────────────────────────────┘

Changes to the visit schedule, assigned field resources, or estimated duration reset 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 /api/scheduler/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