WARDEN-WP-0029: implement plan front door, org posture, desk, freshness
Ship posture-aware access planning: organization_posture=build (axis C), catalog freshness warnings, warden plan verdicts, localhost founder desk, and playbook/agent guidance that retire /tmp file-drop patterns. Compose route catalog + handoff rather than a second routing layer.
This commit is contained in:
parent
5c6b71b83b
commit
5149946a4c
18 changed files with 1690 additions and 102 deletions
|
|
@ -4,7 +4,7 @@ type: workplan
|
|||
title: "Policy front door: posture-aware access planning + founder interaction surface"
|
||||
domain: infotech
|
||||
repo: ops-warden
|
||||
status: active
|
||||
status: finished
|
||||
owner: codex
|
||||
topic_slug: custodian
|
||||
planning_priority: high
|
||||
|
|
@ -73,101 +73,80 @@ T05 is high priority: catalog staleness was the incident root cause.
|
|||
|
||||
```task
|
||||
id: WARDEN-WP-0029-T02
|
||||
status: todo
|
||||
status: done
|
||||
priority: high
|
||||
state_hub_task_id: "73ae528c-384d-43dd-a62a-455a32ec1ea5"
|
||||
```
|
||||
|
||||
Add `organization_posture: build` as a **third axis** in registry policy
|
||||
configuration (alongside env posture dev/test/prod and workload maturity
|
||||
M0–M3 — do not overload those axes), with build-phase policy relaxations
|
||||
spelled out (workstation OIDC acceptable, per-repo deploy keys, advisory
|
||||
flex-auth) and the graduation triggers (first customer data, first
|
||||
non-founder operator, prod tier). `warden plan`, `warden policy`, and
|
||||
scorecard must state the posture in their output.
|
||||
Added `organization_posture: build` as axis C in
|
||||
`registry/policy/security-posture.yaml` (relaxations + graduation triggers).
|
||||
Surfaced in `warden policy list/show`, scorecard, and `warden plan` output.
|
||||
|
||||
### T05 — Catalog freshness + agent guidance
|
||||
|
||||
```task
|
||||
id: WARDEN-WP-0029-T05
|
||||
status: todo
|
||||
status: done
|
||||
priority: high
|
||||
state_hub_task_id: "2121d102-806a-424a-8b62-bd25d7a9324e"
|
||||
```
|
||||
|
||||
The stale-CLI failure mode: `warden` resolved an old **bundled** catalog and
|
||||
hid an existing lane. Add a catalog version/freshness check (source path,
|
||||
content hash or mtime, package version, warn when using bundled fallback or
|
||||
when reviewed entries are stale; `warden route list` shows catalog date) and
|
||||
update AGENTS/CLAUDE guidance in ops-warden: agents must run `warden plan`
|
||||
before ever drafting a founder credential step. (Consuming-repo snippets are
|
||||
out of band — pointer only.)
|
||||
`Catalog.freshness()` reports source (repo/bundled/override), content hash,
|
||||
mtime, package version, stale entry count, and warnings for bundled fallback.
|
||||
Human `warden route list` prints catalog line; plan JSON embeds `catalog`.
|
||||
Scorecard check `catalog_freshness`. AGENTS.md + credential-routing rules
|
||||
require `warden plan` before founder credential steps.
|
||||
|
||||
### T01 — `warden plan` decision front door
|
||||
|
||||
```task
|
||||
id: WARDEN-WP-0029-T01
|
||||
status: todo
|
||||
status: done
|
||||
priority: high
|
||||
state_hub_task_id: "32e4a755-fb74-4979-920f-32d44888df9d"
|
||||
```
|
||||
|
||||
New command: `warden plan "<need>" [--actor agt-...] [--domain ...]`.
|
||||
**Composes** routing catalog (`find` / `RouteEntry`) + `expand_handoff` +
|
||||
`resolvable` + organization posture + policy gate status. Returns a typed
|
||||
verdict: `autonomous` (with the exec-capable command sequence),
|
||||
`founder_required` (with a typed founder act: `oidc_login` | `approve` |
|
||||
`paste_once_provision`), or `unroutable` (with a CCR proposal stub). JSON
|
||||
output for agents. Every plan call audited (metadata only). Does **not**
|
||||
duplicate keyword matching or hold secret values.
|
||||
`warden plan "<need>" [--actor] [--domain] [--json]` composes catalog find +
|
||||
handoff + org posture + policy gate. Verdicts: `autonomous` /
|
||||
`founder_required` (`oidc_login` | `approve` | `paste_once_provision`) /
|
||||
`unroutable` (CCR stub). Metadata-only audit. Module: `src/warden/plan.py`.
|
||||
|
||||
### T04 — Retire file-drop patterns from playbooks
|
||||
|
||||
```task
|
||||
id: WARDEN-WP-0029-T04
|
||||
status: todo
|
||||
status: done
|
||||
priority: medium
|
||||
state_hub_task_id: "61d25118-14ec-4846-8d53-3e09d437cac3"
|
||||
```
|
||||
|
||||
Sweep wiki/playbooks (starting with
|
||||
`forgejo-admin-api-token.md` `/tmp/forgejo-tegwick-api-token` steady-state
|
||||
remnants) and replace file drops with `warden access --exec` / `--out` /
|
||||
`--wrap` lanes or T03 paste-once capture. Document consumer follow-ups
|
||||
(railiance-platform `forgejo_package_prune`, binky-control cutover) as
|
||||
pointers — in-repo playbooks must not instruct founder file drops.
|
||||
`wiki/playbooks/forgejo-admin-api-token.md` rewritten: plan-first, sanctioned
|
||||
transports (`--exec`/`--out`/`--wrap`), desk paste-once for provision; `/tmp`
|
||||
file drops marked retired. Consumer follow-ups noted for railiance-platform
|
||||
and binky-control docs.
|
||||
|
||||
### T03 — Founder interaction surface (local web approval page)
|
||||
|
||||
```task
|
||||
id: WARDEN-WP-0029-T03
|
||||
status: todo
|
||||
status: done
|
||||
priority: medium
|
||||
state_hub_task_id: "2ea768b7-d756-4c45-ac65-1670e069fafb"
|
||||
```
|
||||
|
||||
`warden desk`: serves a localhost, short-lived page when a plan needs a
|
||||
founder act — renders the exact action in plain language (approve/deny,
|
||||
launch OIDC login, or paste-once secret capture that writes straight to the
|
||||
OpenBao path and never echoes). No values in terminal scrollback, shell
|
||||
history, or durable files. Metadata-only audit per interaction.
|
||||
|
||||
**Build-phase non-goals:** multi-user auth, remote bind, core-hub / whynot
|
||||
UI stack. Pattern: stdlib `ThreadingHTTPServer` on `127.0.0.1` only (see
|
||||
net-kingdom security-bootstrap-console). Hardening graduates with org
|
||||
posture.
|
||||
`warden desk` — loopback `ThreadingHTTPServer`, short-lived token URL, acts
|
||||
approve / oidc_login / paste_once_provision (bao kv put via stdin, dry-run
|
||||
supported). Metadata-only audit open/close. Module: `src/warden/desk.py`.
|
||||
|
||||
## Acceptance
|
||||
|
||||
- `warden plan "forgejo deploy key for binky-control"` returns `autonomous`
|
||||
with the admin-lane command sequence; `warden plan` for a need that only
|
||||
matches a non-resolvable / provision-needed path returns `founder_required`
|
||||
with exactly one typed founder act.
|
||||
- Posture `build` visible in plan output and scorecard.
|
||||
- `warden desk` can complete one founder act (approve or paste-once) with
|
||||
zero secret values in CLI/files/audit payload.
|
||||
- No in-repo playbook instructs a founder file drop as steady state.
|
||||
- Catalog freshness is visible on `warden route list` / plan JSON.
|
||||
- [x] `warden plan "forgejo deploy key for binky-control"` → `autonomous` /
|
||||
`agent-harness-forgejo-deploy` with access commands
|
||||
- [x] Provision-style needs → `founder_required` with typed founder act
|
||||
- [x] Posture `build` in plan + policy + scorecard
|
||||
- [x] Desk approve flow (unit) with zero secrets in audit
|
||||
- [x] No in-repo playbook instructs founder file drop as steady state
|
||||
- [x] Catalog freshness on `warden route list` / plan JSON
|
||||
|
||||
## See also
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue