Skip to content
Registry StackDocsDevelopment (unreleased)

Author a Casework policy

View as Markdown

If you are writing the policy a Registry Casework deployment will run, you edit a project directory and check it offline, with no database and no network. You continue in tutorial-work/casework, the project from Decide your first ReviewRequest, with its development session still running.

casework.yaml is the policy. dev-clients.yaml names the local callers and teams for caseworkctl dev, fixtures/ holds the cases test proves, and runtime.example.yaml is a starting runtime configuration for a deployment. .casework/schemas/ holds the JSON Schemas your editor reads through each file’s first-line comment. Check the project as it stands:

Terminal window
caseworkctl check .
{
"filesChecked": 3,
"policyBindings": [
{"digest": "sha256:<digest>", "id": "decision", "version": "1"}
]
}

Check reads casework.yaml, dev-clients.yaml, the development session’s state file while one exists, and any holiday-sets/, and prints one binding for each ReviewPolicy. When a file is wrong, it prints a refusal with a code such as casework.review-policy.unknown-queue, the file, line, and JSON pointer, and the next step to take.

Each access profile admits a token that carries its requiredScopes, takes the caller’s identity from principalClaim, and gives the caller one role: staff, supervisor, administrator, or requester. The project declares one of each:

casework.yaml
accessProfiles:
staff:
principalClaim: sub
requiredScopes: [casework:staff]
role: staff

A queue is where a stage’s ReviewTasks wait. Its label is what reviewers see, so give it the name your team uses:

casework.yaml
queues:
decisions:
label: Decisions awaiting review
label: Licence decisions

Labels are excluded from the policy digest, so check still prints the same binding.

casework.yaml
reviewPolicies:
decision:
version: "1"
purpose: answer
context: {mode: submitted}
stages:
- id: answer
queue: decisions
decidingProfiles: [staff]
requiredApprovals: 1

A ReviewPolicy fixes the purpose, the stages in order, the profiles that decide each stage, the displaySchema reviewers see, and the outcomes a decision may record. Each outcome sets its settlement, whether a reason is required, and whether a public reason is required, optional, or none. A larger policy adds routing rules that send a task to another queue by its fields, and teams that state which profiles a queue’s staff must hold.

For an approval policy, you can start with caseworkctl init --template single-reviewer-approval, two-peer-approval, or technical-check-then-authorization. The two-peer pattern supplies two local people on one Staff profile. The technical pattern gives its first stage negativeDecisions: advise: each completed decision counts toward its threshold, including a rejection or request for changes, then a separate authorizer decides. The default, settle, retains the immediate negative veto. An advisory stage must have a later stage; check refuses an advisory final stage. explain reports the effective mode.

Earlier advisory reasons remain available to authorized reviewers in decision history. The producer receives only the settling outcome and its public reason. All three patterns exclude the initiator; the technical pattern also excludes earlier reviewers from authorization.

context: {mode: submitted} reviews the snapshot the producer sent. A policy whose reviewers must see the source’s current record sets mode: current-source and names a context provider, as Review a Proposal in Casework does. trustedProducers names each calling system: its access profile, issuer, subject, source namespaces, and the policies it may request.

The digest covers the policy’s behavior and everything it depends on: stages, context, outcomes, access profiles, queues, teams, producers, and the clocks and calendars it uses. A producer that names only the policy ID is bound to the active version and digest when Casework accepts its request. A producer that pins version and digest is refused with review.policy-mismatch once the active digest changes.

A clock measures a deadline, and a stage clock counts working days on a calendar. Add a calendar and a five-day review deadline to the end of casework.yaml:

casework.yaml
calendars:
office:
timezone: Asia/Bangkok
workingWeekdays: [monday, tuesday, wednesday, thursday, friday]
holidaySet: office-holidays
clocks:
review-deadline:
type: stage
anchor: {type: stage-entered}
calendar: office
after: {workingDays: 5}
dueTime: "17:00"
atRisk: {before: {workingDays: 1}}
reminders: {due-soon: {before: {workingDays: 1}}}

The task is due at 17:00 Bangkok time on the fifth working day after it enters the stage, and is at risk one working day before. A clock may also carry steps that move a due task to another queue; it never decides an outcome. Attach the clock to the policy:

casework.yaml
requiredApprovals: 1
clocks: [review-deadline]
retention:

The calendar’s working days exclude the dates of its holiday set. Write one revision of it, so check validates it with the project:

Terminal window
mkdir -p holiday-sets
holiday-sets/office-holidays-7.yaml
apiVersion: id.registrystack.org/formats/casework/holiday-set/v1alpha1
kind: CaseworkHolidaySet
holidaySet: office-holidays
revision: 7
dates: [2026-09-07]

Check the project and prove its fixture again. The clock changed the policy’s behavior, so its digest changes:

Terminal window
caseworkctl check .
caseworkctl test .
{
"filesChecked": 4,
"policyBindings": [
{"digest": "sha256:<digest>", "id": "decision", "version": "1"}
]
}
{"proofBoundary": "offline-synthetic", "productionClosure": false}

offline-synthetic means no PostgreSQL and no runtime decision took part.

A producer’s client code is written against typed bindings: the policy bindings and the TypeScript and Python types for its requests, tasks, and results. Generate them outside the project and hand them to the producer’s developers:

Terminal window
caseworkctl types . --output ../casework-types
{
"files": ["casework.ts", "casework.py", "contexts.schema.json"],
"output": "../casework-types"
}

Then plan the policy package without writing it:

Terminal window
caseworkctl package . --dry-run
{
"dryRun": true,
"files": ["casework.yaml"],
"packageDigest": "sha256:<digest>"
}

The package digest covers the bytes of every packaged file, so any edit changes it. The holiday set is not packaged: an administrator publishes its revisions to the running service, and until one is published the stage clock cannot compute a due time. Deploy Registry Casework activates the package.

The running session serves the package it built when it started, and it refuses to restart on edited files while it holds records, so discard it and start a fresh one. This deletes the ReviewRequest you decided earlier and the session’s credentials:

Terminal window
caseworkctl dev stop --remove
caseworkctl dev start
{"status": "complete", "outcome": "stopped", "directory": {"revision": 0, "teams": 0}}
{"status": "complete", "outcome": "ready", "directory": {"revision": 1, "teams": 1}}

The session keeps its ports. Its tokens are new, so run caseworkctl dev token again before your next call. Leave it running.

Format and filesCheck command
Casework project
  • casework.yaml
caseworkctl check <project>
Casework runtime configuration
  • runtime.yaml
  • runtime.example.yaml
caseworkctl check <project> --runtime-config <file>
Casework fixture
  • fixtures/*.yaml
  • fixtures/*.yml
caseworkctl test <project>
Casework holiday set
  • holiday-sets/*.yaml
  • holiday-sets/*.yml
caseworkctl check <project>
Casework development clients
  • dev-clients.yaml
caseworkctl check <project>

casework.yaml

Source preview, pre-1.0

Generated from products/casework/generated/project/project.schema.json. 178 key paths. Explained in docs/site/src/content/docs/configure/casework.mdx.

Key pathTypeRequiredAccepted valuesConstraints
accessProfilesobjectYesNot specifiedNone specified
accessProfiles.*Map valueobjectNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
accessProfiles.*.principalClaimstringYesNot specifiedNone specified
accessProfiles.*.requiredScopesarrayYesNot specified
  • minItems: 1
  • uniqueItems: true
accessProfiles.*.requiredScopes[]Array itemstringNoNot specifiedNone specified
accessProfiles.*.rolestringYes
  • administrator
  • requester
  • staff
  • supervisor
None specified
apiVersionstringYes
  • id.registrystack.org/formats/casework/project/v1alpha1
None specified
calendarsobjectNoNot specifiedSchema default, where declared: {}None specified
calendars.*Map valueobjectNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
calendars.*.holidaySetstringYesNot specifiedNone specified
calendars.*.timezonestringYesNot specifiedNone specified
calendars.*.workingWeekdaysarrayYesNot specified
  • uniqueItems: true
calendars.*.workingWeekdays[]Array itemstringNo
  • friday
  • monday
  • saturday
  • sunday
  • thursday
  • tuesday
  • wednesday
None specified
clocksobjectNoNot specifiedSchema default, where declared: {}None specified
clocks.*Map valueThe serialized form of [ClockPolicy]: the shape the serializer emits.objectNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
clocks.*.afterFor subject: An elapsed budget in exactly one unit; a day is 24 elapsed hours. For stage: A number of working days: after: {workingDays: N}, and the lead time inside before.objectYesNot specifiedNone specified
clocks.*.after.daysintegerConditionalNot specified
  • format: uint32
  • maximum: 3650
  • minimum: 1
clocks.*.after.hoursintegerConditionalNot specified
  • format: uint32
  • maximum: 87600
  • minimum: 1
clocks.*.after.minutesintegerConditionalNot specified
  • format: uint32
  • maximum: 5256000
  • minimum: 1
clocks.*.after.workingDaysintegerConditionalNot specified
  • format: uint32
  • maximum: 3650
  • minimum: 1
clocks.*.anchorFor subject: The instant a subject clock counts from: anchor: {type: request-accepted}. For stage: The instant a stage clock counts from: anchor: {type: stage-entered}.objectYesNot specifiedNone specified
clocks.*.anchor.typestringYes
  • request-accepted
  • stage-entered
None specified
clocks.*.atRiskA lead time before a stage clock is due: {before: {workingDays: N}}.objectConditionalNot specifiedNone specified
clocks.*.atRisk.beforeA number of working days: after: {workingDays: N}, and the lead time inside before.objectConditionalNot specifiedNone specified
clocks.*.atRisk.before.workingDaysintegerConditionalNot specified
  • format: uint32
  • maximum: 3650
  • minimum: 1
clocks.*.calendarstringConditionalNot specifiedNone specified
clocks.*.dueTimestringConditionalNot specifiedNone specified
clocks.*.remindersobjectConditionalNot specifiedNone specified
clocks.*.reminders.*Map valueA named reminder, written reminders: {ID: {before: {workingDays: N}}}.objectConditionalNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
clocks.*.reminders.*.beforeA number of working days: after: {workingDays: N}, and the lead time inside before.objectConditionalNot specifiedNone specified
clocks.*.reminders.*.before.workingDaysintegerConditionalNot specified
  • format: uint32
  • maximum: 3650
  • minimum: 1
clocks.*.stepsarrayConditionalNot specifiedNone specified
clocks.*.steps[]Array itemobjectConditionalNot specifiedNone specified
clocks.*.steps[].actionobjectConditionalNot specifiedNone specified
clocks.*.steps[].action.reassignobjectConditionalNot specifiedNone specified
clocks.*.steps[].action.reassign.queuestringConditionalNot specifiedNone specified
clocks.*.steps[].atstringConditional
  • due
None specified
clocks.*.steps[].becauseHuman-readable display text. Bidirectional embedding, override, and isolate controls, byte-order marks, line and paragraph separators, and Unicode noncharacters are refused; multilingual joiners and direction marks remain valid.stringConditionalNot specifiedNone specified
clocks.*.steps[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringConditionalNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
clocks.*.typestringYes
  • stage
  • subject
None specified
contextProvidersobjectNoNot specifiedSchema default, where declared: {}None specified
contextProviders.*Map valueobjectNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
contextProviders.*.capabilitiesarrayYesNot specified
  • uniqueItems: true
contextProviders.*.capabilities[]Array itemstringNo
  • human-display
  • routing-context
  • service-status
  • task-grant-context
None specified
contextProviders.*.deploymentRefstringYesNot specifiedNone specified
contextProviders.*.descriptionstringNoNot specifiedNone specified
contextProviders.*.serviceProfilesobjectNoNot specifiedSchema default, where declared: {}None specified
contextProviders.*.serviceProfiles.human-displaystringNoNot specifiedNone specified
contextProviders.*.serviceProfiles.routing-contextstringNoNot specifiedNone specified
contextProviders.*.serviceProfiles.service-statusstringNoNot specifiedNone specified
contextProviders.*.serviceProfiles.task-grant-contextstringNoNot specifiedNone specified
contextProviders.*.sourceNamespacestringYesNot specifiedNone specified
inboxobjectNoNot specifiedSchema default, where declared: {"defaultPageSize":25,"maximumCandidateScan":100,"maximumConcurrentSourceReads":4,"maximumSourceReads":25,"pageDeadlineMilliseconds":2000}None specified
inbox.defaultPageSizeintegerNoNot specifiedSchema default, where declared: 25
  • format: uint32
  • maximum: 100
  • minimum: 1
inbox.maximumCandidateScanintegerNoNot specifiedSchema default, where declared: 100
  • format: uint32
  • maximum: 10000
  • minimum: 1
inbox.maximumConcurrentSourceReadsintegerNoNot specifiedSchema default, where declared: 4
  • format: uint32
  • maximum: 32
  • minimum: 1
inbox.maximumSourceReadsintegerNoNot specifiedSchema default, where declared: 25
  • format: uint32
  • maximum: 10000
  • minimum: 1
inbox.pageDeadlineMillisecondsintegerNoNot specifiedSchema default, where declared: 2000
  • format: uint64
  • maximum: 30000
  • minimum: 100
kindstringYes
  • CaseworkProject
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
queuesobjectYesNot specifiedNone specified
queues.*Map valueobjectNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
queues.*.labelHuman-readable display text. Bidirectional embedding, override, and isolate controls, byte-order marks, line and paragraph separators, and Unicode noncharacters are refused; multilingual joiners and direction marks remain valid.stringYesNot specifiedNone specified
reviewPoliciesobjectNoNot specifiedSchema default, where declared: {}None specified
reviewPolicies.*Map valueobjectNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
reviewPolicies.*.clocksarrayNoNot specifiedNone specified
reviewPolicies.*.clocks[]Array itemstringNoNot specifiedNone specified
reviewPolicies.*.contextobjectYesNot specifiedNone specified
reviewPolicies.*.context.contractobjectConditionalNot specifiedNone specified
reviewPolicies.*.context.contract.idThe producer-issued contract id, kept exactly as written: nonblank, no control characters, and at most 256 UTF-8 bytes. The byte ceiling is enforced by the Casework reader.stringConditionalNot specified
  • maxLength: 256
  • maxLength: 512
  • minLength: 1
  • pattern: \S
  • pattern: ^[^\u0000-\u001F\u007F-\u009F]+$
reviewPolicies.*.context.contract.revisionstringConditionalNot specified
  • maxLength: 71
  • minLength: 71
  • pattern: ^sha256:[0-9a-f]{64}$
reviewPolicies.*.context.contract.schemaDigestA SHA-256 digest: sha256: followed by 64 lowercase hex digits.stringConditionalNot specified
  • pattern: ^sha256:[0-9a-f]{64}$
reviewPolicies.*.context.modestringYes
  • current-source
  • submitted
None specified
reviewPolicies.*.context.providerstringConditionalNot specifiedNone specified
reviewPolicies.*.displaySchemaNot specifiedYesNot specifiedNone specified
reviewPolicies.*.labelOptional presentation label. Stable references use id.stringNoNot specifiedNone specified
reviewPolicies.*.outcomesWritten in configuration as a mapping from each outcome id; served as a list by id.objectNoNot specifiedNone specified
reviewPolicies.*.outcomes.*Map valueobjectNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
reviewPolicies.*.outcomes.*.labelHuman-readable display text. Bidirectional embedding, override, and isolate controls, byte-order marks, line and paragraph separators, and Unicode noncharacters are refused; multilingual joiners and direction marks remain valid.stringYesNot specifiedNone specified
reviewPolicies.*.outcomes.*.publicReasonWhether a decision with this outcome gives text for release to the subject's owner. There is no default: the policy author decides what an applicant is told.stringYes
  • none
  • optional
  • required
None specified
reviewPolicies.*.outcomes.*.reasonRequiredbooleanYesNot specifiedNone specified
reviewPolicies.*.outcomes.*.resultRequiredbooleanNoNot specifiedNone specified
reviewPolicies.*.outcomes.*.settlementstringYes
  • answered
  • approved
  • changes-requested
  • rejected
None specified
reviewPolicies.*.purposestringYes
  • answer
  • approval
None specified
reviewPolicies.*.resultSchemaNot specifiedNoNot specifiedNone specified
reviewPolicies.*.retentionobjectYesNot specifiedNone specified
reviewPolicies.*.retention.accountabilityRetentionDaysintegerYesNot specified
  • format: uint32
  • maximum: 3650
  • minimum: 1
reviewPolicies.*.retention.terminalRetentionDaysintegerYesNot specified
  • format: uint32
  • maximum: 3650
  • minimum: 1
reviewPolicies.*.routingarrayNoNot specifiedNone specified
reviewPolicies.*.routing[]Array itemobjectNoNot specifiedNone specified
reviewPolicies.*.routing[].becauseHuman-readable display text. Bidirectional embedding, override, and isolate controls, byte-order marks, line and paragraph separators, and Unicode noncharacters are refused; multilingual joiners and direction marks remain valid.stringYesNot specifiedNone specified
reviewPolicies.*.routing[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
reviewPolicies.*.routing[].labelOptional presentation label. Stable references use id.stringNoNot specifiedNone specified
reviewPolicies.*.routing[].queuestringYesNot specifiedNone specified
reviewPolicies.*.routing[].whenobjectYesNot specifiedNone specified
reviewPolicies.*.routing[].when.fieldsobjectNoNot specifiedNone specified
reviewPolicies.*.routing[].when.fields.*Map valueThe written form of [RoutingPredicate], an externally tagged union the shared reader decodes with positions.objectNoNot specified
  • propertyNames.maxLength: 512
  • propertyNames.minLength: 1
  • propertyNames.pattern: ^[^\u0000-\u001F\u007F-\u009F]+$
reviewPolicies.*.routing[].when.fields.*.equalsNot specifiedConditionalNot specifiedNone specified
reviewPolicies.*.routing[].when.fields.*.oneOfarrayConditionalNot specifiedNone specified
reviewPolicies.*.routing[].when.stagestringNoNot specifiedNone specified
reviewPolicies.*.stagesarrayYesNot specifiedNone specified
reviewPolicies.*.stages[]Array itemobjectNoNot specifiedNone specified
reviewPolicies.*.stages[].decidingProfilesarrayYesNot specifiedNone specified
reviewPolicies.*.stages[].decidingProfiles[]Array itemstringNoNot specifiedNone specified
reviewPolicies.*.stages[].excludeInitiatorbooleanNoNot specifiedSchema default, where declared: falseNone specified
reviewPolicies.*.stages[].excludePreviousStageReviewersbooleanNoNot specifiedSchema default, where declared: falseNone specified
reviewPolicies.*.stages[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
reviewPolicies.*.stages[].labelOptional presentation label. Stable references use id.stringNoNot specifiedNone specified
reviewPolicies.*.stages[].negativeDecisionsControls whether a rejection or change request settles the whole review. settle is the default; advise records and counts the decision toward this non-final stage without settling the review.stringNo
  • advise
  • settle
Schema default, where declared: "settle"
None specified
reviewPolicies.*.stages[].queuestringYesNot specifiedNone specified
reviewPolicies.*.stages[].requiredApprovalsintegerYesNot specified
  • format: uint32
  • maximum: 32
  • minimum: 1
reviewPolicies.*.versionstringYesNot specifiedNone specified
taskTemplatesobjectNoNot specifiedSchema default, where declared: {}None specified
taskTemplates.*Map valueobjectNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
taskTemplates.*.agentThe agent a template names, as casework.yaml writes it: the issuer is the URL of the token issuer that authenticates the agent (CFG-VAL-7).objectYesNot specifiedNone specified
taskTemplates.*.agent.issuerAn 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.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]*)?$
taskTemplates.*.agent.subjectstringYesNot specifiedNone specified
taskTemplates.*.authorizationModeImmediate authorizations last at most fifteen minutes. Deferred is an explicit governed window of at most seven days; assertion TTL stays sixty seconds.stringNo
  • deferred
  • immediate
None specified
taskTemplates.*.boundsThe product-specific authority a task grant carries, chosen by its type member. The shared reader's union helper decodes it so every error inside a variant keeps its position (CFG-SCHEMA-8); the wire form is unchanged.objectYesNot specifiedNone specified
taskTemplates.*.bounds.permissionsarrayConditionalNot specifiedNone specified
taskTemplates.*.bounds.permissions[]Array itemExact Scheduling commitment authority copied into a task grant. This duplicates the public wire shape deliberately: Casework is an authority for governed templates, not a dependency on Scheduling's runtime or model crate.objectConditionalNot specifiedNone specified
taskTemplates.*.bounds.permissions[].actionsarrayConditionalNot specifiedNone specified
taskTemplates.*.bounds.permissions[].actions[]Array itemstringConditionalNot specifiedNone specified
taskTemplates.*.bounds.permissions[].collectionstringConditionalNot specifiedNone specified
taskTemplates.*.bounds.permissions[].locationstringConditionalNot specifiedNone specified
taskTemplates.*.bounds.permissions[].operationsarrayConditionalNot specifiedNone specified
taskTemplates.*.bounds.permissions[].operations[]Array itemstringConditionalNot specifiedNone specified
taskTemplates.*.bounds.permissions[].servicestringConditionalNot specifiedNone specified
taskTemplates.*.bounds.requirementstringConditionalNot specifiedNone specified
taskTemplates.*.bounds.typestringYes
  • breg
  • evidence
  • scheduling
None specified
taskTemplates.*.clientstringYesNot specifiedNone specified
taskTemplates.*.eligibleProfilesarrayYesNot specifiedNone specified
taskTemplates.*.eligibleProfiles[]Array itemstringNoNot specifiedNone specified
taskTemplates.*.eligibleTeamsarrayYesNot specifiedNone specified
taskTemplates.*.eligibleTeams[]Array itemstringNoNot specifiedNone specified
taskTemplates.*.evidenceContextEvidence-only requester context signed into the authority assertion. Other products derive neither requester admission nor relying-party audience from these fields and therefore forbid the block entirely.objectNoNot specifiedNone specified
taskTemplates.*.evidenceContext.audiencestringYesNot specifiedNone specified
taskTemplates.*.evidenceContext.requesterTagsarrayYesNot specifiedNone specified
taskTemplates.*.evidenceContext.requesterTags[]Array itemstringNoNot specifiedNone specified
taskTemplates.*.labelHuman-readable display text. Bidirectional embedding, override, and isolate controls, byte-order marks, line and paragraph separators, and Unicode noncharacters are refused; multilingual joiners and direction marks remain valid.stringYesNot specifiedNone specified
taskTemplates.*.lifetimeSecondsintegerYesNot specified
  • format: uint64
  • maximum: 604800
  • minimum: 1

and, where a rule elsewhere applies

  • maximum: 604800

or

  • maximum: 900
taskTemplates.*.purposestringYesNot specifiedNone specified
taskTemplates.*.resourcestringYesNot specifiedNone specified
taskTemplates.*.reviewPoliciesPolicies whose currently held ReviewTasks may issue this grant.arrayNoNot specifiedNone specified
taskTemplates.*.reviewPolicies[]Array itemstringNoNot specifiedNone specified
taskTemplates.*.scopesarrayYesNot specifiedNone specified
taskTemplates.*.scopes[]Array itemstringNoNot specifiedNone specified
taskTemplates.*.sourcestringYesNot specifiedNone specified
taskTemplates.*.subjectsExact token identity keys mapped to governed source logical fields. Values are extracted from the approving caller's disclosed source read.objectYesNot specifiedNone specified
taskTemplates.*.subjects.*Map valuestringNoNot specified
  • propertyNames.maxLength: 512
  • propertyNames.minLength: 1
  • propertyNames.pattern: ^[^\u0000-\u001F\u007F-\u009F]+$
taskTemplates.*.versionstringYesNot specifiedNone specified
teamsobjectNoNot specifiedSchema default, where declared: {}None specified
teams.*Map valueobjectNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
teams.*.labelHuman-readable display text. Bidirectional embedding, override, and isolate controls, byte-order marks, line and paragraph separators, and Unicode noncharacters are refused; multilingual joiners and direction marks remain valid.stringYesNot specifiedNone specified
teams.*.memberProfilesarrayYesNot specifiedNone specified
teams.*.memberProfiles[]Array itemstringNoNot specifiedNone specified
teams.*.servesarrayYesNot specifiedNone specified
teams.*.serves[]Array itemstringNoNot specifiedNone specified
teams.*.supervisorProfilesarrayYesNot specifiedNone specified
teams.*.supervisorProfiles[]Array itemstringNoNot specifiedNone specified
trustedProducersobjectNoNot specifiedSchema default, where declared: {}None specified
trustedProducers.*Map valueobjectNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
trustedProducers.*.completionobjectNoNot specifiedNone specified
trustedProducers.*.completion.destinationIdstringYesNot specifiedNone specified
trustedProducers.*.completion.recipientBindingstringYesNot specifiedNone specified
trustedProducers.*.initiatorProfileThe requester profile a person named as this producer's initiator authenticates with to read the requester-visible history of their own requests. Absent, no initiator reads anything.stringNoNot specifiedNone specified
trustedProducers.*.issuerAn 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.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]*)?$
trustedProducers.*.profilestringYesNot specifiedNone specified
trustedProducers.*.retentionHow long Casework keeps what a producer needs to recover a submission.objectYesNot specifiedNone specified
trustedProducers.*.retention.receiptRetentionDaysDays a submission receipt stays readable for recovery, at most 365.integerYesNot specified
  • format: uint32
  • maximum: 365
  • minimum: 1
trustedProducers.*.reviewPoliciesarrayYesNot specifiedNone specified
trustedProducers.*.reviewPolicies[]Array itemstringNoNot specifiedNone specified
trustedProducers.*.sourceNamespacesarrayYesNot specifiedNone specified
trustedProducers.*.sourceNamespaces[]Array itemstringNoNot specifiedNone specified
trustedProducers.*.subjectstringYesNot specifiedNone specified
trustedProducers.*.trustedInitiatorIssuerAn 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.stringNoNot 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]*)?$

fixtures/*.yaml

Source preview, pre-1.0

Generated from products/casework/generated/fixture/fixture.schema.json. 11 key paths. Explained in docs/site/src/content/docs/configure/casework.mdx.

Key pathTypeRequiredAccepted valuesConstraints
apiVersionstringYes
  • id.registrystack.org/formats/casework/fixture/v1alpha1
None specified
expectobjectYesNot specified
  • minProperties: 1
expect.outcomesarrayNoNot specified
  • minItems: 1
  • uniqueItems: true
expect.outcomes[]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}$
expect.queueA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringNoNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
kindstringYes
  • CaseworkFixture
None specified
reviewobjectYesNot specifiedNone specified
review.displayBusiness values remain JSON; the selected policy owns their schema.objectYesNot specifiedNone specified
review.display.*Map valueNot specifiedNoNot specifiedNone specified
review.policyA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$

dev-clients.yaml

Source preview, pre-1.0

Generated from products/casework/generated/dev-clients/dev-clients.schema.json. 50 key paths. Explained in docs/site/src/content/docs/configure/casework.mdx.

Key pathTypeRequiredAccepted valuesConstraints
apiVersionstringYes
  • id.registrystack.org/formats/casework/dev-clients/v1alpha1
None specified
clientsLocal teaching clients bound to access profiles casework.yaml declares.arrayYesNot specifiedNone specified
clients[]Array itemobjectNoNot specifiedNone specified
clients[].accessProfileThe access profile this client binds. Several clients may share a profile.stringYesNot specifiedNone specified
clients[].claimsAt most 32 token claims; registered access-token claims are reserved.objectNoNot specifiedNone specified
clients[].claims.*Map valuestringNoNot specified
  • propertyNames.maxLength: 512
  • propertyNames.minLength: 1
  • propertyNames.pattern: ^[^\u0000-\u001F\u007F-\u009F]+$
clients[].idissuer is reserved for the local token issuer.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
clients[].scopes1 to 32 distinct RFC 6749 scope-tokens of at most 256 bytes.arrayYesNot specifiedNone specified
clients[].scopes[]Array itemstringNoNot specifiedNone specified
directoryThe teams the first start seeds, one for each queue.arrayNoNot specifiedNone specified
directory[]Array itemobjectNoNot specifiedNone specified
directory[].queueThe queue this team serves; one team serves each queue.stringYesNot specifiedNone specified
directory[].staff1 to 32 clients bound to a Staff profile.arrayYesNot specifiedNone specified
directory[].staff[]Array itemstringNoNot specifiedNone specified
directory[].supervisorsAt most 32 clients bound to a Supervisor profile.arrayNoNot specifiedNone specified
directory[].supervisors[]Array itemstringNoNot specifiedNone specified
directory[].teamA lowercase letter, then at most 63 lowercase letters, digits, _, or -.stringYesNot specifiedNone specified
integrationsSource-backed development: source bindings, service clients, and the local task authority.objectNoNot specifiedNone specified
integrations.browserClientsInteractive OAuth clients explicitly admitted from a borrowed issuer.arrayNoNot specifiedNone specified
integrations.browserClients[]Array itemstringNoNot specifiedNone specified
integrations.contextProvidersOptional provider connections keyed by their declared deploymentRef.objectNoNot specifiedNone specified
integrations.contextProviders.*Map valueEnvironment-specific transport and reader identity. Human display always replaces it.objectNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
integrations.contextProviders.*.baseUrlAn 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.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]*)?$
integrations.contextProviders.*.clientAssertionAudiencestringNoNot specifiedNone specified
integrations.contextProviders.*.clientAssertionKeyRefAn 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})$
integrations.contextProviders.*.clientIdRefAn 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})$
integrations.contextProviders.*.resourcestringNoNot specifiedNone specified
integrations.contextProviders.*.scopesarrayNoNot specifiedNone specified
integrations.contextProviders.*.scopes[]Array itemstringNoNot specifiedNone specified
integrations.contextProviders.*.statusProfilestringYesNot specifiedNone specified
integrations.contextProviders.*.taskGrantProfilestringNoNot specifiedNone specified
integrations.contextProviders.*.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.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]*)?$
integrations.resourceAudience accepted by this Casework session.stringYesNot specifiedNone specified
integrations.secretFilesOwner-only files copied into the retained private secret root.objectNoNot specifiedNone specified
integrations.secretFiles.*Map valuestringNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
integrations.serviceClientsarrayNoNot specifiedNone specified
integrations.serviceClients[]Array itemobjectNoNot specifiedNone specified
integrations.serviceClients[].claimsToken claims of at most 256 bytes each, written as text.objectNoNot specifiedNone specified
integrations.serviceClients[].claims.*Map valuestringNoNot specified
  • propertyNames.maxLength: 512
  • propertyNames.minLength: 1
  • propertyNames.pattern: ^[^\u0000-\u001F\u007F-\u009F]+$
integrations.serviceClients[].idA local identifier: a lowercase letter, then up to 63 lowercase letters, digits, _, or -.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
integrations.serviceClients[].resourceOmission means this Casework session's generated audience.stringNoNot specifiedNone specified
integrations.serviceClients[].scopesarrayYesNot specifiedNone specified
integrations.serviceClients[].scopes[]Array itemstringNoNot specifiedNone specified
integrations.serviceClients[].taskExchangebooleanNoNot specifiedSchema default, where declared: falseNone specified
integrations.taskAuthorityobjectNoNot specifiedNone specified
integrations.taskAuthority.issuerLogical issuer, independent of the local API transport URL; an 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]*)?$
integrations.taskAuthority.jwksPortPublic-key-only listener, reachable from the stock issuer container.integerYesNot specified
  • format: uint32
  • maximum: 65535
  • minimum: 1
integrations.taskAuthority.statusClientsobjectYesNot specifiedNone specified
integrations.taskAuthority.statusClients.*Map valuestringNoNot specified
  • propertyNames.pattern: ^[a-z][a-z0-9_-]{0,63}$
kindstringYes
  • CaseworkDevClients
None specified

holiday-sets/*.yaml

Source preview, pre-1.0

Generated from products/casework/generated/holiday-set/holiday-set.schema.json. 6 key paths. Explained in docs/site/src/content/docs/configure/casework.mdx.

Key pathTypeRequiredAccepted valuesConstraints
apiVersionstringYes
  • id.registrystack.org/formats/casework/holiday-set/v1alpha1
None specified
datesThe dates that are not working days, at most 3660.arrayYesNot specified
  • maxItems: 3660
  • uniqueItems: true
dates[]Array itemstringNoNot specified
  • format: date
  • pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$
holidaySetThe holiday set a calendar names in holidaySet.stringYesNot specified
  • pattern: ^[a-z][a-z0-9_-]{0,63}$
kindstringYes
  • CaseworkHolidaySet
None specified
revisionintegerYesNot specified
  • format: uint64
  • maximum: 9223372036854775807
  • minimum: 1

Staff the directory