RPF-WP-0054-T05 probe passed; publish secrets-engine JWT login contract
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s

- CCR-2026-0040/0043 re-applied 2026-10-10T09:15Z. Probe: generated v1, a
  second run refused (already_present), tokens revoked, no value read,
  probe entry deleted. Receipts in docs/evidence.
- CCR-2026-0038: login proof passed (secrets-engine a963a77); the consumer
  contract is published at docs/contracts/secrets-engine-openbao-jwt-login.yaml.
  RPF-WP-0035-T02 still waits on the negative claim checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 469992@bnt-lap001
Assistant-Session: e4b8e420-df0a-441d-83ae-7f19130594d9
This commit is contained in:
codex 2026-10-10 11:18:38 +02:00
parent 6f77484785
commit c924ff2279
6 changed files with 142 additions and 7 deletions

View file

@ -5,7 +5,7 @@ request_type: custody-generate-grant
title: Broker grant keycape/client-secret-generate (create-only, generate in custody)
status: applied
created: '2026-10-09'
updated: '2026-10-09'
updated: '2026-10-10'
requester:
agent: railiance-platform
reason: RPF-WP-0054-T04. net-kingdom SecurityCaseType oidc-browser-relying-party
@ -82,6 +82,18 @@ verification:
- Readback matched source for both policies and the token role.
- Issuer policy is not bound to any identity by this apply.
- No secret values were read, written, printed, or accepted in argv.
- at: '2026-10-10T09:15:46+00:00'
actor: founder
kind: delegated_metadata_apply
result: passed
details:
- Delegated metadata applier ran as founder using local bao CLI ambient authority.
- 'Policy metadata write: sys/policies/acl/keycape-client-secret-generate'
- 'Issuer policy metadata write: sys/policies/acl/credential-broker-keycape-client-secret-generate-issuer'
- 'Token role metadata write: auth/token/roles/keycape-client-secret-generate'
- Readback matched source for both policies and the token role.
- Issuer policy is not bound to any identity by this apply.
- No secret values were read, written, printed, or accepted in argv.
lifecycle:
deactivate: Delete auth/token/roles/keycape-client-secret-generate, then both policies;
generated entries stay in custody with their cases.

View file

@ -60,8 +60,8 @@ risk:
notes:
- Membership of net-kingdom-admins is the access decision; that group already holds
the KeyCape operator reader (CCR-2026-0034).
- Worst case within 15m is unused keycape/<client_id> entries;
existing entries cannot be overwritten (CCR-2026-0040 is create-only).
- Worst case within 15m is unused keycape/<client_id> entries; existing entries
cannot be overwritten (CCR-2026-0040 is create-only).
verification:
positive:
- Readback after apply matches source for the role (done by applier-apply; prints
@ -86,6 +86,16 @@ verification:
- 'OIDC role metadata write: auth/netkingdom/role/credential-broker-keycape-client-secret-generate'
- Readback matched source for the role.
- No secret values were read, written, printed, or accepted in argv.
- at: '2026-10-10T09:15:56+00:00'
actor: founder
kind: delegated_metadata_apply
result: passed
details:
- Delegated metadata applier ran as founder using local bao CLI ambient authority.
- 'Issuer policy confirmed live and matching source: sys/policies/acl/credential-broker-keycape-client-secret-generate-issuer'
- 'OIDC role metadata write: auth/netkingdom/role/credential-broker-keycape-client-secret-generate'
- Readback matched source for the role.
- No secret values were read, written, printed, or accepted in argv.
lifecycle:
deactivate: Delete auth/netkingdom/role/credential-broker-keycape-client-secret-generate.
rotate: Not applicable (no stored credential).

View file

@ -0,0 +1,8 @@
# Consumer contract for secrets-engine service-JWT login to OpenBao (CCR-2026-0038).
# Published by railiance-platform 2026-10-10 after the login proof passed
# (secrets-engine docs/evidence/2026-10-10-keycape-openbao-probe.json, a963a77).
# Non-secret. Point SECRETS_ENGINE_OPENBAO_JWT_LOGIN at a copy of this file.
# Identical to the founder's probe input; that local copy may be kept as is.
mount: keycape-services
role: secrets-engine-openbao
bound_issuer: https://kc.coulomb.social

View file

@ -0,0 +1,94 @@
{
"actor": "founder",
"ccrs": [
"CCR-2026-0040",
"CCR-2026-0043"
],
"date": "2026-10-10",
"note": "Receipts copied verbatim (no values). First attempt failed at grant token creation (limited-use caller token) and wrote nothing; fixed in 6f77484, both CCRs re-applied. Caller token after fix: policies [credential-broker-keycape-client-secret-generate-issuer], num_uses 0. Probe entry metadata-deleted afterwards by platform-admin.",
"receipts": {
"dry_run": {
"case_ref": "probe-secret-generate-20261010@sha256:9cb9b2da16f4a8e5a6dfccad23d1849110485d452e098ff8cbd7a4066447e956",
"case_verified": true,
"client_id": "probe-secret-generate-20261010",
"credential_values_emitted": false,
"exit_code": 0,
"grant": "keycape/client-secret-generate",
"grant_token_revoked": true,
"mode": "dry-run",
"outcome": "dry_run_would_generate",
"path": "platform/workloads/keycape/probe-secret-generate-20261010",
"schema": "platform.keycape-client-secret-generate.v1",
"value_reads": 0
},
"first_attempt_1": {
"case_ref": "probe-secret-generate-20261010@sha256:9cb9b2da16f4a8e5a6dfccad23d1849110485d452e098ff8cbd7a4066447e956",
"case_verified": true,
"client_id": "probe-secret-generate-20261010",
"credential_values_emitted": false,
"exit_code": 4,
"grant": "keycape/client-secret-generate",
"mode": "generate",
"outcome": "grant_token_create_failed",
"path": "platform/workloads/keycape/probe-secret-generate-20261010",
"schema": "platform.keycape-client-secret-generate.v1",
"value_reads": 0
},
"first_attempt_2": {
"case_ref": "probe-secret-generate-20261010@sha256:9cb9b2da16f4a8e5a6dfccad23d1849110485d452e098ff8cbd7a4066447e956",
"case_verified": true,
"client_id": "probe-secret-generate-20261010",
"credential_values_emitted": false,
"exit_code": 4,
"grant": "keycape/client-secret-generate",
"mode": "generate",
"outcome": "grant_token_create_failed",
"path": "platform/workloads/keycape/probe-secret-generate-20261010",
"schema": "platform.keycape-client-secret-generate.v1",
"value_reads": 0
},
"first_attempt_dry_run": {
"case_ref": "probe-secret-generate-20261010@sha256:9cb9b2da16f4a8e5a6dfccad23d1849110485d452e098ff8cbd7a4066447e956",
"case_verified": true,
"client_id": "probe-secret-generate-20261010",
"credential_values_emitted": false,
"exit_code": 4,
"grant": "keycape/client-secret-generate",
"mode": "dry-run",
"outcome": "grant_token_create_failed",
"path": "platform/workloads/keycape/probe-secret-generate-20261010",
"schema": "platform.keycape-client-secret-generate.v1",
"value_reads": 0
},
"generate": {
"case_ref": "probe-secret-generate-20261010@sha256:9cb9b2da16f4a8e5a6dfccad23d1849110485d452e098ff8cbd7a4066447e956",
"case_verified": true,
"client_id": "probe-secret-generate-20261010",
"credential_values_emitted": false,
"exit_code": 0,
"grant": "keycape/client-secret-generate",
"grant_token_revoked": true,
"kv_version": 1,
"mode": "generate",
"outcome": "generated",
"path": "platform/workloads/keycape/probe-secret-generate-20261010",
"schema": "platform.keycape-client-secret-generate.v1",
"value_reads": 0
},
"second_generate_refused": {
"case_ref": "probe-secret-generate-20261010@sha256:9cb9b2da16f4a8e5a6dfccad23d1849110485d452e098ff8cbd7a4066447e956",
"case_verified": true,
"client_id": "probe-secret-generate-20261010",
"credential_values_emitted": false,
"exit_code": 3,
"grant": "keycape/client-secret-generate",
"grant_token_revoked": true,
"mode": "generate",
"outcome": "already_present",
"path": "platform/workloads/keycape/probe-secret-generate-20261010",
"schema": "platform.keycape-client-secret-generate.v1",
"value_reads": 0
}
},
"schema": "platform.evidence.rpf-wp-0054-t05-probe.v1"
}

View file

@ -47,7 +47,7 @@ status: wait
needs_human: true
decision_id: 62aa95e4-3ccc-4867-8806-5e3db005b483
depends_on: [KEY-WP-0037-T02, KEY-WP-0037-T03, KEY-WP-0037-T04]
blocking_reason: "CCR-2026-0038 approved, binding confirmed and applied by the founder 2026-10-08T22:42Z (readback matched; evidence in the CCR). Waits only on the login proof with a real KeyCape service JWT (SECRETS-WP-0012-T03 probe-openbao) and the negative checks listed in the CCR."
blocking_reason: "CCR-2026-0038 applied 2026-10-08. The login proof passed 2026-10-10 (secrets-engine a963a77, message 0dba7e04), and the consumer contract is published at docs/contracts/secrets-engine-openbao-jwt-login.yaml. Still waits on the CCR negative checks (wrong aud/sub/tenant/principal_type/roles/scope, a coding-agent JWT and an expired JWT refused; capabilities-self deny on the guarded paths), then ops-mason MASON-WP-0009-T05."
priority: high
state_hub_task_id: "e0c82ea9-05a5-537e-8fbf-67534263572e"
```

View file

@ -189,9 +189,8 @@ is needed.
```task
id: RPF-WP-0054-T05
status: todo
status: done
priority: high
needs_human: true
depends_on: [RPF-WP-0054-T03, RPF-WP-0054-T04]
state_hub_task_id: "a21d1915-fee9-5c31-89e7-a4560c645950"
```
@ -263,6 +262,13 @@ The issuer policy lacked `auth/token/revoke-self`; it is now added. Re-apply
CCR-2026-0040 (issuer policy) before CCR-2026-0043 (role), because the binding
apply refuses unless the live issuer policy matches source.
2026-10-10 second probe passed after re-applying both CCRs (09:15Z). The
caller token held only the issuer policy with num_uses 0. Results: dry-run
`dry_run_would_generate`; generate `generated`, kv_version 1; second run exit 3
`already_present`. The grant token was revoked every time, operator
`revoke-self` succeeded, and no value was read. The probe entry was then
metadata-deleted. Receipts: `docs/evidence/2026-10-10-keycape-client-secret-generate-probe.json`.
The policy denials (data read, update, delete, other paths) were already proven
by the CCR-2026-0040 readback and its policy tests. The probe proves the live
create-once behaviour.
@ -273,7 +279,7 @@ Record the receipts under `docs/evidence/`.
```task
id: RPF-WP-0054-T06
status: todo
status: progress
priority: medium
depends_on: [RPF-WP-0054-T05]
state_hub_task_id: "d7015584-3429-5f32-b4bc-0a9b64017c15"
@ -286,6 +292,11 @@ plan NK-WP-0048-T06. Consider declaring the `c3.runtime-secrets` capability so
the case type can compose mint-secret instead of treating it as a follow-through
step (net-kingdom case README "Known limits").
2026-10-10: ops-warden catalogued the lane as draft (ops-warden 0ae8a0e,
playbook `wiki/playbooks/keycape-client-secret-generate.md`) and activates it
when platform confirms. Probe receipt sent. Activation is held until key-cape
confirms the secret format (T01/T03).
## T07 — Rotation lane (separate, later)
```task