diff --git a/deploy/informed-decision/README.md b/deploy/informed-decision/README.md index 1cfcf28..8ce1e35 100644 --- a/deploy/informed-decision/README.md +++ b/deploy/informed-decision/README.md @@ -25,9 +25,10 @@ Concurrent enqueue may report queue_busy while dispatch is in flight; retry the same explicit enqueue after the bounded attempt. SIGTERM stops between attempts. The worker uses the selected existing State Hub service account. It has no -Service/Ingress, database credential, browser route or approval scopes. Only the -intake-audience token is mounted: lifecycle API clients must use their separately -admitted lifecycle-audience token. Token mounts are read-only without subPath. +Service/Ingress, database credential, browser route or approval scopes. Separate 600-second tokens are projected for intake and lifecycle audiences. +The dispatcher reads only intake-token; admitted headless lifecycle clients use +lifecycle-token inside this workload context. Neither token is printed or +exported through the Hub API. Token mounts are read-only without subPath. The worker image does not change the Hub API image or PostgreSQL schema. All execution that can write this private queue or run commands as this workload @@ -40,3 +41,18 @@ requester delivery, the INFD lifecycle service and policy candidates. Retain the PVC and rows on withdrawal; rollback stops the worker but does not undo submitted memos, native approvals or human acts. Native human acceptance and audit receipts remain STATE-WP-0096-T03 / INFD-WP-0007-T07. + + +Explicit queueing from an authorized workstation session (the file contains the +exact envelope returned by lifecycle request-review, not an access token): + +```sh +kubectl -n state-hub exec -i deployment/state-hub-memo-dispatch -- \ + python -m api.services.memo_dispatch --queue /data/private enqueue \ + --envelope /dev/stdin < /private/review-envelope.json +``` + +This is a per-decision data operation, not a deployment. Headless clients call +8081 with the appropriate projected audience and the normal API idempotency key; +they never request approval:approve or approval:consume. Automatic scanning and +a public delegate endpoint are deliberately outside this worker's contract. diff --git a/deploy/informed-decision/dispatcher.candidate.json b/deploy/informed-decision/dispatcher.candidate.json index 40d7403..2e3c381 100644 --- a/deploy/informed-decision/dispatcher.candidate.json +++ b/deploy/informed-decision/dispatcher.candidate.json @@ -120,6 +120,13 @@ "expirationSeconds": 600, "path": "intake-token" } + }, + { + "serviceAccountToken": { + "audience": "informed-decision-lifecycle", + "expirationSeconds": 600, + "path": "lifecycle-token" + } } ] }