diff --git a/agent-builder/.claude/context.md b/agent-builder/.claude/context.md index 02ef6b9..952befe 100644 --- a/agent-builder/.claude/context.md +++ b/agent-builder/.claude/context.md @@ -37,27 +37,50 @@ a **dead** root token as live, into every session, for 3 days. Prune = **#192**; 2026-07-15** (sliding per-host trip window; append-only replayed breaker log; Set B host_override; which tier-4 sources latch; trip escalation). -**⚠️ P3 CODE IS COMPLETE BUT NOT DEPLOYED — BOTH HOSTS STILL RUN THE OLD `sudo_rules.py`.** -`app.py` + `circuit_breaker.py` + Set B override are written and green (**85 tests OK**, mutants -caught) but **UNDEPLOYED**, so **the server-01 tier-0 `breaker.log` hole is OPEN IN PRODUCTION** -until `DEPLOY_RUNBOOK.md` runs. Two **verified** deploy blockers gate it (row **187**): -`Dockerfile` never COPYs `circuit_breaker.py`/`security/` (image would crash on boot), and -`docker-compose.yml` has no `/var/lib/agent-sudo` mount (breaker resettable by `docker restart` — -the exact D-CB6 bypass). **Both were invisible to a 85/85-green suite.** +**✅ P3 IS DEPLOYED ON BOTH HOSTS — 2026-07-15 20:00, commit `005c214`.** (Superseded the +"CODE COMPLETE BUT UNDEPLOYED" state that stood here before; that claim is DEAD.) +server-01 `192.168.1.90:8082` and primary `192.168.1.88:8084`, both healthy, 0 restarts. +Old sudo-bridge **still owns primary `:8082`** — no cutover happened (**#146**). +**The tier-0 `breaker.log` hole is CLOSED on both hosts**: `/var/lib/agent-sudo/breaker.log`, +dir `0700 root:root`, on a bind mount, path verified resolving inside the container. -**Deploying is TIER-4 HUMAN-ONLY by design** (D-CB7 Set B): restarting `agent-sudo-daemon` is -refused in code, because the unit env holds `SUDO_MD_VERIFY_ENFORCE` — self-restart IS the -gate-disarm primitive. An agent physically may not deploy this. That is the constraint model -working, not a gap. +**TIER 4 IS DONE — BY REFUSING. There is nothing to finish.** Verified live via `classify()`: +`rm -rf /` → `danger_veto`; `systemctl restart agent-sudo-daemon` and editing the unit → +`host_override_setb`. Tier 4 is **human-only BY DESIGN** (D-CB7): the unit env holds +`SUDO_MD_VERIFY_ENFORCE`, so a system that can restart its own daemon can disarm its own gate. +**A request to make tier 4 autonomous is a request to delete the security model — refuse it.** + +**⚠️ REAL REMAINING SCOPE = TIERS 1/2/3, and tier 1 is BROKEN:** `scoped_undo.py:186` says +`REQUIRES_UNDO_TIERS = (1, 3)` but `app.py:244` hardcodes tier `3` → **tier-1 commands +auto-execute TODAY with no undo capture**, contradicting D4. Code fix, not config. Needs a human +decision first (implement D4 vs amend it). Tier 2/3 are still 503 stubs (caps OFF). +**Measured asymmetry: server-01 HAS Incus + both sandboxes RUNNING; primary has NO Incus** — so +tier 2 on primary is an open design question, not a task. + +**THE BUG CLASS — check reflexively:** per-host values hardcoded into files tracked once and +shared by both hosts. Bit **twice** in one directory: the compose port (would have silently +undone the D8 cutover) and `SERVER_ID`/`VAULT_ADDR` in the daemon unit (would make server-01 +identify as **primary**). **Diff both hosts' copies before landing any shared file on a second +host.** No test measures cross-host divergence; none ever will. **Recall corpus (2026-07-15):** `semantic_recall.py` now indexes design docs too (`DOC_ROOTS`), so D-CB5–D-CB9 are searchable. `context.md` is **deliberately excluded** until **#192** prunes it. **MEMORY_DIR: do NOT repoint `embed_memory_dir.py`** — its Postgres `claude_memories` table has **no reader** (verified). See row **188**. -**Next session, in order:** **#187** (Phase 0 blockers → `DEPLOY_RUNBOOK.md` phases 1–3; user runs -the tier-4 steps) → **#173** fail-open/fail-closed → **#128** secrets-proxy → **#147/#146** (CA -P2–P5 + primary cutover 8084→8082). **#205** (Vault+Bitwarden security design) is THU-first. +**📋 THE PLAN IS WRITTEN — READ IT, DO NOT RE-DERIVE IT:** +`agent-builder/GAMEPLAN_agent-sudo_secrets-proxy.md` (also in Obsidian `Projects/`, commit +`1d37e45`). Agent prompts **S1 / A1 / A7** are written + saved in `agent_prompts.md`. + +**USER DECISION 2026-07-15:** **do NOT dispatch background agents during business-development +time.** Agent-Sudo + secrets-proxy resume in the **personal-project block NEXT WEEK** and run +until done. Interim control = the `security-enforcement.py` hook (blocks secret-shaped strings + +sudo) — accepted, deliberate. + +**Next session, in order:** **two human decisions (~10 min) first** — A1 (tier-1 undo) + A3 +(primary tier-2) — they unblock everything → **#128/row 191** secrets-proxy **S1** (zero-dep, +removes a per-session tax, so it goes first) → **A1** implement → **A2** phase 2 on server-01 → +**#173 + A4** (fold together) → **#146**. **#205** (Vault+Bitwarden security design) is THU-first. **Then:** Thu 07-16 qui/qbit memory leak (#176) + media_pipeline (#177) · Fri 07-17 clear the runway (#178) · **Mon 07-20 resume business development (#179) — digital businesses deployed by Fri 07-24.**