From a64aa58b384051f6539922763e0c74b131f5221f Mon Sep 17 00:00:00 2001 From: tegwick Date: Sun, 4 Oct 2026 22:37:45 +0200 Subject: [PATCH] Project separate lifecycle and intake audiences for the selected workload Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a10780-6d41-7952-9718-dfbc1f41236f --- deploy/informed-decision/README.md | 22 ++++++++++++++++--- .../dispatcher.candidate.json | 7 ++++++ 2 files changed, 26 insertions(+), 3 deletions(-) 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" + } } ] }