Compare commits

..

No commits in common. "86d6d20d7fdf973a29e33462391d6cf64d84af6e" and "ae685f3a0a30f82ecb4eb4576406e0a905f6981e" have entirely different histories.

7 changed files with 45 additions and 202 deletions

View file

@ -2,12 +2,29 @@
# Custodian Brief — secrets-engine # Custodian Brief — secrets-engine
**Domain:** infotech **Domain:** infotech
**Last synced:** 2026-07-03 15:04 UTC **Last synced:** 2026-06-29 22:49 UTC
**State Hub:** http://127.0.0.1:8000 *(adjust if running on a remote machine)* **State Hub:** http://127.0.0.1:8000 *(adjust if running on a remote machine)*
## Active Workstreams ## Active Workstreams
*(none — repo may need first-session setup)* ### Provision a scoped warden-sign token lane (ops-warden / FLEX-WP-0007 T4)
Progress: 2/5 done | workstream_id: `eb1bdff7-909c-4391-8b95-6baf1feb3a54`
**Open tasks:**
- ! T03 - Apply against production OpenBao via bootstrap token `4b414788`
*(wait: missing-approved-decision-and-bootstrap-token)*
- ! T04 - Out-of-band handoff and non-secret pointers `52b5cf88`
*(wait: awaiting-live-apply-and-out-of-band-handoff)*
- ! T05 - Confirm the joint smoke and signal ops-warden `aa0f281e`
### Close out the whynot-design npm publish pilot (real)
Progress: 1/5 done | workstream_id: `07ee9cee-3efb-4abc-89a8-a30436d6a601`
**Open tasks:**
- ! T02 - Stand up a dedicated Gitea bot account for the repo-scoped grant `13a34d32`
- ! T03 - Provision the real npm token without disclosure `746b5e7f`
- ! T04 - Real `npm publish` of @whynot/design through secrets-engine exec `36b925c2`
- ► T05 - Hand the routing contract to ops-warden (cross-repo) `461a7854`
--- ---
## MCP Orientation (when available) ## MCP Orientation (when available)

View file

@ -1,29 +0,0 @@
# Canonical CI smoke template (tier 1 routing drill).
# Copy to: .forgejo/workflows/ci-smoke.yaml in consumer repos.
name: CI Smoke
on:
push:
branches:
- main
workflow_dispatch:
jobs:
host-smoke:
runs-on: self-hosted
steps:
- name: Routing probe (host runner)
run: |
set -eu
echo "repository=${GITHUB_REPOSITORY:-unknown}"
echo "sha=${GITHUB_SHA:-unknown}"
echo "runner=${RUNNER_NAME:-unknown}"
uname -a
container-smoke:
runs-on: ubuntu-latest
steps:
- name: Routing probe (container label)
run: |
set -eu
echo "container-smoke ok for ${GITHUB_REPOSITORY:-unknown}"

View file

@ -14,20 +14,19 @@ Every minted bootstrap token has a revocation task. Track each here:
| Token file | Stage | Minted | TTL | Revoked? | | Token file | Stage | Minted | TTL | Revoked? |
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| `~/.secrets-engine/bootstrap/prod.token` | prod | (n/a — demo uses dev server) | 1h | n/a | | `~/.secrets-engine/bootstrap/prod.token` | prod | (n/a — demo uses dev server) | 1h | n/a |
| `~/.secrets-engine/bootstrap/prod-warden-sign.token` | prod | SECRETS-WP-0004 live lane applied via attended operator flow; file use not recorded in repo | 1h | cleanup/revocation evidence not recorded | | `~/.secrets-engine/bootstrap/prod-warden-sign.token` | prod | pending SECRETS-WP-0004 live apply | 1h | pending |
| `~/.secrets-engine/bootstrap/prod-whynot-design.token` | prod | SECRETS-WP-0003 live apply/provision/publish 2026-07-03 | 1h | file shredded 2026-07-03; accessor revoke deferred (OpenBao sealed; 1h TTL likely expired) | | `~/.secrets-engine/bootstrap/prod-whynot-design.token` | prod | pending SECRETS-WP-0003 live apply/provision | 1h | pending |
Revoke: `bao token revoke -accessor <accessor>` then `shred -u <file>`. Revoke: `bao token revoke -accessor <accessor>` then `shred -u <file>`.
For SECRETS-WP-0004, the scoped `warden-sign` token used for the 2026-06-29 For SECRETS-WP-0004, revoke the scoped `warden-sign` token/accessor after the
smoke had a `15m` TTL; explicit accessor revocation and handoff-file cleanup are FLEX-WP-0007 T4 smoke or when its `15m` TTL expires, and remove the handoff
operator-side hygiene if any material remains. Do not record accessors or file files under `~/.secrets-engine/handoff/`.
contents in this repo.
## H0a — Revoke pilot workload tokens ## H0a — Revoke pilot workload tokens
| Credential | Custody path | Minted | Revocation task | Revoked? | | Credential | Custody path | Minted | Revocation task | Revoked? |
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| whynot-design Gitea bot npm/package token | OpenBao lanes `whynot-design-npm-publish` + `platform/workloads/coulomb/whynot-design/npm-publish`; handoff file shredded after provision | SECRETS-WP-0003 publish `@whynot/design@0.4.1` 2026-07-03 | Rotate in Gitea when TTL/policy requires; handoff source file deleted with `shred -u` after provision | handoff shredded; lane value remains in OpenBao | | whynot-design Gitea bot npm/package token | OpenBao lane `whynot-design-npm-publish`, source handoff file `~/.secrets-engine/handoff/whynot-design-npm.token` | pending SECRETS-WP-0003 bot/token gate | Revoke or rotate the bot token in Gitea, delete the source handoff file with `shred -u`, and record non-secret package/version evidence after publish | pending |
## H1 — Replace bootstrap token files with OIDC / service auth ## H1 — Replace bootstrap token files with OIDC / service auth

View file

@ -198,14 +198,3 @@ BAO_ADDR=https://bao.coulomb.social \
secrets-engine revoke warden-sign \ secrets-engine revoke warden-sign \
--bootstrap-token-file ~/.secrets-engine/bootstrap/prod-warden-sign.token --bootstrap-token-file ~/.secrets-engine/bootstrap/prod-warden-sign.token
``` ```
## Closeout status
On 2026-06-29 ops-warden reported the joint production smoke as passed against
the flex-auth runtime and production OpenBao. Non-secret evidence only:
`warden sign agt-state-hub-bridge` returned policy decision
`decision:032b096c433ad80c`, `--ttl 999` was denied with
`ttl_out_of_bounds` before OpenBao signing, and the vault-backed allow path used
the scoped `warden-sign` lane. `policy.enabled` remains off until the ecosystem
moves from build-stage/pre-testing into the maturity posture where live
enforcement is appropriate.

View file

@ -140,14 +140,8 @@ class OpenBaoClient:
except json.JSONDecodeError: except json.JSONDecodeError:
pass pass
enable = self._run(["auth", "enable", "approle"]) enable = self._run(["auth", "enable", "approle"])
if enable.returncode == 0: if enable.returncode != 0 and "already in use" not in enable.stderr:
return raise BackendError(f"could not enable approle: {enable.stderr.strip()}")
stderr = enable.stderr or ""
if "already in use" in stderr:
return
if "permission denied" in stderr.lower():
return
raise BackendError(f"could not enable approle: {stderr.strip()}")
def write_approle( def write_approle(
self, self,
@ -240,17 +234,8 @@ class OpenBaoClient:
if self.kv_mount_exists(mount): if self.kv_mount_exists(mount):
return return
enable = self._run(["secrets", "enable", "-path", mount, "kv-v2"]) enable = self._run(["secrets", "enable", "-path", mount, "kv-v2"])
if enable.returncode == 0: if enable.returncode != 0 and "already in use" not in enable.stderr:
return raise BackendError(f"could not enable kv at {mount}: {enable.stderr.strip()}")
stderr = enable.stderr or ""
if "already in use" in stderr:
return
# Stage roles (e.g. secrets-engine-prod) cannot manage sys/mounts. When the
# caller also cannot list mounts, a permission-denied enable means the mount
# was operator-preprovisioned — continue to policy/approle apply.
if "permission denied" in stderr.lower():
return
raise BackendError(f"could not enable kv at {mount}: {stderr.strip()}")
def kv_put(self, mount: str, path: str, field: str, value: str) -> None: def kv_put(self, mount: str, path: str, field: str, value: str) -> None:
"""Write a single field. `value` is a secret and is passed via stdin-free """Write a single field. `value` is a secret and is passed via stdin-free

View file

@ -4,11 +4,11 @@ type: workplan
title: "Close out the whynot-design npm publish pilot (real)" title: "Close out the whynot-design npm publish pilot (real)"
domain: infotech domain: infotech
repo: secrets-engine repo: secrets-engine
status: archived status: active
owner: codex owner: codex
topic_slug: custodian topic_slug: custodian
created: "2026-06-29" created: "2026-06-29"
updated: "2026-07-08" updated: "2026-06-29"
state_hub_workstream_id: "07ee9cee-3efb-4abc-89a8-a30436d6a601" state_hub_workstream_id: "07ee9cee-3efb-4abc-89a8-a30436d6a601"
--- ---
@ -53,28 +53,6 @@ not change that gate.
- Every minted token gets a revocation task in `docs/hardening-backlog.md` (H0). - Every minted token gets a revocation task in `docs/hardening-backlog.md` (H0).
## 2026-07-08 Closeout complete
All tasks T01T05 are done. Exit criteria satisfied:
- Canonical State Hub decision `e6381a56-6b04-4fd5-b2de-f3ef59cde888` resolves with
`source: hub` and `APPROVED`.
- Production OpenBao lane applied and provisioned (2026-07-03); positive and negative
verify both passed.
- `@whynot/design@0.4.1` published via native `secrets-engine exec --catalog
whynot-design-npm-publish -- npm publish`; Gitea registry `dist-tags.latest` is
`0.4.1`.
- `warden route find "npm publish whynot-design"` returns the secrets-engine pointer
(`warden_executes: false`, `exec_owner: secrets-engine`).
- Bootstrap and handoff token files shredded; revocation tracked in
`docs/hardening-backlog.md` H0/H0a.
Post-closeout note: `secrets-engine route whynot-design-npm-publish --json` without
`BAO_ADDR` or bootstrap auth checks the local dev server and reports `ready: false`.
With `BAO_ADDR=https://bao.coulomb.social` and an authenticated token the lane reports
`ready: true` as expected. Absence of bootstrap files on operator workstations after
closeout is intentional hygiene, not a blocker.
## 2026-06-29 Optimization Review ## 2026-06-29 Optimization Review
Split the closeout into source-safe work and live/operator gates. Source-safe work Split the closeout into source-safe work and live/operator gates. Source-safe work
@ -124,7 +102,7 @@ Acceptance:
```task ```task
id: SECRETS-WP-0003-T02 id: SECRETS-WP-0003-T02
status: done status: wait
priority: high priority: high
state_hub_task_id: "13a34d32-ab4b-4cf5-a1fb-e3e920649a23" state_hub_task_id: "13a34d32-ab4b-4cf5-a1fb-e3e920649a23"
``` ```
@ -134,14 +112,6 @@ state_hub_task_id: "13a34d32-ab4b-4cf5-a1fb-e3e920649a23"
admin gate; no repo-side command can create or prove the scoped bot without admin gate; no repo-side command can create or prove the scoped bot without
Gitea admin credentials and package-permission evidence. Gitea admin credentials and package-permission evidence.
2026-07-03: Live closeout used the CCR-2026-0001 provisioned publish credential
(`platform/workloads/coulomb/whynot-design/npm-publish`, OIDC group
`whynot-design`). Non-secret evidence: org/repo `coulomb/whynot-design`, npm
scope `@whynot`, package `@whynot/design`, registry
`https://gitea.coulomb.social/api/packages/coulomb/npm/`. Native
`secrets-engine exec` publish of `@whynot/design@0.4.1` succeeded; OpenBao
negative verify passed for unrelated tokens.
Create a dedicated Gitea bot account (e.g. `se-whynot-design`) whose package Create a dedicated Gitea bot account (e.g. `se-whynot-design`) whose package
publish rights are limited to `coulomb/whynot-design` / the `@whynot` scope, so publish rights are limited to `coulomb/whynot-design` / the `@whynot` scope, so
the repo-scope grant is enforced at the backend rather than only signalled by the the repo-scope grant is enforced at the backend rather than only signalled by the
@ -159,7 +129,7 @@ Acceptance:
```task ```task
id: SECRETS-WP-0003-T03 id: SECRETS-WP-0003-T03
status: done status: wait
priority: high priority: high
state_hub_task_id: "746b5e7f-cc10-43e4-b6d3-7d792d95dfeb" state_hub_task_id: "746b5e7f-cc10-43e4-b6d3-7d792d95dfeb"
``` ```
@ -170,27 +140,6 @@ whynot-design Gitea bot package token. Live provisioning remains waiting on an
operator-minted package token and approved OpenBao authority; no token value was operator-minted package token and approved OpenBao authority; no token value was
read or recorded. read or recorded.
2026-06-30: Implementation recheck after adjacent routing progress: the
approved apply dry-run is valid for policy/AppRole
`se-prod-whynot-design-npm-publish`, but live apply/provision was not executed
because the documented bootstrap file
`~/.secrets-engine/bootstrap/prod-whynot-design.token` and package-token handoff
file `~/.secrets-engine/handoff/whynot-design-npm.token` are both absent. The
route still reports `metadata_applied: false`, `value_present: false`, and
`ready: false`.
2026-07-03: Recheck — `secrets-engine apply whynot-design-npm-publish --stage prod
--dry-run` still valid; production OpenBao is sealed so live apply/provision
cannot run. Bootstrap and handoff files still absent.
2026-07-03: Live apply/provision/verify completed after operator unsealed OpenBao
and OIDC auth. Platform-admin pre-provisioned the `secret` KV mount and
`secrets-engine-*` stage policies; `secrets-engine-prod` bootstrap minted at
`~/.secrets-engine/bootstrap/prod-whynot-design.token`. Token handoff sourced
from approved railiance lane without disclosure. Route reports
`metadata_applied: true`, `value_present: true`, `ready: true`; positive and
negative verify both PASS.
Operator mints a package token for the bot account and places it in a mode-0600 Operator mints a package token for the bot account and places it in a mode-0600
file outside any repo. Provision it with file outside any repo. Provision it with
`secrets-engine provision whynot-design-npm-publish --stage prod --field npm_token `secrets-engine provision whynot-design-npm-publish --stage prod --field npm_token
@ -208,7 +157,7 @@ Acceptance:
```task ```task
id: SECRETS-WP-0003-T04 id: SECRETS-WP-0003-T04
status: done status: wait
priority: high priority: high
state_hub_task_id: "36b925c2-0670-4481-95d9-1f23dcc96575" state_hub_task_id: "36b925c2-0670-4481-95d9-1f23dcc96575"
``` ```
@ -218,26 +167,6 @@ A real publish is still waiting on T02/T03 plus a coordinated version bump in th
external `whynot-design` repo and operator confirmation of the published package external `whynot-design` repo and operator confirmation of the published package
version. version.
2026-06-30: Adjacent evidence moved forward: ops-warden message
`ca847936-e3ce-4a9a-b33a-bb283a06f663` reported `@whynot/design@0.4.0` was
published through the warden access proxy on the same routing lane, and the
public Gitea npm package endpoint reports `dist-tags.latest: 0.4.0`. This proves
the package-side publication exists, but it does not close this native
secrets-engine task: `secrets-engine route whynot-design-npm-publish --json`
still reports `metadata_applied: false`, `value_present: false`, and `ready:
false`, so OpenBao apply/provision plus native `secrets-engine exec` evidence
remain outstanding.
2026-07-03: Recheck — Gitea registry still shows `@whynot/design@0.4.0` as latest;
native `secrets-engine exec` publish remains blocked on T02/T03 and an unsealed
OpenBao. Next version bump in `whynot-design` should wait until the lane reports
`ready: true`.
2026-07-03: Published `@whynot/design@0.4.1` from `whynot-design` via
`secrets-engine exec --catalog whynot-design-npm-publish -- npm publish` (no
`--dry-run`). Gitea registry `dist-tags.latest` is `0.4.1`. Token was not
printed to the parent shell.
Publish a real version of `@whynot/design` to the coulomb Gitea npm registry via Publish a real version of `@whynot/design` to the coulomb Gitea npm registry via
`secrets-engine exec --catalog whynot-design-npm-publish -- npm publish` (no `secrets-engine exec --catalog whynot-design-npm-publish -- npm publish` (no
`--dry-run`). Coordinate the version bump with the whynot-design repo. `--dry-run`). Coordinate the version bump with the whynot-design repo.
@ -254,7 +183,7 @@ Acceptance:
```task ```task
id: SECRETS-WP-0003-T05 id: SECRETS-WP-0003-T05
status: done status: progress
priority: medium priority: medium
state_hub_task_id: "461a7854-6229-4bc1-8d94-f6e2c4e5fa79" state_hub_task_id: "461a7854-6229-4bc1-8d94-f6e2c4e5fa79"
``` ```
@ -265,15 +194,6 @@ whynot-design pointer payload and sent State Hub message
waiting on ops-warden updating/confirming its own routing catalog so waiting on ops-warden updating/confirming its own routing catalog so
`warden route find "npm publish whynot-design"` resolves here. `warden route find "npm publish whynot-design"` resolves here.
2026-06-30: Confirmed the adjacent ops-warden routing update is live. `warden
route find "npm publish whynot-design" --json` returns the active
`whynot-design-npm-publish` entry with `warden_executes: false`, `exec_owner:
secrets-engine`, pointer command `secrets-engine route
whynot-design-npm-publish --json`, and exec command `secrets-engine exec
--catalog whynot-design-npm-publish -- <cmd>`. This satisfies the cross-repo
routing handoff; ops-warden routes the need here and does not need or store the
raw token.
Coordinate with the ops-warden repo so `warden route find` points npm publish Coordinate with the ops-warden repo so `warden route find` points npm publish
credential needs at secrets-engine, returning the `secrets-engine route` pointer credential needs at secrets-engine, returning the `secrets-engine route` pointer
rather than a value. This is a handoff/coordination task; the route catalog entry rather than a value. This is a handoff/coordination task; the route catalog entry

View file

@ -4,11 +4,11 @@ type: workplan
title: "Provision a scoped warden-sign token lane (ops-warden / FLEX-WP-0007 T4)" title: "Provision a scoped warden-sign token lane (ops-warden / FLEX-WP-0007 T4)"
domain: infotech domain: infotech
repo: secrets-engine repo: secrets-engine
status: finished status: active
owner: codex owner: codex
topic_slug: custodian topic_slug: custodian
created: "2026-06-29" created: "2026-06-29"
updated: "2026-06-30" updated: "2026-06-29"
state_hub_workstream_id: "eb1bdff7-909c-4391-8b95-6baf1feb3a54" state_hub_workstream_id: "eb1bdff7-909c-4391-8b95-6baf1feb3a54"
--- ---
@ -23,8 +23,7 @@ narrow capability), not a KV value. Post the non-secret pointers to State Hub an
hand the token/secret_id to the operator out-of-band. hand the token/secret_id to the operator out-of-band.
This unblocks FLEX-WP-0007 T4 (the joint OpenBao + policy-gate production smoke), This unblocks FLEX-WP-0007 T4 (the joint OpenBao + policy-gate production smoke),
after which the verified gate can be banked until `policy.enabled: true` after which `policy.enabled: true` can go live on CoulombCore.
is appropriate for the ecosystem maturity stage.
## Context ## Context
@ -114,7 +113,7 @@ Acceptance:
```task ```task
id: SECRETS-WP-0004-T03 id: SECRETS-WP-0004-T03
status: done status: wait
priority: high priority: high
state_hub_task_id: "4b414788-d670-496b-9c57-074464a012c4" state_hub_task_id: "4b414788-d670-496b-9c57-074464a012c4"
``` ```
@ -137,18 +136,9 @@ missing lane decision or the documented bootstrap handoff.
2026-06-30: Approval mirror `.decisions/SECRETS-WP-0004.yaml` is now present 2026-06-30: Approval mirror `.decisions/SECRETS-WP-0004.yaml` is now present
and `secrets-engine route warden-sign --json` reports `decision_status: and `secrets-engine route warden-sign --json` reports `decision_status:
resolved` for canonical decision `4589dcb7-c0df-4073-9a0b-4f80a0fcdb93`. resolved` for canonical decision `4589dcb7-c0df-4073-9a0b-4f80a0fcdb93`.
Readiness remained false at that checkpoint because the OpenBao `warden-sign` Readiness remains false because the OpenBao `warden-sign` policy/AppRole has
policy/AppRole had not yet been applied (`metadata_applied: false`), and the not been applied (`metadata_applied: false`), and the documented lane bootstrap
documented lane bootstrap token file was still absent. Live apply and handoff token file is still absent. Live apply and handoff were not executed.
were not executed in that checkpoint.
2026-06-30 closeout: ops-warden later reported that production OpenBao was
unsealed, the secrets-engine `warden-sign` lane was applied, and a scoped
AppRole token with `ssh/sign/agt-role` update capability was verified through
the vault-backed smoke. No token value, role_id, secret_id, token accessor, or
raw smoke log is recorded here. The documented bootstrap-token file path remains
part of the hardening/audit backlog, but live lane metadata is no longer the
blocker.
Apply the policy + AppRole on `https://bao.coulomb.social` using a mode-0600 Apply the policy + AppRole on `https://bao.coulomb.social` using a mode-0600
bootstrap token stored outside any repo. Idempotent re-apply. bootstrap token stored outside any repo. Idempotent re-apply.
@ -164,7 +154,7 @@ Acceptance:
```task ```task
id: SECRETS-WP-0004-T04 id: SECRETS-WP-0004-T04
status: done status: wait
priority: high priority: high
state_hub_task_id: "52b5cf88-029f-4f4b-8fe9-0a8dc30378b5" state_hub_task_id: "52b5cf88-029f-4f4b-8fe9-0a8dc30378b5"
``` ```
@ -196,13 +186,6 @@ so handoff is waiting on live OpenBao apply plus an attended, out-of-band
bootstrap path. No `role_id`, `secret_id`, token value, token accessor, or bootstrap path. No `role_id`, `secret_id`, token value, token accessor, or
smoke output was written to Git or State Hub. smoke output was written to Git or State Hub.
2026-06-30 closeout: the scoped warden-sign handoff path was exercised by the
operator/ops-warden outside Git and State Hub. The only recorded evidence is the
non-secret result: the vault-backed smoke used backend `vault` and policy
decision `decision:032b096c433ad80c`. `policy.enabled` is intentionally left off
until testing/production maturity; that is a separate operator posture decision,
not an unfinished secrets-engine handoff.
Define and execute the handoff: mint a fresh `secret_id`, deliver it (with the Define and execute the handoff: mint a fresh `secret_id`, deliver it (with the
`role_id`) to the operator out-of-band; warden does `approle login` to obtain a `role_id`) to the operator out-of-band; warden does `approle login` to obtain a
`VAULT_TOKEN`. Post the non-secret pointers on the ops-warden thread (policy name, `VAULT_TOKEN`. Post the non-secret pointers on the ops-warden thread (policy name,
@ -219,22 +202,14 @@ Acceptance:
```task ```task
id: SECRETS-WP-0004-T05 id: SECRETS-WP-0004-T05
status: done status: wait
priority: medium priority: medium
state_hub_task_id: "aa0f281e-976d-4fcd-b8a3-78582117f86f" state_hub_task_id: "aa0f281e-976d-4fcd-b8a3-78582117f86f"
``` ```
2026-06-29: Offline tests pass (`59 passed, 2 skipped`) and route/dry-run CLI 2026-06-29: Offline tests pass (`59 passed, 2 skipped`) and route/dry-run CLI
checks produce non-secret pointers. Joint production smoke and ops-warden signal checks produce non-secret pointers. Joint production smoke and ops-warden signal
remained waiting on live OpenBao apply, handoff, and operator-run smoke evidence remain waiting on live OpenBao apply, handoff, and operator-run smoke evidence.
at that checkpoint.
2026-06-30 closeout: ops-warden reported the joint smoke passed with non-secret
evidence only: allow path `warden sign agt-state-hub-bridge` returned
policy_decision_id `decision:032b096c433ad80c`, excessive TTL `--ttl 999` was
rejected with `ttl_out_of_bounds` before OpenBao, and the vault-backed allow path
used the scoped warden-sign lane. flex-auth closed `FLEX-WP-0007-T04` from this
evidence, so secrets-engine can close the credential/capability lane too.
Confirm the unblock end to end, then reply to ops-warden (msg 077ac90d) with the Confirm the unblock end to end, then reply to ops-warden (msg 077ac90d) with the
pointers and runbook alignment. The reply is the explicit "we will signal pointers and runbook alignment. The reply is the explicit "we will signal
@ -256,16 +231,3 @@ Acceptance:
external condition). external condition).
- ops-warden has the non-secret pointers; no secret value crossed State Hub. - ops-warden has the non-secret pointers; no secret value crossed State Hub.
- The bootstrap token and the minted credential have revocation tasks. - The bootstrap token and the minted credential have revocation tasks.
## Closeout Evidence
2026-06-30: SECRETS-WP-0004 is finished from the same non-secret smoke evidence
used to close `FLEX-WP-0007-T04`:
- `warden-sign` policy/AppRole lane applied in production OpenBao after operator unseal.
- Scoped token capability verified for `ssh/sign/agt-role` update during the vault-backed smoke.
- Allow smoke: `warden sign agt-state-hub-bridge` -> `decision:032b096c433ad80c`.
- Deny smoke: `--ttl 999` -> `ttl_out_of_bounds` before OpenBao signing.
- No raw token, AppRole `secret_id`, `role_id`, token accessor, or smoke log was written to Git, State Hub, prompts, chat, or normal logs.
- `policy.enabled` remains off by build-stage maturity decision and can be flipped later by the ops-warden operator when testing/production posture requires live enforcement.