railiance-platform/docs/credential-lane-designs/informed-decision-requester-workload.md
tegwick 4ed39d91d0
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Accept native requester delivery proofs and preserve final cutover gate
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a10780-6d41-7952-9718-dfbc1f41236f
2026-10-04 23:50:18 +02:00

8.4 KiB

Current delivery state — 2026-10-04

CCR-2026-0032 is applied. The exact self-token amendment was approved and applied through attended Warden login. Dedicated manual ArgoCD application informed-decision-requester owns SA/store/ExternalSecret at 4332c39. Store Valid and ExternalSecret SecretSynced; native bounded proofs pass against candidate 804d89fb. See docs/evidence/2026-10-04-requester-delivery.json and docs/evidence/infd-requester-proof*.json. Final receiving review-pod projection and service cutover acceptance remain under INFD-WP-0007. Issuer rotation is a separate approved operation; none was performed for this delivery.

The original design record below describes preparation history. Current policy adds only self lookup/revoke; the updated helper accepts the exact legacy policy or final policy and refuses all other drift. Its receipts contain fixed phases and booleans, never CLI bytes. The earlier execution digest is superseded: CCR is now applied, so the metadata child deliberately refuses replay.

Informed-decision requester workload delivery

Status: founder-approved design for owner integration; execution pending, CCR-2026-0032, RPF-WP-0051. Demand: INFD-WP-0005-T05, message cd811073-d6db-41cf-8a57-10df0b360eab. Source preparation is authorized by the founder's RPF-WP-0050 scope selection and continuation instruction.

2026-10-04: Bernd answered "I approve" to the prepared design boundary, including namespace-level ESO trust and credential persistence beyond the reader token's lifetime. This supplies the design judgment. Owner binding/runtime acceptance and the separately reviewed live deployment remain; no repeated design decision is needed unless the boundary materially changes. CCR status remains proposed and auth claims unconfirmed while the implementation gates are open.

Exact proposed boundary

The existing KV-v2 path platform/workloads/informed-decision/sitting-requester and field CLIENT_SECRET remain issuer custody. New policy workload-kv-read-informed-decision-sitting-requester-eso reads only its exact data path. The founder-approved amendment also grants auth/token/lookup-self read and auth/token/revoke-self update. It grants no KV write, metadata read/list, wildcard or sibling access. KV ACLs apply to the entire path, not individual fields; future fields at this path require review of the reader's risk.

The prospective auth role informed-decision-sitting-requester-eso binds only ServiceAccount informed-decision/informed-decision-eso and audience openbao. Token TTL, maximum and explicit maximum are 900 seconds, with no default policy or periodic token. The review Deployment retains its own ServiceAccount review; the new ServiceAccount serves ESO authentication only. ESO's actual TokenRequest permission for this account must be verified through the owner before promotion.

The proposed ClusterSecretStore openbao-informed-decision-sitting-requester admits only namespace informed-decision. The proposed ExternalSecret and target Secret are informed-decision-sitting-requester, key client-secret, refreshed every five minutes. Explicit target annotations contain source annotation copying. Any ExternalSecret in this namespace can use the store; it is a namespace boundary, not pod-level admission. Namespace writer access remains part of owner review.

The mount proposal projects only that key at /var/run/secrets/informed-decision/requester/client-secret, read-only, mode 0440, without subPath or environment delivery. The existing review pod runs as UID/GID/fsGroup 10001. Kubernetes rotation changes the projected file; the owner callback must reopen it per exchange rather than caching the credential forever. Missing custody must fail closed and the required Secret projection is not optional.

Runtime composition remains an owner gate

The owner implements IntakeApprovalClient with an injected access-token callback; the deployed runtime does not yet compose the private intake listener or this file-backed client-credentials exchange. This packet deliberately introduces no invented environment setting or runtime JSON key. The owner must accept and compose the file callback, exact issuer/token endpoint, bounded transport with CA checks, RS256/JWKS signature verification, and claim/scope refusal before promotion.

Existing verified requester contract: client informed-decision-sitting-requester, subject informed-decision, audience approval-engine, tenant tenant:platform, service principal, role informed-decision-sitting-requester, and scope exactly approval:create. The maximum existing JWT lifetime is fifteen minutes. Human answering uses the existing browser client; no approval/read/consume scope or workload acceptance route is introduced. No client registration, custody seed or rotation occurs in this work. Existing CCR-2026-0026/0027 remain applied.

Concrete metadata child for review

scripts/informed_decision_requester_metadata.py is a silent contained child, not yet approved to run live. It requires the actual CCR's SHA256, approved status and confirmed exact binding, and an attended platform-admin identity without root or ambient token environment overrides. It checks both current policy and role before any write, refuses differing objects, writes only missing metadata objects from stdin, and verifies both afterward. Only an API 404 means absence; denial and transport errors stop the operation. It neither reads/writes KV values nor applies Kubernetes objects, and retains no token or subprocess output in a file or receipt.

After owner acceptance, exact CCR/binding approval and fresh founder go, review the exact helper and policy digests and run from that checkout in the founder's terminal:

BAO_ADDR=http://127.0.0.1:18200 VAULT_ADDR=http://127.0.0.1:18200 \
  warden access openbao-platform-admin-login --exec -- \
  python3 scripts/informed_decision_requester_metadata.py \
  --expected-ccr-sha256 <SHA256-OF-THE-APPROVED-CCR>

The argument binds the approved CCR, whose status/binding changes produce a new digest; the current proposed digest is not an execution authorization. Exit 0 means metadata readback passed; 2 means source/approval/envelope refusal; 3 means an existing object differs; 4 means command failure; 5 means malformed response or readback failure. The founder retains warden's actual completion/revocation line; its exit code alone does not establish handoff or session cleanup. Metadata success is not native reader or runtime acceptance.

The review manifests live in docs/provisioning-windows/2026-10-04-1000/informed-decision/. No active Kustomization references them. ESO/runtime promotion needs its own owner path, cluster/node and headroom checks, diff/server dry-run and approved immutable image/config. Neither this command nor the packet activates that promotion.

Owner receipt and abort contract

Record only non-secret identities, timestamps, source digests, readiness and capability booleans in receipt-contract.json or its accepted successor. Native checks must prove exact role identity/effective policy and all TTL bounds; ESO SecretSynced; safe annotation metadata; exact-file projection; sibling data GET and parent metadata LIST denial; wrong namespace/ServiceAccount/audience denial; and create-only exchange with approve/read/consume refused. Never print a real Secret, annotation contents, token/accessor or raw child error. Use the maintained secret-annotation helper for actual Secret metadata checks.

Rotation review must prove the callback observes a changed file and stops using the predecessor after coordinated issuer rotation. No issuer rotation is performed merely to prove metadata preparation. Reader token expiry/revocation and attended admin-session cleanup require native receipts.

The founder is the proposed driver and abort owner for the attended metadata step; confirm attendance at the actual window. The receiving owner must name its runtime verification/abort owner before promotion. On a partial failure, stop and establish actual state; do not overwrite conflicts or automatically delete objects. Owner-reviewed rollback withdraws this new ESO/runtime projection and disables only this new reader role, revoking its outstanding tokens through admin custody. Already materialized target Secrets need separately approved removal; deletionPolicy: Retain does not erase them. Existing verifier and attended-reader roles and the KeyCape client remain intact. If value exposure occurred, use the separate issuer incident/rotation procedure.