secrets-engine/workplans/SECRETS-WP-0012-keycape-openbao-consumer-custody.md
tegwick a963a77bc7
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 2s
Close SECRETS-WP-0012-T03: service-JWT OpenBao login probe passed
Record the founder-run probe-openbao result as non-secret evidence,
finish SECRETS-WP-0012 and point SECRETS-WP-0008-T06 at the remaining
platform negative checks.

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

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 544698@bnt-lap001
Assistant-Session: 279b8520-335f-4041-ba2a-9491335473db
2026-10-10 10:19:19 +02:00

109 lines
4.3 KiB
Markdown

---
id: SECRETS-WP-0012
type: workplan
title: "KeyCape secrets-engine-openbao consumer custody acceptance"
domain: infotech
repo: secrets-engine
status: finished
flavor: implementation
owner: claude-code
topic_slug: custodian
created: "2026-10-06"
updated: "2026-10-10"
related_workplans:
- SECRETS-WP-0008
state_hub_workstream_id: "143de42b-b568-5070-add0-d5e71eabd436"
---
# SECRETS-WP-0012 - KeyCape secrets-engine-openbao consumer custody acceptance
Demand: KEY-WP-0037-T02 and RPF-WP-0035-T02 (proposed CCR-2026-0033) need
secrets-engine's source acceptance of the consumer copy of the
`secrets-engine-openbao` client secret: host, owner, path, mode, delivery,
rotation/revocation ownership and a bounded validation interface. The founder
approved the two-copy custody boundary (decision
`632a8893-0d6a-4591-a50b-40bbdb798f32`), not generation, fetch, delivery,
registration or deployment. Live service-JWT adoption stays SECRETS-WP-0008-T06.
Redirected 2026-10-06: founder direction keeps the secret only in OpenBao, and
the ops-mason plan `keycape-secrets-engine-openbao-client-custody` (658cdbc)
replaces the consumer file with a per-command in-memory read (T02 cancelled,
T04 implements it, T03 is the first live use). T01's file checks remain for
the approval client only.
Packet: [docs/keycape-openbao-consumer-custody.md](../docs/keycape-openbao-consumer-custody.md).
## Consumer packet and strict file acceptance
```task
id: SECRETS-WP-0012-T01
status: done
priority: high
state_hub_task_id: "d7978a83-0760-5763-a42f-77721fdeff1d"
```
Done 2026-10-06. The packet names the coordinates and marks D1-D4 as founder
decisions with recommendations. `service_auth.read_client_secret_file`
now refuses symlinked, foreign-owned, non-regular, shared-parent and
multi-token files in addition to the earlier mode, worktree and empty checks.
`secrets-engine service-auth check-secret-file` is the value-free validation
interface. Synthetic tests are in `tests/test_consumer_secret_file.py`. Full
suite: 510 passed, 1 skipped (root-only owner test).
## Founder decisions D1-D4
```task
id: SECRETS-WP-0012-T02
status: cancel
priority: high
state_hub_task_id: "b95da704-ce13-5bf5-be3b-126e894a669d"
```
Cancelled 2026-10-06: superseded by founder direction 2026-10-06 (the client
secret lives only in OpenBao, no workstation copy) and the ops-mason plan
`keycape-secrets-engine-openbao-client-custody` (658cdbc, MASON-WP-0009).
D1-D4 (host, OS user, persistent file, rotation cadence) no longer apply.
## In-memory OpenBao secret source
```task
id: SECRETS-WP-0012-T04
status: done
priority: high
state_hub_task_id: "be26828b-1faf-53a1-bc49-77c4cc80f1ca"
```
Done 2026-10-06. `service_auth.OpenBaoOidcClientSecretSource`: attended
`bao login -method=oidc -path=netkingdom -no-store -format=json` on role
`keycape-secrets-engine-openbao-operator-workload-kv-read`, token from a
stdout pipe, ambient `BAO_TOKEN`/`VAULT_TOKEN` stripped, header-only GET of
`platform/data/workloads/keycape/secrets-engine-openbao` field
`CLIENT_SECRET`, unconditional `revoke-self`, then the KeyCape exchange and
OpenBao JWT login. The file source is refused for this profile (kept for the
approval client). `secrets-engine service-auth probe-openbao` prints
value-free evidence. Synthetic tests: `tests/test_openbao_secret_source.py`.
Docs: `docs/keycape-openbao-consumer-custody.md` (rewritten),
`docs/service-auth.md`, `docs/cli.md`.
## First live attended use
```task
id: SECRETS-WP-0012-T03
status: done
priority: high
state_hub_task_id: "1c3afd34-4aa3-5484-a9c7-2db577225269"
```
Acceptance: the one-line JSON from `service-auth probe-openbao --json` with
`ok: true`, `secret_source: openbao-oidc-in-memory`, both accessor
fingerprints and both revoke-self results true, recorded without any value,
token or full accessor. This is the evidence for KEY-WP-0037-T04,
RPF-WP-0035-T02 and plan verification item 6; OpenBao login proof also
closes into SECRETS-WP-0008-T06.
Result 2026-10-10: the founder ran the attended probe and it passed with
`ok: true`, `secret_source: openbao-oidc-in-memory`, both revoke-self results
true, and session handles `0204e60340d2` (service) and `4e9c487b6206`
(operator). Evidence: `docs/evidence/2026-10-10-keycape-openbao-probe.json`.
The CCR-2026-0038 negative checks remain with railiance-platform under
RPF-WP-0035-T02.