All writing

Build log

The local model wasn't worse. My context pipeline was.

I benchmarked local models against paid frontier tiers on real document grunt-work, with sealed answer keys and a deterministic grader. The first verdict blamed the model. The recorded runs blamed my inputs.

Key findings

  • The 'paid model is clearly better' verdict was an input artifact: born-digital text fed as images. As text, the cheapest frontier tier went from 35% to 92% and every contestant landed in a 90–94% band.
  • Within its window the local model matched the strong frontier tier's full read on a global cross-check: 9/9 via chunk-and-extract with deterministic aggregation.
  • Turning 'thinking' ON made extraction worse — 19/20 dropped to 17/20 with a fabricated date — and on the chunked task it produced literally empty output, 0/9.

My benchmark's first verdict said the paid model was clearly better. That verdict was wrong. My documents were born-digital text, and I was feeding them to every model as images.

The numbers move a lot once you fix that: the cheapest paid tier scored 35% reading images and 92% reading the same class of documents as text. Much of what gets reported as a small model's ceiling is, in my recorded runs, an input-pipeline bug wearing a model-quality costume.

The running example is my offload bench, from June 2026. A home model lab asked whether a local model on my desktop GPU could take over document grunt-work (pull these fields, find these values, check this list). That work otherwise goes to a paid frontier model, the big hosted tier. It's the same lab behind the sealed task-difficulty benchmark and what running local models actually costs. Every task had answer keys sealed before any model ran, and grading was deterministic — a dumb script comparing strings, same inputs, same score, no model judgment anywhere near the result.

Why did 35% become 92%?

Because I stopped photographing text. The test documents were born-digital: created as digital text, never scanned. My first run rendered them as images anyway, forcing every model through a needless OCR step (optical character recognition — turning a picture of text back into text). Fed images, the cheapest frontier tier scored 35%. Handed the same class of documents as extracted text, it scored 92%, and every contestant (two local models, two paid tiers) landed in a 90–94% band.

Honest limits, stated plainly. These were single scored runs on small batches, roughly 8–12 documents per condition, so the small spread inside that band is noise, not a ranking. And the 35%-to-92% pair comes from two comparable-but-different document sets, not an identical A/B swap of the same files.

The contamination went past the image mistake, and it was mine. I had let a competing model grade the results, and I had hand-matched the hardest documents to the strongest model. That first verdict deserved to be thrown out, and it was. The rebuilt rule the whole lab now keeps: the thing being tested never grades itself.

Same documents, two input pipelines: images score 35%, text scores 92% Same documents, two input pipelines Born-digital document (already digital text) Rendered as an image (forces a needless OCR step) Cheapest frontier tier scores 35% Same class of document (no rendering at all) Handed over as text (the text it already was) Scores 92% all contestants 90–94% Pre-sealed answer keys + a deterministic grader (a script, not a model) made the gap visible.
The failure path and the fix: fed as images, the cheapest frontier tier scored 35%; fed as extracted text, 92%, with all four contestants in a 90–94% band. Diagram source: this page; maps 1:1 to the image-in and text-in runs scored by the deterministic string-comparing grader.

Can a small context window do a whole-document task?

Yes, if you stop asking the model to hold the whole document. The local model's context window (how much text it can hold at once) was about a quarter of the biggest test document. The test was a global cross-check: find every entry in a long document's reference list that the body never actually cites. I chunked the document, had the local model extract citations from each piece, and let plain code do the global comparison. Deterministic aggregation: no model in the reduce step.

Result: 9/9 targets recovered, matching the strong frontier tier's single full-document read. It also flagged three false positives, so the output still needs a downstream deterministic or human pass, not blind trust. The durable lesson holds anyway: a context-window limit is a capacity problem, and capacity problems are engineering problems. Chunk, extract, reduce with code.

Does more "thinking" mean more accuracy?

No, and this is the finding I would least have guessed. The local model has a togglable deliberation mode. Turning it ON made extraction worse: 19/20 dropped to 17/20, including a fabricated date — a confident, made-up value it had read correctly with thinking off. On the chunked global task, thinking mode produced literally empty output: 0/9. Not slower and right. Nothing.

A sibling model that cannot turn its thinking off failed the same way, empty on every chunk, and was structurally disqualified from the pipeline for exactly that reason. Meanwhile the non-thinking mode ran at roughly 8–10× the speed as recorded (an approximate ratio across runs, not one controlled timing) at equal or better accuracy.

None of this would have been visible without two boring decisions: grading was deterministic, and deliberation was measured rather than assumed. A vibes evaluation would have told me the thinking mode "seemed more careful." The scorecard says it fabricated data and then went silent.

So should you switch to a local model?

Not on this evidence, and I haven't. These are historical benchmark lessons under stated limits: single runs, small batches, and almost entirely born-digital documents. The skip-OCR lesson applies only to text you already have as text; genuinely messy scans were never part of that comparison. All-in costs (my time, electricity, the tokens a frontier agent spends reading local output back) were not captured, so I won't call the local route "free." The lab's own egress-boundary file blocks that claim from leaving the bench. No route got promoted.

What survives is the mechanism:

This page is one slice of how I know when my AI is right. The question I'd put to you: if you re-fed your worst-scoring task as clean extracted text, would your model ranking survive?


Method & data

Method: a home model-lab offload benchmark from June 2026 — pre-sealed answer keys, a deterministic grader, the dated run tables, and the lab's egress-boundary rules, generalized
Data: patterns and methods only; no names, dollar figures, addresses, case identifiers, or confidential content · Last checked: 2026-08-14

How this was made

AI-drafted, adversarially checked, human-directed. My AI assistant wrote this from the system's own records — the sealed-key run tables, the consolidated controlled-findings file, and the lab's egress-boundary and operating-runbook files. A separate AI session then tried to break every claim against those records, and automated privacy and readability gates ran before publish. I direct this pipeline, own every boundary in it, and audit published pages on a rolling basis — if you find an error, tell me and it goes in the corrections log, dated, never silent.

I'm Ali — I run real life-and-work admin on AI agents, then check their work in the open. More at /about.

Published under my standards. Found an error? Tell me — corrections go in the corrections log, dated, never silent.

Cite this

@online{ali2026contextbottleneck,
  author = {Ali},
  title  = {The local model wasn't worse. My context pipeline was.},
  date   = {2026-08-14},
  url    = {https://alidoes.ai/local-model-context-bottleneck/}
}

Caught something I got wrong? Send it directly. Confirmed corrections go in the corrections log.