diff --git a/persistent-memory.md b/persistent-memory.md index 896678b..213530c 100644 --- a/persistent-memory.md +++ b/persistent-memory.md @@ -1,6 +1,6 @@ # Persistent memory — ratatoskr -_Last updated: 2026-06-30_ +_Last updated: 2026-07-01_ This file captures durable intent and supporting evidence (goals, decisions, foot-gun warnings, in-flight state) across context resets. Read it at session @@ -39,64 +39,54 @@ upstream API key stays server-side (INV-003). ## Current state / in-flight -_As of 2026-06-20:_ +_As of 2026-07-01:_ -**#17 and #18 BOTH CLOSED — the composite both-plane binding is fully proven.** #18 shipped -`v0.18.0` (`359dbb1`): D2 (PAD read-endpoint, `v0.17.14`) renders live PAD in the web pane from our -`:8390` store; D1 (composite endpoint, `v0.17.16` `7f4ceaa`) — `build_combined_provider_app` -(`provider/combined.py`) on `:8392` wraps bifrost's public `build_combined_app` over BOTH stores + -the shared affect read route; one bound session drives memory.* AND affect.* through ONE endpoint, -op-feed deriving plane per path. Suite **503 green**. **#17 closed in the tracker 2026-06-20** -(shipped `v0.17.8`–`.13` + the `v0.17.17` op-feed field fix). +**THE v1 COVERAGE-AUDIT HAS CONVERGED.** The audit that ran this session (2026-06-30 → 07-01) +reached its scope-A done-definition: **every frozen Worldtree v1 I/O point is classified — covered +or excluded-with-rationale, zero unaccounted.** Coverage: **REST 17/40 ✅ with ZERO in-scope gaps** +(23 REST path-groups excluded-by-design), **SSE 11/11 ✅**, **Bifrost provider planes 8/8 ✅** +(live-proven). The living ledger is `docs/coverage-map.md`. **v1 cuts when Worldtree tags 1.0** +(ratatoskr v1 = full Worldtree I/O coverage; the target is the coverage map, not a feature list). +Only not-consumed in-scope *method*: `GET /agents/{id}` (consumer-agent lookup, manual-curl-only, +on an already-✅ path group). -**#18's final leg — the Worldtree-DRIVEN composite turn — RAN and is PROVEN end-to-end + persisted -(2026-06-20).** infra-ops added `10.100.10.50:8392` to the personal WT's (`:8081`) -`BIFROST_CLIENT_ALLOWED_HOSTS` (thread `01KVHWJGTT…`), unblocking the smoke. A real WT turn through -`:8392` (session `b83a66b6`, agent `ratatoskr:sindra`, fresh end_user `resmoke-choco-1`) drove the -FULL both-plane lifecycle on ONE endpoint, caps-routed by path: `handshake` -(`caps_granted=[memory, affect]`) → `affect.fetch` + `memory.search` (reads) → `affect.emit` -(`stored:true`, PAD row in `affect_snapshots`) → `memory.upsert_many` (`upserted:1`, chunk -`2df1b79de761b948` in `memory_chunks`). Both writes verified directly in our SQLite. The -model-backend outage that blocked the first attempt (both agents' models `model_unavailable`) was -operator-fixed mid-session, then the resmoke completed clean. **No open legs remain on the composite.** +**The debug-observability core is COMPLETE** (published as the `v0.19.0` milestone): all four +observability panes built + live + consuming their real endpoints — **Persona** (`GET /agents/{id}/persona_state`), +**Tools** (`GET /sessions/{id}/tools`), **BifrostState** (`GET /admin/sessions/{id}/bifrost`), +**AdminEvents** (`GET /admin/events` SSE, session-filtered). **#11 is closed-by-build** (AdminEvents +shipped `v0.18.11`; its long-standing "blocked on `admin.events.read`" status was STALE — the admin +key already carries the scope). The whole slice arc: SSE-resume (`v0.18.5/.6`) → session-picker +(`v0.18.7`) → `--whoami` me/capabilities (`v0.18.8`) → Tools (`v0.18.9`) → BifrostState (`v0.18.10`) +→ AdminEvents (`v0.18.11`) → **v0.19.0 milestone** → Tier-2 characters+persona-write (`v0.19.1`). -**bifrost repinned 0.8.0 → 0.10.0** (floor, `provider` extra). 0.10.0 made `affect.fetch` -MANDATORY (strong-or-absent: `_supports_affect_plane` requires `affect_supported`+`emit`+`fetch`, -gating EVERY affect op incl. emit) — so the repin FORCED `affect.fetch` (`v0.17.15`, conformed -to bifrost's reference `InMemoryAffectStore.fetch` → `{found, snapshot?}`) or our shipped affect -plane would 400. The composite's affect cap depends on it. +**Standing substrate pins:** Worldtree spec **v1.0.0b2** (`5810a26`) — ratatoskr now vendors the +FROZEN machine-readable `conversation-api-openapi.json` (2.2.0) + `conversation-api-sse-events.schema.json`, +pinned in `.corviduo-canonicals.toml` + drift-gated by `canonical_drift.py` (the prose markdown is a +`tolerate_drift` reference). **bifrost `==1.0.0` / wire v0.6 STABLE/FROZEN.** Suite **573 green**. -**OPERATOR SESSION STATE — `:8390`/`:8391`/`:8765` shells are PRE-#18 code (foot-gun).** web `:8765` -+ affect `:8390` + memory `:8391` are prior-session background shells on OLD code. The **`:8392` -composite provider is RUNNING on NEW code** (`ratatoskr-combined-provider`, pid started Jun19, -`RATATOSKR_OPFEED_PATH=/tmp/ratatoskr-combined-opfeed.jsonl`, shared `affect.db`/`memory.db`) — now -`:8392`-allowlisted and WT-turn-proven. To see the full web stack on new code, RESTART `:8390`/`:8765` -from current code (D2 web needs `RATATOSKR_AFFECT_READ_URL`). Consumer/owner key = `wt_live_d81b…` -(`~/.config/ratatoskr/provider.env`, mode 600, rotate via infra-ops); providers SQLite + sqlite-vec, -`memory.db`/`affect.db` at repo root (live sindra PAD: vuong + the `resmoke-choco-1` smoke fixture). +**Keys (env-only, mode 600; rotate via infra-ops):** consumer/Heimdall key at +`~/.config/ratatoskr/provider.env`; **admin key `RATATOSKR_ADMIN_API_KEY`** (Heimdall user +`ratatoskr-readonly`, tier `readonly-admin`, **7 read scopes** incl. `admin.sessions.read` + +`admin.events.read` — verified 2026-07-01, **personal `:8081` only**) in `env.sh` — powers the +BifrostState + AdminEvents admin panes. Heimdall keys are PER-INSTANCE (a personal-minted key 401s +on demo). -**Tier-3 memory PROVEN end-to-end** (earlier this session): `ratatoskr:terse-probe` -cold-recalled a seeded user fact (scope_any → 1 hit @ cosine 0.6994), and the verbose -`sindra-probe` too under #296 Stage 2 (v0.36.0). The #296 extraction-quality arc closed -(Stage 1 v0.35.19 gate + Stage 2 v0.36.0 user-only extraction at worldtree-codex; hard- -linguistic layer → Worldtree #305). `:8081` runs v0.36.0. +**Provider identity (the second, still-live role):** ratatoskr owns BOTH ends of the Bifrost +round-trip — the combined `:8392` provider fronts the memory (`:8391`) + affect (`:8390`) stores +(SQLite + sqlite-vec, `memory.db`/`affect.db` at repo root); consumer/owner key `wt_live_d81b…`. +`ratatoskr:sindra` is the owner-scoped Tier-3 agent (invisible to `GET /agents`; check via +`GET /agents/:` with the owner key). This provider surface is settled/converged — no +in-flight work on it. -**Sindra:** `ratatoskr:sindra`, `thoughtful-character` role → `mistral-small-4-reasoning` -(DELETE+redefined on v0.35.16; `memory:{}` block trips the promotion gate). Owner-scoped -(separate `consumer_agents` table) — invisible to `GET /agents`; check via -`GET /agents/:` with the owner key. +**Open / deferred (nothing blocking):** #10 (subject-migration watch on Worldtree #196). Design +note: bare-TUI + 0-sessions → error (§4-clause-consistent; the friendlier auto-fall-to-new is +deferred, operator-preference). heid-code-review was run on the b1 resume slice only (panel: zero +findings, cross-model-verified); b2 + the later slices were offered but not reviewed. `graphify-out/` +runs dirty (auto-regen, not chased — never stage it). Contract-skip was invoked for the low-effort +GET wrappers + `stream_admin_events`, but contract #2 / #1 / #6 were amended to stay canonical. -**Standing:** Worldtree spec pin v0.35.16 (`f1b59f8`); **bifrost 0.10.0 / wire v0.6** -(`scope_all`+`scope_any`). Heimdall key env-only at `~/.config/ratatoskr/provider.env` (mode -600); rotate via infra-ops. `graphify-out/` runs dirty (auto-regen, not chased). **Open issues: -#11** (AdminEvents pane — the next-reachable Worldtree-I/O coverage gap, blocked on an -`admin.events.read` scope request) and **#10** (subject-migration watch on Worldtree #196) — both -deferred. **#17 + #18 CLOSED.** Codex-first pilot dormant. No in-flight implementation work — repo -is at a converged checkpoint; v1 advances when Worldtree does (v1 = full Worldtree I/O coverage). - -Branch: `main` (tag `v0.18.0`, `359dbb1`) — **in sync with `origin/main`** (the full #17+#18 arc is -pushed). This `/snapshot` commit will sit one ahead of origin until pushed (push is the operator's -call). Remote: `origin → git@gitea.phasefinal.com:vh/ratatoskr.git`. +Branch: `main` — **in sync with `origin/main`** at **`v0.19.1`** (`af07a23`); the whole session's arc +is pushed. Remote: `origin → git@gitea.phasefinal.com:vh/ratatoskr.git`. ## Recent decisions