Unreleased documentation. These pages follow the main branch and can change before the next release. For supported guidance, use v0.44.0.
You will submit one ReviewRequest as a producer, decide it as staff, and read the answer as the producer. The request carries its own snapshot, so no source registry is needed.
Install Registry Stack
Section titled “Install Registry Stack”Download one exact rstack-vX.Y.Z-install.sh and the verification material from the same Registry
Stack release. Follow the
release verification procedure
before running the installer. From the verified release directory, install the casework
component:
tag="vX.Y.Z"bash "rstack-${tag}-install.sh" caseworkrstack casework --versionThe managed installation exposes rstack on your PATH. The casework component supplies the
Casework runtime and its command-line tools from the same release.
Create the project
Section titled “Create the project”Create a project from the standalone template and work inside it:
mkdir -p tutorial-workrstack casework init tutorial-work/casework --template standalone-decisioncd tutorial-work/casework{ "command": "init", "status": "complete", "created": "tutorial-work/casework", "next": "Run caseworkctl check, test and types, then caseworkctl dev start.", "template": "standalone-decision"}Check what the policy allows
Section titled “Check what the policy allows”The project declares one ReviewPolicy, decision: who
may ask, which team answers, and the outcomes allowed. Check it offline and run its fixture:
rstack casework check .rstack casework test .{ "policyBindings": [ {"digest": "sha256:<digest>", "id": "decision", "version": "1"} ]}The digest pins the policy’s behavior. To read what that behavior is, explain it:
rstack casework explain .{ "contextCustody": "admitted bounded snapshot", "refusals": [ "untrusted producer", "policy binding mismatch", "concealed source", "changed subject or contract", "stale task revision", "ineligible reviewer" ]}Casework keeps the snapshot the producer sends and refuses each listed case.
Start the development session
Section titled “Start the development session”rstack casework dev start{ "status": "complete", "outcome": "ready", "caseworkUrl": "http://127.0.0.1:8092", "directory": {"revision": 1, "teams": 1}}PostgreSQL and a token issuer run in Docker, with one staff team seeded. .casework/dev/ holds
private credentials; keep it out of version control. The API commands get short-lived tokens for
the registered local clients in memory.
Submit a ReviewRequest
Section titled “Submit a ReviewRequest”Save the request. It names the policy, the subject under review, and the snapshot a reviewer will read:
{ "policy": {"id": "decision"}, "subject": { "source": "standalone", "type": "batch", "id": "LIC-2026-0041", "version": "1", "digest": "sha256:6a3167d79ae3308448b24f2c9c0b9ac1cf116a7ad8be0c167c7e8660e43662bb" }, "requesterReference": "LIC-2026-0041", "context": { "mode": "submitted", "snapshot": {"reference": "LIC-2026-0041", "summary": "Review licence batch LIC-2026-0041"} }}The subject digest is the producer’s own fingerprint of the version it asks about, here the SHA-256 of the snapshot’s compact JSON; Casework binds the request and its result to it. Send it:
rstack casework api /v1/review-requests \ --client requester \ --idempotency-key tutorial-review-1 \ --input request.json \ --output accepted.jsonjq . accepted.jsonrequest_id="$(jq -r .requestId accepted.json)"{ "requestId": "<id>", "policy": {"id": "decision", "version": "1", "digest": "sha256:<digest>"}, "submissionDigest": "<digest>"}The request named only the policy ID, so Casework bound it to the active version and the digest
check printed. The same body under the same key returns this request, not a second one.
Read the ReviewTask
Section titled “Read the ReviewTask”The request opened a ReviewTask. List it as staff:
rstack casework api '/v1/review-tasks?limit=25' \ --client staff \ --output tasks.jsontask_id="$(jq -r '.items[0].taskId' tasks.json)"task_revision="$(jq -r '.items[0].revision' tasks.json)"Try to read it as the producer:
rstack casework api "/v1/review-tasks/$task_id" \ --client requester \ --output refused.json || test "$?" -eq 1jq . refused.json{"code": "operation.not-authorized", "status": 403, "title": "Operation not authorized"}A producer may read its result, never the human task.
Claim and decide
Section titled “Claim and decide”Claim the task at the revision you read, so no one else decides it while you work:
rstack casework api "/v1/review-tasks/$task_id/claim" \ --client staff \ --method POST \ --if-match "\"$task_revision\"" \ --idempotency-key tutorial-claim-1 \ --output claimed.jsonjq . claimed.jsonclaimed_revision="$(jq -r .revision claimed.json)"{ "revision": 2, "state": {"held": {"holder": {"issuer": "http://127.0.0.1:8093", "subject": "<subject>"}}}}You hold the task at revision 2. Save one of the policy’s outcomes as decision.json:
{"decision":{"type":"answer","outcome":"confirmed"}}Send the decision:
rstack casework api "/v1/review-tasks/$task_id/decisions" \ --client staff \ --if-match "\"$claimed_revision\"" \ --idempotency-key tutorial-answer-1 \ --input decision.json \ --output /dev/nullThe command exits successfully when Casework records the decision and answers 204.
Read the ReviewResult
Section titled “Read the ReviewResult”Back as the producer, fetch the answer:
rstack casework api "/v1/review-requests/$request_id/result" \ --client requester \ --output result.jsonjq . result.json{"status": "answered", "outcome": "confirmed", "availableUntil": "<instant>"}The ReviewResult repeats the request’s policy, subject
and submission digest. It names no reviewer and is kept until availableUntil.
Leave it running
Section titled “Leave it running”The next page continues with this session and its policy, so leave it running. When you are
finished with Casework, run rstack casework dev stop --remove in tutorial-work/casework to delete
the session’s containers, database and credentials.
Cookies on Registry Stack
We use optional cookies to understand how you use the main Registry Stack website and this documentation. If you contact us, we may link this activity to your enquiry. You can change your choice at any time. Read the privacy policy.
Your browser asks sites not to track you, so optional tracking stays off.
We could not use or save that choice. Optional tracking remains off.