What makes it special
Four things the graph does, each with the place in its source that does it, set in the margin.
Plans before it reads
Before any research starts, the planner splits the brief into six sections whose scopes do not overlap, and each worker is handed only its own. That boundary is enforced on retrieval, not just requested: a worker’s pool of passages is filtered to its own scope before anything is ranked.1
1agents/scribe-research/src/tools.ts - planOutline · researchSection“a tag is claimed by at most one section, two workers cannot retrieve the same passage”
Six readers at once, one honest barrier
All six section workers are dispatched together and report back in whatever order they finish, not in outline order. The join waits for the slowest: fan-out buys throughput, not latency. Inside, each lane is marked with its time and its place in the arrival order, so the section that held the press is the last one back.2
2agents/scribe-research/src/graph.ts - the research_fan_out node“Results then land in completion order, which is not outline order.”
Every claim keeps its source
One reducer turns the six findings into a single report and carries each citation key through verbatim, attached to the claim it supports; it is told to invent none. Inside, every sourced sentence carries a numbered marker and its sources are set as marginalia with the section that cites them, so a sentence with no marker plainly has nothing behind it.3
3agents/scribe-research/src/tools.ts - draftReport“Carry every bracketed citation key through verbatim … Invent no new keys.”
A failed worker ships as a named gap
If a section’s source is unreachable, or nothing in scope clears the relevance floor, the worker fails rather than writing from memory. The graph still joins, and the report carries that section marked not researched, naming what is missing.4
4agents/scribe-research/src/tools.ts - researchSection · SourceUnreachable“This section is empty and it is not being filled from memory.”