ops-warden/workplans
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
..
archived repo.work.assign_missing_identifiers 2026-09-01 00:51:59 +02:00
ADHOC-2026-06-27.md repo.work.assign_missing_identifiers 2026-09-01 00:51:59 +02:00
ADHOC-2026-06-29.md repo.work.assign_missing_identifiers 2026-09-01 00:51:59 +02:00
ADHOC-2026-08-11.md repo.work.assign_missing_identifiers 2026-09-01 00:51:59 +02:00
ADHOC-2026-08-17.md repo.work.assign_missing_identifiers 2026-09-01 00:51:59 +02:00
ADHOC-2026-09-08.md chore: record hub ids for 2026-09-08 workplans 2026-09-08 14:57:42 +02:00
WARDEN-WP-0016-ops-bridge-tunnel-cert-pilot.md feat(WARDEN-WP-0016): ops-bridge cert_command readiness gate + handoff 2026-06-27 19:50:28 +02:00
WARDEN-WP-0017-access-front-door-discoverability.md feat(WARDEN-WP-0018): activate whynot-design npm publish lane + resolvable flag 2026-06-29 00:32:00 +02:00
WARDEN-WP-0018-whynot-design-npm-lane-activation.md chore(WARDEN-WP-0018): stamp state_hub task ids from consistency sync 2026-06-29 00:36:35 +02:00
WARDEN-WP-0019-route-to-secrets-engine.md chore(WARDEN-WP-0019): stamp state_hub ids from consistency sync 2026-06-29 17:43:44 +02:00
WARDEN-WP-0020-ops-warden-worker.md feat(WARDEN-WP-0020): T4 scheduling tick + T5 SCOPE — worker complete 2026-06-30 00:41:04 +02:00
WARDEN-WP-0021-enable-scheduled-worker-tick.md feat(WARDEN-WP-0021): T3-T5 — visibility, approve loop, runbook (scheduled worker complete) 2026-06-30 15:24:10 +02:00
WARDEN-WP-0022-audit-trail-and-activity.md Implement WP-0022 audit trail and WP-0023 INTENT–SCOPE closeout 2026-07-01 23:32:38 +02:00
WARDEN-WP-0023-intent-scope-alignment-closeout.md Implement WP-0022 audit trail and WP-0023 INTENT–SCOPE closeout 2026-07-01 23:32:38 +02:00
WARDEN-WP-0024-experiential-memory-and-agent-sessions.md Implement WARDEN-WP-0024 experiential memory and agent sessions. 2026-07-02 23:40:45 +02:00
WARDEN-WP-0025-forgejo-admin-api-token-lane.md fix(workplans): adopt ADR-007 derived identifiers for unregistered records 2026-08-25 20:16:12 +02:00
WARDEN-WP-0026-credential-disclosure-hygiene.md fix(workplans): adopt ADR-007 derived identifiers for unregistered records 2026-08-25 20:16:12 +02:00
WARDEN-WP-0027-credential-governance-lockdown.md WARDEN-WP-0027-T02: the owner gate closed five days ago 2026-08-28 22:01:47 +02:00
WARDEN-WP-0028-tenant-secret-custody.md fix(workplans): adopt ADR-007 derived identifiers for unregistered records 2026-08-25 20:16:12 +02:00
WARDEN-WP-0029-policy-front-door-and-founder-surface.md fix(workplans): adopt ADR-007 derived identifiers for unregistered records 2026-08-25 20:16:12 +02:00
WARDEN-WP-0030-delegation-register.md fix(workplans): adopt ADR-007 derived identifiers for unregistered records 2026-08-25 20:16:12 +02:00
WARDEN-WP-0031-policy-caller-identity.md fix(workplans): adopt ADR-007 derived identifiers for unregistered records 2026-08-25 20:16:12 +02:00
WARDEN-WP-0032-security-zones.md fix(workplans): adopt ADR-007 derived identifiers for unregistered records 2026-08-25 20:16:12 +02:00
WARDEN-WP-0033-native-lane-handoff.md WARDEN-WP-0033 finished — key-cape accepted the issuance question five days ago 2026-08-28 22:00:09 +02:00
WARDEN-WP-0034-layer-model-v07-conformance.md docs: record the answers received and the questions routed 2026-09-09 16:40:46 +02:00
WARDEN-WP-0035-policy-nexus-forgejo-source-read-route.md repo.work.assign_missing_identifiers 2026-09-01 00:51:59 +02:00
WARDEN-WP-0036-attended-login-openbao-output.md repo.work.assign_missing_identifiers 2026-09-01 00:51:59 +02:00
WARDEN-WP-0037-whynot-design-forgejo-npm-lane.md docs: record the answers received and the questions routed 2026-09-09 16:40:46 +02:00
WARDEN-WP-0038-plan-mutation-intent.md feat: refuse to answer a write with a read (WARDEN-WP-0038) 2026-09-10 08:02:10 +02:00
WARDEN-WP-0039-explicit-policy-refusal.md docs: record the answers received and the questions routed 2026-09-09 16:40:46 +02:00
WARDEN-WP-0040-unknown-zone-fail-closed-adoption.md chore: record hub ids for WARDEN-WP-0040 2026-09-09 16:42:01 +02:00