- #368 (user,character) memory silo test DONE + PASSED live (WT b127): write-side conjunctive {end_user,agent_self} scoping + read-side cross- character isolation both proven end-to-end; betty (throwaway) deleted, Sindra intact. Full record in persistent-memory.d/2026-07-18-368-silo- test-passed.md. Retired the stale "silo test in progress" in-flight blocks. - Two-tier migration: split 152 over-threshold dated entries into persistent-memory.d/ detail files, leaving one-line pointers in the index (startup load ~196KB -> ~53KB; bodies now load on demand). - Tier-3 stores scrubbed clean (memory 0 / affect 0, provider restarted empty); persistent-memory + detail file updated to reflect the scrub.
3.1 KiB
[2026-07-06] Sindra rewritten onto a #347 authored first-message + first-message-preset AUTO-SEED SHIPPED (v0.19.8). Operator "rewrite Sindra" now that #347 first-messages work. Her card had a **Startup:** block (a pre-#347 workaround: "introduce yourself + ask for Intensity/Mood/Willingness" with a verbatim scripted greeting) — precisely what #347 replaces. Rewrite, all NON-destructive: (1) lifted her scripted opening into a #347 first-message (punctuation-fixed); (2) PATCHed her live definition — PATCH /agents/ratatoskr:sindra (body ConsumerAgentPatchRequest = system_prompt+role, extra=forbid; keeps OCEAN/persona/memory) removing the Startup block -> a 1-line **Opening:** fallback + reworded the axes-persist line (25686->25449 chars, verified Startup gone); (3) codified auto-seed: NEW module src/ratatoskr/first_message.py (FIRST_MESSAGE_PRESETS dict {agent_id->text} + seed_preset_first_message best-effort helper) wired into ALL 3 session-create paths — cli _amain (--send --new), tui _resolve_then_run (bare --new), web _create_session_endpoint (POST /api/sessions) — so every new Sindra session opens with her greeting. Best-effort (INV-001: swallows AuthoredHistoryUnavailable/SessionApiFailed/httpx.HTTPError -> NEVER blocks create); per-content idempotency key (ratatoskr-preset-+sha256[:12]). Contract docs/contracts/first_message.contract.md (module-scoped: module:+purpose:+touches: required, NOT target_module:) + TDD (9 unit + 1 web wire-in; the 3 existing sindra bind tests needed a history-endpoint mock since creating a preset agent now auto-seeds). Suite 612 green, ruff+mypy clean. LIVE-PROVEN generation-free: create sindra session -> auto-seed -> read-back seq-0 assistant greeting (409 chars). Sindra's greeting now lives canonically in the preset registry (repo); her server card no longer carries it. Patch bump (single-commit feature, no downstream coordination). FOOT-GUN: sindra requires end_user_id on session-create (422 end_user_id_required) — all real paths pass it from env (RATATOSKR_END_USER_ID) / web server config. Then the full quality gate (operator-directed, folded into v0.19.8): heid-code-review (unanimous ZERO implementation drift; 2 test-only fixups — INV-004 verification-claim made explicit re the global rglob test + an exactly-one-POST assertion) + heid-bug-hunt (3/3 convergence caught what the conformance lens structurally COULDN'T — the code matched the contract's NARROW 3-type ERROR_ROUTING, but INV-001's "NEVER raises" is BROADER). HARDENED: broad except Exception → None (re-raise asyncio.CancelledError, itself a BaseException), soft-guard PREs (return None, NOT assert — a wiring bug can't crash the create path it's wired into), and asyncio.wait_for(_SEED_TIMEOUT_S=10s) bounding the seed write (the CLI/TUI clients run read=None for SSE → a stalled /history would otherwise block create forever). Suite 615 green. LESSON: code-matches-ERROR_ROUTING ≠ honors-broad-INV-001 — heid-code-review confirms contract-conformance, heid-bug-hunt catches robustness gaps the contract's own narrow clauses miss; run both.