From 55fb078578d4c6e232372aeaa21b9d0af48c2a4f Mon Sep 17 00:00:00 2001 From: tegwick Date: Sat, 3 Oct 2026 08:11:55 +0200 Subject: [PATCH] Draft provisioning-window sitting for hub decision D1 (CUST-WP-0075) Co-Authored-By: Claude Opus 5.5 Assistant: claude-code Assistant-Model: opus Assistant-Process: 3775@bnt-lap001 Assistant-Session: cfacb6a5-ad5b-4f79-ac67-053e3b0d34a3 --- .../OPERATOR.md | 131 ++++++++ .../approval-create-intents.json | 28 ++ .../provisioning/index.json | 55 ++++ .../provisioning/infd-20261003-p01.memo.json | 1 + .../provisioning/infd-20261003-p01.packet.md | 64 ++++ .../sitting.json | 15 + tools/prepare_provisioning_window_batch.py | 290 ++++++++++++++++++ workplans/ADHOC-2026-10-03.md | 46 +++ 8 files changed, 630 insertions(+) create mode 100644 docs/batches/2026-10-03-provisioning-window/OPERATOR.md create mode 100644 docs/batches/2026-10-03-provisioning-window/approval-create-intents.json create mode 100644 docs/batches/2026-10-03-provisioning-window/provisioning/index.json create mode 100644 docs/batches/2026-10-03-provisioning-window/provisioning/infd-20261003-p01.memo.json create mode 100644 docs/batches/2026-10-03-provisioning-window/provisioning/infd-20261003-p01.packet.md create mode 100644 docs/batches/2026-10-03-provisioning-window/sitting.json create mode 100644 tools/prepare_provisioning_window_batch.py create mode 100644 workplans/ADHOC-2026-10-03.md diff --git a/docs/batches/2026-10-03-provisioning-window/OPERATOR.md b/docs/batches/2026-10-03-provisioning-window/OPERATOR.md new file mode 100644 index 0000000..abcb5a8 --- /dev/null +++ b/docs/batches/2026-10-03-provisioning-window/OPERATOR.md @@ -0,0 +1,131 @@ +# Provisioning-window sitting — operator packet (hub decision D1) + +Hub decision: `62aa95e4-3ccc-4867-8806-5e3db005b483` (D1, attended OpenBao +provisioning window), routed by CUST-WP-0075. The founder approves through +informed-decision, not with a raw hub resolve. +Review group: `net-kingdom-admins`. Surface: https://decisions.coulomb.social/ +Contract: `docs/specs/CompactSignoffBatches.md`. +Generator: `tools/prepare_provisioning_window_batch.py` (re-running rewrites the same bytes). + +An agent drafted this. It may not `accept` / `decline` / `seal`. Only the human binds. + +## One unsigned memo, four lanes excluded + +| n | memo_id | Blocking record | Question | +| --: | --- | --- | --- | +| 1 | `infd-20261003-p01` | RPF-WP-0035-T06 (railiance-platform) | Accept the passed 2026-09-13 CCR-2026-0019 scoped delivery proof? | + +Packet hash: `sha256:ee53cae14ae86dbdec2936d72f99e1285b6c714d5bd322ef30df8ffbf0939ff2`. +Required acknowledgement: the wrong-group login is untested, the 404 proves +routing only, and acceptance does not close T06 (the CCR-2026-0018 +disablement is still open). + +Excluded (no memo; the reasons are in `provisioning/index.json` → `excluded`): + +| Task | Why not ready now | +| --- | --- | +| MASON-WP-0007-T05 | The policy/role script exists, but the row-7 seed copy has no reviewed script; the T01 survey is still todo; ESO's right to create SA tokens in `tenant-engine` is unverified | +| RPF-WP-0035-T02 | The design is still `proposed`; no reviewed child command exists; KeyCape registration/custody is unverified; gated on SECRETS-WP-0007-T04 | +| RPF-WP-0035-T08 | Already provisioned and delivered 2026-09-11; what remains is owner acceptance, not an attended act (stale gate) | +| RAPPCOREHUB-WP-0003-T04 | No CCR, design or script exists for the dedicated `read:repository` identity; the identity-canon fix is also outstanding | + +Resolving hub decision D1 is a separate act, after the window has run. The +owners of the excluded lanes re-qualify their tasks. + +## Part A — circulate and bind the memo + +**A1. Dry run (shell, no credentials).** From `/home/worsch/informed-decision`: + +```bash +.venv/bin/python -B tools/create_sitting_approvals.py --dry-run \ + --sitting 2026-10-03-provisioning-window \ + --receipt 2026-10-03-provisioning-window-approval-create.json --expect 1 +``` + +Expect `memo_ids: ["infd-20261003-p01"]` and `posted: false`. + +**A2. Approval Engine tunnel (shell, separate terminal).** + +```bash +kubectl -n approval-engine port-forward svc/approval-engine 18281:8080 +``` + +**A3. Create the native approval (shell, attended, in the founder's own terminal: `! …`).** +KeyCape OIDC/MFA opens in the browser. The installed warden bundle does not +know this lane yet, so name the source catalog. Note the `--` before the child. + +```bash +WARDEN_ROUTING_CATALOG=/home/worsch/ops-warden/registry/routing/catalog.yaml \ +BAO_ADDR=http://127.0.0.1:18200 VAULT_ADDR=http://127.0.0.1:18200 \ +warden access informed-decision-sitting-requester-login --exec -- \ + /home/worsch/informed-decision/tools/create_sitting_approvals.sh \ + --sitting 2026-10-03-provisioning-window \ + --receipt 2026-10-03-provisioning-window-approval-create.json --expect 1 +``` + +The child is silent. The outcome is the receipt +`docs/evidence/2026-10-03-provisioning-window-approval-create.json`, which holds +the `approval_id` and the engine-computed binding digest and no secret. Read +warden's printed line, not its exit code. The fallback wrapper takes the same +child and the same arguments: +`python3 /home/worsch/railiance-platform/scripts/openbao-attended-exec.py --lane informed-decision-sitting-requester-login -- `. + +**A4. Flex Auth exact-record admission (repo change + deploy).** In +`access-engine/examples/informed-decision-sitting/policy.md` (formerly +flex-auth): change `version: v6` to `v7` and add `"memo:infd-20261003-p01"` with +the receipt's `approval_id`, `binding_digest`, `label: "p01"`, the binding from +`approval-create-intents.json` and `memo_version: 1`. Mirror it in +`records.json` and keep every existing record. Never add the record before A3: +an empty approval id must not become a policy value. Build in CI, bump +`access-engine/values/informed-decision-sitting.yaml` and deploy. Then, in this +repo, set `deploy/sitting-admission.json` to `policy.version: v7` with the new +`package_digest`, and roll out the review service. + +**A5. Attach and load (shell).** + +```bash +.venv/bin/python -B tools/attach_compact_bindings.py \ + --principal \ + --receipt docs/evidence/2026-10-03-provisioning-window-approval-create.json \ + --sitting 2026-10-03-provisioning-window --batches provisioning +.venv/bin/python -B tools/load_sitting_memos.py --db \ + --bound docs/batches/2026-10-03-provisioning-window/bound +``` + +The attach step writes `bound/`; the unsigned drafts stay unsigned. Load into +the live store the same way as for the 2026-09-21 sitting. + +**A6. Review and bind (browser).** Sign in at https://decisions.coulomb.social/ +with fresh MFA. Open `infd-20261003-p01`, read the packet and acknowledge the +required highlight. Then accept, return or decline. One memo, one bind. There +is no approve-all. + +## Part B — attended execution after acceptance + +This is the pattern for any lane whose memo was accepted. It is a shell step, +run in the founder's own terminal: + +```bash +BAO_ADDR=http://127.0.0.1:18200 VAULT_ADDR=http://127.0.0.1:18200 \ +warden access openbao-platform-admin-login --exec -- +``` + +The child must be silent and idempotent. Read warden's printed line: +`attended command completed but session revocation could not be confirmed` +means the child ran; `attended login failed closed before command handoff` +means it never ran. + +| memo | Command after acceptance | Owner records | +| --- | --- | --- | +| `p01` (RPF-WP-0035-T06) | **None.** The proof already ran; do not re-run it as a substitute. No platform-admin session is needed. | railiance-platform records the accepted approval id against T06 and keeps T06 open for the CCR-2026-0018 disablement. | + +When an excluded lane becomes ready, it gets its own memo in a later sitting +before anything runs. For MASON-WP-0007-T05 the policy/role half would be +`... --exec -- sh scripts/openbao-tenant-engine-audit-core-sender-eso-attended.sh`, +run from a railiance-platform checkout (exit 3 means an existing object +differs). This sitting does not authorize it. + +## Must not +- Paste or display any credential value +- Resolve hub decision D1 from this sitting alone +- Let an agent accept, decline or seal diff --git a/docs/batches/2026-10-03-provisioning-window/approval-create-intents.json b/docs/batches/2026-10-03-provisioning-window/approval-create-intents.json new file mode 100644 index 0000000..a09c80c --- /dev/null +++ b/docs/batches/2026-10-03-provisioning-window/approval-create-intents.json @@ -0,0 +1,28 @@ +{ + "kind": "informed-decision-approval-create-intents", + "sitting_id": "infd-sitting-2026-10-03-provisioning-window", + "status": "not-posted", + "posted": false, + "requester_client": "informed-decision-sitting-requester", + "human_control": true, + "pdp_path": false, + "required_count": 1, + "note": "Intents only. Digests are computed by approval-engine at create; do not invent them here.", + "intents": [ + { + "memo_id": "infd-20261003-p01", + "create_client": "informed-decision-sitting-requester", + "binding": { + "action": "accept", + "actor": "informed-decision", + "principal": "railiance-platform", + "purpose": "Accept the 2026-09-13 scoped delivery proof for the CCR-2026-0019 secrets-engine approval-client reader", + "target": { + "id": "ccr:CCR-2026-0019-delivery-proof", + "type": "credential-lane", + "system": "railiance-platform" + } + } + } + ] +} diff --git a/docs/batches/2026-10-03-provisioning-window/provisioning/index.json b/docs/batches/2026-10-03-provisioning-window/provisioning/index.json new file mode 100644 index 0000000..e9013ad --- /dev/null +++ b/docs/batches/2026-10-03-provisioning-window/provisioning/index.json @@ -0,0 +1,55 @@ +{ + "kind": "informed-decision-batch", + "id": "infd-batch-2026-10-03-provisioning-window", + "review_group": "net-kingdom-admins", + "status": "draft-unsigned", + "submitted": false, + "one_question_per_memo": true, + "approve_all_forbidden": true, + "agent_disposition_forbidden": true, + "hub_decision": "62aa95e4-3ccc-4867-8806-5e3db005b483", + "ordinal": [ + { + "n": 1, + "memo_id": "infd-20261003-p01", + "workplan": "RPF-WP-0035", + "task": "RPF-WP-0035-T06", + "hub_task_prefix": "68bff751", + "question": "Accept the passed 2026-09-13 scoped delivery proof for the CCR-2026-0019 secrets-engine approval-client reader as that reader's native delivery acceptance?", + "memo": "infd-20261003-p01.memo.json", + "packet": "infd-20261003-p01.packet.md", + "packet_hash": "sha256:ee53cae14ae86dbdec2936d72f99e1285b6c714d5bd322ef30df8ffbf0939ff2", + "required_highlight": "infd-20261003-p01-h1" + } + ], + "excluded": [ + { + "workplan": "MASON-WP-0007", + "task": "MASON-WP-0007-T05", + "owner_repo": "ops-mason", + "reason": "Half the act has no reviewed command. The policy + Kubernetes-auth role script railiance-platform scripts/openbao-tenant-engine-audit-core-sender-eso-attended.sh exists (silent, idempotent, exit 3 on drift), but the row-7 wrapped seed that copies the tenant-engine sender token from the registry to platform/workloads/tenant-engine/audit-core-sender has no script: railiance-platform says it has no helper and the plan only names 'the user-engine migration technique'. A placeholder child must not be approved. Also MASON-WP-0007-T01 (metadata survey: path unused, no conflicting names) is still todo, and ESO's right to create serviceaccounts/token in namespace tenant-engine is unverified (MASON-WP-0007-T06).", + "ready_when": "ops-mason or railiance-platform commits a reviewed silent seed helper, T01 survey is recorded, then one memo covers policy/role apply plus seed." + }, + { + "workplan": "RPF-WP-0035", + "task": "RPF-WP-0035-T02", + "owner_repo": "railiance-platform", + "reason": "Design docs/credential-lane-designs/secrets-engine-service-jwt.md is 'proposed, not provisioned'. Its 2026-09-27 return supplies inputs (openbao/auth/keycape-services-config.json, openbao/auth/secrets-engine-jwt-role.json, openbao/policies/secrets-engine-login-self.hcl) but no reviewed child command and says 'Do not execute a placeholder command'. Live KeyCape client registration and protected client-side custody remain unverified, and first-lane apply is gated on SECRETS-WP-0007-T04. The earlier sitting memo infd-20260914-c02 for this task was created 2026-09-15 and expired unbound 2026-09-16.", + "ready_when": "railiance-platform accepts the design, commits the reviewed silent install/verify child, and records KeyCape registration + custody." + }, + { + "workplan": "RPF-WP-0035", + "task": "RPF-WP-0035-T08", + "owner_repo": "railiance-platform", + "reason": "The attended first-provision already happened. factory-audit-senders-review.md 'Current execution status': both version-1 credentials provisioned (seed receipt 2026-09-11-factory-audit-sender-seed.json) and delivered (2026-09-11-factory-audit-delivery-live.json, delivered_and_scope_verified_pending_producer_acceptance); CCR-2026-0021/0022 applied; 'Do not repeat provisioning or delivery'. What remains is owner acceptance (independent archive readback, audit bearer-revocation), not an attended OpenBao act. The task's blocking_reason is stale.", + "ready_when": "railiance-platform re-qualifies T08 to its real remaining owner acceptance work." + }, + { + "workplan": "RAPPCOREHUB-WP-0003", + "task": "RAPPCOREHUB-WP-0003-T04", + "owner_repo": "rapp-core-hub", + "reason": "No credential change request, design or provisioning script exists for a dedicated read:repository Forgejo identity for the core-hub publisher (the only read:repository lane, CCR-2026-0014, belongs to policy-nexus and must not be reused). The task also needs Repo Manager to fix the identity-canon registry identity and publish a corrected image before the 123/0 snapshot can pass.", + "ready_when": "The Forgejo identity/custody owner drafts the CCR and silent provisioning child; Repo Manager ships the identity-canon correction." + } + ] +} diff --git a/docs/batches/2026-10-03-provisioning-window/provisioning/infd-20261003-p01.memo.json b/docs/batches/2026-10-03-provisioning-window/provisioning/infd-20261003-p01.memo.json new file mode 100644 index 0000000..238251b --- /dev/null +++ b/docs/batches/2026-10-03-provisioning-window/provisioning/infd-20261003-p01.memo.json @@ -0,0 +1 @@ +{"approval_binding_digest":null,"approval_id":null,"binding":{"justification":null,"principal":{"display_name":"Named reviewer in net-kingdom-admins","id":"pending-human-session","identifiers":[],"kind":"person","role":"reviewer"},"target":{"environment":"prod","id":"ccr:CCR-2026-0019-delivery-proof","kind":"credential-lane","label":"secrets-engine approval-client reader, scoped delivery proof","requires_new_bind":false},"terms":null},"binding_level":"organizational","brief":"Reader 1 (CCR-2026-0019, applied 2026-09-14) already ran its scoped delivery proof under the attended reader lane and the receipts say passed. RPF-WP-0035-T06 waits only on a human accepting that proof. Accepting runs nothing, delivers no credential and changes no OpenBao object. It does not close T06 by itself.","highlights":[{"id":"infd-20261003-p01-h1","item_id":"infd-20261003-p01-packet","locator":{"kind":"work_record","task":"RPF-WP-0035-T06","workplan":"RPF-WP-0035"},"note":"Known gaps you accept: the wrong-group human login is untested, and the read check used a nonexistent approval id (HTTP 404 proves authenticated routing, not a usable claim). The proof is from 2026-09-13 and is not re-run. Accepting does not close RPF-WP-0035-T06: the CCR-2026-0018 coordinated disablement still needs KeyCape and Approval Engine confirmation, and the file-delivered secret's removal depends on operator hygiene.","required_ack":true,"severity":"critical"}],"id":"infd-20261003-p01","locale":"en","packet":[{"hash":"sha256:ee53cae14ae86dbdec2936d72f99e1285b6c714d5bd322ef30df8ffbf0939ff2","item_id":"infd-20261003-p01-packet","label":"infd-20261003-p01-packet"}],"question":"Accept the passed 2026-09-13 scoped delivery proof for the CCR-2026-0019 secrets-engine approval-client reader as that reader's native delivery acceptance?","requested_act":"approve","sealed":false,"step_kind":"approve","ui_release":"informed-decision@0.2.0","version":1} diff --git a/docs/batches/2026-10-03-provisioning-window/provisioning/infd-20261003-p01.packet.md b/docs/batches/2026-10-03-provisioning-window/provisioning/infd-20261003-p01.packet.md new file mode 100644 index 0000000..5da11e0 --- /dev/null +++ b/docs/batches/2026-10-03-provisioning-window/provisioning/infd-20261003-p01.packet.md @@ -0,0 +1,64 @@ +# RPF-WP-0035-T06 — accept the CCR-2026-0019 scoped delivery proof + +Blocking workplan: RPF-WP-0035 (railiance-platform) +Blocking task: RPF-WP-0035-T06 (hub prefix 68bff751) +Hub decision: 62aa95e4-3ccc-4867-8806-5e3db005b483 (D1, attended provisioning window) +Design: railiance-platform `docs/credential-lane-designs/keycape-approval-client-side-readers.md` +Request: railiance-platform `credential-change-requests/CCR-2026-0019-secrets-engine-approval-client-read.yaml` (status `applied`) + +## Question +Accept the passed 2026-09-13 scoped delivery proof for the CCR-2026-0019 +secrets-engine approval-client reader as that reader's native delivery acceptance? + +## One act +Record a human acceptance of a proof that has already run. Nothing executes +because of this memo. No OpenBao, KeyCape or cluster object changes. + +## What already ran (reference only) +Both under the attended reader lane, never the platform-admin lane: + +```sh +warden access secrets-engine-approval-client-login --exec -- \ + python3 /home/worsch/railiance-platform/scripts/approval-client-reader-preflight.py +warden access secrets-engine-approval-client-login --exec -- \ + /home/worsch/secrets-engine/.venv/bin/python -B \ + /home/worsch/railiance-platform/scripts/approval-client-delivery-check.py +``` + +## Non-secret receipts (railiance-platform `docs/evidence/`) +- `2026-09-14-ccr0019-operator-binding.json` — role/policy apply and readback +- `2026-09-14-ccr0019-reader-preflight.json` — `status: passed`, `secret_values_read: false` +- `2026-09-14-ccr0019-delivery-check.json` — `status: passed`, `approval_mutations: false`, `cleanup: true` + +## Positive evidence the owner expects +- Exact read of `platform/data|metadata/workloads/secrets-engine/approval-client` +- Private delivery of the existing version-1 value; private runtime file removed +- `approval:read` token reaches Approval Engine authenticated (HTTP 404 on a fresh id) +- Warden session exited 0 after self-revocation and helper cleanup + +## Negative evidence the owner expects +- Denied: sibling `approval-engine/operator-client`, parent metadata/listing, + an unrelated workload path, policy read, role read +- `approval:consume` token refused on the read route (HTTP 403); no real approval consumed + +## Known gaps (required acknowledgement) +- Wrong-group human login untested. +- The 404 read proves routing, not a usable claim on a real approval. +- File delivery outlives the reading process; removal is operator hygiene. + +## Rollback / revocation (CCR-2026-0019 lifecycle) +- Deactivate: detach policy `workload-kv-read-secrets-engine-approval-client` from + role `secrets-engine-approval-client-workload-kv-read`; disable the ops-warden + catalog entry. The KeyCape verifier lane is unaffected. +- Compromise: KeyCape disables the `secrets-engine-approval` registration first, + then the value is rotated (shared with CCR-2026-0017) and the policy detached. + +## Not decided here +- CCR-2026-0018 retention or coordinated disablement (KeyCape + Approval Engine + + Platform). T06 stays open until both owners confirm that sequence. +- Any rotation, reseed, `approval:consume` grant, or CCR-2026-0020 (cancelled). + +## Must not +- Display or paste the client secret +- Re-run the proof as a substitute for this acceptance +- Treat acceptance as authority for any other lane in the D1 window diff --git a/docs/batches/2026-10-03-provisioning-window/sitting.json b/docs/batches/2026-10-03-provisioning-window/sitting.json new file mode 100644 index 0000000..d7858df --- /dev/null +++ b/docs/batches/2026-10-03-provisioning-window/sitting.json @@ -0,0 +1,15 @@ +{ + "kind": "informed-decision-sitting", + "id": "infd-sitting-2026-10-03-provisioning-window", + "review_group": "net-kingdom-admins", + "principal": "pending-human-session", + "status": "draft-unsigned", + "hub_decision": "62aa95e4-3ccc-4867-8806-5e3db005b483", + "batches": [ + "infd-batch-2026-10-03-provisioning-window" + ], + "memo_count": 1, + "excluded_count": 4, + "bind_path": "create approval (attended), Flex Auth exact-record admission, load store, human accept", + "note": "Unsigned draft. Live bind substitutes pending-human-session with the authenticated key-cape subject." +} diff --git a/tools/prepare_provisioning_window_batch.py b/tools/prepare_provisioning_window_batch.py new file mode 100644 index 0000000..860a57c --- /dev/null +++ b/tools/prepare_provisioning_window_batch.py @@ -0,0 +1,290 @@ +"""Draft the unsigned 2026-10-03 provisioning-window sitting (hub decision D1, CUST-WP-0075). + +Five candidate lanes were reviewed against owner source. Only lanes whose sole +missing step is a human act get a memo; the others are recorded as excluded in +the batch index with the owner-source reason. One question per memo. No secret +values. Does not submit, present, create approvals or bind. +""" +from __future__ import annotations + +import json +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +from prepare_compact_batches import REVIEW_GROUP, _memo, _sha # noqa: E402 + +from informed_decision.memo import Scope # noqa: E402 +from informed_decision.records import dumps, memo_from # noqa: E402 + +SITTING = "2026-10-03-provisioning-window" +ROOT = Path(__file__).resolve().parents[1] / "docs" / "batches" / SITTING +SITTING_ID = "infd-sitting-2026-10-03-provisioning-window" +BATCH = "provisioning" +HUB_DECISION = "62aa95e4-3ccc-4867-8806-5e3db005b483" + +MEMOS = [ + { + "id": "infd-20261003-p01", + "workplan": "RPF-WP-0035", + "task": "RPF-WP-0035-T06", + "hub_task_prefix": "68bff751", + "question": ( + "Accept the passed 2026-09-13 scoped delivery proof for the CCR-2026-0019 " + "secrets-engine approval-client reader as that reader's native delivery acceptance?" + ), + "brief": ( + "Reader 1 (CCR-2026-0019, applied 2026-09-14) already ran its scoped delivery proof " + "under the attended reader lane and the receipts say passed. RPF-WP-0035-T06 waits only " + "on a human accepting that proof. Accepting runs nothing, delivers no credential and " + "changes no OpenBao object. It does not close T06 by itself." + ), + "highlight": ( + "Known gaps you accept: the wrong-group human login is untested, and the read check used a " + "nonexistent approval id (HTTP 404 proves authenticated routing, not a usable claim). The " + "proof is from 2026-09-13 and is not re-run. Accepting does not close RPF-WP-0035-T06: the " + "CCR-2026-0018 coordinated disablement still needs KeyCape and Approval Engine confirmation, " + "and the file-delivered secret's removal depends on operator hygiene." + ), + "target": Scope( + "credential-lane", + "ccr:CCR-2026-0019-delivery-proof", + "secrets-engine approval-client reader, scoped delivery proof", + "prod", + ), + "binding": { + "action": "accept", + "actor": "informed-decision", + "principal": "railiance-platform", + "purpose": "Accept the 2026-09-13 scoped delivery proof for the CCR-2026-0019 secrets-engine approval-client reader", + "target": { + "id": "ccr:CCR-2026-0019-delivery-proof", + "type": "credential-lane", + "system": "railiance-platform", + }, + }, + "packet": """# RPF-WP-0035-T06 — accept the CCR-2026-0019 scoped delivery proof + +Blocking workplan: RPF-WP-0035 (railiance-platform) +Blocking task: RPF-WP-0035-T06 (hub prefix 68bff751) +Hub decision: 62aa95e4-3ccc-4867-8806-5e3db005b483 (D1, attended provisioning window) +Design: railiance-platform `docs/credential-lane-designs/keycape-approval-client-side-readers.md` +Request: railiance-platform `credential-change-requests/CCR-2026-0019-secrets-engine-approval-client-read.yaml` (status `applied`) + +## Question +Accept the passed 2026-09-13 scoped delivery proof for the CCR-2026-0019 +secrets-engine approval-client reader as that reader's native delivery acceptance? + +## One act +Record a human acceptance of a proof that has already run. Nothing executes +because of this memo. No OpenBao, KeyCape or cluster object changes. + +## What already ran (reference only) +Both under the attended reader lane, never the platform-admin lane: + +```sh +warden access secrets-engine-approval-client-login --exec -- \\ + python3 /home/worsch/railiance-platform/scripts/approval-client-reader-preflight.py +warden access secrets-engine-approval-client-login --exec -- \\ + /home/worsch/secrets-engine/.venv/bin/python -B \\ + /home/worsch/railiance-platform/scripts/approval-client-delivery-check.py +``` + +## Non-secret receipts (railiance-platform `docs/evidence/`) +- `2026-09-14-ccr0019-operator-binding.json` — role/policy apply and readback +- `2026-09-14-ccr0019-reader-preflight.json` — `status: passed`, `secret_values_read: false` +- `2026-09-14-ccr0019-delivery-check.json` — `status: passed`, `approval_mutations: false`, `cleanup: true` + +## Positive evidence the owner expects +- Exact read of `platform/data|metadata/workloads/secrets-engine/approval-client` +- Private delivery of the existing version-1 value; private runtime file removed +- `approval:read` token reaches Approval Engine authenticated (HTTP 404 on a fresh id) +- Warden session exited 0 after self-revocation and helper cleanup + +## Negative evidence the owner expects +- Denied: sibling `approval-engine/operator-client`, parent metadata/listing, + an unrelated workload path, policy read, role read +- `approval:consume` token refused on the read route (HTTP 403); no real approval consumed + +## Known gaps (required acknowledgement) +- Wrong-group human login untested. +- The 404 read proves routing, not a usable claim on a real approval. +- File delivery outlives the reading process; removal is operator hygiene. + +## Rollback / revocation (CCR-2026-0019 lifecycle) +- Deactivate: detach policy `workload-kv-read-secrets-engine-approval-client` from + role `secrets-engine-approval-client-workload-kv-read`; disable the ops-warden + catalog entry. The KeyCape verifier lane is unaffected. +- Compromise: KeyCape disables the `secrets-engine-approval` registration first, + then the value is rotated (shared with CCR-2026-0017) and the policy detached. + +## Not decided here +- CCR-2026-0018 retention or coordinated disablement (KeyCape + Approval Engine + + Platform). T06 stays open until both owners confirm that sequence. +- Any rotation, reseed, `approval:consume` grant, or CCR-2026-0020 (cancelled). + +## Must not +- Display or paste the client secret +- Re-run the proof as a substitute for this acceptance +- Treat acceptance as authority for any other lane in the D1 window +""", + }, +] + +EXCLUDED = [ + { + "workplan": "MASON-WP-0007", + "task": "MASON-WP-0007-T05", + "owner_repo": "ops-mason", + "reason": ( + "Half the act has no reviewed command. The policy + Kubernetes-auth role script " + "railiance-platform scripts/openbao-tenant-engine-audit-core-sender-eso-attended.sh exists " + "(silent, idempotent, exit 3 on drift), but the row-7 wrapped seed that copies the tenant-engine " + "sender token from the registry to platform/workloads/tenant-engine/audit-core-sender has no " + "script: railiance-platform says it has no helper and the plan only names 'the user-engine " + "migration technique'. A placeholder child must not be approved. Also MASON-WP-0007-T01 " + "(metadata survey: path unused, no conflicting names) is still todo, and ESO's right to create " + "serviceaccounts/token in namespace tenant-engine is unverified (MASON-WP-0007-T06)." + ), + "ready_when": ( + "ops-mason or railiance-platform commits a reviewed silent seed helper, T01 survey is recorded, " + "then one memo covers policy/role apply plus seed." + ), + }, + { + "workplan": "RPF-WP-0035", + "task": "RPF-WP-0035-T02", + "owner_repo": "railiance-platform", + "reason": ( + "Design docs/credential-lane-designs/secrets-engine-service-jwt.md is 'proposed, not provisioned'. " + "Its 2026-09-27 return supplies inputs (openbao/auth/keycape-services-config.json, " + "openbao/auth/secrets-engine-jwt-role.json, openbao/policies/secrets-engine-login-self.hcl) but " + "no reviewed child command and says 'Do not execute a placeholder command'. Live KeyCape client " + "registration and protected client-side custody remain unverified, and first-lane apply is " + "gated on SECRETS-WP-0007-T04. The earlier sitting memo infd-20260914-c02 for this task was " + "created 2026-09-15 and expired unbound 2026-09-16." + ), + "ready_when": ( + "railiance-platform accepts the design, commits the reviewed silent install/verify child, and " + "records KeyCape registration + custody." + ), + }, + { + "workplan": "RPF-WP-0035", + "task": "RPF-WP-0035-T08", + "owner_repo": "railiance-platform", + "reason": ( + "The attended first-provision already happened. factory-audit-senders-review.md 'Current " + "execution status': both version-1 credentials provisioned (seed receipt " + "2026-09-11-factory-audit-sender-seed.json) and delivered (2026-09-11-factory-audit-delivery-live.json, " + "delivered_and_scope_verified_pending_producer_acceptance); CCR-2026-0021/0022 applied; 'Do not " + "repeat provisioning or delivery'. What remains is owner acceptance (independent archive readback, " + "audit bearer-revocation), not an attended OpenBao act. The task's blocking_reason is stale." + ), + "ready_when": "railiance-platform re-qualifies T08 to its real remaining owner acceptance work.", + }, + { + "workplan": "RAPPCOREHUB-WP-0003", + "task": "RAPPCOREHUB-WP-0003-T04", + "owner_repo": "rapp-core-hub", + "reason": ( + "No credential change request, design or provisioning script exists for a dedicated " + "read:repository Forgejo identity for the core-hub publisher (the only read:repository lane, " + "CCR-2026-0014, belongs to policy-nexus and must not be reused). The task also needs Repo " + "Manager to fix the identity-canon registry identity and publish a corrected image before the " + "123/0 snapshot can pass." + ), + "ready_when": ( + "The Forgejo identity/custody owner drafts the CCR and silent provisioning child; Repo Manager " + "ships the identity-canon correction." + ), + }, +] + + +def main() -> None: + directory = ROOT / BATCH + directory.mkdir(parents=True, exist_ok=True) + ordinal = [] + intents = [] + for n, spec in enumerate(MEMOS, start=1): + packet_path = directory / f"{spec['id']}.packet.md" + packet_path.write_text(spec["packet"], encoding="utf-8") + digest = _sha(spec["packet"]) + memo = _memo( + memo_id=spec["id"], + question=spec["question"], + brief=spec["brief"], + target=spec["target"], + packet_id=spec["id"] + "-packet", + packet_hash=digest, + highlight=spec["highlight"], + workplan=spec["workplan"], + task=spec["task"], + ) + if memo_from(json.loads(dumps(memo))).question != spec["question"]: + raise RuntimeError("round-trip failed") + memo_path = directory / f"{spec['id']}.memo.json" + memo_path.write_text(dumps(memo) + "\n", encoding="utf-8") + ordinal.append( + { + "n": n, + "memo_id": spec["id"], + "workplan": spec["workplan"], + "task": spec["task"], + "hub_task_prefix": spec["hub_task_prefix"], + "question": spec["question"], + "memo": memo_path.name, + "packet": packet_path.name, + "packet_hash": digest, + "required_highlight": f"{spec['id']}-h1", + } + ) + intents.append({"memo_id": spec["id"], "create_client": "informed-decision-sitting-requester", "binding": spec["binding"]}) + index = { + "kind": "informed-decision-batch", + "id": f"infd-batch-{SITTING}", + "review_group": REVIEW_GROUP, + "status": "draft-unsigned", + "submitted": False, + "one_question_per_memo": True, + "approve_all_forbidden": True, + "agent_disposition_forbidden": True, + "hub_decision": HUB_DECISION, + "ordinal": ordinal, + "excluded": EXCLUDED, + } + (directory / "index.json").write_text(json.dumps(index, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") + create = { + "kind": "informed-decision-approval-create-intents", + "sitting_id": SITTING_ID, + "status": "not-posted", + "posted": False, + "requester_client": "informed-decision-sitting-requester", + "human_control": True, + "pdp_path": False, + "required_count": 1, + "note": "Intents only. Digests are computed by approval-engine at create; do not invent them here.", + "intents": intents, + } + (ROOT / "approval-create-intents.json").write_text(json.dumps(create, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") + sitting = { + "kind": "informed-decision-sitting", + "id": SITTING_ID, + "review_group": REVIEW_GROUP, + "principal": "pending-human-session", + "status": "draft-unsigned", + "hub_decision": HUB_DECISION, + "batches": [index["id"]], + "memo_count": len(MEMOS), + "excluded_count": len(EXCLUDED), + "bind_path": "create approval (attended), Flex Auth exact-record admission, load store, human accept", + "note": "Unsigned draft. Live bind substitutes pending-human-session with the authenticated key-cape subject.", + } + (ROOT / "sitting.json").write_text(json.dumps(sitting, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") + print(f"Wrote {len(MEMOS)} unsigned memo(s), {len(EXCLUDED)} excluded lane(s) under {ROOT}") + + +if __name__ == "__main__": + main() diff --git a/workplans/ADHOC-2026-10-03.md b/workplans/ADHOC-2026-10-03.md new file mode 100644 index 0000000..c847ace --- /dev/null +++ b/workplans/ADHOC-2026-10-03.md @@ -0,0 +1,46 @@ +--- +id: INFD-WP-ADHOC-2026-10-03 +type: workplan +title: "Provisioning-window sitting draft for hub decision D1" +domain: infotech +repo: informed-decision +status: blocked +owner: claude +created: "2026-10-03" +updated: "2026-10-03" +related: + - CUST-WP-0075 +--- + +## Draft the provisioning-window sitting + +```task +id: INFD-WP-ADHOC-2026-10-03-T01 +status: done +priority: high +``` + +Dispatched by the-custodian under CUST-WP-0075. The founder wants hub decision +`62aa95e4-3ccc-4867-8806-5e3db005b483` (D1, attended OpenBao provisioning +window) approved through informed-decision. Batch: +`docs/batches/2026-10-03-provisioning-window/` (generator +`tools/prepare_provisioning_window_batch.py`, operator steps in its +`OPERATOR.md`). Five candidate lanes were read against owner source. One memo, +`infd-20261003-p01` (RPF-WP-0035-T06, acceptance of the CCR-2026-0019 scoped +delivery proof), was drafted. MASON-WP-0007-T05, RPF-WP-0035-T02, +RPF-WP-0035-T08 and RAPPCOREHUB-WP-0003-T04 were excluded with reasons in the +batch index. Unsigned; no approval created, nothing submitted. + +## Circulate and bind the sitting + +```task +id: INFD-WP-ADHOC-2026-10-03-T02 +status: wait +needs_human: true +decision_id: 62aa95e4-3ccc-4867-8806-5e3db005b483 +blocking_reason: "Founder runs OPERATOR.md Part A: attended approval create, Flex Auth v7 exact-record admission, load, human bind at decisions.coulomb.social." +priority: high +``` + +Agents do not create the approval, admit the record, or bind. After the human +disposition, record the receipt under `docs/evidence/` and update `sitting.json`.