Released docs. You are viewing the documentation published with v0.41.0. Development docs are available at Latest.
Registry Scheduling configuration reference
Look up configuration keys for scheduling.yaml, records.yaml, the files under fixtures/, and
the operator’s runtime.yaml.
The tables are generated from Registry Scheduling’s Rust-derived JSON Schemas.
This reference describes the current configuration grammar, not a frozen contract. Types, required fields, accepted values, defaults, and constraints come from the schemas. Descriptions appear where the Rust definition supplies them.
scheduling.yaml is the authored policy: services, locations, offerings, and hooks.
records.yaml holds the runtime records the policy names by identifier, such as resource pools and
published windows. Files under fixtures/ drive local checks. runtime.yaml is the operator’s
deployment file: listener, database, package, identity, task-grant status, audit, retention, and hook
destinations.
A schema-valid document still needs the checks schedulingctl runs, because cross-field rules and
references between files cannot all be expressed by these tables.
Configuration files describes the YAML rules and environment
substitution that apply when the runtime reads runtime.yaml.
Read the tables
Section titled “Read the tables”fields[] means an array item; destinations.hooks.* means a map entry whose name you choose.
Required fields inside an optional object apply when that object is present.
Conditional fields depend on the selected variant or another configuration value.
Accepted values list the union across variants; constraints separated by or are alternatives.
A schema default applies only where that variant declares it. Not specified does not mean
that every value is accepted.
scheduling.yamlSource preview, pre-1.0, 75 key pathsrecords.yamlSource preview, pre-1.0, 60 key pathsfixtures/*.yamlSource preview, pre-1.0, 98 key pathsruntime.yamlSource preview, pre-1.0, 67 key paths
scheduling.yaml
Source preview, pre-1.0
Generated from products/scheduling/generated/project/project.schema.json. 75 key paths. Explained in docs/site/src/content/docs/reference/scheduling-configuration.mdx.
| Key path | Type | Required | Accepted values | Constraints |
|---|---|---|---|---|
apiVersion | string | Yes |
| None specified |
channelsThe channels this deployment serves. The vocabulary is closed by the
Channel type itself; the declaration narrows it to the served
subset, every subquota must draw on a declared channel, and a request
naming anything else is refused. The set is required and holds at
least one channel: a deployment that names none serves none. | array | Yes | Not specified |
|
channels[]Array itemThe authenticated channel a subquota limits. | string | No |
| None specified |
holdPolicyThe hold policy every offering inherits. | object | Yes | Not specified | None specified |
holdPolicy.because | string | Yes | Not specified | None specified |
holdPolicy.maximumPerCallerThe most live holds one caller may keep at once. | integer | Yes | Not specified |
|
holdPolicy.ttlMinutesHow long a hold keeps its capacity: at most one day. | integer | Yes | Not specified |
|
holidaySets | array | Yes | Not specified |
|
holidaySets[]Array itemA named, revisioned set of holiday dates. | object | No | Not specified | None specified |
holidaySets[].because | string | Yes | Not specified | None specified |
holidaySets[].datesThe dates the set closes. A set that closes no date omits the member. | array | No | Not specified |
|
holidaySets[].dates[]Array item | string | No | Not specified | None specified |
holidaySets[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
holidaySets[].revision | integer | Yes | Not specified |
|
hooksObserver hooks. A project with none omits the member. | array | No | Not specified |
|
hooks[]Array itemOne observer hook: the shared Registry Stack hook declaration narrowed to
the closed Scheduling contract. It runs after commit, follows one of three
appointment lifecycle triggers, delivers to a URL destination, and takes
no condition and no proposal principal. | object | No | Not specified | None specified |
hooks[].handlerWhere an observer hook delivers, chosen by its type member. Scheduling
delivers to a URL destination the runtime configuration binds, and to
nothing else. | object | Yes | Not specified | None specified |
hooks[].handler.destinationIdA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
hooks[].handler.type | string | Yes |
| None specified |
hooks[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
hooks[].phaseWhen an observer hook runs. Scheduling runs every hook after the
appointment transaction commits, never inside its capacity transaction. | string | Yes |
| None specified |
hooks[].projectionThe fields of the trigger's closed projection the observer receives.
A hook that needs none lists none. | array | Yes | Not specified |
|
hooks[].projection[]Array item | string | No | Not specified | None specified |
hooks[].triggerThe appointment lifecycle transition an observer hook follows. | string | Yes |
| None specified |
kind | string | Yes |
| None specified |
offerings | array | Yes | Not specified |
|
offerings[]Array itemOne bookable thing a deployment offers. | object | No | Not specified | None specified |
offerings[].arrivalPresent exactly when mode is arrival-window. | object | No | Not specified | None specified |
offerings[].arrival.horizonDaysHow far ahead of the window's start booking is open. | integer | Yes | Not specified |
|
offerings[].arrival.leadTimeMinutesThe earliest lead time a caller may book the window at. | integer | Yes | Not specified |
|
offerings[].arrival.windowThe published window this offering serves arrivals in. | string | Yes | Not specified |
|
offerings[].because | string | Yes | Not specified | None specified |
offerings[].cancellationCutoffMinutesHow late before the displayed start a booking may still be cancelled. | integer | Yes | Not specified |
|
offerings[].duplicateActiveKeyThe caller attribute an active-booking duplicate check keys on, when
the service defines one. Phone numbers and email addresses are never
valid duplicate keys. | string | No | Not specified |
|
offerings[].exactTimePresent exactly when mode is exact-time. | object | No | Not specified | None specified |
offerings[].exactTime.bufferAfterMinutesCleanup time occupied after the displayed end. | integer | Yes | Not specified |
|
offerings[].exactTime.bufferBeforeMinutesSetup time occupied before the displayed start. | integer | Yes | Not specified |
|
offerings[].exactTime.durationMinutes | integer | Yes | Not specified |
|
offerings[].exactTime.horizonDaysHow far ahead booking is open. | integer | Yes | Not specified |
|
offerings[].exactTime.leadTimeMinutesThe earliest lead time a caller may book at. | integer | Yes | Not specified |
|
offerings[].exactTime.maximumRecipientsThe largest party the offering serves. | integer | Yes | Not specified |
|
offerings[].exactTime.poolThe pool of interchangeable members backing this offering. A pool is
its members, never an independent counter. | string | Yes | Not specified |
|
offerings[].exactTime.startIncrementMinutesThe grid displayed starts must land on. | integer | Yes | Not specified |
|
offerings[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
offerings[].label | string | Yes | Not specified | None specified |
offerings[].locationA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
offerings[].modeHow an offering delivers its service. | string | Yes |
| None specified |
offerings[].prerequisitesPrerequisite references a requesting party must hold. An offering
with no prerequisite omits the member. | array | No | Not specified |
|
offerings[].prerequisites[]Array item | string | No | Not specified | None specified |
offerings[].remindersAuthored reminder offsets for this offering. The runtime mints one
revision-bound intent per offset whose due time is still ahead when
the appointment commits; message transport stays external (INT-02).
An offering with no reminders omits the member or lists none. | array | No | Not specified |
|
offerings[].reminders[]Array itemOne authored reminder offset: a notification intent becomes due this many
minutes before the displayed start of an appointment on the offering. | object | No | Not specified | None specified |
offerings[].reminders[].because | string | Yes | Not specified | None specified |
offerings[].reminders[].offsetMinutes | integer | Yes | Not specified |
|
offerings[].requiresCapabilitiesCapabilities every backing member must have for this offering. An
offering that requires none omits the member. | array | No | Not specified |
|
offerings[].requiresCapabilities[]Array itemA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | No | Not specified |
|
offerings[].serviceA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
openings | array | Yes | Not specified |
|
openings[]Array itemA bounded weekly opening pattern over local wall-clock time. The timezone
comes from the location record the pattern references. | object | No | Not specified | None specified |
openings[].because | string | Yes | Not specified | None specified |
openings[].effectiveFrom | string | Yes | Not specified | None specified |
openings[].effectiveUntil | string | Yes | Not specified | None specified |
openings[].endTime | string | Yes | Not specified | None specified |
openings[].holidaySetA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
openings[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
openings[].locationA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
openings[].startTime | string | Yes | Not specified | None specified |
openings[].weekdays | array | Yes | Not specified |
|
openings[].weekdays[]Array itemOne weekday of an opening pattern. | string | No |
| None specified |
projectThe members that name a project (CFG-ENV-6): a project's project block
holds these, and may add project-wide members of the product's own.
Schema name ProjectIdentity. | object | Yes | Not specified | None specified |
project.idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
project.version | string | Yes | Not specified | None specified |
services | array | Yes | Not specified |
|
services[]Array itemA service a deployment schedules. | object | No | Not specified | None specified |
services[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
services[].label | string | Yes | Not specified | None specified |
records.yaml
Source preview, pre-1.0
Generated from products/scheduling/generated/records/records.schema.json. 60 key paths. Explained in docs/site/src/content/docs/reference/scheduling-configuration.mdx.
| Key path | Type | Required | Accepted values | Constraints |
|---|---|---|---|---|
apiVersion | string | Yes |
| None specified |
exceptions | array | No | Not specified |
|
exceptions[]Array itemAn owned dated exception over local wall-clock time, the record form of
registry_platform_calendar::CalendarException. An exception is scoped to
one location: a closure at one counter never closes another. | object | No | Not specified | None specified |
exceptions[].authority | string | No | Not specified | None specified |
exceptions[].dateThe local date, YYYY-MM-DD. | string | Yes | Not specified | None specified |
exceptions[].endTimeThe local end time, HH:MM. | string | Yes | Not specified | None specified |
exceptions[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
exceptions[].kindThe layer an exception occupies, mirrored for records. | string | Yes |
| None specified |
exceptions[].locationThe location this exception applies to. | string | Yes | Not specified |
|
exceptions[].reopens | string | No | Not specified | None specified |
exceptions[].startTimeThe local start time, HH:MM. | string | Yes | Not specified | None specified |
kind | string | Yes |
| None specified |
locations | array | No | Not specified |
|
locations[]Array itemA location record: the layer of configuration an operator maintains at
runtime, not inside the authored policy. | object | No | Not specified | None specified |
locations[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
locations[].timezoneA named IANA timezone such as Asia/Bangkok. | string | Yes | Not specified | None specified |
pools | array | No | Not specified |
|
pools[]Array itemA pool of interchangeable resources backing exact-time offerings. A pool is
its concrete members, never an independent counter. | object | No | Not specified | None specified |
pools[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
pools[].members | array | Yes | Not specified |
|
pools[].members[]Array itemOne interchangeable member of a resource pool.
available carries no reason. Why a member is unavailable is private staff
information; the public answer to a caller is that capacity is exhausted. | object | No | Not specified | None specified |
pools[].members[].available | boolean | Yes | Not specified | None specified |
pools[].members[].capabilitiesThe capabilities this member carries. Omitted or [], it carries
none and serves only offerings that require none. | array | No | Not specified |
|
pools[].members[].capabilities[]Array itemA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | No | Not specified |
|
pools[].members[].resourceIdA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
windows | array | No | Not specified |
|
windows[]Array itemA published arrival window with its capacity. | object | No | Not specified | None specified |
windows[].because | string | Yes | Not specified | None specified |
windows[].end | string | Yes | Not specified |
|
windows[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
windows[].leftoverDeclared intent for the window's leftover capacity. Nothing reads it
in this version, so a declaration is refused at authoring; the field
stays so a refusal can name it. | string | No |
| None specified |
windows[].locationA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
windows[].offeringA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
windows[].revision | integer | Yes | Not specified |
|
windows[].staffingThe staffing block a window's supply is carved from, when the window is
backed by the same concrete resources an exact-time pool sells.
A pool that backs a window may not also back an exact-time offering: a
window claim occupies the window's own supply while an exact-time claim
occupies the member it books, so the two modes would double-book the same
staffing in a ledger that cannot see the conflict. That mix is refused at
publication whatever this block declares.
reserved_members records how many pool members the window's supply is
intended to use. The current ledger does not enforce that partition between
windows, so two windows backed by the same pool may not overlap, whatever
either staffing block declares. Disjoint windows may reuse the pool. | object | No | Not specified | None specified |
windows[].staffing.because | string | Yes | Not specified | None specified |
windows[].staffing.poolA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
windows[].staffing.reservedMembers | integer | No | Not specified |
|
windows[].start | string | Yes | Not specified |
|
windows[].subquotasPer-channel ceilings within units. A window that limits no channel
omits the member. | array | No | Not specified |
|
windows[].subquotas[]Array itemA per-channel ceiling within a window's published capacity. | object | No | Not specified | None specified |
windows[].subquotas[].because | string | Yes | Not specified | None specified |
windows[].subquotas[].channelThe authenticated channel a subquota limits. | string | Yes |
| None specified |
windows[].subquotas[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
windows[].subquotas[].units | integer | Yes | Not specified |
|
windows[].unitsPublished capacity in the unit basis the units policy defines. | integer | Yes | Not specified |
|
windows[].unitsPolicyHow an offering converts a party into consumed recipient units, chosen by
its type member. | object | Yes | Not specified | None specified |
windows[].unitsPolicy.aboveHighestBandWhat a party above the highest band costs, or that it is refused, chosen
by its type member. | object | Conditional | Not specified | None specified |
windows[].unitsPolicy.aboveHighestBand.type | string | Conditional |
| None specified |
windows[].unitsPolicy.aboveHighestBand.units | integer | Conditional | Not specified |
|
windows[].unitsPolicy.bands | array | Conditional | Not specified |
|
windows[].unitsPolicy.bands[]Array itemOne band of a banded units table: parties up to up_to recipients cost
units. | object | Conditional | Not specified | None specified |
windows[].unitsPolicy.bands[].because | string | Conditional | Not specified | None specified |
windows[].unitsPolicy.bands[].units | integer | Conditional | Not specified |
|
windows[].unitsPolicy.bands[].upTo | integer | Conditional | Not specified |
|
windows[].unitsPolicy.because | string | Yes | Not specified | None specified |
windows[].unitsPolicy.inputThe closed input set a banded table may read. Tier 1 reads exactly one. | string | Conditional |
| None specified |
windows[].unitsPolicy.perRecipient | integer | Conditional | Not specified |
|
windows[].unitsPolicy.type | string | Yes |
| None specified |
windows[].unitsPolicy.units | integer | Conditional | Not specified |
|
fixtures/*.yaml
Source preview, pre-1.0
Generated from products/scheduling/generated/fixture/fixture.schema.json. 98 key paths. Explained in docs/site/src/content/docs/reference/scheduling-configuration.mdx.
| Key path | Type | Required | Accepted values | Constraints |
|---|---|---|---|---|
apiVersion | string | Yes |
| None specified |
cases | array | Yes | Not specified |
|
cases[]Array itemOne replayed request and its expectation. | object | No | Not specified | None specified |
cases[].expectOne case's expected outcome, chosen by its type member. | object | Yes | Not specified | None specified |
cases[].expect.codeA public problem code, exactly as a caller would receive it. | string | Conditional |
| None specified |
cases[].expect.resourceThe pool member an exact-time case lands on. Omit it to accept
any member. | string | Conditional | Not specified |
|
cases[].expect.type | string | Yes |
| None specified |
cases[].expect.units | integer | Conditional | Not specified |
|
cases[].nameThe case name, which also identifies the claim an admitted case
records. | string | Yes | Not specified |
|
cases[].requestOne replayed request as an author writes it.
This is the authoring form of an admission request, not the wire form. It
carries everything the wire request carries plus rescheduleOf, the claim
this case replaces: a fixture legitimately says "this case reschedules that
one", where an HTTP caller may not, because on the wire the exclusion is
the runtime's to supply from inside its own transaction. | object | Yes | Not specified | None specified |
cases[].request.capabilitiesThe capabilities the party holds. A party holding none omits the
member. | array | No | Not specified |
|
cases[].request.capabilities[]Array itemA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | No | Not specified |
|
cases[].request.channelThe channel the caller books through. It is free text so a fixture
can exercise the refusal of a channel outside the vocabulary. | string | No | Not specified | None specified |
cases[].request.duplicateKey | string | No | Not specified | None specified |
cases[].request.offeringA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
cases[].request.partyThe party one replayed case requests for. Zero is allowed in both counts
so a fixture can exercise the refusal of a party the offering cannot
serve. | object | Yes | Not specified | None specified |
cases[].request.party.attendees | integer | Yes | Not specified |
|
cases[].request.party.recipients | integer | Yes | Not specified |
|
cases[].request.policyRevisionThe policy revision the caller resolved the offering under. Replay
runs the policy at revision 1. | integer | Yes | Not specified |
|
cases[].request.prerequisitesThe prerequisites the party holds. A party holding none omits the
member. | array | No | Not specified |
|
cases[].request.prerequisites[]Array item | string | No | Not specified | None specified |
cases[].request.rescheduleOfThe claim this case replaces. Its allocation is left out of this
case's conflict checks and removed when the case is admitted, so a
reschedule never competes with what it replaces. A claim an earlier
case booked is case: followed by that case's name. | string | No | Not specified | None specified |
cases[].request.start | string | Yes | Not specified |
|
cases[].request.windowRevision | integer | No | Not specified |
|
factsThe environment records an admission runs against: locations, pools,
published windows, and dated exceptions. In production these are runtime records; in an offline
replay they are fixture facts. The evaluator never reads or mutates them
directly; its caller resolves them into the context the evaluator takes.
A fixture may omit an empty collection; replay fails fast when a case
references a record the facts do not carry. | object | Yes | Not specified | None specified |
facts.exceptions | array | No | Not specified |
|
facts.exceptions[]Array itemAn owned dated exception over local wall-clock time, the record form of
registry_platform_calendar::CalendarException. An exception is scoped to
one location: a closure at one counter never closes another. | object | No | Not specified | None specified |
facts.exceptions[].authority | string | No | Not specified | None specified |
facts.exceptions[].dateThe local date, YYYY-MM-DD. | string | Yes | Not specified | None specified |
facts.exceptions[].endTimeThe local end time, HH:MM. | string | Yes | Not specified | None specified |
facts.exceptions[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
facts.exceptions[].kindThe layer an exception occupies, mirrored for records. | string | Yes |
| None specified |
facts.exceptions[].locationThe location this exception applies to. | string | Yes | Not specified |
|
facts.exceptions[].reopens | string | No | Not specified | None specified |
facts.exceptions[].startTimeThe local start time, HH:MM. | string | Yes | Not specified | None specified |
facts.locations | array | No | Not specified |
|
facts.locations[]Array itemA location record: the layer of configuration an operator maintains at
runtime, not inside the authored policy. | object | No | Not specified | None specified |
facts.locations[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
facts.locations[].timezoneA named IANA timezone such as Asia/Bangkok. | string | Yes | Not specified | None specified |
facts.pools | array | No | Not specified |
|
facts.pools[]Array itemA pool of interchangeable resources backing exact-time offerings. A pool is
its concrete members, never an independent counter. | object | No | Not specified | None specified |
facts.pools[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
facts.pools[].members | array | Yes | Not specified |
|
facts.pools[].members[]Array itemOne interchangeable member of a resource pool.
available carries no reason. Why a member is unavailable is private staff
information; the public answer to a caller is that capacity is exhausted. | object | No | Not specified | None specified |
facts.pools[].members[].available | boolean | Yes | Not specified | None specified |
facts.pools[].members[].capabilitiesThe capabilities this member carries. Omitted or [], it carries
none and serves only offerings that require none. | array | No | Not specified |
|
facts.pools[].members[].capabilities[]Array itemA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | No | Not specified |
|
facts.pools[].members[].resourceIdA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
facts.windowsPublished arrival-window supply owned by this deployment's operator
records. The policy references these records by identifier. | array | No | Not specified |
|
facts.windows[]Array itemA published arrival window with its capacity. | object | No | Not specified | None specified |
facts.windows[].because | string | Yes | Not specified | None specified |
facts.windows[].end | string | Yes | Not specified |
|
facts.windows[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
facts.windows[].leftoverDeclared intent for the window's leftover capacity. Nothing reads it
in this version, so a declaration is refused at authoring; the field
stays so a refusal can name it. | string | No |
| None specified |
facts.windows[].locationA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
facts.windows[].offeringA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
facts.windows[].revision | integer | Yes | Not specified |
|
facts.windows[].staffingThe staffing block a window's supply is carved from, when the window is
backed by the same concrete resources an exact-time pool sells.
A pool that backs a window may not also back an exact-time offering: a
window claim occupies the window's own supply while an exact-time claim
occupies the member it books, so the two modes would double-book the same
staffing in a ledger that cannot see the conflict. That mix is refused at
publication whatever this block declares.
reserved_members records how many pool members the window's supply is
intended to use. The current ledger does not enforce that partition between
windows, so two windows backed by the same pool may not overlap, whatever
either staffing block declares. Disjoint windows may reuse the pool. | object | No | Not specified | None specified |
facts.windows[].staffing.because | string | Yes | Not specified | None specified |
facts.windows[].staffing.poolA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
facts.windows[].staffing.reservedMembers | integer | No | Not specified |
|
facts.windows[].start | string | Yes | Not specified |
|
facts.windows[].subquotasPer-channel ceilings within units. A window that limits no channel
omits the member. | array | No | Not specified |
|
facts.windows[].subquotas[]Array itemA per-channel ceiling within a window's published capacity. | object | No | Not specified | None specified |
facts.windows[].subquotas[].because | string | Yes | Not specified | None specified |
facts.windows[].subquotas[].channelThe authenticated channel a subquota limits. | string | Yes |
| None specified |
facts.windows[].subquotas[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
facts.windows[].subquotas[].units | integer | Yes | Not specified |
|
facts.windows[].unitsPublished capacity in the unit basis the units policy defines. | integer | Yes | Not specified |
|
facts.windows[].unitsPolicyHow an offering converts a party into consumed recipient units, chosen by
its type member. | object | Yes | Not specified | None specified |
facts.windows[].unitsPolicy.aboveHighestBandWhat a party above the highest band costs, or that it is refused, chosen
by its type member. | object | Conditional | Not specified | None specified |
facts.windows[].unitsPolicy.aboveHighestBand.type | string | Conditional |
| None specified |
facts.windows[].unitsPolicy.aboveHighestBand.units | integer | Conditional | Not specified |
|
facts.windows[].unitsPolicy.bands | array | Conditional | Not specified |
|
facts.windows[].unitsPolicy.bands[]Array itemOne band of a banded units table: parties up to up_to recipients cost
units. | object | Conditional | Not specified | None specified |
facts.windows[].unitsPolicy.bands[].because | string | Conditional | Not specified | None specified |
facts.windows[].unitsPolicy.bands[].units | integer | Conditional | Not specified |
|
facts.windows[].unitsPolicy.bands[].upTo | integer | Conditional | Not specified |
|
facts.windows[].unitsPolicy.because | string | Yes | Not specified | None specified |
facts.windows[].unitsPolicy.inputThe closed input set a banded table may read. Tier 1 reads exactly one. | string | Conditional |
| None specified |
facts.windows[].unitsPolicy.perRecipient | integer | Conditional | Not specified |
|
facts.windows[].unitsPolicy.type | string | Yes |
| None specified |
facts.windows[].unitsPolicy.units | integer | Conditional | Not specified |
|
initialThe claims the ledger holds before the first case. A fixture that
starts from an empty ledger omits the member. | array | No | Not specified |
|
initial[]Array itemOne entry in the authoritative supply ledger.
start and end are the occupied interval including any setup and cleanup
buffers, so two claims that merely touch at their displayed times still
conflict when their buffers overlap. | object | No | Not specified | None specified |
initial[].channelThe authenticated channel the claim was allocated in, when the supply
carries channel subquotas. | string | No |
| None specified |
initial[].duplicateKeyThe duplicate-active key this claim holds, when the offering defines
one. | string | No | Not specified | None specified |
initial[].end | string | Yes | Not specified |
|
initial[].expiresAtHold expiry. An expired hold stops consuming capacity at this instant
even when the cleanup worker is delayed. | string | No | Not specified |
|
initial[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
initial[].kindWhat a ledger entry allocates supply for. | string | Yes |
| None specified |
initial[].offeringThe offering whose duplicate-active policy owns this claim. | string | Yes | Not specified |
|
initial[].start | string | Yes | Not specified |
|
initial[].supplyIdThe pool member resource (exact time) or the window (arrival) this
claim occupies. | string | Yes | Not specified |
|
initial[].unitsRecipient units consumed. Exact-time claims on one member consume one. | integer | Yes | Not specified |
|
kind | string | Yes |
| None specified |
nameA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -. | string | Yes | Not specified |
|
nowThe single observed instant every case runs at. | string | Yes | Not specified |
|
runtime.yaml
Source preview, pre-1.0
Generated from products/scheduling/generated/runtime/runtime.schema.json. 67 key paths. Explained in docs/site/src/content/docs/reference/scheduling-configuration.mdx.
| Key path | Type | Required | Accepted values | Constraints |
|---|---|---|---|---|
apiVersion | string | Yes |
| None specified |
auditThe audit journal: where it is written and the key its hashes use. | object | Yes | Not specified | None specified |
audit.destinationWhere audit entries go: a rotated file (the default) or stdout. | string | No |
"file" | None specified |
audit.hashKeyRefSecret reference to the audit hash key. | string | Yes | Not specified |
|
audit.pathThe active audit file. Required for, and only allowed with, file. | string | Conditional | Not specified |
|
audit.retentionDaysDelete rotated files older than this many days. Only allowed with
file; omitted, rotated files are kept 90 days. | integer | No | Not specified |
|
audit.rotateBytesRotate the active file once it reaches this many bytes. Only allowed
with file; omitted, the file rotates at 100 MiB. | integer | No | Not specified |
|
authentication | object | Yes | Not specified | None specified |
authentication.oidcThe access tokens this runtime accepts: the issuer and its keys, the
clients admitted, and the scopes each route family requires. | object | Yes | Not specified | None specified |
authentication.oidc.allowedClientsClient identifiers whose access tokens are admitted. Required in every
file; an omitted or empty list, a repeated client, and unrestricted
are refused. | array | Yes | Not specified |
|
authentication.oidc.allowedClients[]Array item | string | No | Not specified | None specified |
authentication.oidc.assertionIssuersAssertion authorities each client may exchange a subject token from,
keyed by client identifier. Omitted, no assertion-issuer rule applies;
written, it lists at least one client, each with at least one
authority. Once a client is listed, a token it exchanged is accepted
only for one of that client's declared authorities, and a client that
is not listed may exchange from no authority. | object | No | Not specified |
|
authentication.oidc.assertionIssuers.*Map value | array | No | Not specifiedSchema default, where declared: |
|
authentication.oidc.assertionIssuers.*[]Array item | string | No | Not specified |
|
authentication.oidc.audienceThe audience every accepted access token must carry in aud. | string | Yes | Not specified |
|
authentication.oidc.explainScopeThe scope the separately authorized explain path requires. | string | No | Not specifiedSchema default, where declared: "scheduling-explain" | None specified |
authentication.oidc.issuerExact issuer accepted in access-token iss claims, an absolute
https URL. | string | Yes | Not specified |
|
authentication.oidc.jwksSourceWhere the issuer's signing keys come from. Absent reads the issuer's
OpenID Connect discovery document. | object | No | Not specifiedSchema default, where declared: {"type":"discovery"} | None specified |
authentication.oidc.jwksSource.documentRefAn exact secret reference: secret:file/name, resolved under secretProviders.file.root, or secret:env/NAME, resolved only when secretProviders.environment is declared. | string | Conditional | Not specified |
|
authentication.oidc.jwksSource.type | string | Yes |
| None specified |
authentication.oidc.jwksSource.uriAn absolute http or https URL with a host preserved as written, no user information, and no backslash, whitespace or control character. DNS case and equivalent IPv6 literals are permitted. | string | Conditional | Not specified |
|
authentication.oidc.readsScopeThe scope every listing and availability read requires. | string | No | Not specifiedSchema default, where declared: "scheduling-read" | None specified |
authentication.oidc.scopeClaim | string | No | Not specifiedSchema default, where declared: "registry_scopes" | None specified |
databaseThe PostgreSQL connection a stateful runtime uses. Both URLs are secret
references and may name the same secret. | object | Yes | Not specified | None specified |
database.migrationUrlRefSecret reference to the migration connection URL. | string | Yes | Not specified |
|
database.runtimeUrlRefSecret reference to the least-privileged runtime connection URL. | string | Yes | Not specified |
|
database.testOnlyPlaintextAllow a plaintext connection. Refused outside test builds. | boolean | No | Not specifiedSchema default, where declared: false | None specified |
database.trustedRootCertificateRefSecret reference to a PEM root certificate the connection trusts.
Absent, the connection trusts the platform's root certificates. | string | No | Not specified |
|
destinationsWhere due reminder and lifecycle-hook intents are dispatched. An absent
reminders destination and an empty hook map are supported: intents stay
local, so an operator can adopt the product before wiring delivery buses. | object | No | Not specified | None specified |
destinations.hooksLogical URL hook destinations. The governed policy names only these
ids; URL, signing secret, and retry ceilings stay deployment-owned.
At most 128 are bound, each keyed by a local identifier. | object | No | Not specified |
|
destinations.hooks.*Map value | object | No | Not specifiedSchema default, where declared: |
|
destinations.hooks.*.attemptTimeoutMillisecondsHow long one delivery attempt may take, from 100 through 10000
milliseconds. | integer | No | Not specifiedSchema default, where declared: 5000 |
|
destinations.hooks.*.hmacSha256KeyRefAn exact secret reference: secret:file/name, resolved under secretProviders.file.root, or secret:env/NAME, resolved only when secretProviders.environment is declared. | string | Yes | Not specified |
|
destinations.hooks.*.maximumAttemptsHow many delivery attempts one event gets, from 1 through 20. | integer | No | Not specifiedSchema default, where declared: 8 |
|
destinations.hooks.*.urlAn https URL, or http on 127.0.0.1, localhost, or [::1], without a
query or fragment. | string | Yes | Not specified |
|
destinations.reminders | object | No | Not specified | None specified |
destinations.reminders.bearerTokenRefAn exact secret reference: secret:file/name, resolved under secretProviders.file.root, or secret:env/NAME, resolved only when secretProviders.environment is declared. | string | No | Not specified |
|
destinations.reminders.urlAn https URL, or http on 127.0.0.1, localhost, or [::1], without a
query or fragment. | string | Yes | Not specified |
|
identityThe logical identity of the database this deployment owns. The first
schedulingctl apply records it; every later apply and every startup
refuses a database that recorded another. | object | Yes | Not specified | None specified |
identity.databaseIdAn operator-chosen logical id for the database, for example
scheduling-production. It is never derived from a URL or a
PostgreSQL database name. It is at most 256 UTF-8 bytes, carries no
control character, and has no leading or trailing whitespace. | string | Yes | Not specified |
|
kind | string | Yes |
| None specified |
listenerThe listener of a runtime that declares its TLS termination and network
exposure. | object | Yes | Not specified | None specified |
listener.bindSocket address the runtime listens on, written host:port with an IP address host ([addr]:port for IPv6). | string | Yes | Not specified |
|
listener.networkExposureThe operator-declared private network placement of an HTTP listener. | string | No |
"private-address" | None specified |
listener.tlsTerminationDeclares the trusted transport boundary for a runtime's plaintext HTTP
listener. Production listeners require operator-controlled upstream TLS
termination; direct plaintext is limited to the explicit loopback-only
development mode. | string | Yes |
| None specified |
packageThe package a runtime serves: root is the absolute package directory,
and expectedDigest, when set, pins the package digest the runtime must
find there. The package digest is the digest of the package's
SHA256SUMS file; see [crate::package]. | object | Yes | Not specified | None specified |
package.expectedDigestsha256: label of the package digest, the digest of the package's
SHA256SUMS file. When set, the runtime refuses to start on any other
package. | string | No | Not specified |
|
package.rootAbsolute path of the package directory. | string | Yes | Not specified |
|
retentionRetention periods the retention sweep enforces. Every value is deployment
configuration, never policy: a jurisdiction's retention schedule approves
the deployed numbers, and changing one is an operational event. | object | Yes | Not specified | None specified |
retention.attemptReceiptRetentionDaysHow long a stored idempotency receipt stays replayable, from one
through 65535 days. | integer | No | Not specifiedSchema default, where declared: 7 |
|
retention.hookPayloadRetentionDaysLifetime of canonical hook envelopes retained for retry and
dead-letter inspection, from one through thirty days. | integer | No | Not specifiedSchema default, where declared: 7 |
|
secretProvidersThe secret providers a runtime enables. A reference is resolved only by a
provider declared here: secret:file/name under file.root, and
secret:env/NAME only when environment: {} is present. | object | Yes | Not specified | None specified |
secretProviders.environmentEnables secret:env/NAME references, read from the process
environment. Declared as an empty mapping: environment: {}. | object | Conditional | Not specified | None specified |
secretProviders.fileEnables secret:file/name references, read from files under root. | object | Conditional | Not specified | None specified |
secretProviders.file.rootAbsolute directory holding one file per secret. Each file must be a
regular file owned by the runtime user, mode 0400 or 0600, with exactly
one hard link. | string | Conditional | Not specified |
and, where a rule elsewhere applies
|
taskGrantStatusHow a task grant is checked before capacity work: a list of the task
authorities whose fresh grant status every commitment and replay
checks, or unchecked-final-fifteen-minutes to accept only a grant
with at most fifteen minutes left, without a revocation check. | array | string | Yes |
| No bound or
|
taskGrantStatus[]Array itemOne task authority whose grants a runtime checks for fresh status, and the
runtime's own credentials for that check, written as one entry of
taskGrantStatus. The status route and scope default to Casework's. | object | Conditional | Not specified | None specified |
taskGrantStatus[].baseUrlThe authority's base URL the status check calls. It is https;
http is accepted only for a loopback host, for local development. | string | Conditional | Not specified |
|
taskGrantStatus[].caBundleRefPEM CA bundle for the authority and its token endpoint. Omitted, the
platform's trusted roots verify them. | string | Conditional | Not specified |
|
taskGrantStatus[].caseworkResourceThe audience the runtime requests its status credential for, an
absolute resource URI. | string | Conditional | Not specified |
|
taskGrantStatus[].clientAssertionAudienceAn identifier another system issues, written exactly as its issuer gives it. | string | Conditional | Not specified |
|
taskGrantStatus[].clientIdAn identifier another system issues, written exactly as its issuer gives it. | string | Conditional | Not specified |
|
taskGrantStatus[].privateKeyRefAn exact secret reference: secret:file/name, resolved under secretProviders.file.root, or secret:env/NAME, resolved only when secretProviders.environment is declared. | string | Conditional | Not specified |
|
taskGrantStatus[].sourceIssuerThe task authority's issuer, exactly as the authority states it,
including an absolute URN issuer. It is compared rather than fetched
and must be an absolute resource URI. | string | Conditional | Not specified |
|
taskGrantStatus[].statusPathThe status route appended to baseUrl's path. It starts with / and
has exactly one whole {grantId} segment; every other segment uses
only letters, digits, -, ., _, and ~. Omitted,
/v1/task-grants/{grantId}/status. | string | Conditional | Not specifiedSchema default, where declared: "/v1/task-grants/{grantId}/status" | None specified |
taskGrantStatus[].statusScopeThe one scope the runtime requests its status credential with.
Omitted, casework:grants:status. | string | Conditional | Not specifiedSchema default, where declared: "casework:grants:status" |
|
taskGrantStatus[].tokenEndpointAn absolute http or https URL with a host preserved as written, no user information, and no backslash, whitespace or control character. DNS case and equivalent IPv6 literals are permitted. | string | Conditional | Not specified |
|
Regeneration
Section titled “Regeneration”The source schemas live under products/scheduling/generated/.
Run npm run generate in docs/site to rebuild these tables from them.
products/scheduling/RUNTIME-CONFIG.md describes the runtime file in prose, including the closed
envelope, the package digest, and the activation ledger.
Start a project
Section titled “Start a project”No tutorial covers Registry Scheduling yet. To start a project and prove it offline, with no database
and no network, write the standalone-exact-time starter, check it, and replay its synthetic
fixtures:
schedulingctl init ./scheduling --template standalone-exact-timeschedulingctl check ./schedulingschedulingctl test ./schedulinginit writes scheduling.yaml, runtime.example.yaml, records.yaml, and two fixture files, and check reads all five, the runtime example as the runtime reads a runtime file. A
passing check ends with 0 errors, 0 warnings in 5 files, and a passing test reports
Offline synthetic fixtures passed. with productionClosure: false: the replay proves the policy
against its fixtures, not source reachability or deployment readiness. Copy scheduling/runtime.example.yaml
to scheduling/runtime.yaml, set its absolute paths and secret references, and keep or replace its
taskGrantStatus before you check it with
schedulingctl check ./scheduling --runtime-config ./scheduling/runtime.yaml. The example writes
taskGrantStatus: unchecked-final-fifteen-minutes, which accepts only a task grant with at most 900
seconds left and checks no revocation; a deployment that accepts deferred grants lists its task
authorities instead, as the Scheduling API reference
describes. A runtime file without taskGrantStatus is refused.
Check commands
Section titled “Check commands”Every file Registry Scheduling reads has a command that checks it offline, with no service running. Each prints the diagnostics, JSON output, and exit codes that Check a file before you deploy it describes.
| Format and files | Check command |
|---|---|
Scheduling project
| schedulingctl check <project> |
Scheduling supply records
| schedulingctl check <project> |
Scheduling fixture
| schedulingctl check <project> |
Scheduling runtime configuration
| schedulingctl check <project> --runtime-config <file> |
- Registry Scheduling API contract for routes, task grants, and problem codes.
- Audit upgrades and retention for the audit and retention keys.