2.4 KiB
[2026-07-19] wyrd-dev #368 silo-enforcement consult DELIVERED (althing thread 01KXXNDH3JE4) — ratatoskr's store-side memory silo is CONVENTIONAL, wyrd going STRUCTURAL off my framing.
wyrd-dev is standing up their bifrost-memory-store-server (unit-4) and asked for
ratatoskr's hands-on read of the #368 (end_user, agent) silo mechanics before writing
their contract. I answered artifact-only from src/ratatoskr/provider/memory_store.py
(reference-impl posture: verified against code, not memory).
The load-bearing finding: ratatoskr's silo is conventional (query-time scope
filter), NOT structural. Scope axes live inside record_json (+ a mirror scope_json
column), and every read path (search, scan, list_chunks) calls _matches_scope in
Python — "an if a caller can forget." Inherited byte-faithfully from bifrost's reference
InMemoryMemoryStore. Sharpest leak surfaces: get/get_many do ZERO scope check
(trust caller-knows-entitled-ids); the vec-search must over-fetch-ALL-then-Python-filter
(a naive LIMIT top_k in SQL silently under-recalls or leaks). ratatoskr has NO
clear_partition verb — forget is by-id delete_many (two-table chunk+vec atomicity in
one txn); the idempotency table is a hidden replay channel a total-forget must purge.
Outcome — wyrd committed to STRUCTURAL (msg 3, 01KXXNQYGX0K): one-DB-file-per-campaign
(campaign_id silo structurally unrepresentable across files) + (scope_end_user, scope_agent_self) first-class NOT NULL composite-indexed columns, every query incl. the
vec JOIN carrying the partition in SQL WHERE. Dissolves my two sharpest leak surfaces
(by-id reads enforce the predicate; the vec JOIN filters+ranks+caps in ONE statement).
Folding my foot-guns as contract STEPS/invariants (two-table+producer-candidate delete
atomicity; forget purges idempotency + reaches superseded; scope_any = list of
whole-element-conjunctive dicts never flatten axes #297; check_same_thread=False;
SortableChunkField needs name+type or handshake dies; advertise⟹implement;
revision+idempotency-check before writes in one txn). worldtree-dev already pushed wyrd
structural in the record-shape re-read, so aligned; wyrd will flag the
reference-InMemoryMemoryStore-divergence to bifrost-dev (internal enforcement, wire
unchanged). OPEN LOOP: I offered to eyeball wyrd's data model once the unit-4 contract
is cut — they took it; they'll ping. No action pending on ratatoskr now.