From 9d42dd5abd6ab70a0dbc98f7f746a0eced638dee Mon Sep 17 00:00:00 2001 From: tegwick Date: Tue, 11 Aug 2026 11:11:01 +0200 Subject: [PATCH] Add WP-0030 delegation register; refresh INTENT and SCOPE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Founder directive: ops-warden works with, never replaces or duplicates, secrets-engine / tenant-engine / user-engine. Covering an unfilled gap is acceptable only as a tracked interim with a named intended owner. - INTENT §9 "Cover gaps, but never silently own them"; success criterion 7; tenant-engine and user-engine added to the literacy table; non-goal on permanently owning another component's lane - WP-0030 (proposed): delegation: metadata, backfill, warden route gaps, promotion gate, publish the register to owner repos - history/2026-08-11-delegation-surface-assessment.md: 2 of 24 lanes carry exec_owner; 11 proxies record no intended owner - SCOPE refreshed to 2026-08-11 (was 6 workplans behind); completeness C5 -> C4 Co-Authored-By: Claude Opus 5 --- INTENT.md | 33 +++ SCOPE.md | 104 +++++++-- WORK-RECORDS.md | 99 +++++++++ ...026-08-11-delegation-surface-assessment.md | 87 ++++++++ workplans/ADHOC-2026-08-11.md | 2 + .../WARDEN-WP-0030-delegation-register.md | 202 ++++++++++++++++++ 6 files changed, 512 insertions(+), 15 deletions(-) create mode 100644 WORK-RECORDS.md create mode 100644 history/2026-08-11-delegation-surface-assessment.md create mode 100644 workplans/WARDEN-WP-0030-delegation-register.md diff --git a/INTENT.md b/INTENT.md index 304f9cd..0f0919e 100644 --- a/INTENT.md +++ b/INTENT.md @@ -89,6 +89,8 @@ ops-warden should be fluent in the platform architecture documented in | **OpenBao** | Runtime secrets — API keys, dynamic creds, leases, audit | Instruct custody paths; SSH engine is signing backend only; proxy reads as caller when `exec_capable` | | **secrets-engine** | Owner-native secret-exec (`secrets-engine exec`) | Route provisioned exec lanes (e.g. npm publish); ops-warden does not hold tokens | | **railiance-platform** (credential broker) | Scoped lease grants (`credential exec`) | Route `warden-sign` token needs; ops-warden does not mint OpenBao tokens | +| **tenant-engine** | Tenant/client secret custody and front door | Route tenant lanes once fronted; ops-warden's current tenant proxies are interim (§9) | +| **user-engine** | End-user identity and account lifecycle | No ops-warden lane today; route rather than absorb | | **ops-warden** | Operational SSH certificates — short-lived host access | **Own and issue** this lane | | **ops-bridge** | Tunnel transport — consumes certs via `cert_command` | Primary consumer; document integration | | **railiance-infra** | Host principals, force-command, SSH hardening | Instruct host-side deployment; do not own Ansible | @@ -201,6 +203,31 @@ must know the current posture, state it in its answers, and tighten defaults when the posture graduates (first customer data, first non-founder operator, production tier). Posture is declared configuration, not tribal knowledge. +### 9. Cover gaps, but never silently own them + +*(added 2026-08-11, founder directive — see WARDEN-WP-0030)* + +ops-warden **works with, and never replaces or duplicates**, secrets-engine, +tenant-engine, user-engine and the other NetKingdom security components. + +It may nonetheless *cover* a need that no component systematically provides yet — +that is a legitimate service, and the `warden access` proxy makes it cheap. The +danger is precisely that cheapness: an absorbed need looks permanent, stops +registering as a missing capability, and quietly turns a routing layer into a +second secrets broker. + +So every execution position other than SSH issuance is **interim by default**: + +- record the component that *should* own the front door, and what is missing +- treat the cover as a tracked gap, not as ownership +- delegate the moment that component ships its front door, keeping the proxy + only as a fallback (`exec_owner` / `exec_command` — the WP-0019 pattern) + +A gap ops-warden covers silently is worse than a gap it refuses, because the +refusal is visible and the cover is not. Filling the gap properly — with the +owner's governance, custody, and policy — is the goal; ops-warden holding the +lane is the temporary means. + --- ## Credential flow (target mental model) @@ -267,6 +294,9 @@ ops-warden is succeeding when: 5. Non-SSH secrets remain **out of ops-warden storage** — only documented paths. 6. Security blockers can be classified by environment posture, workload maturity, owner route, and non-secret evidence instead of by vague credential risk. +7. Every ops-warden execution position is explicitly **permanent** (SSH issuance) or + explicitly **interim** with a named intended owner and blocker — so gaps ops-warden + covers stay visible as gaps and can be handed back. --- @@ -279,6 +309,9 @@ ops-warden is succeeding when: - Host-side SSH configuration deployment - **Duplicating or restating another subsystem's procedure** — routing material points at the owner's docs; it does not fork them +- **Permanently owning a lane that belongs to another component** — covering an + unfilled gap is acceptable and expected; keeping it after the owner can front it, + or holding it without recording that it is interim, is not (§9) - SSO / Teleport at scale (trigger per Access Management Directive §6.2) --- diff --git a/SCOPE.md b/SCOPE.md index 35d698c..29e2780 100644 --- a/SCOPE.md +++ b/SCOPE.md @@ -17,7 +17,7 @@ access guidance aligned with NetKingdom canon. --- -## Where we are (2026-07-01) +## Where we are (2026-08-11) ops-warden **issues short-lived SSH certificates and routes every other credential need to the subsystem that owns it.** SSH signing is **production-verified** on @@ -59,12 +59,28 @@ contract smoke (`--sign-smoke`); the playbook leads with the gate and the pilot (`agt-state-hub-bridge`) is handed to ops-bridge. The live tunnel cutover is ops-bridge's to execute. -**INTENT alignment:** SSH issuance mission met in production. ops-warden workplans -through WP-0021 are finished; WP-0022 (audit) and WP-0023 (INTENT–SCOPE closeout) -ship in July 2026. Remaining distance is in other repos' lanes: ops-bridge running -the cert_command pilot cutover, flex-auth runtime deployment (FLEX-WP-0007, unblocks -`policy.enabled: true`), and the owner-driven WP-0015 canon landing — plus ongoing -operator hygiene. +**Credential hygiene and the policy front door** shipped through July 2026: +disclosure hygiene and rotation guidance (WP-0026 — `warden taint`, +`warden rotate-guide`, agent read-boundary on high-risk lanes), the tenant secret +custody pattern (WP-0028, first lane binky company email IMAP), experiential memory +across worker/agent sessions (WP-0024), the Forgejo admin PAT lane (WP-0025), and the +posture-aware policy front door (WP-0029 — `warden plan`, `warden desk`, declared +`organization_posture: build` as a third axis). WP-0027 (tamper-resistant governance, +mass rotation/lockdown) is drafted and sits in `backlog`. + +**Delegation register** is the open question (WP-0030, proposed). ops-warden fronts +11 catalog lanes as a caller-identity proxy with no record of which component *should* +own that front door. The primitive to delegate exists and is proven +(`exec_owner`/`exec_command` — secrets-engine for npm publish, the credential broker +for warden-sign) but is used by 2 of 24 lanes. See +`history/2026-08-11-delegation-surface-assessment.md`. + +**INTENT alignment:** SSH issuance mission met in production. All ops-warden workplans +through WP-0029 are finished except WP-0027 (`backlog`) and WP-0030 (`proposed`). +Remaining distance is in other repos' lanes: ops-bridge running the cert_command pilot +cutover, flex-auth runtime deployment (FLEX-WP-0007, unblocks `policy.enabled: true`), +the owner-driven WP-0015 canon landing, and — newly named — the missing owner front +doors that keep ops-warden holding interim lanes (secrets-engine, tenant-engine). ### Issue vs route @@ -84,6 +100,12 @@ ops-warden executes exactly one lane with its own authority and routes/assists t Full role and boundary: `wiki/AccessRouting.md`. The catalog is a **pointer layer** — it never restates an owner's procedure (authored `steps` exist only for the SSH lane). +**Interim by default.** SSH issuance is the only lane ops-warden owns permanently. +Where it proxies or assists, it is covering a need no component fronts yet — a +legitimate service, but a *tracked gap*, retired to the owner once their front door +exists (INTENT §9). Recording that intent per lane is WP-0030; today only +`whynot-design-npm-publish` and `ops-warden-warden-sign-token` carry it. + Gap analysis: `history/2026-07-01-intent-scope-gap-analysis.md` (current); `history/2026-06-24-intent-scope-gap-analysis.md` (prior); `history/2026-06-18-post-wp0008-intent-scope-reassessment.md` (SSH lane); @@ -101,14 +123,15 @@ Gap analysis: `history/2026-07-01-intent-scope-gap-analysis.md` (current); | NetKingdom evolution reflected in docs | Met | | Non-SSH secrets stay out of ops-warden | Met | | Workload posture / maturity model for secret-flow blockers | Met — two-axis standard + descriptors + conformance checker + dev doubles (WP-0015) | +| Every execution position explicitly permanent or interim with a named owner | **Not met** — 2 of 24 lanes carry `exec_owner`; 11 proxy lanes record no intended owner (WP-0030) | -**Maturity vector:** `D5 / A5 / C5 / R4` (Discovery / Availability / Completeness / Reliability) +**Maturity vector:** `D5 / A5 / C4 / R4` (Discovery / Availability / Completeness / Reliability) | Dimension | Level | Meaning today | | --- | --- | --- | | D5 | Discovery | Routing wiki + security map + pointer catalog + NK canon cross-links | | A5 | Availability | CLI + `warden route` + `warden access` advisory & proxy front door + `warden policy` + opt-in policy gate + agent `--json` | -| C5 | Completeness | All ops-warden lanes shipped — SSH (prod), routing, access assist, posture conformance, cert_command pilot gate, two owner-native exec routes documented (secrets-engine npm, credential broker warden-sign). Open items are external: flex-auth prod flip + ops-bridge live cutover | +| C4 | Completeness | All ops-warden lanes shipped — SSH (prod), routing, access assist, posture conformance, cert_command pilot gate, disclosure hygiene, tenant custody, policy front door. **Down from C5:** delegation is unrecorded on 11 of 24 lanes, so ops-warden's interim positions are not distinguishable from designed ones (WP-0030) | | R4 | Reliability | Live OpenBao sign + credential-broker policy-gate smoke evidence on Railiance (2026-07-01) | --- @@ -165,6 +188,19 @@ for the rest. - **Unified audit trail** (WP-0022): append-only `audit.jsonl`, secret-material guard, instrumentation on sign/access/worker paths, `warden activity` CLI merging legacy logs + optional State Hub notes (`wiki/AuditTrail.md`) +- **Experiential memory** (WP-0024, `src/warden/memory.py`) — recorded outcomes feed + routing and coordination; no secret values, guardrail allowlist unchanged +- **Disclosure hygiene** (WP-0026): `warden taint ` (KV `custom_metadata`, + no data read), `warden rotate-guide`, safe fetch transports (`--out` / `--exec` / + `--wrap`) with refusal to stream to non-terminal stdout, and the agent read-boundary + on `risk: high` lanes (exit 7 when `WARDEN_AGENT_ID` is set) +- **Tenant secret custody** (WP-0028): tenant vs `platform/workloads/...` path + convention, policy/CCR/catalog ownership, first lane `binky-company-email-imap` +- **Policy front door** (WP-0029): `warden plan "" [--json]` returning + `autonomous` / `founder_required` (typed act) / `unroutable` (CCR stub); + `warden desk` loopback founder surface (approve, OIDC login, paste-once provision + straight into OpenBao); `organization_posture: build` as posture axis C; catalog + freshness reporting on `warden route list` and in plan JSON ### Stewardship (documentation and alignment) @@ -198,8 +234,25 @@ for the rest. | WP | Focus | | --- | --- | +| WP-0017 | Access front-door discoverability | +| WP-0018 | `whynot-design-npm-publish` — first concrete secret lane (production-exercised) | +| WP-0019 | Route provisioned secret-exec lanes to secrets-engine (`exec_owner` pattern) | +| WP-0020 | Coordination worker (`warden worker`) | +| WP-0021 | Scheduled worker tick (systemd --user timer, kill switch) | | WP-0022 | Unified audit trail + `warden activity` | | WP-0023 | INTENT–SCOPE alignment closeout | +| WP-0024 | Experiential memory across worker/agent sessions (`src/warden/memory.py`) | +| WP-0025 | Forgejo admin PAT OpenBao lane (CCR-2026-0006) | +| WP-0026 | Credential disclosure hygiene — `warden taint`, `warden rotate-guide`, agent read-boundary, safe fetch transports | +| WP-0028 | Tenant secret custody pattern — tenant vs platform paths; first lane binky company email IMAP | +| WP-0029 | Policy front door — `warden plan`, `warden desk`, `organization_posture: build` third axis | + +### Open ops-warden work + +| WP | Status | Focus | +| --- | --- | --- | +| WP-0027 | `backlog` | Tamper-resistant credential governance + mass rotation/lockdown (Strand B follow-on to WP-0026) | +| WP-0030 | `proposed` | Delegation register — record intended owner + blocker on every interim lane, `warden route gaps`, promotion gate | Remaining production distance is also in other repos' lanes (see Known gaps). @@ -212,6 +265,8 @@ Remaining production distance is also in other repos' lanes (see Known gaps). | Principals sync warden ↔ railiance-infra | ops-warden + infra | `scripts/check_principals_drift.py` — operator runs periodically | | NK-WP-0009 joint SSH tutorial | net-kingdom | Parallel coordination track | | WP-0015 canon landing (generic `WorkloadMaturityLevel` + M0-M3 requirements) | net-kingdom + info-tech-canon | ops-warden drafted + offered (coordination msgs); owner-driven landing | +| Owner front doors for workload secret lanes | secrets-engine | 6 lanes proxied by ops-warden that `secrets-engine exec` could front, as WP-0019 did for npm publish | +| Owner front door for tenant secret lanes | tenant-engine | WP-0028 defined the custody pattern; 3 tenant lanes still fronted by ops-warden proxy | --- @@ -231,6 +286,9 @@ Remaining production distance is also in other repos' lanes (see Known gaps). - OpenBao / Vault cluster deployment → `railiance-platform` - Human admin SSH key generation (self-service `ssh-keygen`) - Session recording, SIEM, SSO / Teleport at scale +- **Permanently owning another component's lane.** Covering an unfilled gap is in + scope and expected; keeping it once secrets-engine / tenant-engine / user-engine + can front it — or holding it without recording that it is interim — is not (INTENT §9) --- @@ -284,12 +342,24 @@ Remaining production distance is also in other repos' lanes (see Known gaps). - **Audit + activity:** WP-0022 shipped — `warden activity`, `wiki/AuditTrail.md` - **INTENT closeout:** WP-0023 shipped — INTENT refresh, production flip/cutover checklists, catalog promotion cadence, broker hint on missing `VAULT_TOKEN` -- **Active work:** none open in ops-warden after WP-0022/0023; remaining distance is - other repos' lanes +- **Disclosure hygiene:** WP-0026 shipped — `warden taint`, `warden rotate-guide`, + safe fetch transports (`--out`/`--exec`/`--wrap`), agent read-boundary on `risk: high` + lanes (`wiki/playbooks/agent-read-boundary.md`) +- **Tenant custody:** WP-0028 shipped — tenant vs platform path convention; first lane + `binky-company-email-imap`. Front door is still an ops-warden proxy (tenant-engine gap) +- **Policy front door:** WP-0029 shipped — `warden plan ""` (autonomous / + founder_required / unroutable), `warden desk` founder interaction surface, declared + `organization_posture: build` as a third posture axis, catalog freshness reporting +- **Delegation:** 24 catalog lanes — 1 executed by ops-warden (SSH), 2 delegated via + `exec_owner`, 11 proxied with **no intended owner recorded**, 10 route-only. Addressed + by WP-0030 (proposed) +- **Active work:** WP-0027 (`backlog`), WP-0030 (`proposed`); remaining production + distance is other repos' lanes - **Integration docs:** cert_command migration, token hygiene (broker-first), principals drift (`wiki/playbooks/`) -- **Latest assessment:** `history/2026-07-01-intent-scope-gap-analysis.md` -- **Latest workplans:** WP-0022 (audit), WP-0023 (INTENT–SCOPE closeout) — shipped July 2026 +- **Latest assessment:** `history/2026-08-11-delegation-surface-assessment.md` +- **Latest workplans:** WP-0029 (policy front door) shipped July 2026; WP-0030 + (delegation register) proposed 2026-08-11 --- @@ -335,7 +405,9 @@ Downstream: `ops-bridge` (primary), kaizen agents, CI automations, human operato | `railiance-platform` | OpenBao deployment and platform secrets | | `flex-auth` | Authorization; policy package shipped (FLEX-WP-0006); runtime deploy FLEX-WP-0007 | | `key-cape` | Identity / IAM Profile lightweight mode | -| `secrets-engine` | Owner-native secret-exec front door (`secrets-engine exec/route`); ops-warden routes provisioned secret lanes to it (WP-0019) | +| `secrets-engine` | Owner-native secret-exec front door (`secrets-engine exec/route`); ops-warden routes provisioned secret lanes to it (WP-0019) and holds 6 more as interim proxies pending its front doors | +| `tenant-engine` | Intended owner of tenant/client secret front doors; ops-warden holds 3 tenant lanes as interim proxies (WP-0028 pattern, WP-0030 register) | +| `user-engine` | End-user identity/account lifecycle; no ops-warden lane today — route rather than absorb | | `state-hub` | Workplan registry | --- @@ -388,7 +460,9 @@ keywords: [access, credential, secret, npm, token, api-key, openbao, key-cape, l | `wiki/AuditTrail.md` | Unified metadata-only audit + `warden activity` | | `wiki/playbooks/catalog-lane-promotion.md` | draft → active catalog promotion checklist | | `wiki/CertCommandInterface.md` | cert_command contract | -| `history/2026-07-01-intent-scope-gap-analysis.md` | Current INTENT↔SCOPE gap analysis | +| `history/2026-08-11-delegation-surface-assessment.md` | Current assessment — where ops-warden covers gaps and who should own them | +| `workplans/WARDEN-WP-0030-delegation-register.md` | Delegation register plan (proposed) | +| `history/2026-07-01-intent-scope-gap-analysis.md` | Prior INTENT↔SCOPE gap analysis | | `workplans/WARDEN-WP-0023-intent-scope-alignment-closeout.md` | Alignment closeout plan | | `history/2026-06-24-intent-scope-gap-analysis.md` | Prior gap analysis | | `history/2026-06-27-workload-security-posture-charter.md` | WP-0015 posture/conformance charter | diff --git a/WORK-RECORDS.md b/WORK-RECORDS.md new file mode 100644 index 0000000..2d5a210 --- /dev/null +++ b/WORK-RECORDS.md @@ -0,0 +1,99 @@ +# Work Records — ops-warden + +> Generated by `statehub fix-consistency` (CUST-WP-0061-T04, work-record +> stage 3). Do not edit by hand — edit the source file/block listed for +> each record and re-run fix-consistency to refresh this index. Archived +> workplans are omitted; closed decisions/intakes/engagements stay listed +> so recently-resolved work is still visible. [auto] + +| Kind | ID | Status | Lane | Source | +| --- | --- | --- | --- | --- | +| workplan | ADHOC-2026-06-27 | finished | — | workplans/ADHOC-2026-06-27.md | +| workplan | ADHOC-2026-06-29 | finished | — | workplans/ADHOC-2026-06-29.md | +| workplan | ADHOC-2026-08-11 | active | — | workplans/ADHOC-2026-08-11.md | +| workplan | WARDEN-WP-0016 | finished | — | workplans/WARDEN-WP-0016-ops-bridge-tunnel-cert-pilot.md | +| workplan | WARDEN-WP-0017 | finished | — | workplans/WARDEN-WP-0017-access-front-door-discoverability.md | +| workplan | WARDEN-WP-0018 | finished | — | workplans/WARDEN-WP-0018-whynot-design-npm-lane-activation.md | +| workplan | WARDEN-WP-0019 | finished | — | workplans/WARDEN-WP-0019-route-to-secrets-engine.md | +| workplan | WARDEN-WP-0020 | finished | — | workplans/WARDEN-WP-0020-ops-warden-worker.md | +| workplan | WARDEN-WP-0021 | finished | — | workplans/WARDEN-WP-0021-enable-scheduled-worker-tick.md | +| workplan | WARDEN-WP-0022 | finished | — | workplans/WARDEN-WP-0022-audit-trail-and-activity.md | +| workplan | WARDEN-WP-0023 | finished | — | workplans/WARDEN-WP-0023-intent-scope-alignment-closeout.md | +| workplan | WARDEN-WP-0024 | finished | — | workplans/WARDEN-WP-0024-experiential-memory-and-agent-sessions.md | +| workplan | WARDEN-WP-0025 | finished | — | workplans/WARDEN-WP-0025-forgejo-admin-api-token-lane.md | +| workplan | WARDEN-WP-0026 | finished | — | workplans/WARDEN-WP-0026-credential-disclosure-hygiene.md | +| workplan | WARDEN-WP-0027 | backlog | — | workplans/WARDEN-WP-0027-credential-governance-lockdown.md | +| workplan | WARDEN-WP-0028 | finished | — | workplans/WARDEN-WP-0028-tenant-secret-custody.md | +| workplan | WARDEN-WP-0029 | finished | — | workplans/WARDEN-WP-0029-policy-front-door-and-founder-surface.md | +| task | ADHOC-2026-06-27-T01 | done | — | workplans/ADHOC-2026-06-27.md | +| task | ADHOC-2026-06-29-T01 | done | — | workplans/ADHOC-2026-06-29.md | +| task | ADHOC-2026-08-11-T01 | done | — | workplans/ADHOC-2026-08-11.md | +| task | ADHOC-2026-08-11-T02 | done | — | workplans/ADHOC-2026-08-11.md | +| task | ADHOC-2026-08-11-T03 | wait | — | workplans/ADHOC-2026-08-11.md | +| task | WARDEN-WP-0016-T01 | done | — | workplans/WARDEN-WP-0016-ops-bridge-tunnel-cert-pilot.md | +| task | WARDEN-WP-0016-T02 | done | — | workplans/WARDEN-WP-0016-ops-bridge-tunnel-cert-pilot.md | +| task | WARDEN-WP-0016-T03 | done | — | workplans/WARDEN-WP-0016-ops-bridge-tunnel-cert-pilot.md | +| task | WARDEN-WP-0016-T04 | done | — | workplans/WARDEN-WP-0016-ops-bridge-tunnel-cert-pilot.md | +| task | WARDEN-WP-0017-T01 | done | — | workplans/WARDEN-WP-0017-access-front-door-discoverability.md | +| task | WARDEN-WP-0017-T02 | done | — | workplans/WARDEN-WP-0017-access-front-door-discoverability.md | +| task | WARDEN-WP-0017-T03 | done | — | workplans/WARDEN-WP-0017-access-front-door-discoverability.md | +| task | WARDEN-WP-0018-T01 | done | — | workplans/WARDEN-WP-0018-whynot-design-npm-lane-activation.md | +| task | WARDEN-WP-0018-T02 | done | — | workplans/WARDEN-WP-0018-whynot-design-npm-lane-activation.md | +| task | WARDEN-WP-0018-T03 | done | — | workplans/WARDEN-WP-0018-whynot-design-npm-lane-activation.md | +| task | WARDEN-WP-0019-T01 | done | — | workplans/WARDEN-WP-0019-route-to-secrets-engine.md | +| task | WARDEN-WP-0019-T02 | done | — | workplans/WARDEN-WP-0019-route-to-secrets-engine.md | +| task | WARDEN-WP-0020-T01 | done | — | workplans/WARDEN-WP-0020-ops-warden-worker.md | +| task | WARDEN-WP-0020-T02 | done | — | workplans/WARDEN-WP-0020-ops-warden-worker.md | +| task | WARDEN-WP-0020-T03 | done | — | workplans/WARDEN-WP-0020-ops-warden-worker.md | +| task | WARDEN-WP-0020-T04 | done | — | workplans/WARDEN-WP-0020-ops-warden-worker.md | +| task | WARDEN-WP-0020-T05 | done | — | workplans/WARDEN-WP-0020-ops-warden-worker.md | +| task | WARDEN-WP-0021-T01 | done | — | workplans/WARDEN-WP-0021-enable-scheduled-worker-tick.md | +| task | WARDEN-WP-0021-T02 | done | — | workplans/WARDEN-WP-0021-enable-scheduled-worker-tick.md | +| task | WARDEN-WP-0021-T03 | done | — | workplans/WARDEN-WP-0021-enable-scheduled-worker-tick.md | +| task | WARDEN-WP-0021-T04 | done | — | workplans/WARDEN-WP-0021-enable-scheduled-worker-tick.md | +| task | WARDEN-WP-0021-T05 | done | — | workplans/WARDEN-WP-0021-enable-scheduled-worker-tick.md | +| task | WARDEN-WP-0022-T01 | done | — | workplans/WARDEN-WP-0022-audit-trail-and-activity.md | +| task | WARDEN-WP-0022-T02 | done | — | workplans/WARDEN-WP-0022-audit-trail-and-activity.md | +| task | WARDEN-WP-0022-T03 | done | — | workplans/WARDEN-WP-0022-audit-trail-and-activity.md | +| task | WARDEN-WP-0022-T04 | done | — | workplans/WARDEN-WP-0022-audit-trail-and-activity.md | +| task | WARDEN-WP-0023-T01 | done | — | workplans/WARDEN-WP-0023-intent-scope-alignment-closeout.md | +| task | WARDEN-WP-0023-T02 | done | — | workplans/WARDEN-WP-0023-intent-scope-alignment-closeout.md | +| task | WARDEN-WP-0023-T03 | done | — | workplans/WARDEN-WP-0023-intent-scope-alignment-closeout.md | +| task | WARDEN-WP-0023-T04 | done | — | workplans/WARDEN-WP-0023-intent-scope-alignment-closeout.md | +| task | WARDEN-WP-0023-T05 | done | — | workplans/WARDEN-WP-0023-intent-scope-alignment-closeout.md | +| task | WARDEN-WP-0023-T06 | done | — | workplans/WARDEN-WP-0023-intent-scope-alignment-closeout.md | +| task | WARDEN-WP-0023-T07 | done | — | workplans/WARDEN-WP-0023-intent-scope-alignment-closeout.md | +| task | WARDEN-WP-0024-T01 | done | — | workplans/WARDEN-WP-0024-experiential-memory-and-agent-sessions.md | +| task | WARDEN-WP-0024-T02 | done | — | workplans/WARDEN-WP-0024-experiential-memory-and-agent-sessions.md | +| task | WARDEN-WP-0024-T03 | done | — | workplans/WARDEN-WP-0024-experiential-memory-and-agent-sessions.md | +| task | WARDEN-WP-0024-T04 | done | — | workplans/WARDEN-WP-0024-experiential-memory-and-agent-sessions.md | +| task | WARDEN-WP-0024-T05 | done | — | workplans/WARDEN-WP-0024-experiential-memory-and-agent-sessions.md | +| task | WARDEN-WP-0024-T06 | done | — | workplans/WARDEN-WP-0024-experiential-memory-and-agent-sessions.md | +| task | WARDEN-WP-0024-T07 | done | — | workplans/WARDEN-WP-0024-experiential-memory-and-agent-sessions.md | +| task | WARDEN-WP-0025-T01 | done | — | workplans/WARDEN-WP-0025-forgejo-admin-api-token-lane.md | +| task | WARDEN-WP-0025-T02 | done | — | workplans/WARDEN-WP-0025-forgejo-admin-api-token-lane.md | +| task | WARDEN-WP-0025-T03 | done | — | workplans/WARDEN-WP-0025-forgejo-admin-api-token-lane.md | +| task | WARDEN-WP-0025-T04 | done | — | workplans/WARDEN-WP-0025-forgejo-admin-api-token-lane.md | +| task | WARDEN-WP-0025-T05 | done | — | workplans/WARDEN-WP-0025-forgejo-admin-api-token-lane.md | +| task | WARDEN-WP-0026-T01 | done | — | workplans/WARDEN-WP-0026-credential-disclosure-hygiene.md | +| task | WARDEN-WP-0026-T02 | done | — | workplans/WARDEN-WP-0026-credential-disclosure-hygiene.md | +| task | WARDEN-WP-0026-T03 | done | — | workplans/WARDEN-WP-0026-credential-disclosure-hygiene.md | +| task | WARDEN-WP-0026-T04 | done | — | workplans/WARDEN-WP-0026-credential-disclosure-hygiene.md | +| task | WARDEN-WP-0026-T05 | done | — | workplans/WARDEN-WP-0026-credential-disclosure-hygiene.md | +| task | WARDEN-WP-0026-T06 | done | — | workplans/WARDEN-WP-0026-credential-disclosure-hygiene.md | +| task | WARDEN-WP-0026-T07 | done | — | workplans/WARDEN-WP-0026-credential-disclosure-hygiene.md | +| task | WARDEN-WP-0027-T01 | cancel | — | workplans/WARDEN-WP-0027-credential-governance-lockdown.md | +| task | WARDEN-WP-0027-T02 | cancel | — | workplans/WARDEN-WP-0027-credential-governance-lockdown.md | +| task | WARDEN-WP-0027-T03 | cancel | — | workplans/WARDEN-WP-0027-credential-governance-lockdown.md | +| task | WARDEN-WP-0028-T01 | done | — | workplans/WARDEN-WP-0028-tenant-secret-custody.md | +| task | WARDEN-WP-0028-T02 | done | — | workplans/WARDEN-WP-0028-tenant-secret-custody.md | +| task | WARDEN-WP-0028-T03 | done | — | workplans/WARDEN-WP-0028-tenant-secret-custody.md | +| task | WARDEN-WP-0028-T04 | done | — | workplans/WARDEN-WP-0028-tenant-secret-custody.md | +| task | WARDEN-WP-0028-T05 | done | — | workplans/WARDEN-WP-0028-tenant-secret-custody.md | +| task | WARDEN-WP-0028-T06 | done | — | workplans/WARDEN-WP-0028-tenant-secret-custody.md | +| task | WARDEN-WP-0028-T07 | done | — | workplans/WARDEN-WP-0028-tenant-secret-custody.md | +| task | WARDEN-WP-0029-T01 | done | — | workplans/WARDEN-WP-0029-policy-front-door-and-founder-surface.md | +| task | WARDEN-WP-0029-T02 | done | — | workplans/WARDEN-WP-0029-policy-front-door-and-founder-surface.md | +| task | WARDEN-WP-0029-T03 | done | — | workplans/WARDEN-WP-0029-policy-front-door-and-founder-surface.md | +| task | WARDEN-WP-0029-T04 | done | — | workplans/WARDEN-WP-0029-policy-front-door-and-founder-surface.md | +| task | WARDEN-WP-0029-T05 | done | — | workplans/WARDEN-WP-0029-policy-front-door-and-founder-surface.md | diff --git a/history/2026-08-11-delegation-surface-assessment.md b/history/2026-08-11-delegation-surface-assessment.md new file mode 100644 index 0000000..c2004ed --- /dev/null +++ b/history/2026-08-11-delegation-surface-assessment.md @@ -0,0 +1,87 @@ +# Delegation surface assessment — 2026-08-11 + +**Trigger:** founder directive — ops-warden should work with, but never replace or +duplicate, secrets-engine, tenant-engine, user-engine and other NetKingdom +components. Covering an unfilled gap is acceptable if the gap stays visible, gets +filled with proper governance, and ops-warden then delegates. + +**Method:** enumerate `registry/routing/catalog.yaml` by execution mode; check +`wiki/AccessRouting.md` and `wiki/playbooks/catalog-lane-promotion.md` for existing +interim/delegation doctrine; compare against SCOPE/INTENT claims. + +--- + +## 1. Execution surface (24 catalog entries) + +| Mode | Count | Entries | +| --- | --- | --- | +| `warden_executes: true` — ops-warden's own authority | 1 | `ssh-cert-host-access` | +| `exec_owner:` set — delegated, route-primary/proxy-fallback | 2 | `whynot-design-npm-publish` (secrets-engine), `ops-warden-warden-sign-token` (railiance-platform broker) | +| `exec_capable` proxy, **no** `exec_owner` | 11 | `openbao-api-key`, `key-cape-oidc-login`, `issue-core-ingestion-api-key`, `reuse-surface-hub-write-token`, `openrouter-llm-connect`, `railiance-backup-offsite-lane`, `forgejo-admin-api-token`, `binky-company-email-imap`, `binky-qonto-api`, `rapp-qonto-keycape-client`, `agent-harness-forgejo-deploy` | +| route-only pointer | 10 | remainder | + +**Finding.** The delegation primitive exists, is proven in production, and is used by +**2 of 24** lanes. Eleven lanes have ops-warden as the de facto front door with no +record of who should own it instead. + +## 2. The doctrine is not written down + +- `wiki/AccessRouting.md` — the canonical "what ops-warden answers" page — contains + **no mention of secrets-engine** and no section on interim positions. A worker or + agent reading it cannot tell that `warden access` proxying a workload secret is a + stopgap rather than the design. +- `wiki/playbooks/catalog-lane-promotion.md` gates draft→active on the lane + *working* (zero placeholders, resolvable, tests green). It never asks whether + ops-warden should be the one executing it. +- The delegation intent for `whynot-design-npm-publish` lives in WP-0019 prose and + SCOPE; the *machine-readable* expression (`exec_owner`) was a by-product, not a + policy applied catalog-wide. + +Consequence: an absorbed need is indistinguishable from a designed one. Ownership +drift is invisible by construction, which is exactly the failure mode the directive +targets. + +## 3. Drafted classification of the eleven + +Not authoritative — architecture judgement belongs to the founder (WP-0030 T02). + +| Lane | Draft reading | Intended owner / blocker | +| --- | --- | --- | +| `key-cape-oidc-login` | **Permanent** | Login is key-cape's; the proxy is caller convenience, not custody | +| `openbao-api-key` | **Permanent (by design)** | Generic escape hatch for any OpenBao path; a catch-all, not a lane | +| `binky-company-email-imap` | Interim | **tenant-engine** — WP-0028 defined the tenant custody pattern; no tenant front door executes it | +| `binky-qonto-api` | Interim | **tenant-engine** — same | +| `rapp-qonto-keycape-client` | Interim | **tenant-engine** / key-cape — tenant workload client credential | +| `issue-core-ingestion-api-key` | Interim | **secrets-engine** — same shape WP-0019 closed for npm publish | +| `openrouter-llm-connect` | Interim | **secrets-engine** — high-risk provider key | +| `reuse-surface-hub-write-token` | Interim | **secrets-engine** | +| `railiance-backup-offsite-lane` | Interim | **secrets-engine** / railiance-platform | +| `forgejo-admin-api-token` | Interim | **secrets-engine** | +| `agent-harness-forgejo-deploy` | Interim | **secrets-engine** | + +**No lane names `user-engine` as owner.** It appears only as a *consumer* inside +`coulomb-social-runtime-env` (route-only, owned by railiance-platform), whose rotation +guidance points at the OpenBao path `user-engine/user-engine-runtime` for +`USER_ENGINE_PROXY_SECRET`. So a user-engine runtime secret exists and is routed, but +user-engine fronts nothing itself. Whether it should own that lane is worth confirming +rather than assuming either way. + +## 4. Secondary finding — SCOPE drift + +`SCOPE.md` "Where we are" was dated **2026-07-01** and stated *"Active work: none +open in ops-warden after WP-0022/0023."* Six workplans have shipped since +(WP-0024–0026, WP-0028, WP-0029 finished; WP-0027 sits in `backlog`), adding +`warden plan`, `warden desk`, `warden taint`, `warden rotate-guide`, experiential +memory, the tenant custody pattern, and the build-phase organization posture axis. +SCOPE understated the repo by roughly six weeks of work. Corrected in this pass. + +## 5. Recommendation + +WARDEN-WP-0030 — record `delegation:` (mode / intended_owner / blocked_on) on every +entry, expose `warden route gaps`, gate promotion on the ownership question, and +publish the resulting interim register to the owner repos. Absence of a delegation +block should read as *interim, owner unknown* — a question — never as settled +ownership. + +The measure of success is not fewer proxies. It is that no proxy exists without an +answer to *"who should own this front door, and what is missing?"* diff --git a/workplans/ADHOC-2026-08-11.md b/workplans/ADHOC-2026-08-11.md index 967b4dc..da5668f 100644 --- a/workplans/ADHOC-2026-08-11.md +++ b/workplans/ADHOC-2026-08-11.md @@ -42,6 +42,7 @@ an anchor that does not exist. The intended heading is `## Routing catalog index id: ADHOC-2026-08-11-T02 status: done priority: medium +state_hub_task_id: "546a4299-314c-448d-b2fb-201ddc50353c" ``` `fix-consistency` flagged 11 unread messages older than 3 days, two of them as possible @@ -75,6 +76,7 @@ read. Inbox is now empty. id: ADHOC-2026-08-11-T03 status: wait priority: medium +state_hub_task_id: "b930df62-b8dd-45ae-b0a5-98298cdfa1b6" ``` secrets-engine (msg `80456912`, 2026-06-29) is holding a validated non-mutating dry-run diff --git a/workplans/WARDEN-WP-0030-delegation-register.md b/workplans/WARDEN-WP-0030-delegation-register.md new file mode 100644 index 0000000..09f928a --- /dev/null +++ b/workplans/WARDEN-WP-0030-delegation-register.md @@ -0,0 +1,202 @@ +--- +id: WARDEN-WP-0030 +type: workplan +title: "Delegation register — make gap-covering interim, visible, and retirable" +domain: infotech +repo: ops-warden +status: proposed +owner: claude +topic_slug: custodian +planning_priority: high +planning_order: 30 +created: "2026-08-11" +updated: "2026-08-11" +--- + +# WARDEN-WP-0030 — Delegation register + +## Origin + +Founder directive 2026-08-11: **ops-warden should work with, but never replace or +duplicate, secrets-engine, tenant-engine, user-engine and other NetKingdom +components.** It is acceptable for ops-warden to cover a gap where needed security +functionality is not yet systematically provided — *provided* the gap is kept in +mind, filled, and given proper governance, after which ops-warden delegates to the +improved component. + +The directive is already half-lived and nowhere written. Survey of +`registry/routing/catalog.yaml` on 2026-08-11 (24 entries): + +| Execution mode | Count | Meaning | +| --- | --- | --- | +| `warden_executes: true` | 1 | ops-warden's own lane (`ssh-cert-host-access`) | +| `exec_owner:` set | 2 | Delegated — route-primary, proxy-fallback | +| `exec_capable` proxy, no `exec_owner` | 11 | **ops-warden is the de facto front door** | +| route-only | 10 | Pointer, nothing to delegate | + +The delegation primitive already exists and works: `exec_owner` / `exec_command` / +`pointer_command` (`whynot-design-npm-publish` → secrets-engine, WP-0019; +`ops-warden-warden-sign-token` → railiance-platform credential broker, +RAILIANCE-WP-0005 T08). It is used by 2 of 24 lanes. + +Nothing distinguishes the other eleven — "ops-warden proxies because that is the +right end state" reads identically to "ops-warden proxies because no owner front +door was ever built." Supporting evidence of the doctrine gap: + +- `wiki/AccessRouting.md` does not mention secrets-engine at all and has no section + on interim positions. +- `wiki/playbooks/catalog-lane-promotion.md` gates draft→active on the lane + *working*, never on whether ops-warden should be the one running it. + +## Goal + +Make every ops-warden execution position **explicitly interim or explicitly +permanent**, with the intended owner and blocking condition recorded in the +machine-readable layer — so gap-covering is a tracked, retirable state rather than +silent ownership drift. + +Success is not removing proxies. Success is that no proxy exists without an answer +to *"who should own this front door, and what is missing?"* + +## Non-goals + +- Removing or degrading any working lane. Proxies keep working until the owner's + front door exists and is proven. +- Building the missing front doors. That work belongs to secrets-engine, + tenant-engine, user-engine, and railiance-platform — this workplan produces the + register they need, not their implementations. +- A second catalog or a parallel schema. `delegation:` extends the existing entry + shape; `warden route gaps` composes the existing loader. + +## Design constraints + +- **Interim is the default.** A lane without a `delegation:` block is treated as + `interim` with an unknown owner, not as settled. Absence must read as a question. +- **Founder classifies, agent drafts.** Which of the eleven are legitimately + permanent is an architecture judgement (`key-cape-oidc-login` plausibly is; the + tenant/workload secret lanes plausibly are not). T02 lands a *drafted* + classification for review; the founder's answer is authoritative. +- **No restating owner procedure.** The register names the intended owner and the + blocker; it does not describe how that owner will implement their front door. + Same pointer-layer discipline as the rest of the catalog. + +## Tasks + +### T01 — Interim custodianship doctrine + +```task +id: WARDEN-WP-0030-T01 +status: todo +priority: high +``` + +Add a doctrine section to `wiki/AccessRouting.md` stating the boundary: the only +lane ops-warden executes with its own authority is SSH issuance; every other +execution position is interim, held because the owning component does not yet cover +the need, and retired to that owner once it does. Name secrets-engine, +tenant-engine, user-engine, railiance-platform and flex-auth as the delegation +targets. Cross-link INTENT.md §9. + +### T02 — `delegation:` metadata + backfill + +```task +id: WARDEN-WP-0030-T02 +status: todo +priority: high +``` + +Extend the catalog entry schema with: + +```yaml +delegation: + mode: native | interim | permanent # native = owner already fronts it + intended_owner: # required unless mode: permanent + blocked_on: # required when mode: interim + reviewed: "YYYY-MM-DD" +``` + +Backfill all 24 entries. `exec_owner` lanes become `mode: native`. +`ssh-cert-host-access` becomes `mode: permanent` (ops-warden's own lane). The +eleven undelegated proxies get a **drafted** classification plus intended owner, +flagged in the workplan for founder review rather than asserted as settled. + +### T03 — `warden route gaps` + conformance test + +```task +id: WARDEN-WP-0030-T03 +status: todo +priority: medium +``` + +`warden route gaps [--json]` lists interim lanes with intended owner, blocker, and +age since review — the queryable register. Add a routing test asserting every +`exec_capable` non-`warden_executes` entry declares `delegation`, so a new proxy +cannot be added without answering the ownership question. Surface stale interim +entries in the existing drift/stale review cadence. + +### T04 — Promotion gate + +```task +id: WARDEN-WP-0030-T04 +status: todo +priority: medium +``` + +Update `wiki/playbooks/catalog-lane-promotion.md`: draft→active requires a +`delegation` block. If `mode: interim`, the promotion note must state the intended +owner and the retirement condition. Add the matching question to the lane-review +checklist. + +### T05 — Publish the register to the owners + +```task +id: WARDEN-WP-0030-T05 +status: todo +priority: medium +``` + +Once T02 is reviewed, send the interim register to secrets-engine, tenant-engine, +user-engine, railiance-platform and net-kingdom as a coordination message: here is +what ops-warden currently fronts on your behalf, here is what would let us step +back. This is the artefact that converts a private ops-warden position into a +fleet-visible capability gap. + +## Acceptance + +- [ ] `wiki/AccessRouting.md` states the interim-custodianship boundary and names + the delegation targets +- [ ] All 24 catalog entries carry `delegation`; `warden route gaps` returns the + interim set with owner + blocker +- [ ] Routing test fails when a proxy lane omits `delegation` +- [ ] Promotion playbook gates draft→active on the ownership question +- [ ] Founder has reviewed the interim/permanent classification of the eleven +- [ ] Register delivered to the named owner repos + +## Open question for the founder + +The eleven undelegated proxies are: `openbao-api-key`, `key-cape-oidc-login`, +`issue-core-ingestion-api-key`, `reuse-surface-hub-write-token`, +`openrouter-llm-connect`, `railiance-backup-offsite-lane`, `forgejo-admin-api-token`, +`binky-company-email-imap`, `binky-qonto-api`, `rapp-qonto-keycape-client`, +`agent-harness-forgejo-deploy`. + +Draft reading, for review in T02: `key-cape-oidc-login` is **permanent** (login is +key-cape's and the proxy is convenience, not custody). `openbao-api-key` is the +generic escape hatch and is arguably permanent-by-design. The two `binky-*` tenant +lanes and `rapp-qonto-keycape-client` look like **tenant-engine** gaps (WP-0028 +defined the custody pattern; no tenant front door executes it). The workload secret +lanes — `issue-core-*`, `openrouter-llm-connect`, `reuse-surface-*`, +`railiance-backup-*`, `forgejo-admin-*`, `agent-harness-forgejo-deploy` — look like +**secrets-engine** gaps of the same shape WP-0019 already closed for npm publish. +No lane names **user-engine** as owner — it appears only as a consumer inside +`coulomb-social-runtime-env` (`USER_ENGINE_PROXY_SECRET`, rotated at +`user-engine/user-engine-runtime`). Whether user-engine should front that lane itself +is worth confirming. + +## See also + +- INTENT.md §9 (cover gaps, never silently own them) +- WARDEN-WP-0019 (route to secrets-engine — the pattern this generalizes) +- WARDEN-WP-0028 (tenant secret custody pattern; front door still ops-warden's proxy) +- `history/2026-08-11-delegation-surface-assessment.md` +- `registry/routing/catalog.yaml`, `wiki/playbooks/catalog-lane-promotion.md`