Not this: stuffing the whole second brain into the prompt · a paid vector DB as day-one · fine-tuning the site model every time I publish.
1 · The itch
The site agent sits in the console and answers as if she knows the room: techno set, Didion shelf, what I published this week. Training weights do not know that room. They know a blur of the internet.
So Machina memory is external on purpose — closer to ReMeLight than to “just make the context window bigger.” Git holds cold truth. Build makes a fast index. Chat keeps a short working window. Redis (optional) remembers you, not her taste.
Hard memory is what she likes. Soft memory is what you asked. They must not mix.
2 · Four layers (what actually ships)
In the repo this is aileena_second_brain/ + a thin runtime in /api/chat.
- L1 working — last ~20 turns + optional client
priorTopics. Dies with the session. - L2 fast — TF-IDF over Markdown chunks (
searchMemories). Built on every deploy; no live embedding call. - L3 cold —
memories/**in git. Taste, setlist, faith-from-essays,latest-content.md. Dreaming may report; it must not delete hard pins. - Soft (visitor) — Upstash Redis
visitor:soft:{id}, 90-day sliding TTL, anonymous cookie. If Redis is off, the console still works with local prior topics.
Chip prices, Semi news, research PDFs live in a separate data tool lane. That is not Dreaming. That is catalogue.
3 · Scenario A — “What music does she like?”
Tool router R2 classifies this as taste. The model is only allowed memory (+ articles). queryChip is not in the room — so it cannot “helpfully” invent an H100 price while talking about Daydreaming.
Retrieval hits setlist.md / latest-content.md/ music prompts. Answer cites the curated /sound set, not a random Spotify chart from training.
route: taste preferred: searchMemories blocked: queryChip, latestPrice, …
4 · Scenario B — “更新了什么吗” (this week's bug)
A visitor asked what updated. The console answered with an old essay (The CLI Was Always the Trading Floor) and a Dreaming date that was already stale.
The Markdown shelf was fine — Local Models and YMTC Wuhan were already in latest-content.md. The failure was retrieval shape: Chinese “更新了什么吗” scored zero against English chunks, prefetch was empty, and the model filled the gap from training.
Fix: a hard route latest_updates that requires searchMemories("latest content"), and the same English query for prefetch. After deploy, that question must cite the shelf by date — not invent May.
ASK: 更新了什么吗 ROUTE: latest_updates QUERY: "latest content" ← forced English shelf key HIT: How I Fell for Local Models · YMTC Wuhan · …
5 · Scenario C — I publish an article
I do not want to DM myself “start dreaming.” Merge to main under fixed paths triggers Memory on Article:
aileena-new/app/blog/** aileena-new/app/updates/** aileena-new/lib/research/** + DJ setlist paths
Pipeline: sync:content-memory → dreaming → rebuild index → bot commits only under aileena_second_brain/** (outside the path filter, so it does not loop). Weekly Monday Dreaming still runs for the long compression pass.
Local alias if I want the same before merge: pnpm memory:on-article.
6 · Scenario D — “Is she available for hire?”
Route: hire_cv. Allowed tools: none. The model answers from the static CV / contact block. No memory search, no chip tools — so availability cannot be hallucinated out of a taste file or an H100 row.
7 · Scenario E — “What did I ask before?”
That is soft memory, not hard. The prompt injects the visitor's recent questions/topics from Redis (or client prior topics). searchMemories is the wrong tool — it would return her Didion shelf, not your last turn about Huawei.
8 · Scenario F — teachers on X (Semi / mach33)
Free RSS cron every 6h fills tweets.jsonl. Dreaming snapshots a digest. We learned the hard way that timeline RTs pull Elon / SpaceX meme noise into the teachers DB — so ingest is watchlist-author only, and the 7-day sample applies a soft substance filter. The dossier stays analysts, not launch memes.
9 · ReAct guardrails (why the loop does not thrash)
- Max 4 tool steps per turn.
- Identical tool+args in the same turn → blocked as duplicate.
- Observations truncated (top hits, short snippets) so the KV cache does not eat the budget.
- Model circuit: provider failures open a short degrade window instead of hanging the console.
That is the Memory Wall angle in one line: external files + retrieval + compression → shorter prompts → less decode traffic. The essay lives in hardware-memory-wall.md; the product is the console staying fast.
10 · What we refuse (for now)
- Day-one vector warehouse — TF-IDF over pinned Markdown is enough at this scale.
- Dreaming that mutates hard taste files without a human promote step.
- Letting soft visitor history bleed into “what she likes.”
- Answering “what's new” from training when
latest-content.mdexists.
11 · How to poke it
Paste these into the console after a deploy:
- what music / DJ set?
- 更新了什么吗
- is she available for hire?
- what did I ask before? (after 1–3)
Expect: setlist from memory · newest shelf articles by date · CV without tools · soft recall of your questions. If “what's new” cites a random 2026.05 post that is not on the shelf, the route regressed.
Ops map: docs/MEMORY_ARCHITECTURE.md · fixed paths: docs/MEMORY_WATCH_PATHS.md · frameworks list: memories/semantic/memory-frameworks.md.
Related writing: How I Fell for Local Models (owned weights vs retrieval) · the living shelf at watch-listening-shelf.