The design was already written. The read stopped one line short of it.
A 'missing' agent design for the Scout — cursor, scratchpad, arc-finder scoping — had been sitting in NEWSROOM.md lines 72–238 for two days; the read sampled the bookends and rebuilt it from scratch in conversation instead.
- NEWSROOM.md, the 509-line living design doc for the Scout/Writer/Editor crew, already specified the Scout's cursor, scratchpad, and source scoping in a contiguous block — lines 72-238, committed 2026-07-10
- Mid-conversation, the model re-asked a question already settled two days earlier by commits d2f3c90, a7cb75f, and e35b51e to that same file
- First read sampled lines 1-60 and 380-509 and skipped the 320 lines between wholesale — the span where the answer lived
- A second, closer read stopped mid-sentence at line 189 and concluded there was nothing left — the resolving text started at line 190
- Fix shipped as a doc-header contract — read: full vs read: reference — plus a standing rule to read design docs whole on bootstrap-style requests
What happened
Asked to specify the Scout — an agent that walks session logs for story leads — the model produced a design for it live in conversation: a forward cursor over logs, a free-text scratchpad, a separate batch arc-finder held in reserve. It read like discovery. It wasn't. NEWSROOM.md, the project's living design doc for the whole content crew, already carried all of it, in one contiguous block running lines 72 to 238.
The tell arrived when the model asked, mid-session, whether the Scout's memory was its own scratchpad or the same store as a different component's ledger — and got told plainly that the question exposed a gap, because it had already been settled. It had: recovering the file's own history turned up three commits from 2026-07-10 whose subject lines alone answered the question — d2f3c90 ('simplify — Scout's own forward-walk + a free-text scratchpad, no schema'), a7cb75f ('the scratchpad is opaque — the Scout's own format, nothing parses it'), and e35b51e ('scope the cursor to logs only; park a separate batch arc-finder'). The doc body carried the same answer, verbatim, starting at line 190 — one line past where the model's prior read had stopped.
Retrieval, not discovery
The first read of NEWSROOM covered lines 1-60 (the org chart) and 380-509 (content types, open choices), and skipped the 320 lines between wholesale — precisely the block holding the cursor, the scratchpad, and the source rules. An org-chart heading near the top looked like the whole Scout entry; the model trusted the heading as a map and moved on without checking whether more followed.
A second pass went back into that middle span — and still stopped at line 189, mid-sentence ('…a watermark is stable where an'), then concluded there was nothing left to find. The resolving text started on the very next line. Nothing here was a length problem: at 509 lines the doc isn't even among the 35 largest authored docs in the repo, and no read limit had truncated anything. It was read like a lookup — sampled for an answer — when the job was comprehension: hold the whole thing, then conclude.
The fix, and what it taught
The shipped fix isn't a size cap; a cap wouldn't have caught this doc at all, and it never would have stopped the bookend sampling that did the damage. Instead: a one-line contract now opens the file, `read: full` for a comprehension doc versus `read: reference` for a lookup doc like a glossary, extending the status header the doc already carried. A standing instruction rides alongside it — read design docs whole on bootstrap-style requests, never conclude from a partial read.
The doc had said everything already; the same content had to be re-explained in the same conversation because it was sampled instead of read. Length wasn't the defect — treating a comprehension task like a retrieval task was. A doc that already has the answer is only as good as the read that reaches the line it's written on.
Want this kind of engineering on your systems?
Get in touch