ops-warden/src/warden
tegwick 66db87e6ae feat: refuse to answer a write with a read (WARDEN-WP-0038)
`warden plan` scored needs by keyword overlap with no notion of what the
caller wanted to DO, so "generate a successor secret and CAS-write it to two
custodians" matched the lane that READS that path and inherited its
`autonomous` verdict -- answered with --out/--exec/--wrap.

Two counterparties reported it in two days. key-cape distrusted the output on
principle and was right to; railiance-platform, answering as the write
authority being wrongly bypassed, said plainly that `founder_required` is the
verdict it should have returned and that until it is fixed a plan result must
not stand in for the owner's answer.

A mutating need on a lane ops-warden does not permanently own can no longer
reach any branch returning `autonomous`: it becomes `founder_required` with
an approve act naming the write owner, or `unroutable` with a CCR stub when
the lane admits no rotation route. Commands carry no read transport either
way, which is the half that made the wrong verdict actionable.

The ownership test does the work a verb list cannot. SSH certificate
issuance is itself a mutating act, so `delegation.mode: permanent` -- not the
absence of a verb -- separates ops-warden's own front door from someone
else's custody. A regression asserts `warden sign` still proceeds; a guard
that refused our own lane would be worse than the defect it fixes.

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

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 1276224@bnt-lap001
Assistant-Session: 426ec497-e1c4-4dd3-b417-dfce1ca1dbc3
2026-09-10 08:02:10 +02:00
..
routing fix: route OpenBao recovery ceremonies safely 2026-08-22 20:54:45 +02:00
scripts Initial Commit 2026-03-28 00:45:43 +00:00
__init__.py Initial Commit 2026-03-28 00:45:43 +00:00
access.py feat: complete local layer model v0.7 conformance work 2026-09-05 01:19:48 +02:00
audit.py feat: adopt security zones and explicit workload refs 2026-08-22 15:36:37 +02:00
ca.py feat: adopt security zones and explicit workload refs 2026-08-22 15:36:37 +02:00
caller_identity.py feat: adopt security zones and explicit workload refs 2026-08-22 15:36:37 +02:00
cli.py feat: complete local layer model v0.7 conformance work 2026-09-05 01:19:48 +02:00
config.py feat: adopt security zones and explicit workload refs 2026-08-22 15:36:37 +02:00
desk.py WARDEN-WP-0029: implement plan front door, org posture, desk, freshness 2026-07-18 16:59:37 +02:00
doubles.py feat(WARDEN-WP-0015): T3 conformance checker + T4 dev-tier contract doubles 2026-06-27 19:30:30 +02:00
inventory.py Initial Commit 2026-03-28 00:45:43 +00:00
mask.py WARDEN-WP-0026 T03: masking display filter (defense-in-depth) 2026-07-16 14:54:55 +02:00
memory.py Add Makefile targets to install and verify phase-memory with warden. 2026-07-03 00:54:21 +02:00
models.py feat: adopt security zones and explicit workload refs 2026-08-22 15:36:37 +02:00
plan.py feat: refuse to answer a write with a read (WARDEN-WP-0038) 2026-09-10 08:02:10 +02:00
policy.py Refuse explicit policy authentication and binding denials before side effects 2026-09-08 16:46:00 +02:00
posture.py WARDEN-WP-0029: implement plan front door, org posture, desk, freshness 2026-07-18 16:59:37 +02:00
proxy.py Preserve Warden config in attended child 2026-09-01 00:24:18 +02:00
scorecard.py WARDEN-WP-0029: implement plan front door, org posture, desk, freshness 2026-07-18 16:59:37 +02:00
taint.py WARDEN-WP-0026 finish Strand A (T04/T05/T07) 2026-07-16 23:26:26 +02:00
vault.py Implement WP-0022 audit trail and WP-0023 INTENT–SCOPE closeout 2026-07-01 23:32:38 +02:00
vault_hints.py Implement WP-0022 audit trail and WP-0023 INTENT–SCOPE closeout 2026-07-01 23:32:38 +02:00
worker.py fix: contain attended OpenBao login output 2026-08-23 01:31:05 +02:00