Skip to content

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.

{
"id": <integer>,
"name": <string> | null,
"livery": [string] | null,
"active": <bool> | null,
"rank": <integer> | null,
}
id integer
Unique integer identifier.
name string
Display name of the desk (e.g. "PRIMARY GARAGING").
at location
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.
livery string
Liveries covered; null selects all liveries.
earliest timeInterval default 0
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.
active bool default true
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.
rank integer
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).

Desks are processed in priority order: liveryskillrankat. 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.

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 onlyname 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.