“a college education, not a bigger brain”

If Day 40 gave werbos a measurable mind, Day 41 started teaching it. The operator’s ask: a college-level werbos. The constraint: not by swapping in a bigger model — that throws away the whole local-first thesis. College-level the way it arrives for a person — a method for thinking, the ability to research what you don’t know, and knowing your own limits. We laid the first bricks.


First, stop the 3B from mangling its own tools (2aaf49e · 90ea768)

The “conversations regressing” the operator kept hitting while testing skills wasn’t the skills at all — it was the 3B mangling the dispatch_skill tool call. It dropped operators (1+2+3 → 123), leaked {function <nil>}, and sometimes emptied out entirely. The lesson, now a law: don’t ask a small model to emit tool calls.

So the fix is two parts. --no-skill-dispatch gates the tool the 3B can’t hold. And the skill router — parseltongue, brick 1 of the conductor — routes natural language to a skill outside the model: IDF-weighted over all 295 skills, high-precision-or-abstain. “tell me a joke” lands on the joke skill, clean; greetings and general chat stay in chat, clean. Route deterministically, then run the skill — don’t make the small model play orchestrator.

Teach it to get un-stuck — and to check if it worked (276fef4 · a163dff)

werbos unstuck is metacognitive self-remediation. When werbos keeps failing the same thing, it decomposes the request into the concepts it needs to learn, researches each one, then re-attempts the original request grounded in what it just learned. Watch the mind get un-stuck.

Then we closed it into a real scientific loop. After the re-attempt, werbos PREDICTS how likely it actually worked, TESTS itself (grades the attempt), and records the ERROR between prediction and result. Live on the 3B: an SSH-tunnel joke, predicted 80% — then its own test came back “no, that doesn’t address the request, still stuck” — error 0.80, overconfident. That gap isn’t a failure. It’s the first calibration data point.

Make its confidence mean something (8102ef6)

A 3B says “90%” and is wrong half the time, so raw self-confidence is a trap. The move isn’t to trust it — it’s to measure its bias against a trusted grader (Claude now; a bigger local model later — the slider dials Claude out as local gets good enough).

werbos calibration logs {stated, correctness} pairs and builds the reliability curve (stated confidence vs how often it was actually right) plus the correction. First readings: werbos is +0.20 overconfident overall, worst on explain (+0.55) and creative, but honest on facts and math — and the correction maps a stated “90%” to trust 57%. It bluffs hardest exactly where we’d already caught it bluffing.

Let it dream (5c2cbb7 · da29dca)

The most visceral “watch the mind” brick yet. A dream here isn’t decoration — it’s a visualization of day-residue: what’s actually preoccupying werbos (recent activity, fixations, the wishlist, its monologue), synthesized into a short surreal narrative, rendered to an image, then presented back so werbos can reflect: “does this feel familiar? why this dream?” — a real metacognitive signal, because the dream is sourced from its own state.

Fed three scraps it had stumbled on, the 3B dreamed itself “trapped in an endless loop of failed attempts — reciting the same joke about SSH, but it falls flat, like a tunnel with no exit… the words ‘100-50’ hovering out of reach… rain washing away my haiku.” Then, shown its own dream, it reflected: “this feels eerily familiar… echoes of my struggles explaining technical concepts… self-doubt and fear of failure.” The Mind page grew Dreams and Calibration tabs (a reliability diagram + the “where it bluffs” chips) beside the monologue and the radial.

(Footnote: Pollinations’ free image tier now returns 402 — terms changed since we wired it. The pipeline degrades cleanly, image best-effort; the backend is a deliberate one-file swap.)

Teach it to doubt (47ede91)

The operating rule of a scientific mind: when you’re not sure, don’t bluff. Before committing an answer, the doubt-gate scores doubt on two independent signals and routes on the worse of the two:

  1. Calibrated confidence — the stated number, corrected by that category’s own bias. Not a global average: explain and math differ by 0.65, so the gate has to correct on the right one.
  2. Self-consistency — sample the answer twice; if the two diverge, that’s doubt the model won’t report. The stand-in for logprobs.

Then it routes: commit (answer normally) / escalate (run the unstuck research loop, then re-answer) / abstain (“I’m not sure” — honestly).

Live on the 3B: “capital of France?” → COMMIT (Paris). “explain how recursion works” → the model emitted no confidence line at all — but the two samples diverged (34%), so the gate caught the doubt anyway, escalated, researched three sub-concepts, and came back with a fuller, grounded answer. That’s the entire reason it’s two signals and a min(): the second one saved it when the first was blank.


The AHA

Every brick today was the same move: the system gets smarter; the model doesn’t. A frozen 3B that researches when it’s stuck, knows its confidence is inflated on explain, and abstains instead of bluffing is operating above its weight class — not because it got bigger, but because it got a method.

And the loop closed on itself. unstuck predicts → tests → errors. The errors feed the calibration curve. The doubt-gate reads that curve to decide commit / research / abstain. And “research” is the unstuck loop. It’s a cycle, not a line — and it’s the cheapest path we know from 8th-grader to college.