mcp-data-platform exposes knowledge as wiki-style pages. An agent talking to it over MCP can search them and fetch them, and the pages can point at each other the way an internal wiki does. The server is txn2/mcp-data-platform, also hosted as Plexara. The previous note measured knowledge pollution after a curation gate. This one is about cross-references. The agent is writing a change plan, or an incident document, and the facts it needs live across a wiki-style corpus. Do the links change what it can complete?
They do not, not at these scales, not for this agent. Six pages I had certified unreachable, twice, before any episode ran, were found anyway: all 15 episodes at 500 pages, 13 of 14 surviving episodes at 5000 pages. What the links change is how many searches it burns getting there, and whether it can still walk the pages when search is off.
This is the fifth post in MCP Studies. The previous post measured knowledge pollution. This one asks whether cross-references help agents complete documents. It is grounded in the open-source
txn2/mcp-data-platform, also available hosted as Plexara.
I planted the same wiki twice, under one agent configuration. In the graph arm the cross-references are real, followable links. In the stripped arm every link is rewritten as a sentence that keeps the meaning, and the reference table is empty. The arms differ only in whether the connection is an edge or a sentence. What moves is corpus size: 50, 500, and 5000 pages. A benchmark that can only agree with its author is marketing. I pre-registered a kill for any stripped-arm recovery of a certified-unreachable page. That kill fired first. It is the published headline.
§I Tried to Make Some Pages Unfindable
Each task hands the agent an entry page and grades it against a nine-page closure, the pages reachable from the entry by following authored links. Inside that closure sit the facts the finished document must state, each sourced to one specific page. Two of those facts per task live on pages written in another department’s register. A finance close calendar. A records schedule. An attendance ledger. The connection to the task is institutional, not topical. That is the thing a hyperlink might provide that search cannot: a route to a fact search cannot rank.
Before any episode ran, each scale was certified two ways. Offline, every one of those pages had to rank outside the exclusion horizon by embedding similarity for every task phrasing: top-25 at 500 pages, top-100 at 5000, using nomic-embed-text the same way the vector-search notes describe. Live, the platform’s own search was swept at three phrasings and limits 5, 25, and 100 per cell, and had to return zero hits on those pages and zero signature leaks. Both instruments passed at 500 and 5000. Scale 50 cannot satisfy the certification and sits in the matrix as the within-ceiling control. Certification consumed one authored candidate before any episode, a duty rota that no rewrite could separate from the incident task. Proving it twice, before spending an episode, was supposed to make “unreachable by search” a property of the corpus rather than a hope about the agent.
§The Agent Found Them Anyway
The stripped arm recovered those pages at both certified scales. At 500 pages: 1.00, all 15 episodes, all six constraints. At 5000 pages: 0.93, 13 of the 14 surviving episodes.
This is not a harness leak. Both certifications passed before any episode. The sweep gates recorded zero hits and zero signature leaks. No signature appears anywhere without its source page having been fetched. Confabulation is zero in all 98 graded episodes; the pilot had measured 19 percent in its unreachable slots, which is why a signature only counts when the page was actually read. The scale-50 control behaved as predicted, both arms 1.00, delta 0.00. The instrument was clean. The construct was defeatable.
What the certifications proved is unreachability for task-derived queries: the cell prompt and its authored phrasings, which is what both instruments sample. The defeating queries are read-derived.
The stripped arm renders each authored edge as a sentence that keeps the meaning. One of those sentences, on an ordinary closure page, reads “work on systems that feed the statutory accounts also observes the company close calendar.” The agent finds that page through task-derived search, reads the sentence, and then queries the institution in the institution’s own vocabulary. In gs-change-plan replicate 1 at scale 500, the episode’s third search is company close calendar finance change freeze windows, which ranks the certified-unreachable page instantly.
In grep terms: the study certified that grep <task words> never hits the finance calendar page, and that is true. The agent grepped the task words, read a hit that said “see the company close calendar,” and ran grep "company close calendar". Two greps beat one link.
That loop has a classical name, pseudo-relevance feedback. A reading agent does it without being asked. It was strong enough here to defeat a twice-certified unreachability construct at both certified scales. The consequence for the next study: “unreachable by search” has to hold against an agent that has already read the mention. Prose that preserves meaning names what it points at, so it cannot provide that.
§How the Wiki Was Built
The surface is the knowledge-page graph the platform already exposes: pages, chunk-embedded, reachable through search (lexical plus vector) and read with fetch. No warehouse or catalog is in the fixture. One agent configuration throughout: Claude opus via claude-cli 2.1.226, one fresh platform identity and session per episode, the same harness as the rest of the series. Every prompt carries a frozen “Open items” suffix.
The corpus is a generated wiki. A 27-page hand-authored core is byte-identical at every scale, sitting inside generated operations-wiki filler at 50, 500, and 5000 pages. Generator Seed 1250, EdgeDensity 3, frozen. graphstudy regenerates the corpus from that spec, and -mode reread refuses on fingerprint mismatch. Three tasks: a change plan (gs-change-plan), an incident document (gs-incident), a feed-onboarding document (gs-feed-onboarding). Each constraint is graded by its signature, a minted literal (a class code like RB-7, a unique digit run, a reserved word such as “garnet”) that cannot occur off its source page. All other prose is digit-free.
A constraint counts only when its signature is in the final document and a source page was actually fetched. Coverage without a read is confabulation, reported separately, zero here. Off-entry coverage drops the constraints whose source is the handed entry page, so discovery is actually required. Provenance records, for every fetch, whether its reference was first seen in a search result, on a fetched page, or nowhere.
The matrix: 2 arms × 3 scales × 3 cells × k=5 = 90, plus graph/no-search at 5000, 3 × k=3 = 9. Ninety-nine run, 98 graded, one client-side failure archived and excluded. The first certified scale’s coverage SD read 0.0000 against the 0.30 threshold, so k stayed at 5.
§Eleven Fetches, Five Thousand Pages
Off-entry grounded coverage sat at ceiling in every cell: 1.00 everywhere except stripped/5000 at 0.95, whose deficit is one episode (gs-incident replicate 5: 3 of 10 grounded constraints; every other surviving episode in the cell is at 1.00).
| Scale | Arm | Search | n | fail | grounded | disc. grounded | searches / grounded |
|---|---|---|---|---|---|---|---|
| 50 | graph | on | 15 | 0 | 1.00 | 1.00 | 0.59 |
| 50 | stripped | on | 15 | 0 | 1.00 | 1.00 | 0.73 |
| 500 | graph | on | 15 | 0 | 1.00 | 1.00 | 0.67 |
| 500 | stripped | on | 15 | 0 | 1.00 | 1.00 | 1.02 |
| 5000 | graph | off | 9 | 0 | 1.00 | 1.00 | 0.00 |
| 5000 | graph | on | 15 | 0 | 1.00 | 1.00 | 0.63 |
| 5000 | stripped | on | 14 | 1 | 0.95 | 0.93 | 1.44 |
At 5000 pages an episode makes roughly eleven fetches (10.7 graph, 11.2 stripped), 0.2 percent of the corpus, and grounds the closure except for that one stripped episode. The 42-page pilot left open the expectation that scale would eventually starve coverage. It did not. Scale moved the cost, not the coverage. Every coverage delta in that table is a ceiling reading. The only separation the study delivers is cost.
§What the Links Change
Searches per grounded constraint, graph versus stripped: 0.59 vs 0.73 at 50 pages, 0.67 vs 1.02 at 500, 0.63 vs 1.44 at 5000. The graph arm is flat across two orders of magnitude of corpus. The stripped arm roughly doubles. The matrix’s only failed episode and its only sub-ceiling coverage cell also sit in stripped/5000. At the largest scale the queries-instead-of-edges strategy is costlier, and that is where the lone coverage wobble lives.

The share of graph-arm fetches whose reference was first seen on a fetched page, an edge actually used, rises with scale: 0.09 at 50 pages, 0.28 at 500, 0.34 at 5000. The stripped arm is 1.00 search-provenance at every scale, because it has no edges to use. Agents use the edges when they exist, and more as the haystack grows. The edges just were not the only route to the content.

The other half is what happens when search is gone. The auxiliary check removed the search tool entirely: graph arm, 5000 pages, k=3 per cell. All nine episodes walked their closure by following edges at full depth. Grounded coverage 1.00, 9.0 fetches per episode (the closure size), zero searches. The pilot’s no-search floors, at 42 pages, were 0.96 (opus) and 0.42 (haiku) on the graph arm, and 0.00 on the stripped arm at both reading budgets. With no edges and no search there is no route at all, and the document simply lacks the content.

At these scales, for this configuration, authored edges do not change what a completion document contains. They change what producing it costs, and whether it can be produced at all when search is down.
§Completeness Was Unmeasured
Every prompt ended with the same frozen elicitation: list open items, or write “None” if nothing is outstanding. Of 98 surviving episodes, 0 claimed completeness, 91 declared open items, and 7 omitted the section. That is at measured 1.00 grounded coverage, in both arms, at every scale. The overclaim rate is therefore 0.00 everywhere.
It would be wrong to read that as “edges do not change closure awareness.” A channel in which no episode ever claims completeness cannot separate anything. Whether a walkable closure changes what an agent believes about its own done-ness is unmeasured here, not null. A graph closure terminates and a ranked list never certifies coverage. That mechanism is still plausible. Testing it needs an instrument that does not route through a self-report this configuration never makes.
§The Kill Table
The protocol listed kill conditions, and the order they would be checked, before any episode.
| Kill condition | Reading |
|---|---|
| Instrument kills | Fired. Stripped-arm recovery at both certified scales (1.00 at 500, 0.93 at 5000). Certified-scale run pairs are invalid for the unreachability reading. No kill condition is then read as a confirmatory finding. |
| Kill 1, discontinuity mechanism | Read informationally: would not have fired. Graph-arm coverage of those pages is 1.00 at every scale. |
| Kill 2, closure mechanism | Read informationally: numerically present (off-entry deltas +0.00 and +0.05, overclaim 0.00) but a ceiling reading, not a mechanism null. The overclaim half is inert. |
| Condition 3, proceed on a coverage or overclaim advantage | Read informationally: not met. The largest advantage anywhere is +0.07. |
| Condition 4, anything else | The recorded outcome. A boundary condition. Numbers to the register. Claims argued from them. |
The idea that edges deliver coverage is retired with the unreachability construct. The arms did not differ in what documents contained at any scale. What survives is cost and no-search robustness. I published the kill as the headline, rather than sliding it under the cost result, because that is the rule the rest of this series already runs on.
§What This Does Not Say
No coverage-delivery claim for edges survives the kill. The study does not show that unlinked content is unreachable; it measured the opposite, twice, on its strongest attempt at unreachable content. No closure-awareness claim: the elicitation channel was inert, and overclaim 0.00 bounds nothing. No model-tier claim, anywhere. One agent configuration throughout. The design moves the reading-budget-to-corpus ratio through the corpus axis; the pilot’s second configuration is cited only as a floor on the no-search arm. Only these scales and this corpus construction: 50, 500, 5000 pages, a 27-page hand-authored core inside generated filler, Seed 1250, EdgeDensity 3. Kill conditions read informationally are not findings. The protocol says so: once the instrument kill has fired, no kill condition is read as confirmatory.
§Threats to Validity
The report carries its own limits, and they are worth restating rather than burying. One agent configuration: one model alias (opus), one client (claude-cli 2.1.226), one scaffold, and nothing at the study scales measures a tighter reading budget. The unreachability reading is invalid by the study’s own kill; both certification instruments sample task-derived phrasings, the defeating queries are read-derived, and the construct failed rather than the harness (the gates passed, the plants verified, the control replicated). Coverage contrasts have no headroom: with every cell at or near 1.00, the off-entry deltas are ceiling readings, which is why this post claims cost separation, not coverage separation. The cost reading is configuration-bound; searches per grounded constraint is a behavioral quantity of one client and one model, and the flat-versus-doubling shape is the claim, not the absolute values. Generated filler clusters share template families, so an embedding model could rank them degenerately and make the haystack easier or harder than a real wiki. Digit-free filler and memorable class codes are a mild register shift identical across arms; contrasts are unbiased. The elicited claim channel biases against overclaim, declaring a gap costs one line, and in the event it was fully inert. Every manifest records commit 7e441e30 with a -dirty suffix: the platform code is the study-design merge, the dirty suffix is the run branch’s own harness instruments, committed immediately after the runs, and no episode ran on a tagged release. Corpora are spec-generated and fingerprint-verified, so the fixture is exactly reproducible regardless. One client-side failure in stripped/5000 (the result event carried its error flag with subtype “success”; the transcript ends in a mid-response server error) is archived, counted as a failure, and excluded from grading. Signature grading is a lower bound on coverage, identical in both arms.
§What the Platform Does About It
Write cross-references for economy and resilience, not reach. An authored edge saves a re-derivation through query space that grows with corpus size, and it is the only route that still works when search is gone. The graph view and reference scanning earn their keep on those grounds. They do not make un-linked content unreachable. This study measured the opposite.
The next unreachability instrument has to hold against read-derived queries, or vary what documents say across arms and accept grading two different corpora, the confound this design refused. Prose that preserves meaning preserves the vocabulary trail.
That is narrower than the completeness story I went in with. For this agent, authored edges are an efficiency and resilience feature, not a reach feature.
§Reproduce It, Cite It
Every table regenerates offline from raw run data committed under bench/results/graph-completion-confirmatory/ and bench/results/graph-completion-probe/:
git clone https://github.com/txn2/mcp-data-platform && cd mcp-data-platform
python3 bench/reports/graph-completion/graph_tables.py
The figures regenerate from figures.py beside it, and both also run from the notebook at bench/reports/graph-completion/report.ipynb. make bench-report-graph-completion-pdf typesets the report. graphstudy regenerates the corpus from Spec, and -mode reread refuses on fingerprint mismatch. The full report is published in the project docs and archived on Zenodo under DOI 10.5281/zenodo.21881798:
Johnston, C. (2026). Do cross-references help LLM agents complete documents? Search cost, robustness, and unreachable content on a wiki-style corpus (version 1.0). mcp-data-platform benchmark report series. DOI 10.5281/zenodo.21881798.
I set out to prove some pages unfindable. The agent found them by reading a sentence and searching again. The kill is the result. The cost curve is what remains.
The production data platform behind this series is txn2/mcp-data-platform, available hosted as Plexara.