Files
ratatoskr/persistent-memory.md
T
vh 57fdc48e20 memory: /snapshot — worldtree-sdk cutover decided (#20), slice-1 next
Captures the SDK cutover as the active migration: contract done + heid-reviewed,
DEC-5 registry gate cleared, slice-1 foundation the next step. Plus ephemeral-Echo
(v0.21.2 #19) + reference-consumer parity arc in Recent decisions; tier3 model→role
deferred to slice-4 / worldtree-dev deploy flag. Handoff written for slice-1.
2026-07-18 23:19:21 -07:00

313 lines
38 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Persistent memory — ratatoskr
_Last updated: 2026-07-18_
> **Always check for `/tmp/ratatoskr-dev-handoff.md`** — if it exists and its
> `Written:` stamp is under an hour old, read it (it carries the in-flight
> handoff from the previous session), then delete it. Older than an hour:
> stale — delete it unread.
This file captures durable intent and supporting evidence (goals, decisions,
foot-gun warnings, in-flight state) across context resets. Read it at session
start; treat it as one input alongside `CLAUDE.md` and the auto-memory system,
not as the single source of truth.
When durable state shifts enough to warrant capture, run `/snapshot` and
commit alongside the next commit per the persistent-memory commit-along rule
in `CLAUDE.md`.
---
## Repo purpose
Ratatoskr is a **dev-grade debug-observability TUI** for Worldtree's
Conversation API. The product IS the observability surface; chat is the
input mechanism. Devs run Ratatoskr against a local Worldtree to watch a
turn flow through every layer of the system, side-by-side, in one terminal:
agent SSE stream, persona/Vili affect dispatch, tool calls, Bifrost
handshake state, admin lifecycle events, optional raw server log.
Named after the squirrel that runs up and down Yggdrasil carrying messages
between layers. On-the-nose Worldtree resonance (Yggdrasil = the World Tree).
**Second identity (since 2026-06-14): the v1 Bifrost Tier-3 consumer/provider**
the durable persistence Worldtree writes Tier-3 agent affect (PAD/persona, `:8390`)
+ memory (`:8391`) into. Lives in `src/ratatoskr/provider/`, depends on `bifrost`
(`provider` optional-extra), separate from the conversation-API spec pin. So
ratatoskr now owns BOTH ends of the Bifrost round-trip — the lens #17 exploits.
**v0.15.0+ sibling browser surface** (`ratatoskr.web`, `ratatoskr-web` console
script): same five-pane debug surface over the same SSE wire, LAN-viewable.
Internal-LAN trust model — `0.0.0.0`, no auth/TLS/CORS (operator direction).
Disciplined regardless: transcript HTML-escapes assistant content (INV-004);
upstream API key stays server-side (INV-003).
## Current state / in-flight
_As of 2026-07-18 (evening):_
**🔨 ACTIVE MIGRATION — worldtree-sdk cutover (issue #20), starting slice-1.** Operator ruled ADOPT
(2026-07-18): ratatoskr cuts its CONSUMER client layer over to consume **worldtree-sdk (Python) 1.0.0**
retire the hand-rolled httpx wrappers (`sessions`/`sse_client`/`tier3`) behind a thin `ratatoskr.wt`
adapter over the SDK. Both TS + Python SDK 1.0.0 are GA (**Python live + pip-installable on the gitea
PyPI** — DEC-5 gate cleared). Ratatoskr's own **parity pass shaped the Python spine** (open-world reads,
caller-injected transport, per-wire role/model). Design locked (6 DECs, vor-cross'd with worldtree-codex,
heid-panel-reviewed → error-map table added); contract `docs/contracts/worldtree_sdk_cutover.contract.md`
(committed `e45640c`). **NEXT = slice-1 foundation:** add the gitea PyPI index (`[[tool.uv.index]]`
name=gitea + read token) + pin `worldtree-sdk==1.0.0`, VERIFY the uv install (DEC-5 precondition), stand
up `ratatoskr.wt` + injected `WorldtreeClient` + the error-map default rule (unit-tested, unexercised).
Then slices 2-7 (route-family migration + deletions, live-smoke per slice). Scope: consumer layer ONLY;
Bifrost provider planes untouched. Multi-session grind. Full design → auto-memory
`project_worldtree_sdk_cutover`. This SUPERSEDES the #371 "repin rides the later Python milestone" framing
below (that milestone shipped; we're adopting, not just repinning).
**⏸️ DEFERRED — tier3 agents `model``role` (scope B), on worldtree-dev's deploy flag.** WT renames the
agents-RESPONSE selector `model``role` (spec 1.2, commit `387c67b`, NOT yet deployed). `_parse_tier3_agent_info`
reads `body["model"]` → KeyErrors post-deploy. Operator chose scope B (full tier3 `model``role` incl.
contract #15 + CLI `--model``--role`). Implement ON the deploy flag, not before (breaks the current demo);
folds into cutover slice-4. Auto-memory `project_tier3_agents_model_to_role_pending`.
**✅ RESOLVED — the "app product" workstreams leave Rata entirely (operator 2026-07-18).**
**No arbo fork, no SillyTavern-on-Rata** — a NEW repo (template-dev standing up) takes over BOTH
app-product ideas. Rata does NOT fork into anything and is NOT the base for any chat / image-gen app.
Rata reverts to its core identity: **the Worldtree Conversation-API debug-observability surface +
the Bifrost Tier-3 reference impl + the Conversation-API SDK seed / future-consumer.** Supersedes the
2026-07-17 "fork Rata for arbo" NEXT-MAJOR plan (that plan is retired; arbo API intel lives in the
Recent-decisions detail trail if the new repo wants it).
**▶️ Rata's live stake in the Worldtree SDK (#371).** The SillyTavern *app* moved out, but Rata
stays the **SDK's seed donor + a future consumer**: Worldtree owns the official Conversation API SDK
(dedicated repo, elevated pre-v1 track, **WT #371**), seeded from Rata's client spine
(`sse_client`/`sessions`/`tier3`); TS ships first, **Rata's repin rides the later Python milestone**;
internal-registry-only. This session Rata shipped the parity-matrix inventory (→ WT
`docs/sdk/parity-matrix.md` `698cfc3`, behavioral-spec `c999b5f`, fixture corpus `3019ee6` = 66
fixtures), the issue-#1 contract drift fix (`4bd9abd`), and the personal-WT endpoint. WT pipeline:
behavioral-spec ✓ / parity-matrix ✓ / fixture-corpus ✓ → next is the **codegen spike (d)**. Three
divergences pinned for our eventual repin: D-1 (unknown SSE event → skip+diagnostics-hook vs our
current hard-raise), D-2 (open-world enums), D-3 (typed eager `410 session_retired`). Full arc →
`persistent-memory.d/2026-07-18-worldtree-sdk-371-and-sillytavern-app.md`.
- **SDK fixture-capture: GO GIVEN** (operator → worldtree-dev, 2026-07-18); the capture run
proceeds on Worldtree's side. Nothing pending from Rata on #371.
**⚠️ TUI DEPRECATED (operator 2026-07-17) — web supersedes it; rip pending, surgical.** Independent
of any fork (the web console is now THE interactive surface). `tui.py` + `tests/test_tui.py` delete
cleanly, BUT `cli.py` is SHARED (`web/entrypoint.py` + `tier3.py` import `USER_AGENT`; `cli.py` holds
`ParsedArgs`/`_format_duration_ms`/`_format_usage`). OPEN SCOPE Q: remove textual-only (`tui.py`) vs
the whole terminal interface (relocate shared consts out of `cli.py` first). Breaking public-surface
removal → minor bump (operator approval). (The v0.20.17 collapsible debug panes, `c678853`, are now
just a web-console feature — the "pre-fork" framing is moot.)
**#368 (user,character) memory silo test — DONE, PASSED live (WT b127).** The reason for the
pre-session clear; closed. Write+read isolation proven end-to-end (conjunctive `{end_user,
agent_self}`; cold-recall gave zero cross-character bleed); throwaway `ratatoskr:betty` deleted;
Sindra intact; stores scrubbed. **Still QUEUED:** the backfill live-verify (synthetic legacy corpus).
Full record → `persistent-memory.d/2026-07-18-368-silo-test-passed.md`. Sibling issues WT-owned:
**#369** (recited-content re-promotion loop), **#367** (copula-absence bridge phrasing).
**Deferred/queued (all NON-URGENT):** (1) P06-driver **referential-frame A/B/C probe**
(operator-ratified, waits on WT b122 → `persistent-memory.d/2026-07-17-referential-frame-probe.md`);
(2) R39 Phase-2 **matched-quartets rebuild** (confirmatory, "whenever"); (3) bifrost **snapshot-cursor
adoption** (ruled normative, not blocking → `persistent-memory.d/2026-07-16-bifrost-cursor-conformance.md`).
**Substrate / environment:** branch `main` at **v0.21.2**, **PUSHED to origin 2026-07-18** (this session:
ephemeral-Echo create `c7016f2` #19, coverage-map→SDK-surface `b1fbadd`, canonical syncs `5d06a27`/`80c8d58`,
cutover contract `e45640c` refs #20 — the last uncommitted only in this snapshot); origin
`git@gitea.phasefinal.com:vh/ratatoskr.git`. bifrost **`==1.1.4`** / wire v0.7; WT openapi vendored 2.3.0,
**conversation-api-spec re-synced to v1.1** (`b4a278c`, role/model echo-section fix); **suite green** (ephemeral
work added 13 tests). Personal WT on **b127**
(`http://10.250.50.152:8081`; #368 silo + #364 promotion-hygiene live both instances). The combined
**:8392** provider (memory+affect) + **:8765** web are THE surfaces, dev-box BACKGROUND SHELLS —
restart via `scratchpad/relaunch_by_pid.py <pid>` (pid via `ss -ltnp | grep <port>`). `env.sh` sets
the REQUIRED `RATATOSKR_MEMORY_EMBEDDING_DIM=1024`. Keys env-only mode-600 in
`~/.config/ratatoskr/provider.env` + `RATATOSKR_ADMIN_API_KEY` (7 read scopes, personal-:8081-only;
Heimdall keys per-instance). **FOOT-GUN: check owner-scoped agents via `GET /agents/<owner>:<name>`
with the OWNER key (`WORLDTREE_API_KEY`), NOT the admin key** — admin gives a false 404. `graphify-out/`
runs dirty (auto-regen on the commit hook, never stage). v1 = full Worldtree I/O coverage, cuts when
WT tags 1.0 (`docs/coverage-map.md`).
**Other live threads:** soong-lab = Tier-3 agent-authoring studio (v0.3.24+; motivational
string→object export fixed upstream, our workaround droppable). Cross-session name-recall arc
COMPLETE + shipped (v0.20.11→.16; WT #364 closed both sides; Sindra durably recalls Vuong via
`mark_superseded` retirement). Sindra pristine baseline **WIPED 2026-07-18** (full #368 scrub,
born-empty store — old `sindra-baseline/*.db` predate it). Open/deferred: #10 subject-migration watch;
relational-dynamics verify (bind `--bifrost-url :8392`); WT #356 resume-durability = WT-owned.
## Recent decisions
Chronological log of decisions with `[YYYY-MM-DD]` prefix. One line per
decision. Captures rationale that won't be obvious from code alone.
- `[2026-06-17]` **#296 triage sent to worldtree-dev** (`01KVBBH0…`): extraction SUBJECT-INVERSION (promotes assistant prose, drops the user's fact) + META-DESCRIPTION-not-content; verbose-persona aggravator. WAD-vs-bug resolved to BUG (extraction quality), not idle-gating.
- `[2026-06-18]` **Tier-3 memory PROVEN end-to-end live**`ratatoskr:terse-probe` recalled a seeded user fact in a COLD history-free session (scope_any → 1 hit @ cosine 0.6994). Closes the opening "how far from Tier-3 memory" question for normal agents.
- `[2026-06-19]` **#18 D2 SHIPPED (`v0.17.14`, `39eebd1`) and the full #17+#18 arc PUSHED to origin** → `persistent-memory.d/2026-06-19-18-d2-shipped-v0-17-14-39eebd1-and-the-full-1.md`
- `[2026-06-19]` **bifrost repinned 0.8.0→0.10.0; `affect.fetch` became MANDATORY (strong-or-absent)**`persistent-memory.d/2026-06-19-bifrost-repinned-0-8-0-0-10-0-affect-fetch-be.md`
- `[2026-06-19]` **#18 D1 SHIPPED — composite `build_combined_app` on `:8392` (`v0.17.16`, `7f4ceaa`); #18 CLOSED; published `v0.18.0` (`359dbb1`)** → `persistent-memory.d/2026-06-19-18-d1-shipped-composite-buildcombinedapp-on-8.md`
- `[2026-06-19]` **op-feed handshake field-name fix (#17, `v0.17.17` `d60b77d`): `capabilities_requested`→`capabilities`**`persistent-memory.d/2026-06-19-op-feed-handshake-field-name-fix-17-v0-17-17.md`
- `[2026-06-19]` **Ratatoskr is a REFERENCE implementation of the Worldtree/Bifrost standard (operator)**`persistent-memory.d/2026-06-19-ratatoskr-is-a-reference-implementation-of-th.md`
- `[2026-06-19]` **Ratatoskr v1 is DERIVED from Worldtree I/O coverage (operator) — no self-defined feature ROADMAP**`persistent-memory.d/2026-06-19-ratatoskr-v1-is-derived-from-worldtree-i-o-co.md`
- `[2026-06-20]` **#18's final leg PROVEN — composite `:8392` WT-driven smoke ran end-to-end + persisted** → `persistent-memory.d/2026-06-20-18-s-final-leg-proven-composite-8392-wt-drive.md`
- `[2026-06-20]` **#17 CLOSED in the tracker.** Shipped end-to-end (`v0.17.8``.13` + op-feed field fix `v0.17.17`); the 2026-06-20 composite smoke re-exercised its op-feed live. Closing comment captures the full both-plane proof. Open issues now just #11 (scope-blocked) + #10 (watch).
- `[2026-06-20]` **Sindra has real PAD but ~empty memory — the affect/memory persistence asymmetry, confirmed on real sessions**`persistent-memory.d/2026-06-20-sindra-has-real-pad-but-empty-memory-the-affe.md`
- `[2026-06-29]` **Web SPA combined-bind default (`v0.18.1`, `719e4d6`) — operator-caught gap**`persistent-memory.d/2026-06-29-web-spa-combined-bind-default-v0-18-1-719e4d6.md`
- `[2026-06-29]` **bifrost repinned 1.0.0 (`v0.18.2`, `af67ad9`)**`persistent-memory.d/2026-06-29-bifrost-repinned-1-0-0-v0-18-2-af67ad9.md`
- `[2026-06-30]` **Worldtree v1.0.0b1→b2 consumer adaptation: eager turn-launch statuses (`v0.18.3` `b2e4901`, `v0.18.4` `e4317f6`)**`persistent-memory.d/2026-06-30-worldtree-v1-0-0b1-b2-consumer-adaptation-eag.md`
- `[2026-06-30]` **Verify-against-the-real-spec-before-committing caught a real upstream gap**`persistent-memory.d/2026-06-30-verify-against-the-real-spec-before-committin.md`
- `[2026-06-30]` **regard is a DEAD AXIS in Worldtree's emitted affect (caught provider-side; worldtree-dev confirmed + escalated to Vuong)**`persistent-memory.d/2026-06-30-regard-is-a-dead-axis-in-worldtree-s-emitted.md`
- `[2026-06-30]` **v1 coverage-audit kicked off; coverage ledger written (`docs/coverage-map.md`) — the first one**`persistent-memory.d/2026-06-30-v1-coverage-audit-kicked-off-coverage-ledger.md`
- `[2026-06-30]` **Scope mandate A locked (operator): v1 "done" = every frozen I/O point CLASSIFIED (covered-or-excluded-with-rationale), zero unaccounted — NOT a feature-complete client**`persistent-memory.d/2026-06-30-scope-mandate-a-locked-operator-v1-done-every.md`
- `[2026-06-30]` **Finding P-1 (pin drift) + pin-remediation PENDING**`persistent-memory.d/2026-06-30-finding-p-1-pin-drift-pin-remediation-pending.md`
- `[2026-06-30]` **(b) Tier-1 frontier SCOPED, ready for a contract-first TDD cycle (next focused work)** → `persistent-memory.d/2026-06-30-b-tier-1-frontier-scoped-ready-for-a-contract.md`
- `[2026-06-30]` **(b1) SSE-resume SHIPPED (`v0.18.5`) — `stream_turn_resilient` (sse_client.py)** → `persistent-memory.d/2026-06-30-b1-sse-resume-shipped-v0-18-5-streamturnresil.md`
- `[2026-06-30]` **(b2) session-picker SHIPPED (`v0.18.7`) — bare TUI mode → startup picker (design-brief §4)** → `persistent-memory.d/2026-06-30-b2-session-picker-shipped-v0-18-7-bare-tui-mo.md`
- `[2026-06-30]` **capabilities+me slice SHIPPED (`v0.18.8`) — `GET /me` + `GET /capabilities` consumed via a new `--whoami` one-shot**`persistent-memory.d/2026-06-30-capabilities-me-slice-shipped-v0-18-8-get-me.md`
- `[2026-07-01]` **b1 (SSE-resume) heid-code-review panel: ZERO findings — cross-model-verified clean**`persistent-memory.d/2026-07-01-b1-sse-resume-heid-code-review-panel-zero-fin.md`
- `[2026-07-01]` **`GET /sessions/{id}/tools` quick-win SHIPPED (`v0.18.9`) — owner-scoped tool inventory in the TUI Tools pane** → `persistent-memory.d/2026-07-01-get-sessions-id-tools-quick-win-shipped-v0-18.md`
- `[2026-07-01]` **BifrostState pane SHIPPED (`v0.18.10`) — `GET /admin/sessions/{id}/bifrost` in a new TUI "Bifrost" pane; the FIRST admin-key consumer in ratatoskr**`persistent-memory.d/2026-07-01-bifroststate-pane-shipped-v0-18-10-get-admin.md`
- `[2026-07-01]` **LEDGER CORRECTION: #11 (AdminEvents) is NO LONGER BLOCKED**`persistent-memory.d/2026-07-01-ledger-correction-11-adminevents-is-no-longer.md`
- `[2026-07-01]` **AdminEvents pane SHIPPED (`v0.18.11`) — `GET /admin/events` SSE in a new TUI pane; #11 closed-by-build; Tier 1 (debug-observability core) COMPLETE**`persistent-memory.d/2026-07-01-adminevents-pane-shipped-v0-18-11-get-admin-e.md`
- `[2026-07-01]` **Tier-2 SHIPPED (`v0.19.1`) — transient-characters CRUD + persona-state write; the v1 coverage-audit CONVERGES (zero in-scope gaps)**`persistent-memory.d/2026-07-01-tier-2-shipped-v0-19-1-transient-characters-c.md`
- `[2026-07-01]` **env.sh now PERSISTS the web Bifrost-bind vars (gitignored, local-only)**`persistent-memory.d/2026-07-01-env-sh-now-persists-the-web-bifrost-bind-vars.md`
- `[2026-07-01]` **Tier-3 stores RESET (operator-directed)**`persistent-memory.d/2026-07-01-tier-3-stores-reset-operator-directed.md`
- `[2026-07-01]` **Embedding-latency loop RESOLVED — it was WORLDTREE's, not ratatoskr (the consumer/provider thesis paid off again)**`persistent-memory.d/2026-07-01-embedding-latency-loop-resolved-it-was-worldt.md`
- `[2026-07-01]` **Web debug-surface parity SHIPPED (`v0.19.2`, `a0a9d5f`) — direct in-session TDD**`persistent-memory.d/2026-07-01-web-debug-surface-parity-shipped-v0-19-2-a0a9.md`
- `[2026-07-01]` **heid-code-review (`v0.19.3`, `75dec01`) — panel caught 2 real client-side SSE-lifecycle bugs TDD missed**`persistent-memory.d/2026-07-01-heid-code-review-v0-19-3-75dec01-panel-caught.md`
- `[2026-07-01]` **Affect snapshot shape CHANGED valence→relations (relation_edge/1) — the persona pane was reading a dead field**`persistent-memory.d/2026-07-01-affect-snapshot-shape-changed-valence-relatio.md`
- `[2026-07-01]` **Trust/warmth VALUES converge and go FLAT at confidence 1.0 — that's WAD, not a stuck pane**`persistent-memory.d/2026-07-01-trust-warmth-values-converge-and-go-flat-at-c.md`
- `[2026-07-01]` **relation_context "stranger" + agency-all-zero flagged to worldtree-dev → both WAD/intentional-v1-deferrals**`persistent-memory.d/2026-07-01-relationcontext-stranger-agency-all-zero-flag.md`
- `[2026-07-01]` **Persona pane displays the CANONICAL affect→NL Worldtree injects — ADOPT, don't invent (operator steer + reference-impl posture)**`persistent-memory.d/2026-07-01-persona-pane-displays-the-canonical-affect-nl.md`
- `[2026-07-01]` **Sindra PAD is over-regulated — characterized via controlled probe, flagged to worldtree-dev (separate affect slice)**`persistent-memory.d/2026-07-01-sindra-pad-is-over-regulated-characterized-vi.md`
- `[2026-07-01]` **Memory plane PROVEN healthy end-to-end**`persistent-memory.d/2026-07-01-memory-plane-proven-healthy-end-to-end.md`
- `[2026-07-01]` **Salience scorer non-discriminating → 3-way routing**`persistent-memory.d/2026-07-01-salience-scorer-non-discriminating-3-way-rout.md`
- `[2026-07-01]` **Canonical check BLOCKED an access_tally fork (reference-impl posture held)**`persistent-memory.d/2026-07-01-canonical-check-blocked-an-accesstally-fork-r.md`
- `[2026-07-01]` **relation_context coherence FIXED upstream (my flag → Worldtree Wave-0, IMPLEMENTED v1.0.0b5)**`persistent-memory.d/2026-07-01-relationcontext-coherence-fixed-upstream-my-f.md`
- `[2026-07-01]` **Foot-gun (measurement, self-caught before flagging): establish the baseline before claiming a rate**`persistent-memory.d/2026-07-01-foot-gun-measurement-self-caught-before-flagg.md`
- `[2026-07-02]` **Salience finding matured into brokkr R28 (OPEN) — ratatoskr is the eval instrument**`persistent-memory.d/2026-07-02-salience-finding-matured-into-brokkr-r28-open.md`
- `[2026-07-02]` **Relational-dynamics arc LIVE on demo (Worldtree v1.0.0b9) — driven by MY relation_context flag**`persistent-memory.d/2026-07-02-relational-dynamics-arc-live-on-demo-worldtre.md`
- `[2026-07-02]` **R28 (salience→promotion-worthiness) CLOSED (operator-directed)**`persistent-memory.d/2026-07-02-r28-salience-promotion-worthiness-closed-oper.md`
- `[2026-07-02]` **R29 (PAD mood-dynamics) finding SHIPPED as Worldtree's A1 anchor fix (demo v1.0.0b14, `e1cdf82`)**`persistent-memory.d/2026-07-02-r29-pad-mood-dynamics-finding-shipped-as-worl.md`
- `[2026-07-03]` **R30 Phase-1 φ0 measured — deployed engine CONFIG-FAITHFUL (φ0≈0.95)**`persistent-memory.d/2026-07-03-r30-phase-1-0-measured-deployed-engine-config.md`
- `[2026-07-03]` **R30 forward disposition (brokkr-owned; tracked at brokkr R30, "brokkr/worldtree will ping")**`persistent-memory.d/2026-07-03-r30-forward-disposition-brokkr-owned-tracked.md`
- `[2026-07-03]` **Relational-arc verify DEFERRED — `relations[]` is Bifrost-provider-only (ADR-0009), confirmed both ways**`persistent-memory.d/2026-07-03-relational-arc-verify-deferred-relations-is-b.md`
- `[2026-07-04]` **R30 CLOSED on offline-tests + human face-validity (operator steer, relayed via worldtree-dev)**`persistent-memory.d/2026-07-04-r30-closed-on-offline-tests-human-face-validi.md`
- `[2026-07-05]` **Authored-history-write primitive proposed -> accepted as Worldtree #347 (Worldtree owns the engine design; ratatoskr = reference consumer)**`persistent-memory.d/2026-07-05-authored-history-write-primitive-proposed-acc.md`
- `[2026-07-05]` **#347 v1 wire validated as reference consumer (GREEN)** → `persistent-memory.d/2026-07-05-347-v1-wire-validated-as-reference-consumer-g.md`
- `[2026-07-06]` **Sindra role character-rp -> character (operator)**`persistent-memory.d/2026-07-06-sindra-role-character-rp-character-operator.md`
- `[2026-07-06]` **Sindra persona/OCEAN DECLARED -> mood fixed (the full diagnostic converged on a stale personal container)**`persistent-memory.d/2026-07-06-sindra-persona-ocean-declared-mood-fixed-the.md`
- `[2026-07-06]` **OpenAPI re-vendored 2.2.0->2.3.0 (`75da676`, pin-only no bump)**`persistent-memory.d/2026-07-06-openapi-re-vendored-2-2-0-2-3-0-75da676-pin-o.md`
- `[2026-07-06]` **#347 authored-history-write CONSUMER SIDE SHIPPED (`v0.19.6`) — direct in-session TDD** → `persistent-memory.d/2026-07-06-347-authored-history-write-consumer-side-ship.md`
- `[2026-07-06]` **Tail-2 SHIPPED (`v0.19.7`) — Tier-3 prose docs re-vendored + persona_state body-shape aligned**`persistent-memory.d/2026-07-06-tail-2-shipped-v0-19-7-tier-3-prose-docs-re-v.md`
- `[2026-07-06]` **Sindra rewritten onto a #347 authored first-message + first-message-preset AUTO-SEED SHIPPED (`v0.19.8`)**`persistent-memory.d/2026-07-06-sindra-rewritten-onto-a-347-authored-first-me.md`
- `[2026-07-06]` **Web UI now RENDERS the seeded first-message (`v0.19.9`) — operator-reported "i don't see Sindra's greeting on the web ui"**`persistent-memory.d/2026-07-06-web-ui-now-renders-the-seeded-first-message-v.md`
- `[2026-07-06]` **Web UI: pivot from incremental CSS polish to a designed prototype (Claude Design) that I wire into**`persistent-memory.d/2026-07-06-web-ui-pivot-from-incremental-css-polish-to-a.md`
- `[2026-07-07]` **Affect-egress reference delivered by worldtree-dev + a we-framing render DRIFT-WATCH banked**`persistent-memory.d/2026-07-07-affect-egress-reference-delivered-by-worldtre.md`
- `[2026-07-12]` **R34/R35 character-self-report reframe LIVE (WT b53); affect-half VALIDATED in prod, powered memory-half eval GREENLIT + designed**`persistent-memory.d/2026-07-12-r34-r35-character-self-report-reframe-live-wt.md`
- `[2026-07-12]` **Capture-path resolved → a worldtree producer-probe (ratatoskr-caught blocker)**`persistent-memory.d/2026-07-12-capture-path-resolved-a-worldtree-producer-pr.md`
- `[2026-07-12]` **bifrost 1.1.1 adopted (v0.20.10, pushed) — the library-level fix for the frozen-v0.6 handshake leak**`persistent-memory.d/2026-07-12-bifrost-1-1-1-adopted-v0-20-10-pushed-the-lib.md`
- `[2026-07-10]` **Bifrost bound-handshake blocker → bifrost 1.1.0 broke frozen-v0.6; fixed by Worldtree b47/wire-v0.7, our side needed ZERO change**`persistent-memory.d/2026-07-10-bifrost-bound-handshake-blocker-bifrost-1-1-0.md`
- `[2026-07-09]` **Sindra PATCHed to `character-rp` → Deckard reasoning-RP seat (operator-directed, INTERIM)**`persistent-memory.d/2026-07-09-sindra-patched-to-character-rp-deckard-reason.md`
- `[2026-07-08]` **PAD display relaxed for R32-1B unbounded-z, done PROACTIVELY (`v0.20.9`, patch, operator-directed "sindra full and unbounded")**`persistent-memory.d/2026-07-08-pad-display-relaxed-for-r32-1b-unbounded-z-do.md`
- `[2026-07-07]` **Web-UI iteration-3 SHIPPED (`v0.20.7`, patch) — all three queued items + the memory 0/0 root-caused**`persistent-memory.d/2026-07-07-web-ui-iteration-3-shipped-v0-20-7-patch-all.md`
- `[2026-07-07]` **Web-UI next-work QUEUED for a fresh-context session (operator-directed `/snapshot` handoff) — full specs in Current state § ⏭ QUEUED**`persistent-memory.d/2026-07-07-web-ui-next-work-queued-for-a-fresh-context-s.md`
- `[2026-07-07]` **Markdown pass-1 SHIPPED (`v0.20.6`) — RP semantic coloring + paragraph reflow (operator-directed markdown rework, step ①)**`persistent-memory.d/2026-07-07-markdown-pass-1-shipped-v0-20-6-rp-semantic-c.md`
- `[2026-07-07]` **Affect-derived tooltips (`v0.20.5`) + transparent squirrel vendored + v0.20.0.5 PUSHED to origin (operator-authorized)**`persistent-memory.d/2026-07-07-affect-derived-tooltips-v0-20-5-transparent-s.md`
- `[2026-07-07]` **SVG sparklines + 3D mood cube imported from the updated Claude Design prototype (`v0.20.4`) — operator: "the svg sparklines and the new 3d graph"**`persistent-memory.d/2026-07-07-svg-sparklines-3d-mood-cube-imported-from-the.md`
- `[2026-07-07]` **Brand mark + favicon → the aurora squirrel (`v0.20.3`), replacing the `ᛯ` rune**`persistent-memory.d/2026-07-07-brand-mark-favicon-the-aurora-squirrel-v0-20.md`
- `[2026-07-07]` **Context-injection view SHIPPED (`v0.20.2`) — the console now reconstructs the FULL hidden affect block Worldtree injects into the agent's system prompt (operator: "use that canon in the interface, see as much context injection as possible")**`persistent-memory.d/2026-07-07-context-injection-view-shipped-v0-20-2-the-co.md`
- `[2026-07-06]` **Claude Design console SHIPPED (`v0.20.0` MINOR, operator-approved) — see Current state for the full record**`persistent-memory.d/2026-07-06-claude-design-console-shipped-v0-20-0-minor-o.md`
- `[2026-07-13]` **P06 memory-half DRIVEN + SCORED — the reframe's memory mechanism is validated**`persistent-memory.d/2026-07-13-p06-memory-half-driven-scored-the-reframe-s-m.md`
- `[2026-07-13]` **Memory extraction turned REASONING-OFF for the eval (operator-directed)**`persistent-memory.d/2026-07-13-memory-extraction-turned-reasoning-off-for-th.md`
- `[2026-07-13]` **Vendored the brokkr R34 psych-profile canon (Vuong-directed) — BOTH files, not just the parameters**`persistent-memory.d/2026-07-13-vendored-the-brokkr-r34-psych-profile-canon-v.md`
- `[2026-07-13]` **Affect-egress "coordinated re-vendor" open item RESOLVED — it was a benign R32-1B doc note, not the we-framing conditional**`persistent-memory.d/2026-07-13-affect-egress-coordinated-re-vendor-open-item.md`
- `[2026-07-13]` **WT #355 root-caused via ratatoskr telemetry (Vuong-routed via soong-dev)**`persistent-memory.d/2026-07-13-wt-355-root-caused-via-ratatoskr-telemetry-vu.md`
- `[2026-07-13]` **WT #355 VALIDATION — fix CONFIRMED; the standing loop-in obligation is DISCHARGED**`persistent-memory.d/2026-07-13-wt-355-validation-fix-confirmed-the-standing.md`
- `[2026-07-13]` **b61 adopted as the personal target — the orthogonal over-budget TRIGGER also fixed**`persistent-memory.d/2026-07-13-b61-adopted-as-the-personal-target-the-orthog.md`
- `[2026-07-13]` **Cleaned + prepped for a Sindra run (operator: "clean up everything + prep")**`persistent-memory.d/2026-07-13-cleaned-prepped-for-a-sindra-run-operator-cle.md`
- `[2026-07-14]` **soong-lab adopted as our Tier-3 agent-authoring studio (operator-directed)**`persistent-memory.d/2026-07-14-soong-lab-adopted-as-our-tier-3-agent-authori.md`
- `[2026-07-15]` **Cross-session recall failure root-caused → the person-prime `scan` build**`persistent-memory.d/2026-07-15-cross-session-recall-failure-root-caused-the.md`
- `[2026-07-15]` **Sindra redefined from the soong-lab bundle**`persistent-memory.d/2026-07-15-sindra-redefined-from-the-soong-lab-bundle.md`
- `[2026-07-16]` **WT #364 + brokkr R39 re-drive (DECISIVE) — name-recall root-caused Worldtree-side; the fix is the signal FAMILY, not a threshold**`persistent-memory.d/2026-07-16-wt-364-brokkr-r39-re-drive-decisive-name-reca.md`
- `[2026-07-16]` **bifrost ruled scan snapshot-cursor NORMATIVE (offset NOT blessed) + shipped conformance coverage in bifrost 1.1.3**`persistent-memory.d/2026-07-16-bifrost-ruled-scan-snapshot-cursor-normative.md`
- `[2026-07-16]` **brokkr flagged ratatoskr as R39 Phase-2 PROBE-RUNNER (Arm-2 contradiction set = our frozen 10-chunk specimen); ACCEPTED IN PRINCIPLE (Vuong 2026-07-16) — formal scope + effort commit lands when Arm-2 actually spins**`persistent-memory.d/2026-07-16-brokkr-flagged-ratatoskr-as-r39-phase-2-probe.md`
- `[2026-07-17]` **`mark_superseded` verb SHIPPED + live-verified (v0.20.15, `be2c577`) — WT #364 durable retirement lands on our store; #364 CLOSED end-to-end both sides** → `persistent-memory.d/2026-07-17-marksuperseded-verb-shipped-live-verified-v0.md`
- `[2026-07-17]` **Web-console UI (v0.20.16, pushed): code-block word-wrap + per-code-block & per-turn copy buttons**`persistent-memory.d/2026-07-17-web-console-ui-v0-20-16-pushed-code-block-wor.md`
- `[2026-07-17]` **P06-driver referential-frame A/B/C probe QUEUED (operator-ratified, deploy-gated on WT b122)**`persistent-memory.d/2026-07-17-p06-driver-referential-frame-a-b-c-probe-queu.md`
- `[2026-07-17]` **Sindra live memory.db tidied to a 5-fact PRISTINE baseline for a test drive**`persistent-memory.d/2026-07-17-sindra-live-memory-db-tidied-to-a-5-fact-pris.md`
- `[2026-07-18]` **#368 (user, character) memory silo test — DONE, PASSED live (WT b127).** Write + read isolation both proven end-to-end; betty (throwaway) deleted; the immediate post-clear action, closed. → `persistent-memory.d/2026-07-18-368-silo-test-passed.md`
- `[2026-07-18]` **Worldtree owns the official Conversation API SDK (#371) — Rata's client spine (`sse_client`/`sessions`/`tier3`) is the SEED; the SillyTavern app moved OUT to a NEW repo (template-dev), Rata does NOT fork.** Rata = SDK seed + future consumer; TS ships first (Rata's repin rides the later Python milestone); internal-registry-only. → `persistent-memory.d/2026-07-18-worldtree-sdk-371-and-sillytavern-app.md`
- `[2026-07-18]` **issue #1 contract drift fixed (`4bd9abd`) — SSE event vocab re-canonicalized: added `awaiting_llm_first_token` (#201) + `affect_update` (#204) to the Event union + TESTS (both were parsed by `_envelope_for_type` and tested in `test_sse_client.py`, but never in #1's contract; surfaced by the #371 parity pass). Contract-only, no bump.**
- `[2026-07-18]` **Both app products (arbo image-gen + SillyTavern chat) leave Rata to a NEW repo (template-dev standing up); Rata does NOT fork and is NOT the app base.** Reverts Rata to its core — Worldtree debug-observability surface + Bifrost reference impl + Conversation-API SDK seed/future-consumer. Supersedes the 2026-07-17 'fork Rata for arbo' NEXT-MAJOR plan.
- `[2026-07-18]` **ephemeral-template (Echo) create SHIPPED (`v0.21.2`, `c7016f2`, #19)**`config` passthrough + `--system-prompt` + `SessionInfo.kind/config` + `--whoami` roles fix. Diagnosed from the ignored `session_api_failed` startup line; role/model drift resolved w/ worldtree-dev (spec re-synced v1.1). TDD + heid contract-review + bug-hunt.
- `[2026-07-18]` **Rata = THE reference consumer of the worldtree-sdk Python spine** — parity pass (12 grounded findings) shaped its contract BEFORE build (open-world reads, caller-injected transport, per-wire role/model — adopted); coverage-map re-anchored to the SDK's 41-op ratified surface (`b1fbadd`); 4 ergonomics items parked post-v1 with wtsdk-dev.
- `[2026-07-18]` **worldtree-sdk cutover DECIDED — adopt the Python SDK for the consumer client layer** (operator, overriding "stay hand-rolled"). Issue #20; contract `docs/contracts/worldtree_sdk_cutover.contract.md` (`e45640c`, vor-cross'd + heid-reviewed); auto-memory `project_worldtree_sdk_cutover`. Consumer layer only, Bifrost provider untouched; slice-1 foundation next. See in-flight.
_65 older entries (2026-05-* debug-TUI/web era + the 2026-06-14 → 06-18 Bifrost-provider build / #17+#18 / #295-296 era) archived to archival-memory.md._
_For per-issue TDD implementation notes, Volva findings, and contract amendments, see the git log — every per-issue commit carries a structured message capturing the trail._
## Tried and abandoned
Log of approaches that were tried and rejected, with rationale. Future-self
defense against re-attempting the same cul-de-sac.
- `[2026-07-10]` **Reverting our provider to bifrost 1.0.0 to fix the bound-handshake `schema_validation_failed` — DISPROVEN, and it would've been the WRONG state**`persistent-memory.d/2026-07-10-reverting-our-provider-to-bifrost-1-0-0-to-fi.md`
- `[2026-06-15]` **Canonical sync retired the issue-scoped parser staleness.** `contract_parser.py` synced to v2.1 (commit `d85ab43`): now validates issue-scoped frontmatter + four v2.1 test categories. The old "treat parser ERROR-on-issue-scoped as expected" note no longer applies.
- `[2026-06-15]` **Issue #17 filed.** REVERSES design-brief §6's "no Bifrost-binding consumer support" — that negative clause predates ratatoskr's provider identity (2026-06-14), so the canary now owns both ends but its client couldn't drive its own provider. (Shipped 2026-06-18.)
- `[2026-06-16]` **`scripts/contract_drift_check.py` defaults `GITEA_REPO` to "Worldtree"** (line 74), so a bare run in ratatoskr false-positives DRIFT by hashing Worldtree's same-numbered issue. Always `export GITEA_REPO=ratatoskr GITEA_OWNER=vh` before running the drift-checker here.
- `[2026-06-19]` **The SAME `check_same_thread` sqlite bug recurred in the MEMORY store — exposed by the contract-mandated `search` dispatch test (TestClient = worker thread)**`persistent-memory.d/2026-06-19-the-same-checksamethread-sqlite-bug-recurred.md`
- `[2026-06-19]` **Full WT-driven `:8392` live-smoke is infra-gated — `:8392` not in WT's `BIFROST_CLIENT_ALLOWED_HOSTS` (bind 422s)**`persistent-memory.d/2026-06-19-full-wt-driven-8392-live-smoke-is-infra-gated.md`
- `[2026-06-19]` **heid-code-review pulled MORE weight than its own "marginal" self-assessment**`persistent-memory.d/2026-06-19-heid-code-review-pulled-more-weight-than-its.md`
- `[2026-06-20]` **The post-turn-async timing trap bit AGAIN — even a 35s post-`[done]` read missed the promotion `upsert_many` by ~2s**`persistent-memory.d/2026-06-20-the-post-turn-async-timing-trap-bit-again-eve.md`
- `[2026-06-30]` **Heimdall keys are PER-INSTANCE — a key minted on one Worldtree 401s on another**`persistent-memory.d/2026-06-30-heimdall-keys-are-per-instance-a-key-minted-o.md`
- `[2026-06-30]` **`tea comment <N>` hangs on Gitea** → `persistent-memory.d/2026-06-30-tea-comment-n-hangs-on-gitea.md`
- `[2026-07-02]` **Mask-HOSTED transient characters have a STATIC mood engine — cost a whole R29 probe**`persistent-memory.d/2026-07-02-mask-hosted-transient-characters-have-a-stati.md`
- `[2026-07-03]` **The "neutral non-appraising tail" premise fails — the neutral MESSAGE choice dominates**`persistent-memory.d/2026-07-03-the-neutral-non-appraising-tail-premise-fails.md`
- `[2026-07-03]` **Two φ0-fit traps: fast-turn timescale + low-baseline conditioning**`persistent-memory.d/2026-07-03-two-0-fit-traps-fast-turn-timescale-low-basel.md`
- `[2026-07-06]` **`persona_state` + the agent envelope are Tier-3-BLIND -- NOT valid signals for "did a persona store"** → `persistent-memory.d/2026-07-06-personastate-the-agent-envelope-are-tier-3-bl.md`
- `[2026-07-06]` **Raw `POST /sessions` is NOT Bifrost-bound -> zero affect/memory emits**`persistent-memory.d/2026-07-06-raw-post-sessions-is-not-bifrost-bound-zero-a.md`
- `[2026-07-06]` **A fast/"no-op" deploy can leave a STALE container running the old image -- verify the running version, not the deploy status**`persistent-memory.d/2026-07-06-a-fast-no-op-deploy-can-leave-a-stale-contain.md`
- `[2026-07-06]` **#348 OCEAN key-mismatch: a declared OCEAN silently resolved to neutral** → `persistent-memory.d/2026-07-06-348-ocean-key-mismatch-a-declared-ocean-silen.md`
- `[2026-07-06]` **`pkill -f "ratatoskr-web --host"` SELF-MATCHES the bash command running it** → `persistent-memory.d/2026-07-06-pkill-f-ratatoskr-web-host-self-matches-the-b.md`
- `[2026-07-06]` **Playwright: no python `playwright` module in the venv; use NODE playwright + an explicit `executablePath`**`persistent-memory.d/2026-07-06-playwright-no-python-playwright-module-in-the.md`
- `[2026-07-06]` **The Bash tool's `grep` is a ugrep-wrapper (`--ignore-files -I`) that silently returns NOTHING on some files**`persistent-memory.d/2026-07-06-the-bash-tool-s-grep-is-a-ugrep-wrapper-ignor.md`
- `[2026-07-06]` **`DesignSync` (claude.ai/design MCP) needs claude.ai design scopes before ANY method works** → `persistent-memory.d/2026-07-06-designsync-claude-ai-design-mcp-needs-claude.md`
- `[2026-07-13]` **`thinking_enabled=False` on the define was a NO-OP — char-rp-reasoning ignores it** → `persistent-memory.d/2026-07-13-thinkingenabled-false-on-the-define-was-a-no.md`
- `[2026-07-13]` **A same-image redeploy does NOT reload a bind-mounted config — the ModelRegistry boot-caches it at `__init__`**`persistent-memory.d/2026-07-13-a-same-image-redeploy-does-not-reload-a-bind.md`
- `[2026-07-15]` **soong-lab bundle `ship.native.motivational.goals/fears` are bare STRINGS, but WT `agents.define` requires OBJECTS**`persistent-memory.d/2026-07-15-soong-lab-bundle-ship-native-motivational-goa.md`
- `[2026-07-15]` **`re.sub`/`re.subn` INTERPRETS backslash-escapes in the REPLACEMENT string** → `persistent-memory.d/2026-07-15-re-sub-re-subn-interprets-backslash-escapes-i.md`
- `[2026-07-13]` **Called Deckard "hung" off a short timeout — WRONG (operator correction)**`persistent-memory.d/2026-07-13-called-deckard-hung-off-a-short-timeout-wrong.md`
- `[2026-07-13]` **Resumed-session context-snapshot is IN-MEMORY → lost on a container recreate (agent_not_available on resume)**`persistent-memory.d/2026-07-13-resumed-session-context-snapshot-is-in-memory.md`
- `[2026-07-16]` **`sortable_chunk_fields` advertised WITHOUT the required `type` field = whole-handshake deploy-breaker; only DRIVING the real bind caught it** → `persistent-memory.d/2026-07-16-sortablechunkfields-advertised-without-the-re.md`
_34 older entries (2026-05-* debug-TUI/web era + the 2026-06-14 → 06-18 foot-gun cluster) archived to archival-memory.md._