FME — Object Model (LOCKED)
Family Memory Engine. The product is "nothing gets forgotten." Source plan:
.claude/plans/hazy-noodling-firefly.md. Locked 2026-06-05 (ZW-ENGINE-V9). This is law — every object in the engine conforms.
Single source of truth (no info in 5 places)
- Original Artifact — the raw Telegram message / voice file / PDF / photo / link = the source of truth. Kept forever.
- Family Memory Index — the searchable catalog (one row per object). Derived.
Family_Event_Log— immutable, append-only audit. Derived.
Everything else is derived from these three. Never duplicate authority.
Canonical object schema (every object, no exceptions)
id: FLB-YYYYMMDD-NNNNN # unique, sequential per day
type: message | voice | photo | pdf | link | task | grocery | memory | event
created: ISO-8601 timestamp
createdBy: Chanie | Sam | kid | system
chapter: ONE (Kids | Travel | Home | Simchas | Grocery | Life-Expenses-Info | Unfiled)
entities: MANY [Libby, Camp Mesorah, Tuition] # people & things — PRIMARY for retrieval
tags: MANY [Summer 2027, Registration]
visibility: both | sam # family chapters = both; Sam-personal excluded from family store
source: Telegram | portal | SMS | drive
original_uri: permanent ref to the RAW artifact — NEVER deleted
summary: one-line (AI or raw)
content: text / file-ref
status: ACTIVE | ARCHIVED
origin: Human | AI # who created it
review_state: AI_UNREVIEWED | CONFIRMED | CORRECTED
lifespan: Permanent | Archive # AI suggests Archive; humans decide
Rules (law)
- Chapters AND entities AND tags — all three. One chapter, many entities, many tags. A camp PDF = chapter
Kids+ entities[Eli, Camp Mesorah]+ tags[Summer 2027, Registration]→ "show me Eli" / "Camp Mesorah" / "Kids" all resolve. entities[]exists from DAY 1 (field present in Phase 1A even though AI auto-extraction is Phase 2 — never lose the field).Unfiledis a first-class chapter, never an exception. Classify fails →Unfiled, acknowledge, continue.- Source preservation: keep original + transcript + summary (for voice, all three) — never collapse to only the summary.
- Trust: every object records
origin(Human/AI) +review_stateso months later you know what the AI guessed vs what a human confirmed.
Where it lives — storage (CORRECTED 2026-06-05 for scale; Sam flagged Sheet row limits)
- Live message threads = Cloudflare KV (
chanie:threadetc., rolling 50-msg buffer). No row limit. Already live. - Family Memory Index (the catalog) = Cloudflare D1 (SQLite) — NOT a Google Sheet. Sheets cap ~10M cells / a few hundred-K rows and would run out; D1 holds millions of rows AND is SQL-queryable = the retrieval backbone. (A Sheet may mirror a recent slice for human browsing, but D1 is the system of record.)
Family_Event_Log(append-only, grows forever) = a Cloudflare D1 table — never truncated.- Originals = a dedicated Google Drive folder (every raw photo/PDF/voice forever);
original_uripoints at the Drive file. - 🔴 PROTECTED: family store ONLY — never reaches Mildred's / any client's store (two-store wall).
- Why D1: same Cloudflare stack as the workers · free tier generous · SQL = fast retrieval · no row ceiling. Provision via CF D1 tooling when Phase 1A's
Family_Event_Loglands.