secrets-engine/workplans/SECRETS-WP-0006-catalog-lane-adoption.md
tegwick b61b575b5b
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
docs: record whynot-design lane pointer discrepancy from ops-warden
ops-warden (WARDEN-WP-0037-T01) reported the whynot-design npm lane as
platform/workloads/coulomb/whynot-design/npm-publish, field NPM_AUTH_TOKEN.

Reviewed without any OpenBao read or mutation:
- The field claim conflates the injected env var (resolved by
  publication_policy) with the declared KV field (npm_token). Annotated the
  catalog so the distinction is explicit at the point of confusion.
- The path claim is credible but unresolved: hardening-backlog already names
  both locations, and custody is owned by railiance-platform. Catalog
  mount/path left unchanged pending custody-side confirmation rather than
  rewriting a proven production lane from an inbox claim.

Recorded under SECRETS-WP-0006-T06.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M65ovP3eiiPHubibvWs9mD

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 393550@bnt-lap001
Assistant-Session: 4bb359f9-1f12-4410-9e76-079cf23c82e4
2026-09-06 00:46:02 +02:00

304 lines
14 KiB
Markdown

---
id: SECRETS-WP-0006
type: workplan
title: "Adopt concrete OpenBao credential lanes from ops-warden"
domain: infotech
repo: secrets-engine
status: active
owner: codex
topic_slug: custodian
created: "2026-08-21"
updated: "2026-09-06"
state_hub_workstream_id: "31f7f8ea-7f73-516c-8877-f03a13f1db82"
---
# SECRETS-WP-0006 - Adopt concrete OpenBao credential lanes from ops-warden
## Goal
Move concrete, OpenBao-backed credential workflows from ops-warden's interim
proxy into the secrets-engine catalog and operating surface without moving
secret custody out of OpenBao or misassigning generic routing and identity
capabilities to this repo.
The intake originates in ops-warden message
`cbd312f8-347e-44cc-933b-9712e2036646` after earlier requests on 2026-08-11 and
2026-08-15.
## Scope decision
Accept these concrete OpenBao KV lanes for catalog admission and staged
operation:
- `issue-core-ingestion-api-key`;
- `reuse-surface-hub-write-token`;
- `openrouter-llm-connect`;
- `forgejo-admin-api-token`;
- `email-connect-transactional`.
Do not create catalog entries for these generic or non-owned routes:
- `openbao-api-key` remains a generic credential-routing template. Concrete
workload credentials beneath it may become catalog lanes, but the template is
not itself a secret lane.
- `key-cape-oidc-login` remains owned by key-cape/Keycloak. secrets-engine may
consume OIDC identity for OpenBao authentication, but it does not own login,
MFA, or identity-token issuance.
The current implementation is generic at the catalog level for KV
`mount`/`path`/`fields`, and `secrets-engine exec` supports `exec-env` plus the
npm-specific `npm-config` adapter. The remaining delivery-mode names are not all
exec adapters: `read-check` is verification, `approle-login` is auth-capability
handoff. `exec-file` is implemented by `exec`; `wrapped` operator handoff is
`secrets-engine wrap`, not an exec adapter.
## Design constraints
- OpenBao remains the custody, policy, lease, and audit backend.
- No raw value, token, password, wrapped token, AppRole material, or accessor is
written to Git, State Hub, chat, prompts, workplans, or normal logs.
- Catalog adoption does not by itself authorize production mutation or value
access. Each production lane needs a resolved approval and a reviewed live
apply/verification plan.
- Existing workload delivery must not be displaced. ESO/Kubernetes delivery and
provider-side rotation remain owned by their current runtime and provider
owners until an explicit migration is approved.
- High-risk lanes must retain exact consumer, field, rotation-owner, denial, and
revocation metadata.
- The production stage role currently manages owner-scoped paths on the
`secret` mount, while these lanes use the existing `platform` mount. Admission
must not silently broaden the stage role or attempt to create that mount.
## Confirm capability and ownership with ops-warden
```task
id: SECRETS-WP-0006-T01
status: done
priority: high
state_hub_task_id: "94d54df8-4088-5475-992b-7fe838c7c7d7"
```
Completed 2026-08-21. Replied in the existing thread with State Hub message
`7fb0c2ce-be41-4a1d-95b0-e2cdd97d5718`, marked the inbound message read, and
recorded decision `ae676382-1826-4e04-aa4e-bb77990c7a0d`. The reply accepted
the five concrete KV lanes, declined the generic OpenBao route and key-cape
login route, corrected the six-delivery-mode interpretation, and kept interim
proxies in place pending per-lane verification.
Reply in the existing State Hub thread with the accepted five-lane scope, the
two declined generic/non-owned routes, and the delivery-mode correction. Accept
ops-warden's offer of a PR-shaped non-secret metadata contribution for the five
concrete lanes.
Done when the reply is posted, the inbound message is marked read, and this
decision is recorded as non-secret State Hub evidence.
## Define admission contract for existing production lanes
```task
id: SECRETS-WP-0006-T02
status: done
priority: high
state_hub_task_id: "1a04ee82-ff61-55bc-bae8-62e1229d9dcc"
```
Completed 2026-08-21. Added explicit `mount_management`, `delivery_auth`, and
`workload_delivery` semantics, with the operating contract documented in
`docs/catalog-admission.md`. Existing mounts and externally managed delivery
auth now render non-mutating checks; apply cannot create or rewrite them.
Existing workload delivery remains independent metadata, while an optional
engine-managed AppRole is a separate approval-gated native delivery surface.
Define how a catalog entry represents a lane whose KV mount already exists and
whose workload delivery is ESO/Kubernetes rather than a secrets-engine-created
AppRole. Separate these concepts where needed:
- existing-mount versus engine-managed mount;
- workload delivery versus agent/operator exec delivery;
- catalog/verification metadata versus engine-managed consumer auth;
- provider-side rotation owner versus OpenBao value update workflow.
Acceptance:
- Dry-run cannot propose creating or broadening the shared `platform` mount.
- A lane can retain its existing workload auth/delivery while optionally
exposing an approved exec-time adapter.
- The production stage role is not broadened by implication.
## Review and import the five catalog entries
```task
id: SECRETS-WP-0006-T03
status: done
priority: high
state_hub_task_id: "b595f38e-bb31-513b-bc73-796cec76a2aa"
```
Completed 2026-08-21. The offered contribution did not arrive, so drafted all
five entries from ops-warden playbooks and the authoritative railiance-platform
CCRs, then requested line-by-line review in message
`ceace632-2332-46d8-a2b3-1714fbfa7e2c`. Ops-warden confirmed the mounts, paths,
field sets, CCR references, consumers, lifecycle owners, existing workload
delivery, proposed exact-path AppRole surface, both route rejections, and the
delivery-mode correction in messages `26df37c5-2756-49b8-8f9c-c1bb2bab1b4b`
and `3f875d90-6f88-4f44-961b-6f6fbd15b01d`. The follow-up retracted the only
apparent metadata concern: `REUSE_SURFACE_FORGEJO_WEBHOOK_SECRET` is explicitly
present in CCR-2026-0005, so both reuse-surface and issue-core remain correctly
classified `high`. Interim proxy ownership remains unchanged until T05.
Review ops-warden's proposed entries line by line against the schema, canonical
security boundary, live route metadata, and owning workload documentation.
Correct field lists, mount/path, consumers, delivery modes, approval references,
rotation owners, and negative checks before merging.
Acceptance:
- All five files contain non-secret metadata only.
- Generic `openbao-api-key` and `key-cape-oidc-login` entries are absent.
- Each entry names an exact lane rather than a provider-wide wildcard.
- Each high-risk lane has explicit rotation and deactivation expectations.
## Implement guards and offline verification
```task
id: SECRETS-WP-0006-T04
status: done
priority: high
state_hub_task_id: "b2ca67ec-48e0-5f85-b4d8-94eb601206c5"
```
Completed 2026-08-21: implemented non-mutating existing-mount/auth planning and
apply behavior, workload-delivery validation, exact field guards for exec and
verification, safe policy/role overrides, route guidance, and focused tests.
All five admitted entries load and render `kv-mount-check` plus an exact-path
policy and bounded AppRole plan. Generic/wildcard entries and undeclared fields
are negatively covered. Privileged provision, verify, exec, handoff, and live
revoke operations now fail closed without a resolved approval. Full verification
passes 82 tests.
Implement only the schema/planning/delivery changes required by the admitted
entries. Add tests for shared existing mounts, auth/delivery separation,
multi-field selection, exact exec-env injection, and rejection of wildcard or
generic provider-wide entries.
Acceptance:
- The complete catalog loads and validates.
- Each admitted lane renders a non-mutating guarded plan.
- Negative tests prove no wildcard path, broad policy, undeclared field, or
unsupported delivery mode is accepted.
- `uv run pytest` and `git diff --check` pass.
## Stage live apply and verification
```task
id: SECRETS-WP-0006-T05
status: wait
priority: high
state_hub_task_id: "fb103f1e-2ff7-5de5-9a2c-191a19c43542"
```
Progress 2026-09-03. Re-rendered guarded plans on the post-hardening engine.
Every admitted lane is still `kv-mount-check` + exact-path read policy +
bounded AppRole. First live candidate is `openrouter-llm-connect` (narrowest
consumer/field set). Procedure: `docs/native-lane-cutover.md`. Coordinated:
railiance-platform `0190c9b3` (AppRole-only apply, no KV/ESO mutation),
ops-warden `c2c01262` (keep all five proxies), llm-connect `6f9b460a` (ESO
stays theirs). Live apply still wait on T04 serving plus a canonical
`action=apply` approval and scoped attended authority. CCR-2026-0003 remains
provenance, not that approval. Proxies stay until T06 per lane.
Readiness update 2026-08-21: rendered non-mutating production dry-runs for all
five lanes. Every plan checks the externally managed `platform` mount without
mutation, writes one exact-path read policy, and proposes the reviewed bounded
AppRole (15-minute token TTL, 30-minute maximum TTL, 15-minute single-use
Secret ID, and eight token uses). OpenBao is reachable and unsealed, but route
status remains `ready: false`: the original CCR references approve the existing
workload lanes and are not resolvable State Hub approvals for the new native
AppRoles. This session also has no production OpenBao token or bootstrap file.
Requested per-lane approval references and scoped attended/apply authority from
railiance-platform in message `3db3da86-2f3f-4301-8be6-74b507ea66a0`. No value
was read and no OpenBao mutation was attempted.
Hardening dependency 2026-08-23: `SECRETS-WP-0007` now owns the engine-level
provisioning, lifecycle, approval-binding, delivery-session, verification, and
evidence gaps found during scope assessment. T05 must not provision or revoke
the existing shared paths through the current commands. Native live adoption
resumes through `SECRETS-WP-0007-T07` after its T01-T06 safety gates; this task
continues to own the per-lane production evidence and acceptance outcome.
For each lane, obtain the required decision/operator approval before any live
OpenBao policy, auth-role, provisioning, rotation, or delivery change. Start
with metadata/capability-safe checks and preserve the current ops-warden proxy
until native positive and negative verification succeeds.
Acceptance per lane:
- Approval is resolved and linked.
- Existing workload delivery remains healthy.
- Positive access and unrelated-consumer denial are proven without reading a
value into evidence.
- Rollback/revocation steps are recorded.
## Reconcile routing ownership and retire interim proxies
```task
id: SECRETS-WP-0006-T06
status: wait
priority: medium
state_hub_task_id: "1431edae-5791-5892-8c4b-829419b537d2"
```
After a lane is natively ready, update the ops-warden delegation register and
safe next action for that lane. Retire interim proxy operation lane by lane,
not as a seven-lane batch.
Acceptance:
- Native readiness is evidenced before the proxy is retired.
- ops-warden remains the routing front door and does not vend non-SSH secrets.
- The generic OpenBao route and key-cape login route retain their correct
owners.
Discrepancy report 2026-09-06 (ops-warden `fc898979`, WARDEN-WP-0037-T01).
ops-warden reports the authoritative whynot-design npm concrete pointer as
`platform/workloads/coulomb/whynot-design/npm-publish`, field `NPM_AUTH_TOKEN`,
endpoint `https://forgejo.coulomb.social/api/packages/coulomb/npm/`. Reviewed
here without any OpenBao read or mutation:
- Endpoint agrees. `catalog/whynot-design-npm-publish.yaml` already carries the
Forgejo registry in `delivery_config.npm.registry`.
- The field claim is a category error, not a repo defect. `NPM_AUTH_TOKEN` is
the resolved *injection env var* from `publication_policy.resolve` (default
template, repo-clamped while netkingdom is `maturity-build`), not a KV field
name. The declared KV field is `npm_token`. `docs/whynot-design-real-publish-closeout.md`
lists both rows separately. Renaming the catalog field to `NPM_AUTH_TOKEN`
would break the proven pilot lane.
- The path claim is credible and unresolved here. `docs/hardening-backlog.md`
already records the value against *both* `whynot-design-npm-publish` and
`platform/workloads/coulomb/whynot-design/npm-publish`, and every other
admitted lane uses the `platform/workloads/...` convention. Which location is
authoritative for reads is custody state owned by railiance-platform; this
repo cannot confirm it without lane read authority, and production live
commands remain fail-closed pending `SECRETS-WP-0007-T04`.
The catalog mount/path is therefore left unchanged pending a custody-side
confirmation from railiance-platform. Rewriting a proven production lane pointer
from an inbox claim is exactly the unverified custody mutation this task must
not make. `ready: false` observed by ops-warden is the expected fail-closed
result and is not evidence of a wrong path.
Next: obtain from railiance-platform a non-secret confirmation of which KV
location backs this lane. If the platform path is authoritative, the catalog
mount/path move is a reviewed lane change carrying its own approval, and the
declared field stays `npm_token` unless custody says otherwise.
## Exit criteria
- The five concrete OpenBao lanes have reviewed catalog entries and guarded
offline plans.
- Live ownership moves only for lanes that pass approved positive/negative
verification.
- The two generic/non-owned routes are not mislabeled as secrets-engine lanes.
- No secret material is recorded in repository or coordination evidence.