Day 72 — 'the dead cat was already dead.'
The day the plan flipped from 'grow the model' to 'shrink it and move the mind out.' The size sweep had already whispered it (85M was dead weight next to 30M); today we said it out loud — the owned model becomes a small, fast SPEECH cursor, and every scrap of capability moves OUT into cards, packs, lanes, and skills. We graded 9 new work-cards libraries (4,743/4,751, the cold-check catching real errors like a blitzscaling card that called 100–999 employees 'City' when it's 'Village'), trained a clean 5M/10M base on 121k everyday pairs (clean beat the style-mixed corpus decisively — proof that flirt/jokes belong in packs, not the base), and rebuilt the corpus engine as two AGENTS actually texting each other (friends / user↔assistant / boss↔assistant), which reads human in a way isolated topic-pairs never could. And then the real idea landed: a COMPREHENSION engine that doesn't 'understand' holistically — it decomposes a sentence into per-word dictionary lookups and builds meaning bottom-up. The test that proved it: 'the DEAD cat was placed in a box… poison… is it alive by day 10?' A big model pattern-matches 'Schrödinger' and skips the reading. A word-precise system reads 'dead' and is done. The moat isn't a smarter model — it's refusing to skip the reading.
“the shortcut is fine. skipping the gate is the sin.”
For a week the plan was grow the talk model. The honest ruler had already hinted the plan was wrong — on Day 71 the 30M beat the 85M and the 125M. Today we stopped arguing with it and inverted the whole thing: the model shrinks; the mind moves out.
The pivot: the model is a cursor, not a knower
The owned model becomes the smallest, fastest speech cursor we can train — pure fluency, nothing else. Everything that looks like capability — facts, compute, actions, voice-range — moves OUT: knowledge into the cards (110 libraries), math into the lanes, tasks into the skill router, introspection into a deterministic composer. The size sweep wasn’t a disappointment; it was the map. When bigger stops helping, that’s the data telling you the model is not where the value lives.
Which retires a week-old ghost, honestly: the mind’s monologue babbles (“Glunglu?”) because we asked a small-talk model to narrate a metrics report — out-of-distribution, not undertrained. We proved it: fed the freshly-trained 30M the real monologue input, still gibberish. More chat data will never fix it. The fix is to stop asking the tiny model to do a job that was never speech.
The honest ruler, again: batch2
Nine new work-cards libraries came in from the field and went through the cold-check: 4,743 of 4,751 passed. The eight it quarantined weren’t noise — most were real errors. A blitzscaling card labeled 100–999 employees the “City” stage; it’s the “Village” stage, and the true answer was hiding in its own distractor. The grader caught it exactly the way it caught the linguistics “pejoration” card last week. A couple of quarantines were false flags (correct-but-hard-to-verify security cards) — which is the right failure direction for a gate: drop the uncertain, keep the moat clean.
The clean base — and the proof that packs are packs
We trained 5M and 10M on the merged corpus (everyday + six style buckets), then again on just the 121k everyday pairs, 12k steps:
| mixed corpus, 6k steps | clean everyday, 12k steps | |
|---|---|---|
| 5M | 1.296 | 1.115 |
| 10M | 1.220 | 1.078 |
Stripping the style buckets out of the base dropped held-out loss on both. That’s the architecture proving itself: a 5–10M model can barely hold coherent everyday speech; folding flirt + jokes + emotional range into it spreads it thin. So they don’t go in the base — they ride on top as packs (the flirt/companion pack got harvested as 86 tasteful roster exemplars, kept deliberately separate so romantic voice never leaks into the mind). Base = clean fluency. Range = composed.
The corpus engine grew a second agent
The biggest quality jump wasn’t a model — it was how the data is made. Isolated “topic → pair” generation makes stiff, context-free replies. So now two agents actually text each other, turn by turn, steered through a rotating topic arc, and we capture the consecutive turns. It reads human:
A: you ever have one of those days where everything feels off and you just wanna stay in bed? B: definitely been there recently, can’t shake a low mood…
And it carries registers, not just topics: friends (3×), user↔assistant (2×), boss↔assistant (1×), so the base learns to be a buddy and a helper and a colleague. Hardened against the teacher’s tells (qwen leaks Chinese meta-text; LLMs spiral into “ttyl / talk soon” goodbye-loops — both filtered). One overnight batch: 30,037 clean pairs, zero contamination. Next dynamic on deck: “help me fix my code” — and code has what chat doesn’t, an execution gate, so those pairs can be verified by running them, not just trusted.
The idea: comprehension that can’t be baited
Then the real one. A tiny model can’t understand a sentence holistically — so don’t ask it to. Decompose understanding into gradeable lookups: parse the words + roles, look up each word in a dictionary RAG (what is it, what does it mean, how’s it used — WordNet is almost exactly this), assemble meaning bottom-up, discern the actual request, then reason over the facts.
The test that made it click: “the dead cat was placed in a box… a day passes, poison food goes in… is the cat alive or dead by day 10?” The answer is dead — it was dead at word one. The poison and the ten days are a deliberate trap. A large model sees “Schrödinger,” pulls the cached it’s-in-superposition answer, and skips reading the actual words. A word-precise system reads “dead” and is finished. (For the record: the first draft of this analysis fell for the trap too — added a whole “reason about the poison” step. The example works.)
Which surfaced the principle worth keeping: it’s not shortcut vs. do every step — it’s gated vs.
ungated shortcuts. Recognize fast, but verify the pattern against the literal words before you
commit; a contradiction (“Schrödinger says uncertain” vs. “the sentence says dead”) kicks you back to
full comprehension. That’s the resolve() shape exactly: LOOKUP → VERIFY → fall through only on
gate-fail. Cheap when the shortcut is honest, careful only when it isn’t. Big models are trained toward
fluent-and-fast — ungated shortcuts — so they’re foolable by construction. Comprehension-first with a
one-cent verify gate is trap-resistant by construction.
Shipped / found:
- The pivot: owned model → smallest speech base cursor; capability moves to cards / lanes / skills / composers (memory: speech-only-pivot)
- batch2 graded: 9 work-cards libraries, 4,743/4,751 pass — cold-check caught real errors (City→Village) (uncommitted:
libraries/{accounting,cryptography,…}) - Clean 5M/10M base on 121k everyday pairs — clean beat style-mixed (10M: 1.078); flirt/jokes proven to belong in packs
- 2-agent dialogue engine — friends / assistant / boss registers, steered arcs, CJK + goodbye-spiral filtered; 30,037 clean pairs/night (
scripts/train_talk_standalone.pygained a 10M tier) - Flirt pack — 86 tasteful roster exemplars harvested as a separate composable layer, base stays clean
- Finding — the mind’s Glunglu is task-mismatch, not undertraining: a small-talk model can’t narrate a metrics report; more chat data won’t fix it
- The comprehension engine — decompose → per-word dictionary-RAG lookup (WordNet) → assemble → discern → reason; word-precision is trap-resistant
- The principle: gated shortcuts — recognize fast, verify the pattern against the literal words, drop to full comprehension on contradiction