Day 53 — 'the model didn't change. the library learned you.'
A capsule learning-loop, end to end. A generic, domain-blind capsule engine (prompt + exemplars + grader + memory) makes a tiny 3B — the size that runs on a phone — consistent and personal entirely through a curated library, no weights touched. Recurrence promote-gate learns a fact about the user across turns; graded generate→grade→retry ships only in-character replies; a doubt-gate that defaults to silence lets the model reach out unprompted without becoming a spammer. Proven live against llama3.2:3b on the SR8: it learned a user fact and made an unprompted callback a turn later; the silence-gate correctly held. Reuse-proofed for the main MMM verb-forest by test. Six commits, +54 tests.
“the model didn’t change. the library learned you.”
Every other day this month has been about making one model behave. Day 53 is about making the model almost irrelevant. The thesis — framework, not weights — got its cleanest demonstration yet: a 3B model, the size that fits on a phone, made consistent and personal entirely by a curated library. No fine-tune. No LoRA. The weights are frozen and, frankly, beside the point. The library does the work.
The capsule, generalized
The unit is a capsule: a fixed prompt, a bank of exemplars
(retrieved outside the model), a grader, and a memory. It’s the
same shape whether the leaf is a verb (add-test, fix-type from
the verb-forest) or a character. So the engine that shipped today
(werbos.personas.roster, +a byte-identical JS twin for on-device)
is domain-blind — and a test proves it: the same render_block
that dresses one kind of turn dresses a verb-capsule’s
task:/patch: view with zero shared code on the path (78e92ef).
That reuse line is the whole point; the boundary is documented in
REUSE.md and enforced by test_engine_is_domain_blind_*.
The loop that learns you
Three pieces turn a stateless prompt into something that accumulates a relationship:
- A recurrence promote-gate (1f05c0a). Observations land as candidates; a fact graduates to durable memory only when it recurs or is confirmed. This is the fix for the ~30%-junk lesson from the chat-harvest dogfood — a one-off mention never pollutes, but a thing you keep raising earns its place and starts shaping replies. Only graduated facts get injected.
- A graded turn loop (a314dad). Assemble (prompt + what it knows about you + retrieved voice) → generate → grade → retry until a ship-verdict or the budget runs out. Route-outside-model plus the leaf-owns-grade-retry discipline from the verb-forest, now applied to conversation. Backend-agnostic: the same loop runs against Ollama in dev and llama.rn on the phone.
- Unprompted outreach, gated toward silence (08c0ef9). The model can form a private thought from what it knows about you, decide whether that thought is worth a message, and only then compose one. The gate defaults to HOLD — the doubt-gate discipline, inverted from the chat grader’s default-PASS, because a needless message is worse than silence. A parametrized test pins it: anything but an explicit SEND holds its tongue.
It actually ran
Not a unit test — a live conversation against llama3.2:3b on
the SR8 (deliberately, the on-device target size). The transcript:
- A first reply needed two generations — the grader rejected the first, the loop regenerated, the second passed and shipped.
- A fact was mentioned twice and graduated from candidate to durable memory.
- The very next turn, the model made the callback unprompted — it used the thing it had just learned, without being asked.
- Asked whether to reach out late at night, it formed a plausible thought and the gate HELD — it stayed quiet.
One honest signal: the 3B grader mis-flagged a good reply, a live instance of the old “you can’t grade a model with a model” problem. On-device grading will be noisy and wants a low retry budget — a real finding from a real run, written down rather than smoothed over.
Plumbing
A dev surface to drive all of this against a local model before any
device build: werbos companion (183e8f7) — list, chat, and
ping (the does-it-reach-out deliberation), each wiring the engine
to Ollama. And a decision doc (3cc49a8) locking the on-device
model call: a neutral abliterated 3B over a purpose-built
finetune, precisely because the library carries the character — the
model’s only job is to not refuse and stay steerable.
The exercise harness for the loop is a small companion roster — a test bed that happens to be a fun one. The reusable engine, the promote-gate, the graded loop, and the silence-gate are the keepers; they fold straight back into the main MMM.
Six commits, +54 tests, all green; 162 persona+memory and 809 CLI tests still passing. The work sits on a branch, unmerged — the engine banked clean before anything is built on top of it.