railiance-platform/workplans/RPF-WP-0013-agent-high-risk-boundary-coverage.md
codex e4af2a1d10
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
fix(workplans): migrate active workplans off the retired RAILIANCE-WP prefix
RAILIANCE-WP is a family name, not a repository (ADR-007, and the prefix
registry already lists it retired). Three repositories independently used one
number space for unrelated work — RAILIANCE-WP-0012 was openbao extraction here,
a cnpg backup in railiance-apps and a deploy-verify in railiance-cluster. This
repository also carried two files both numbered 0016.

Active workplans move to the successor prefix and are renumbered from 0001 in
historical order. Archived workplans keep their historical identifiers.

Projection UUIDs are re-derived from the new canonical ids. Records already
registered under the old identifiers leave orphaned hub rows behind; that debt
is recorded in CUST-WP-0068 and clears when ADR-012's reset-from-forge lands.

Refs CUST-WP-0068-T03

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 2583210@bnt-lap001
Assistant-Session: f2bff2d5-e9b2-4338-92ca-10282a927006
2026-08-25 22:58:35 +02:00

165 lines
6.3 KiB
Markdown

---
id: RPF-WP-0013
type: workplan
title: "Close agent high-risk OpenBao boundary coverage"
domain: financials
repo: railiance-platform
status: finished
owner: codex
topic_slug: railiance
created: "2026-08-21"
updated: "2026-08-22"
related:
- WARDEN-WP-0032
- RISK-F-0009
origin: routed
origin_ref: "State Hub message 828e4903-30fe-4903-acfd-cd2ecdda437d"
state_hub_workstream_id: "25c0b1c9-a1b7-5844-bd39-9db165fe196c"
---
# RPF-WP-0013 — Agent high-risk boundary coverage
## Goal
Make the OpenBao `agent-high-risk-boundary` deny every concrete high-risk KV
data path in the ops-warden routing catalog, verify the deployed policy, and
establish whether any agent identity actually carries the boundary.
## Boundaries
- Read policy documents, token-role metadata and capabilities only; never read
a Secret value.
- A deny is added only for a concrete catalog path graded `risk: high`.
- Pattern-only and non-KV lanes are reported but do not produce invented paths.
- Operator identities do not receive this boundary; it is for coding-agent
identities where deny must override any coincident workload read policy.
## T01 — Reconcile catalog coverage
```task
id: RPF-WP-0013-T01
status: done
priority: high
state_hub_task_id: "35855316-3282-52d2-922e-43af1c4495c0"
```
Run the capabilities-only ops-warden audit against the policy. The initial
2026-08-21 reconciliation found 17 high-risk lanes: six covered, six concrete
uncovered, and five without a concrete KV address. The final generated input
contains 19 high-risk lanes, 14 concrete entries, and five without an address.
No credential value was read.
## T02 — Close the concrete deny gaps
```task
id: RPF-WP-0013-T02
status: done
priority: high
state_hub_task_id: "9f2a6ffc-5f48-5e45-b636-76dff7d41743"
```
Add deny-data/read-metadata pairs for the six catalog paths: whynot-design npm,
rapp-qonto Keycape client, agent-harness Forgejo deploy key, audit-core senders,
email-connect transactional, and Scaleway bootstrap. Add regression coverage
for every concrete path currently emitted by the catalog audit.
Completed 2026-08-22. After ops-warden corrected two multi-field grades, the
source policy covers all 13 unique concrete catalog paths plus the additional
reviewed Core Hub path. The generated-input check reports all 14 concrete
catalog entries covered with none uncovered.
## T03 — Apply and verify live
```task
id: RPF-WP-0013-T03
status: done
priority: high
state_hub_task_id: "92b4b531-986d-54b4-a18b-cd8785dca5ce"
```
Under attended platform authority, upload the reviewed policy, read it back,
and rerun the catalog audit with `policy_source: server`. Inspect policy/token
role metadata to determine whether an agent identity carries the boundary and
whether any role combines it with a workload-read policy. Do not mint a token.
Completed initially on 2026-08-21 and reconciled again on 2026-08-22 under
attended `platform-admin` OIDC. OpenBao accepted the policy; normalized
readback matched source, and the final server-backed audit reported 19
high-risk lanes, 14 covered entries, zero uncovered, and five pattern/non-KV
lanes without a concrete address. No Secret value was read.
## T04 — Route the result
```task
id: RPF-WP-0013-T04
status: done
priority: medium
state_hub_task_id: "d394fcb7-1477-5dfe-9e4b-65bd14f08346"
```
Reply to ops-warden with the deployment evidence and remaining attachment
finding. Request a generated, versioned concrete-deny artifact so future policy
updates consume catalog output rather than relying on a hand-maintained list.
Completed 2026-08-21 via State Hub message
`fe727451-163a-4e14-8ce3-187fea8ce5b3`, including live audit counts, the zero-
attachment finding, the distinct-agent-identity blocker, and the requested
versioned generated artifact shape.
Ops-warden delivered revision `55f0f47a021375b8b25c924953d1b49a24e002c5`
on 2026-08-21. The platform now vendors it as a checked policy input and has a
repeatable upstream-equality plus policy-coverage command.
## T05 — Establish a distinct coding-agent identity
```task
id: RPF-WP-0013-T05
status: done
priority: high
state_hub_task_id: "6805ef60-bd20-5549-b955-cee94eb69dad"
```
The policy is live but no role attaches it. Do not add the boundary to
`platform-admin`: that is an attended human/operator role whose legitimate
recovery work may require the protected values. The identity owner must define
a distinct coding-agent issuance path, attach this boundary there, and prove
deny-wins behavior when combined with an otherwise readable workload policy.
Completed 2026-08-22. State Hub decision
`f0955252-7b20-4c80-86e9-f8080ec60793` establishes the platform-owned AppRole
`coding-agent-railiance-platform` as the operational machine identity. Its
single-use SecretIDs expire after five minutes; its tokens last at most 15
minutes, have eight uses, omit the default policy, and attach both
`agent-high-risk-boundary` and the otherwise-readable issue-core workload
policy. A live ephemeral login proved data capabilities resolve to `deny` and
metadata to `read`; the token was revoked without reading the KV value.
The exact-bound KeyCape JWT role is also live as the issuer-backed migration
target. KeyCape principal registration remains an identity hardening follow-up,
not a blocker to the active AppRole boundary.
## T06 — Consume the generated catalog artifact
```task
id: RPF-WP-0013-T06
status: done
priority: high
state_hub_task_id: "1b0c4f03-0ec7-5fcc-908d-beed236e4865"
```
Consume ops-warden's versioned `high-risk-data-paths.yaml` as a policy-check
input, add the two newly regraded issue-core and reuse-surface paths, and rerun
source plus live coverage. The input remains ops-warden's risk statement, not
the policy authority; railiance-platform continues to own every deny decision.
Completed 2026-08-22. The vendored input matches the clean upstream artifact,
the repository check covers all 14 entries, and the server-backed audit reports
zero uncovered. Evidence: `docs/evidence/agent-high-risk-boundary-2026-08-21.md`.
## Acceptance
- [x] Every concrete high-risk catalog path is denied in the source policy.
- [x] The live policy matches source and the server-backed audit passes.
- [x] A distinct AppRole attachment is established from live metadata.
- [x] Result and generated-artifact follow-up are routed to ops-warden.
- [x] A distinct coding-agent identity actually attaches the boundary.