Day 58 — 'the library is the ceiling.'
The kernel could complete a silhouette and grade it honestly, but every move it made was arithmetic over the library — so it couldn't tell 'who IS a reporter' from 'who is NOT', and it stamped GROUNDED on whatever chunk happened to share words. Today it got the organ it was missing: a reader. A small local model, fenced so it stays a cursor and never a knower — it picks one leaf or abstains, and a second call may only ever downgrade a pass, never invent an answer. Baseline retrieval answered 45% with six confident lies; the fenced reader answered 55% with zero. Then the reader learned to think: a query is a silhouette that implies sub-questions, so decompose it, recurse, ground each hole or name it as a gap. It worked beautifully on a clean corpus — and then, pointed at the real 2342-chunk client corpus, it decomposed perfectly and grounded confident garbage, because the binding constraint was never the reasoning. It was the library. Which is the whole thesis, proven by building the thinking until it broke.
“the library is the ceiling.”
Some days you add a capability. Some days you build a capability all the way to its edge, watch exactly where it breaks, and the crack turns out to be the thing you’ve been claiming for a year. Today was the second kind.
The organ it was missing
The recursive-completion kernel could do a lot. Give it a silhouette and it completes it into a grounded tree, cites every leaf, grades every hole, and re-grounds a single failing node without touching its siblings. But every one of those moves was arithmetic over the library — token overlap, cosine, exact match. Which meant it couldn’t tell “who IS a mandated reporter” from “who is NOT” (same tokens, opposite meaning). It couldn’t tell that “legally obligated” means “mandated.” And the verdict it stamped — GROUNDED — graded the cosine score, not the answer, so a confident, wrong, keyword-adjacent chunk got a green badge. The honest-abstain promise, the whole reason the thing is trustworthy, was quietly never firing.
The forest could route and cite. The kernel could recurse and grade. Neither could read. That was the missing organ.
So we built a reader, and fenced it. It is a cursor, never a knower — the phrase the project keeps landing on. Given a question and the retrieved candidates, it returns the number of the one that answers, or NONE. It can only ever point at a real leaf; a made-up answer reads as abstain. And a second, separate call grades what it picked — and by law (the verdicts doc has said this all along) that grader may only ever downgrade a pass to an abstain, never talk a wrong answer up into a right one. The model can make the system more honest. It can never make it more confident than the arithmetic already did. That direction is the safety argument.
The A/B, same corpus, same retriever, swap only the reader: the arithmetic baseline answered 45% of the questions and told six confident lies. The fenced reader answered 55% and told zero. The number that mattered most was the one that didn’t move: retrieval already had the right leaf in its top results 91% of the time. The win was reading, not retrieving. The facts were always in reach; nothing in the loop could read them.
Then it learned to think
A reader answers one hole. Thinking is what happens when the hole opens into more holes. So we let it recurse — which is, after all, the kernel’s own move.
“Am I a mandated reporter, and what’s the penalty if I don’t report?”
isn’t one question. It’s two, maybe three. So the loop decomposes the
silhouette into the sub-questions it implies, recurses into each one,
grounds every atomic hole with the fenced reader — pick a cited leaf
or abstain — and calls the whole thing real only when every sub-hole is
real. The holes it can’t fill are named, not faked. The honesty
became per-hole: “I can ground who’s a reporter and the penalty, but
not the exemptions” — three separate truths instead of one confident
blur. And because it’s the same kernel underneath, is_real, failures,
and the tree renderer all worked on it unchanged.
Refining it was a lesson in discipline. The first version, handed to a 3B, over-decomposed catastrophically — one question sprawled into sixteen, most of them redundant restatements or drifting into things the corpus never had. Tighten the prompt and it flipped to the opposite sin: it called a genuinely two-part question atomic and tried to answer both halves from one chunk. What a small model actually needed was an example — one compound question split, one atomic left whole — and then it found the middle. Parsimony went in as a rule: decompose one level by default, drop duplicates, and treat a one-item “split” as no split at all. Pointed at a clean fact-corpus, it did exactly the right thing: two clean holes, the penalty grounded to its cited source, and the personal “am I one?” honestly refused, because the corpus defines the category and can’t know about you.
Then it pointed at the wall
And then we did the honest thing: pointed it at the real client corpus — 2,342 chunks of the mandated-reporter training material — and drove it until it broke.
It decomposed perfectly. Two clean holes, who is a reporter and how soon must you report. And it grounded both with total confidence to garbage — a chunk about “click here for county statistics,” a lesson title that reads “How to Report: this lesson explains the steps.” Both marked real. Both wrong. Tightening the grader to demand the answer be present, not just on-topic, didn’t save it — the model still waves through keyword-dense navigation text. And the diagnosis was final: for the timeframe question, retrieval’s top results are quiz answer-options, a table-of-contents line, and — perfectly — the quiz question itself, “how soon should you send a written report.” Never the answer. The fact exists, in a hundred-odd chunks. None of them is what retrieval hands the reader.
There’s the whole thing in one failure. The chain is:
corpus quality → retrieval recall → reader → grader → reasoning loop.
The loop sits at the end. We refined the thinking to its structural limit — parsimonious recursion, fenced grounding, per-hole honesty, answer-presence grading — and it broke upstream, in the library, at exactly the place a sister experiment on the coding forest had already found the wall the day before: recall is the wall, and the library side is the only door.
The AHA
Frontier models hide this failure. They have the fact in their weights, so a bad corpus just means they fall back on what they already know and sound fluent doing it. Werbos can’t, and today that stopped being a weakness and became the point: a reasoning structure so honest it points a finger at exactly where the real constraint lives — the corpus — instead of papering over it with confident prose. We spent the day making the thinking as refined as it could be, and its parting gift was to tell us, unmistakably, that thinking was never the bottleneck.
Vary the library, not the model — we’ve said it for a year. Today we built the thinking all the way to its edge, and the edge said the same thing back.
The next work isn’t a smarter loop. It’s a library worthy of the one we already have: fact-chunks instead of tables of contents, the answer where the reader can reach it. The organ is done. Now it needs something real to read.