deskObject
A desk represents an indoor function scope within a business, aggregating stops with similar characteristics under a common indoor owner. Desks are optional — omitting them has no impact on resource allocation.
-
idinteger - Unique integer identifier.
-
namestring - Display name of the desk (e.g. "PRIMARY GARAGING").
-
atlocation - Geographic location. When other criteria match equally, the closest desk wins.
-
skills[string: skillObject] - Skills covered by this desk (a skill-name map). When non-null the desk must match the stop’s primary option requirements.
-
liverystring - Liveries covered; null selects all liveries.
-
earliesttimeIntervaldefault0 - Allocation window: a stop is only allocated to this desk when its reference time — the stop’s earliest, or the allocated resource’s shift start when that is earlier — is at least this interval after now. Whole days are convenient in the D#HH:MM form (e.g. "2#00:00:00" = 2 days). 0 (the default) places no restriction. If no other desk can take a stop, Spiral overrides this rule so the stop is never left unallocated.
-
activebooldefaulttrue - Whether Spiral may allocate stops to this desk automatically. false leaves the desk known to Spiral — it is still replayed, and stops already on it stay — but takes it out of automatic allocation. An absent value reads as true.
-
rankinteger - Integer ranking; when multiple desks match, the lowest rank is selected.
A desk has no domain field: unlike a stop or resource type, a desk is defined by its skills, not
by a domain. The domain shown while choosing a desk’s skills in the editor is a transient lens only and is
never stored on the desk (Spiral rejects a domain sent on a desk).
Allocation order
Section titled “Allocation order”Desks are processed in priority order: livery → skill → rank → at. A desk with a
non-zero earliest only accepts stops lying at least that far in the future: the stop’s reference
time — its earliest, or the allocated resource’s shift start when that is earlier — must be at or
beyond now + earliest. This lets a forward-planning desk (e.g. next-day booking) be kept clear
of today’s work. The rule is a preference, not a hard constraint: if no other desk can take the
stop, Spiral allocates it here anyway rather than leave it unowned.
Desk sets
Section titled “Desk sets”Desks sharing an identical name form a set in Helix: one pool viewed at several horizons, its
members differing only by earliest. The set is a Helix concept only — name is never sent to
Spiral, which simply receives several desks with different windows and allocates as it always does.
Nothing here changes what Spiral is told or how it chooses.
Helix maintains the set on every writer — the dispatch editor, a run-file replay, a scenario load and a fed primary’s stdin all pass through the same rule in crud, so an authored set that cannot work stops the load naming the record rather than loading quietly wrong.
A coupled field changed on one member is applied to the rest (the name included, so a rename renames the set). These are refused: a window another member already covers; a change leaving the set with two members holding no window, or with none; a rename onto a name that already belongs to a different set, which would merge two pools; and deleting the member with no window while dated members remain. Desks with no name are never treated as a set.
In the editor, setting a window on the member that had none offers to add a new member for the forward band, leaving the edited desk covering the nearer work; clearing a window offers to remove that band.
Authoring a set directly (in a domain file, run file or scenario) needs none of that machinery: write the
desks with the same name and distinct earliest values.