Summary
When codegraph_explore renders a file but trims part of it, the trimmed symbols are named nowhere in the payload. The elisions print as bare ... (gap) ... markers, the file header names a handful of symbols and then says +32 more, and the footer advises:
For a specific symbol you still need, run another codegraph_explore (or codegraph_node) with its exact name
That advice is circular whenever the missing names are the question. The model is given a file it can see is incomplete, no list of what was dropped, and an instruction that requires already knowing the answer.
Ask: when a rendered file is trimmed, name the trimmed symbols — name (file:line), the way the "Not shown above" section already does for whole files — or bias the header's +N more toward symbols whose source was elided rather than ones already shown.
Repro (clean origin/main @ b9ca4b7, unmodified, wasm path, Windows, ~590-file TypeScript/Vue repo)
Query, verbatim:
In this repo's ESPN draft observer (content/espn-draft-observer.ts), name in order the chain of methods from scrapeFullDraftState to the method that calls storage.saveDraftState. One line.
The answer chain in that 2,050-line file is scrapeFullDraftState (847) → _syncStateNow (1913) → _performHeavyDraftSync (1867) → _persistDraftState (1832) → saveDraftState.
The 17.5k payload:
- renders the right file —
content/espn-draft-observer.ts is the first and largest source block;
- names the entry point in the blast radius —
scrapeFullDraftState (content/espn-draft-observer.ts:847), plus _writeDraftStorage (…:1481);
- contains 7 unnamed
... (gap) ... elisions;
- mentions
_syncStateNow, _performHeavyDraftSync and _persistDraftState exactly zero times — not as source, not in the header's symbol list, not as a pointer.
So every one of the three methods the query asks for was elided silently, from a file the ranker chose correctly, with the starting symbol of the requested chain named two sections above.
The file header reads:
**`content/espn-draft-observer.ts`** — imports(imports), calls(calls), now(calls), onUpdateCallback(calls), EspnLiveSources(imports), EspnHoverBridge(imports), +32 more
Four of the six names it spends are imports/calls pseudo-symbols; the three answering methods are inside the anonymous +32 more.
Scale
Same build, same repo, a 18-task bank of code questions with regex "must appear in the payload" needles for the answers (31 tasks total, the 18 code-answering ones used here):
| build |
needles found |
clean origin/main @ b9ca4b7 |
32 / 52 |
Of the 20 misses, 12 are this shape — the needle's owning file was rendered, and the needle-bearing symbol was elided without being named. (The other 8 are ordinary ranking misses: the owning file was not selected at all.) Every needle was verified to exist in tracked source first, so none of these is a stale pattern.
Two tasks score 0 needles on this build; br-persist-path above is one.
Why this is not #1701
#1701 asks for control over the size of the budget (maxChars, symbols-only), and its own measurements concluded the tier defaults are fine. This is orthogonal and cheaper: whatever the budget is, spending it should not lose the answer silently. A trimmed file that lists what it trimmed lets the model make exactly one targeted follow-up call — which is the behaviour the footer already tries to prompt, but cannot, because it withholds the names.
I'd guess the fix is small (the elision sites already know which symbols they skipped). Happy to send a PR if that shape sounds right.
Summary
When
codegraph_explorerenders a file but trims part of it, the trimmed symbols are named nowhere in the payload. The elisions print as bare... (gap) ...markers, the file header names a handful of symbols and then says+32 more, and the footer advises:That advice is circular whenever the missing names are the question. The model is given a file it can see is incomplete, no list of what was dropped, and an instruction that requires already knowing the answer.
Ask: when a rendered file is trimmed, name the trimmed symbols —
name (file:line), the way the "Not shown above" section already does for whole files — or bias the header's+N moretoward symbols whose source was elided rather than ones already shown.Repro (clean
origin/main@b9ca4b7, unmodified, wasm path, Windows, ~590-file TypeScript/Vue repo)Query, verbatim:
The answer chain in that 2,050-line file is
scrapeFullDraftState(847) →_syncStateNow(1913) →_performHeavyDraftSync(1867) →_persistDraftState(1832) →saveDraftState.The 17.5k payload:
content/espn-draft-observer.tsis the first and largest source block;scrapeFullDraftState (content/espn-draft-observer.ts:847), plus_writeDraftStorage (…:1481);... (gap) ...elisions;_syncStateNow,_performHeavyDraftSyncand_persistDraftStateexactly zero times — not as source, not in the header's symbol list, not as a pointer.So every one of the three methods the query asks for was elided silently, from a file the ranker chose correctly, with the starting symbol of the requested chain named two sections above.
The file header reads:
Four of the six names it spends are
imports/callspseudo-symbols; the three answering methods are inside the anonymous+32 more.Scale
Same build, same repo, a 18-task bank of code questions with regex "must appear in the payload" needles for the answers (31 tasks total, the 18 code-answering ones used here):
origin/main@b9ca4b7Of the 20 misses, 12 are this shape — the needle's owning file was rendered, and the needle-bearing symbol was elided without being named. (The other 8 are ordinary ranking misses: the owning file was not selected at all.) Every needle was verified to exist in tracked source first, so none of these is a stale pattern.
Two tasks score 0 needles on this build;
br-persist-pathabove is one.Why this is not #1701
#1701 asks for control over the size of the budget (
maxChars, symbols-only), and its own measurements concluded the tier defaults are fine. This is orthogonal and cheaper: whatever the budget is, spending it should not lose the answer silently. A trimmed file that lists what it trimmed lets the model make exactly one targeted follow-up call — which is the behaviour the footer already tries to prompt, but cannot, because it withholds the names.I'd guess the fix is small (the elision sites already know which symbols they skipped). Happy to send a PR if that shape sounds right.