Skip to content
Registry StackDocsv0.41.0

Registry Scheduling configuration reference

View as Markdown

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.

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.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 pathTypeRequiredAccepted valuesConstraints
apiVersionstringYes
  • id.registrystack.org/formats/scheduling/project/v1alpha1
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.arrayYesNot specified
  • minItems: 1
  • uniqueItems: true
channels[]Array itemThe authenticated channel a subquota limits.stringNo
  • assisted
  • public
  • urgent
  • walk-in
None specified
holdPolicyThe hold policy every offering inherits.objectYesNot specifiedNone specified
holdPolicy.becausestringYesNot specifiedNone specified
holdPolicy.maximumPerCallerThe most live holds one caller may keep at once.integerYesNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
holdPolicy.ttlMinutesHow long a hold keeps its capacity: at most one day.integerYesNot specified
  • format: uint32
  • maximum: 1440
  • minimum: 1
holidaySetsarrayYesNot specified
  • maxItems: 256
  • minItems: 1
holidaySets[]Array itemA named, revisioned set of holiday dates.objectNoNot specifiedNone specified
holidaySets[].becausestringYesNot specifiedNone specified
holidaySets[].datesThe dates the set closes. A set that closes no date omits the member.arrayNoNot specified
  • maxItems: 256
  • minItems: 1
  • uniqueItems: true
holidaySets[].dates[]Array itemstringNoNot specifiedNone specified
holidaySets[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
holidaySets[].revisionintegerYesNot specified
  • format: uint64
  • maximum: 9223372036854775807
  • minimum: 1
hooksObserver hooks. A project with none omits the member.arrayNoNot specified
  • maxItems: 256
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.objectNoNot specifiedNone 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.objectYesNot specifiedNone specified
hooks[].handler.destinationIdA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
hooks[].handler.typestringYes
  • url
None specified
hooks[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
hooks[].phaseWhen an observer hook runs. Scheduling runs every hook after the appointment transaction commits, never inside its capacity transaction.stringYes
  • after
None specified
hooks[].projectionThe fields of the trigger's closed projection the observer receives. A hook that needs none lists none.arrayYesNot specified
  • uniqueItems: true
hooks[].projection[]Array itemstringNoNot specifiedNone specified
hooks[].triggerThe appointment lifecycle transition an observer hook follows.stringYes
  • appointment.cancelled
  • appointment.confirmed
  • appointment.rescheduled
None specified
kindstringYes
  • SchedulingProject
None specified
offeringsarrayYesNot specified
  • maxItems: 256
  • minItems: 1
offerings[]Array itemOne bookable thing a deployment offers.objectNoNot specifiedNone specified
offerings[].arrivalPresent exactly when mode is arrival-window.objectNoNot specifiedNone specified
offerings[].arrival.horizonDaysHow far ahead of the window's start booking is open.integerYesNot specified
  • format: uint32
  • maximum: 3650
  • minimum: 1
offerings[].arrival.leadTimeMinutesThe earliest lead time a caller may book the window at.integerYesNot specified
  • format: uint32
  • maximum: 5256000
  • minimum: 1
offerings[].arrival.windowThe published window this offering serves arrivals in.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
offerings[].becausestringYesNot specifiedNone specified
offerings[].cancellationCutoffMinutesHow late before the displayed start a booking may still be cancelled.integerYesNot specified
  • format: uint32
  • maximum: 5256000
  • minimum: 0
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.stringNoNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
offerings[].exactTimePresent exactly when mode is exact-time.objectNoNot specifiedNone specified
offerings[].exactTime.bufferAfterMinutesCleanup time occupied after the displayed end.integerYesNot specified
  • format: uint32
  • maximum: 1440
  • minimum: 0
offerings[].exactTime.bufferBeforeMinutesSetup time occupied before the displayed start.integerYesNot specified
  • format: uint32
  • maximum: 1440
  • minimum: 0
offerings[].exactTime.durationMinutesintegerYesNot specified
  • format: uint32
  • maximum: 1440
  • minimum: 1
offerings[].exactTime.horizonDaysHow far ahead booking is open.integerYesNot specified
  • format: uint32
  • maximum: 3650
  • minimum: 1
offerings[].exactTime.leadTimeMinutesThe earliest lead time a caller may book at.integerYesNot specified
  • format: uint32
  • maximum: 5256000
  • minimum: 1
offerings[].exactTime.maximumRecipientsThe largest party the offering serves.integerYesNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
offerings[].exactTime.poolThe pool of interchangeable members backing this offering. A pool is its members, never an independent counter.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
offerings[].exactTime.startIncrementMinutesThe grid displayed starts must land on.integerYesNot specified
  • format: uint32
  • maximum: 1440
  • minimum: 1
offerings[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
offerings[].labelstringYesNot specifiedNone specified
offerings[].locationA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
offerings[].modeHow an offering delivers its service.stringYes
  • arrival-window
  • exact-time
None specified
offerings[].prerequisitesPrerequisite references a requesting party must hold. An offering with no prerequisite omits the member.arrayNoNot specified
  • maxItems: 256
  • minItems: 1
  • uniqueItems: true
offerings[].prerequisites[]Array itemstringNoNot specifiedNone 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.arrayNoNot specified
  • maxItems: 256
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.objectNoNot specifiedNone specified
offerings[].reminders[].becausestringYesNot specifiedNone specified
offerings[].reminders[].offsetMinutesintegerYesNot specified
  • format: uint32
  • maximum: 5256000
  • minimum: 1
offerings[].requiresCapabilitiesCapabilities every backing member must have for this offering. An offering that requires none omits the member.arrayNoNot specified
  • maxItems: 256
  • minItems: 1
  • uniqueItems: true
offerings[].requiresCapabilities[]Array itemA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringNoNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
offerings[].serviceA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
openingsarrayYesNot specified
  • maxItems: 256
  • minItems: 1
openings[]Array itemA bounded weekly opening pattern over local wall-clock time. The timezone comes from the location record the pattern references.objectNoNot specifiedNone specified
openings[].becausestringYesNot specifiedNone specified
openings[].effectiveFromstringYesNot specifiedNone specified
openings[].effectiveUntilstringYesNot specifiedNone specified
openings[].endTimestringYesNot specifiedNone specified
openings[].holidaySetA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
openings[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
openings[].locationA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
openings[].startTimestringYesNot specifiedNone specified
openings[].weekdaysarrayYesNot specified
  • minItems: 1
  • uniqueItems: true
openings[].weekdays[]Array itemOne weekday of an opening pattern.stringNo
  • fri
  • mon
  • sat
  • sun
  • thu
  • tue
  • wed
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.objectYesNot specifiedNone specified
project.idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
project.versionstringYesNot specifiedNone specified
servicesarrayYesNot specified
  • maxItems: 256
  • minItems: 1
services[]Array itemA service a deployment schedules.objectNoNot specifiedNone specified
services[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
services[].labelstringYesNot specifiedNone 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 pathTypeRequiredAccepted valuesConstraints
apiVersionstringYes
  • id.registrystack.org/formats/scheduling/records/v1alpha1
None specified
exceptionsarrayNoNot specified
  • maxItems: 256
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.objectNoNot specifiedNone specified
exceptions[].authoritystringNoNot specifiedNone specified
exceptions[].dateThe local date, YYYY-MM-DD.stringYesNot specifiedNone specified
exceptions[].endTimeThe local end time, HH:MM.stringYesNot specifiedNone specified
exceptions[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
exceptions[].kindThe layer an exception occupies, mirrored for records.stringYes
  • closure
  • opening
None specified
exceptions[].locationThe location this exception applies to.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
exceptions[].reopensstringNoNot specifiedNone specified
exceptions[].startTimeThe local start time, HH:MM.stringYesNot specifiedNone specified
kindstringYes
  • SchedulingRecords
None specified
locationsarrayNoNot specified
  • maxItems: 256
locations[]Array itemA location record: the layer of configuration an operator maintains at runtime, not inside the authored policy.objectNoNot specifiedNone specified
locations[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
locations[].timezoneA named IANA timezone such as Asia/Bangkok.stringYesNot specifiedNone specified
poolsarrayNoNot specified
  • maxItems: 256
pools[]Array itemA pool of interchangeable resources backing exact-time offerings. A pool is its concrete members, never an independent counter.objectNoNot specifiedNone specified
pools[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
pools[].membersarrayYesNot specified
  • maxItems: 256
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.objectNoNot specifiedNone specified
pools[].members[].availablebooleanYesNot specifiedNone specified
pools[].members[].capabilitiesThe capabilities this member carries. Omitted or [], it carries none and serves only offerings that require none.arrayNoNot specified
  • maxItems: 256
  • uniqueItems: true
pools[].members[].capabilities[]Array itemA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringNoNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
pools[].members[].resourceIdA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
windowsarrayNoNot specified
  • maxItems: 256
windows[]Array itemA published arrival window with its capacity.objectNoNot specifiedNone specified
windows[].becausestringYesNot specifiedNone specified
windows[].endstringYesNot specified
  • format: date-time
windows[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
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.stringNo
  • becomes-walk-in
  • expires-unused
None specified
windows[].locationA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
windows[].offeringA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
windows[].revisionintegerYesNot specified
  • format: uint64
  • maximum: 9223372036854775807
  • minimum: 1
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.objectNoNot specifiedNone specified
windows[].staffing.becausestringYesNot specifiedNone specified
windows[].staffing.poolA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
windows[].staffing.reservedMembersintegerNoNot specified
  • format: uint32
  • maximum: 256
  • minimum: 1
windows[].startstringYesNot specified
  • format: date-time
windows[].subquotasPer-channel ceilings within units. A window that limits no channel omits the member.arrayNoNot specified
  • maxItems: 4
  • minItems: 1
windows[].subquotas[]Array itemA per-channel ceiling within a window's published capacity.objectNoNot specifiedNone specified
windows[].subquotas[].becausestringYesNot specifiedNone specified
windows[].subquotas[].channelThe authenticated channel a subquota limits.stringYes
  • assisted
  • public
  • urgent
  • walk-in
None specified
windows[].subquotas[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
windows[].subquotas[].unitsintegerYesNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
windows[].unitsPublished capacity in the unit basis the units policy defines.integerYesNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
windows[].unitsPolicyHow an offering converts a party into consumed recipient units, chosen by its type member.objectYesNot specifiedNone specified
windows[].unitsPolicy.aboveHighestBandWhat a party above the highest band costs, or that it is refused, chosen by its type member.objectConditionalNot specifiedNone specified
windows[].unitsPolicy.aboveHighestBand.typestringConditional
  • refuse
  • units
None specified
windows[].unitsPolicy.aboveHighestBand.unitsintegerConditionalNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
windows[].unitsPolicy.bandsarrayConditionalNot specified
  • minItems: 1
windows[].unitsPolicy.bands[]Array itemOne band of a banded units table: parties up to up_to recipients cost units.objectConditionalNot specifiedNone specified
windows[].unitsPolicy.bands[].becausestringConditionalNot specifiedNone specified
windows[].unitsPolicy.bands[].unitsintegerConditionalNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
windows[].unitsPolicy.bands[].upTointegerConditionalNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
windows[].unitsPolicy.becausestringYesNot specifiedNone specified
windows[].unitsPolicy.inputThe closed input set a banded table may read. Tier 1 reads exactly one.stringConditional
  • service-recipient-count
None specified
windows[].unitsPolicy.perRecipientintegerConditionalNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
windows[].unitsPolicy.typestringYes
  • banded-table
  • fixed
  • per-recipient
None specified
windows[].unitsPolicy.unitsintegerConditionalNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1

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 pathTypeRequiredAccepted valuesConstraints
apiVersionstringYes
  • id.registrystack.org/formats/scheduling/fixture/v1alpha1
None specified
casesarrayYesNot specified
  • maxItems: 256
  • minItems: 1
cases[]Array itemOne replayed request and its expectation.objectNoNot specifiedNone specified
cases[].expectOne case's expected outcome, chosen by its type member.objectYesNot specifiedNone specified
cases[].expect.codeA public problem code, exactly as a caller would receive it.stringConditional
  • authentication.refused
  • booking.duplicate-active
  • cancellation.cutoff-passed
  • capability.unmatched
  • capacity.exhausted
  • cursor.expired
  • cursor.invalid
  • eligibility.unavailable
  • hold.expired
  • hold.released
  • hook.unavailable
  • horizon.outside
  • idempotency.expired
  • idempotency.key-reused
  • location.closed
  • operation.not-authorized
  • party.capacity-inadequate
  • policy.changed
  • precondition.failed
  • precondition.required
  • prerequisite.missing
  • profile.not-authorized
  • receipt.unresolved
  • request.body-too-large
  • request.invalid
  • request.method-not-allowed
  • request.not-found
  • request.unprocessable
  • request.unsupported-media-type
  • revision.mismatch
  • schedule.unpublished
  • service.unavailable
None specified
cases[].expect.resourceThe pool member an exact-time case lands on. Omit it to accept any member.stringConditionalNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
cases[].expect.typestringYes
  • admitted
  • refused
None specified
cases[].expect.unitsintegerConditionalNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
cases[].nameThe case name, which also identifies the claim an admitted case records.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
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.objectYesNot specifiedNone specified
cases[].request.capabilitiesThe capabilities the party holds. A party holding none omits the member.arrayNoNot specified
  • maxItems: 256
  • uniqueItems: true
cases[].request.capabilities[]Array itemA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringNoNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
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.stringNoNot specifiedNone specified
cases[].request.duplicateKeystringNoNot specifiedNone specified
cases[].request.offeringA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
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.objectYesNot specifiedNone specified
cases[].request.party.attendeesintegerYesNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 0
cases[].request.party.recipientsintegerYesNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 0
cases[].request.policyRevisionThe policy revision the caller resolved the offering under. Replay runs the policy at revision 1.integerYesNot specified
  • format: uint64
  • maximum: 9223372036854775807
  • minimum: 1
cases[].request.prerequisitesThe prerequisites the party holds. A party holding none omits the member.arrayNoNot specified
  • maxItems: 256
  • uniqueItems: true
cases[].request.prerequisites[]Array itemstringNoNot specifiedNone 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.stringNoNot specifiedNone specified
cases[].request.startstringYesNot specified
  • format: date-time
cases[].request.windowRevisionintegerNoNot specified
  • format: uint64
  • maximum: 9223372036854775807
  • minimum: 1
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.objectYesNot specifiedNone specified
facts.exceptionsarrayNoNot specified
  • maxItems: 256
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.objectNoNot specifiedNone specified
facts.exceptions[].authoritystringNoNot specifiedNone specified
facts.exceptions[].dateThe local date, YYYY-MM-DD.stringYesNot specifiedNone specified
facts.exceptions[].endTimeThe local end time, HH:MM.stringYesNot specifiedNone specified
facts.exceptions[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
facts.exceptions[].kindThe layer an exception occupies, mirrored for records.stringYes
  • closure
  • opening
None specified
facts.exceptions[].locationThe location this exception applies to.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
facts.exceptions[].reopensstringNoNot specifiedNone specified
facts.exceptions[].startTimeThe local start time, HH:MM.stringYesNot specifiedNone specified
facts.locationsarrayNoNot specified
  • maxItems: 256
facts.locations[]Array itemA location record: the layer of configuration an operator maintains at runtime, not inside the authored policy.objectNoNot specifiedNone specified
facts.locations[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
facts.locations[].timezoneA named IANA timezone such as Asia/Bangkok.stringYesNot specifiedNone specified
facts.poolsarrayNoNot specified
  • maxItems: 256
facts.pools[]Array itemA pool of interchangeable resources backing exact-time offerings. A pool is its concrete members, never an independent counter.objectNoNot specifiedNone specified
facts.pools[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
facts.pools[].membersarrayYesNot specified
  • maxItems: 256
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.objectNoNot specifiedNone specified
facts.pools[].members[].availablebooleanYesNot specifiedNone specified
facts.pools[].members[].capabilitiesThe capabilities this member carries. Omitted or [], it carries none and serves only offerings that require none.arrayNoNot specified
  • maxItems: 256
  • uniqueItems: true
facts.pools[].members[].capabilities[]Array itemA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringNoNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
facts.pools[].members[].resourceIdA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
facts.windowsPublished arrival-window supply owned by this deployment's operator records. The policy references these records by identifier.arrayNoNot specified
  • maxItems: 256
facts.windows[]Array itemA published arrival window with its capacity.objectNoNot specifiedNone specified
facts.windows[].becausestringYesNot specifiedNone specified
facts.windows[].endstringYesNot specified
  • format: date-time
facts.windows[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
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.stringNo
  • becomes-walk-in
  • expires-unused
None specified
facts.windows[].locationA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
facts.windows[].offeringA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
facts.windows[].revisionintegerYesNot specified
  • format: uint64
  • maximum: 9223372036854775807
  • minimum: 1
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.objectNoNot specifiedNone specified
facts.windows[].staffing.becausestringYesNot specifiedNone specified
facts.windows[].staffing.poolA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
facts.windows[].staffing.reservedMembersintegerNoNot specified
  • format: uint32
  • maximum: 256
  • minimum: 1
facts.windows[].startstringYesNot specified
  • format: date-time
facts.windows[].subquotasPer-channel ceilings within units. A window that limits no channel omits the member.arrayNoNot specified
  • maxItems: 4
  • minItems: 1
facts.windows[].subquotas[]Array itemA per-channel ceiling within a window's published capacity.objectNoNot specifiedNone specified
facts.windows[].subquotas[].becausestringYesNot specifiedNone specified
facts.windows[].subquotas[].channelThe authenticated channel a subquota limits.stringYes
  • assisted
  • public
  • urgent
  • walk-in
None specified
facts.windows[].subquotas[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
facts.windows[].subquotas[].unitsintegerYesNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
facts.windows[].unitsPublished capacity in the unit basis the units policy defines.integerYesNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
facts.windows[].unitsPolicyHow an offering converts a party into consumed recipient units, chosen by its type member.objectYesNot specifiedNone specified
facts.windows[].unitsPolicy.aboveHighestBandWhat a party above the highest band costs, or that it is refused, chosen by its type member.objectConditionalNot specifiedNone specified
facts.windows[].unitsPolicy.aboveHighestBand.typestringConditional
  • refuse
  • units
None specified
facts.windows[].unitsPolicy.aboveHighestBand.unitsintegerConditionalNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
facts.windows[].unitsPolicy.bandsarrayConditionalNot specified
  • minItems: 1
facts.windows[].unitsPolicy.bands[]Array itemOne band of a banded units table: parties up to up_to recipients cost units.objectConditionalNot specifiedNone specified
facts.windows[].unitsPolicy.bands[].becausestringConditionalNot specifiedNone specified
facts.windows[].unitsPolicy.bands[].unitsintegerConditionalNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
facts.windows[].unitsPolicy.bands[].upTointegerConditionalNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
facts.windows[].unitsPolicy.becausestringYesNot specifiedNone specified
facts.windows[].unitsPolicy.inputThe closed input set a banded table may read. Tier 1 reads exactly one.stringConditional
  • service-recipient-count
None specified
facts.windows[].unitsPolicy.perRecipientintegerConditionalNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
facts.windows[].unitsPolicy.typestringYes
  • banded-table
  • fixed
  • per-recipient
None specified
facts.windows[].unitsPolicy.unitsintegerConditionalNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
initialThe claims the ledger holds before the first case. A fixture that starts from an empty ledger omits the member.arrayNoNot specified
  • maxItems: 256
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.objectNoNot specifiedNone specified
initial[].channelThe authenticated channel the claim was allocated in, when the supply carries channel subquotas.stringNo
  • assisted
  • public
  • urgent
  • walk-in
None specified
initial[].duplicateKeyThe duplicate-active key this claim holds, when the offering defines one.stringNoNot specifiedNone specified
initial[].endstringYesNot specified
  • format: date-time
initial[].expiresAtHold expiry. An expired hold stops consuming capacity at this instant even when the cleanup worker is delayed.stringNoNot specified
  • format: date-time
initial[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
initial[].kindWhat a ledger entry allocates supply for.stringYes
  • booking
  • hold
None specified
initial[].offeringThe offering whose duplicate-active policy owns this claim.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
initial[].startstringYesNot specified
  • format: date-time
initial[].supplyIdThe pool member resource (exact time) or the window (arrival) this claim occupies.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
initial[].unitsRecipient units consumed. Exact-time claims on one member consume one.integerYesNot specified
  • format: uint32
  • maximum: 2147483647
  • minimum: 1
kindstringYes
  • SchedulingFixture
None specified
nameA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
nowThe single observed instant every case runs at.stringYesNot specified
  • format: date-time

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 pathTypeRequiredAccepted valuesConstraints
apiVersionstringYes
  • id.registrystack.org/formats/scheduling/runtime/v1alpha1
None specified
auditThe audit journal: where it is written and the key its hashes use.objectYesNot specifiedNone specified
audit.destinationWhere audit entries go: a rotated file (the default) or stdout.stringNo
  • file
  • stdout
Schema default, where declared: "file"
None specified
audit.hashKeyRefSecret reference to the audit hash key.stringYesNot specified
  • pattern: ^(?:secret:env/[A-Z][A-Z0-9_]{0,127}|secret:file/[a-z][a-z0-9._-]{0,127})$
audit.pathThe active audit file. Required for, and only allowed with, file.stringConditionalNot specified
  • pattern: ^/+(?:(?:[^/.][^/]*|\.(?:[^/.][^/]*|\.[^/]+)?)/+)*(?:[^/.][^/]*|\.(?:[^/.][^/]*|\.[^/]+))$
audit.retentionDaysDelete rotated files older than this many days. Only allowed with file; omitted, rotated files are kept 90 days.integerNoNot specified
  • format: uint32
  • maximum: 36500
  • minimum: 1
audit.rotateBytesRotate the active file once it reaches this many bytes. Only allowed with file; omitted, the file rotates at 100 MiB.integerNoNot specified
  • format: uint64
  • maximum: 4294967295
  • minimum: 1048576
authenticationobjectYesNot specifiedNone specified
authentication.oidcThe access tokens this runtime accepts: the issuer and its keys, the clients admitted, and the scopes each route family requires.objectYesNot specifiedNone 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.arrayYesNot specified
  • minItems: 1
  • uniqueItems: true
authentication.oidc.allowedClients[]Array itemstringNoNot specifiedNone 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.objectNoNot specified
  • maxProperties: 64
  • minProperties: 1
authentication.oidc.assertionIssuers.*Map valuearrayNoNot specifiedSchema default, where declared:
  • maxItems: 16
  • minItems: 1
  • propertyNames.maxLength: 512
  • propertyNames.minLength: 1
  • propertyNames.pattern: ^[^\u0000-\u001F\u007F-\u009F]+$
  • uniqueItems: true
authentication.oidc.assertionIssuers.*[]Array itemstringNoNot specified
  • maxLength: 512
  • minLength: 1
authentication.oidc.audienceThe audience every accepted access token must carry in aud.stringYesNot specified
  • maxLength: 512
  • minLength: 1
authentication.oidc.explainScopeThe scope the separately authorized explain path requires.stringNoNot specifiedSchema default, where declared: "scheduling-explain"None specified
authentication.oidc.issuerExact issuer accepted in access-token iss claims, an absolute https URL.stringYesNot specified
  • format: uri
  • maxLength: 2048
  • pattern: ^[Hh][Tt][Tt][Pp][Ss]?://[^/?#@\u005C\u0000-\u0020\u007F-\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]+([/?#][^\u005C\u0000-\u0020\u007F-\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]*)?$
authentication.oidc.jwksSourceWhere the issuer's signing keys come from. Absent reads the issuer's OpenID Connect discovery document.objectNoNot 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.stringConditionalNot specified
  • pattern: ^(?:secret:env/[A-Z][A-Z0-9_]{0,127}|secret:file/[a-z][a-z0-9._-]{0,127})$
authentication.oidc.jwksSource.typestringYes
  • discovery
  • static
  • uri
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.stringConditionalNot specified
  • format: uri
  • maxLength: 2048
  • pattern: ^[Hh][Tt][Tt][Pp][Ss]?://[^/?#@\u005C\u0000-\u0020\u007F-\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]+([/?#][^\u005C\u0000-\u0020\u007F-\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]*)?$
authentication.oidc.readsScopeThe scope every listing and availability read requires.stringNoNot specifiedSchema default, where declared: "scheduling-read"None specified
authentication.oidc.scopeClaimstringNoNot 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.objectYesNot specifiedNone specified
database.migrationUrlRefSecret reference to the migration connection URL.stringYesNot specified
  • pattern: ^(?:secret:env/[A-Z][A-Z0-9_]{0,127}|secret:file/[a-z][a-z0-9._-]{0,127})$
database.runtimeUrlRefSecret reference to the least-privileged runtime connection URL.stringYesNot specified
  • pattern: ^(?:secret:env/[A-Z][A-Z0-9_]{0,127}|secret:file/[a-z][a-z0-9._-]{0,127})$
database.testOnlyPlaintextAllow a plaintext connection. Refused outside test builds.booleanNoNot specifiedSchema default, where declared: falseNone specified
database.trustedRootCertificateRefSecret reference to a PEM root certificate the connection trusts. Absent, the connection trusts the platform's root certificates.stringNoNot specified
  • pattern: ^(?:secret:env/[A-Z][A-Z0-9_]{0,127}|secret:file/[a-z][a-z0-9._-]{0,127})$
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.objectNoNot specifiedNone 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.objectNoNot specified
  • maxProperties: 128
destinations.hooks.*Map valueobjectNoNot specifiedSchema default, where declared:
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
destinations.hooks.*.attemptTimeoutMillisecondsHow long one delivery attempt may take, from 100 through 10000 milliseconds.integerNoNot specifiedSchema default, where declared: 5000
  • format: uint32
  • maximum: 10000
  • minimum: 100
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.stringYesNot specified
  • pattern: ^(?:secret:env/[A-Z][A-Z0-9_]{0,127}|secret:file/[a-z][a-z0-9._-]{0,127})$
destinations.hooks.*.maximumAttemptsHow many delivery attempts one event gets, from 1 through 20.integerNoNot specifiedSchema default, where declared: 8
  • format: uint8
  • maximum: 20
  • minimum: 1
destinations.hooks.*.urlAn https URL, or http on 127.0.0.1, localhost, or [::1], without a query or fragment.stringYesNot specified
  • format: uri
  • maxLength: 2048
  • pattern: ^[Hh][Tt][Tt][Pp][Ss]?://[^/?#@\u005C\u0000-\u0020\u007F-\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]+([/?#][^\u005C\u0000-\u0020\u007F-\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]*)?$
destinations.remindersobjectNoNot specifiedNone 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.stringNoNot specified
  • pattern: ^(?:secret:env/[A-Z][A-Z0-9_]{0,127}|secret:file/[a-z][a-z0-9._-]{0,127})$
destinations.reminders.urlAn https URL, or http on 127.0.0.1, localhost, or [::1], without a query or fragment.stringYesNot specified
  • format: uri
  • maxLength: 2048
  • pattern: ^[Hh][Tt][Tt][Pp][Ss]?://[^/?#@\u005C\u0000-\u0020\u007F-\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]+([/?#][^\u005C\u0000-\u0020\u007F-\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]*)?$
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.objectYesNot specifiedNone 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.stringYesNot specified
  • maxLength: 256
  • minLength: 1
  • pattern: ^[^\u0000-\u001f\u007f-\u009f \u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000](?:[^\u0000-\u001f\u007f-\u009f]*[^\u0000-\u001f\u007f-\u009f \u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000])?$
kindstringYes
  • SchedulingRuntimeConfig
None specified
listenerThe listener of a runtime that declares its TLS termination and network exposure.objectYesNot specifiedNone specified
listener.bindSocket address the runtime listens on, written host:port with an IP address host ([addr]:port for IPv6).stringYesNot specified
  • maxLength: 128
  • minLength: 1
listener.networkExposureThe operator-declared private network placement of an HTTP listener.stringNo
  • container-private
  • private-address
Schema default, where declared: "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.stringYes
  • development-loopback
  • operator-controlled-upstream
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].objectYesNot specifiedNone 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.stringNoNot specified
  • pattern: ^sha256:[0-9a-f]{64}$
package.rootAbsolute path of the package directory.stringYesNot specified
  • pattern: ^/
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.objectYesNot specifiedNone specified
retention.attemptReceiptRetentionDaysHow long a stored idempotency receipt stays replayable, from one through 65535 days.integerNoNot specifiedSchema default, where declared: 7
  • format: uint32
  • maximum: 65535
  • minimum: 1
retention.hookPayloadRetentionDaysLifetime of canonical hook envelopes retained for retry and dead-letter inspection, from one through thirty days.integerNoNot specifiedSchema default, where declared: 7
  • format: uint32
  • maximum: 30
  • minimum: 1
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.objectYesNot specifiedNone specified
secretProviders.environmentEnables secret:env/NAME references, read from the process environment. Declared as an empty mapping: environment: {}.objectConditionalNot specifiedNone specified
secretProviders.fileEnables secret:file/name references, read from files under root.objectConditionalNot specifiedNone 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.stringConditionalNot specified
  • pattern: ^/

and, where a rule elsewhere applies

  • pattern: ^/
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 | stringYes
  • unchecked-final-fifteen-minutes

No bound

or

  • minItems: 1
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.objectConditionalNot specifiedNone 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.stringConditionalNot specified
  • format: uri
  • maxLength: 2048
  • pattern: ^[Hh][Tt][Tt][Pp][Ss]?://[^/?#@\u005C\u0000-\u0020\u007F-\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]+([/?#][^\u005C\u0000-\u0020\u007F-\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]*)?$
taskGrantStatus[].caBundleRefPEM CA bundle for the authority and its token endpoint. Omitted, the platform's trusted roots verify them.stringConditionalNot specified
  • pattern: ^(?:secret:env/[A-Z][A-Z0-9_]{0,127}|secret:file/[a-z][a-z0-9._-]{0,127})$
taskGrantStatus[].caseworkResourceThe audience the runtime requests its status credential for, an absolute resource URI.stringConditionalNot specified
  • maxLength: 512
  • minLength: 1
  • pattern: ^[^\u0000-\u001F\u007F-\u009F]+$
taskGrantStatus[].clientAssertionAudienceAn identifier another system issues, written exactly as its issuer gives it.stringConditionalNot specified
  • maxLength: 512
  • minLength: 1
  • pattern: ^[^\u0000-\u001F\u007F-\u009F]+$
taskGrantStatus[].clientIdAn identifier another system issues, written exactly as its issuer gives it.stringConditionalNot specified
  • maxLength: 512
  • minLength: 1
  • pattern: ^[^\u0000-\u001F\u007F-\u009F]+$
taskGrantStatus[].privateKeyRefAn exact secret reference: secret:file/name, resolved under secretProviders.file.root, or secret:env/NAME, resolved only when secretProviders.environment is declared.stringConditionalNot specified
  • pattern: ^(?:secret:env/[A-Z][A-Z0-9_]{0,127}|secret:file/[a-z][a-z0-9._-]{0,127})$
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.stringConditionalNot specified
  • maxLength: 512
  • minLength: 1
  • pattern: ^[^\u0000-\u001F\u007F-\u009F]+$
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.stringConditionalNot 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.stringConditionalNot specifiedSchema default, where declared: "casework:grants:status"
  • maxLength: 512
  • minLength: 1
  • pattern: ^[^\u0000-\u001F\u007F-\u009F]+$
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.stringConditionalNot specified
  • format: uri
  • maxLength: 2048
  • pattern: ^[Hh][Tt][Tt][Pp][Ss]?://[^/?#@\u005C\u0000-\u0020\u007F-\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]+([/?#][^\u005C\u0000-\u0020\u007F-\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]*)?$

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.

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:

Terminal window
schedulingctl init ./scheduling --template standalone-exact-time
schedulingctl check ./scheduling
schedulingctl test ./scheduling

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

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 filesCheck command
Scheduling project
  • scheduling.yaml
schedulingctl check <project>
Scheduling supply records
  • records.yaml
schedulingctl check <project>
Scheduling fixture
  • fixtures/*.yaml
  • fixtures/*.yml
schedulingctl check <project>
Scheduling runtime configuration
  • runtime.yaml
  • runtime.example.yaml
schedulingctl check <project> --runtime-config <file>