Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 306568@bnt-lap001 Assistant-Session: 8bdf8150-ea56-41e7-9132-13f04f6b0b91
5 KiB
| id | type | title | domain | repo | status | owner | created | updated | flavor | origin | origin_ref |
|---|---|---|---|---|---|---|---|---|---|---|---|
| RPF-WP-0061 | workplan | Self-service CCR intake: clients file and progress CCRs without a platform worker | financials | railiance-platform | proposed | codex | 2026-10-18 | 2026-10-18 | implementation | cross-repo | ops-mason daa119e6 / 049afa1f; MASON-IN-0005 |
Demand: every credential change request today waits on a railiance-platform
worker session to allocate the CCR number, copy the client's draft and policy
file into this repo, run credential-change.py validate, write the platform
owner review and relay the founder command. For routine lanes the worker adds
no judgement: ops-mason already produces drafts that pass validate
(MASON-WP-0010-T03, MASON-WP-0014), and from MASON-IN-0005 ops-mason can apply
workload-kv-read-* policies and external-secrets-* roles itself. The worker
has become a relay, and clients stall whenever no platform session runs.
Goal: a client can take a standard CCR from draft to approved and applied using only repo tooling, CI and the State Hub decision flow. Platform judgement is moved into a versioned, reviewed standard lane profile; only requests that fall outside it are routed to a platform worker.
Invariants (unchanged by this plan):
- CCRs remain non-secret repo files in
credential-change-requests/; the repo stays authoritative and the hub stays a read model. - Founder approval is never automated. Bound claims still need
confirm-bindingagainst native state before apply. - Nothing here widens ops-mason-construct or any applier grant; secret-id, token creation and value reads stay with the founder and applier.
Design
- Submit. The client runs, in a railiance-platform checkout,
scripts/credential-change.py submit --bundle <dir>(ormake ccr-submit). It copies the CCR and policy file, allocates the next freeCCR-YYYY-NNNNfrom the files on the currentmain, setsstatus: proposed, validates, commits on branchccr/<id>-<slug>and pushes. A push or merge race simply re-allocates; git is the allocator, so no central counter or agent is needed. - Platform review as policy-as-code.
credential-change.py review-standard <ccr>checks the standard lane profile (registry/ccr-standard-profile.yaml):workload-kv-read; kubernetes auth; exactly one KV path underplatform/workloads/<a>/<b>orplatform/suppliers/<supplier>/<account>; policy file byte-equal to the generated HCL (read on the data path plus lookup/revoke-self only); ttl and max ttl ≤ 15m;token_no_default_policy: true; one SA in one namespace; no other CCR inproposed|approved|activereading the same path. A pass appends therailiance-platform-ownerreview comment with the profile version and digest. A fail writes the reasons and marks the CCRneeds_platform_review, which sends one hub message torailiance-platform. - CI gate. A Forgejo Action on
ccr/*branches runsvalidate,review-standardand the secret scan; only a green branch fast-forwards tomain. The client merges its own green branch. - Founder decision.
submitrecords a State Hub decision for the CCR (templates exist indecision-templates). The founder resolves it; anyone runssync-decisionto move the file toapproved/needs_changes. - Apply and evidence. In-profile CCRs are applied by ops-mason under
ops-mason-construct, or by the applier, after
confirm-binding;record-evidencecloses the CCR toactive. - Platform oversight. Platform owns the profile and reviews changes to it
like code. A weekly
credential-change.py audit-standardlists every auto-reviewed CCR so a platform session can spot-check after the fact.
T01 — Define the standard lane profile
id: RPF-WP-0061-T01
status: todo
priority: high
Write registry/ccr-standard-profile.yaml from the existing approved ESO
lanes (CCR-2026-0033, -0035, -0041, -0050, -0051 shapes). Record which past
CCRs would and would not have passed it.
T02 — submit and review-standard subcommands
id: RPF-WP-0061-T02
status: todo
priority: high
Add both subcommands to scripts/credential-change.py with tests covering
id allocation, duplicate-path refusal, policy-file mismatch and every profile
rule. review-standard never touches OpenBao.
T03 — CI gate on ccr/* branches
id: RPF-WP-0061-T03
status: todo
priority: medium
Forgejo Action running validate, review-standard and the secret scan; confirm
which identities may push ccr/* (ops-mason first).
T04 — Hub decision on submit and client-run sync-decision
id: RPF-WP-0061-T04
status: todo
priority: medium
T05 — Client documentation and first self-service CCR
id: RPF-WP-0061-T05
status: todo
priority: medium
Document the flow in docs/credential-change-approval.md and notify
ops-mason and ops-warden. Acceptance: one CCR filed, reviewed, approved and
applied by a client with no railiance-platform worker session involved.