Tool discovery and replies cost extra calls, while review and navigation still have gaps #521
Labels
No labels
code-review
correctness
dos
performance
security
severity/high
severity/low
severity/medium
tech-debt
Kind/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Blocks
Reference
h-dv/code-index#521
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Scope (consolidated 2026-11-12)
Agents pay for a large tool list before making a lookup and cannot readily discover the controls that reduce reply cost. Navigation and review often need retries because a batch fails as a whole, an identifier expires or a useful output shape is missing. Source search should provide usable match evidence in one call. This ticket owns the tool surface and friction acceptance, including historical reads and reply diet.
Priority: High · Risk: cost · Size: L
Merged into this ticket: #557 (Reply diet and matched text), #558 (Historical source and change hunks)
Done
4fd63f0c; session prose and provenance dedup shipped in v0.41.48 and are tested bythe_default_envelope_is_unchanged_and_a_bad_mode_is_refusedand session cases incrates/mcp-server/tests/tool_ux_e3_e2e.rs.review_bytes_hunks_are_clipped_and_defaults_stay_unchanged,review_bytes_read_code_revision_and_refusals,revision_read_survives_removed_parent,review_bytes_large_diff_hunk_budgetand ownership cases incrates/mcp-server/tests/mcp_smoke.rs.crates/mcp-server/src/arguments.rsanddocs/mcp-arguments.md.review_summary_counts_the_filtered_populationincrates/mcp-server/tests/diff_paging_e2e.rsgrades the fix.Remaining
Discovery and tool surface
Worktree and path routing
Search evidence and filters
Batch results, seeds and handles
Reference navigation
Review classification and hunks
Reply budgets and disclosures
Index state and coverage guidance
Acceptance
Suggested order
Original report
Summary
Agents pay a large, mostly avoidable token cost on every session and every call, and the switches that would reduce it cannot be discovered. All numbers below were measured on 2026-11-09 against this repository through the stdio server (
tools/list,resources/list) and the per-tool replies, as character count ÷ 4.tools/list, 23 toolssearch_symbols2,522,find_references2,273,changed_symbols2,235)warming_up,reconciling,degraded) and the only mention ofenvelope="minimal"never reach the agentenvelopeparameter{"type":"string"}with no description; AGENTS.md mentions it 0 timesfind_callerswithresponse_format: conciseevidence_gaps,answer_provenance,index_snapshot,confidence); 86% overhead for 3 rowsenvelope: minimalanswer_provenanceproject="primary"Most of each description re-explains the zero/denominator contract (
name_fallback_count, "ABSENT means …"). The payload fields andcode-index://docs/*already carry that, and meanwhile the one sentence that says when to use this tool instead of the shell gets buried.Proposal
code-index://docs/<topic>for the contract. Enforce the limit with a registry test (the tree already has a tool-description registry style).envelopein the shared schema, and makeconciseimplyminimal.find_callersisfind_references(kinds=[call]);changed_symbolsis a subset ofreview_diff, which is a subset ofcontext_pack(diff_base);resolve_handleduplicates handle acceptance that every tool already has;get_symboloverlaps exact-namesearch_symbols. Fewer tools cost fewer tokens and leave less to choose between. (The I067 measurement found the adoption lever is fewer calls. This change cuts description cost without adding calls.)Note that I067 refuted "shrink the envelope" as an adoption lever. This issue is about the fixed context cost and discoverability, not adoption, and both are measured above.
Acceptance
tools/listis at most 6k tokens.Related: #70, #34. Raw captures:
scratchpad/dog/mcp.outfrom the review session (available on request).Filed from a five-agent review of master @
e3ec6ead(bloat, robustness, agent usefulness, docs, architecture). Every finding was spot-checked in the main session before filing.Agent context cost: tools/list is ~15k tokens, server instructions are truncated by the client, and envelope/concise are undiscoverableto Agent context cost and tool surface: ~15k-token tools/list, truncated instructions, overview/search payloads, tool overlap and frictionAdded two checklist items to the consolidated scope (worktree lanes, gaps 1 and 2) from the first implementation lane, 2026-11-09. Making development across parallel branches easy is a core goal: today a lane agent cannot reach master or other lanes through code-index without an env var that only a gitignored file sets, and the refusal it gets does not say so.
Dogfood triage 2026-11-09: worker sessions (Codex + Claude) in agent worktrees
Five implementation sessions ran in git worktrees today and logged every code-index friction. Each item was reproduced by the lead. They are recorded here because they belong to this issue's agent-friction and worktree scope.
Root cause of the worktree field case above: it was NOT the missing
COSI_WORKTREES_DIR.detect_rootlet the main checkout's untracked.code-index.tomlcapture every nested worktree, now filed as #553. Gaps 1–2 stay valid on their own.answer_provenance.indexed_trees.primarycarrieshead,uncommitted_changesandsibling_worktreesbut no root path. Worktrees share HEAD, so three sessions independently could not prove they were on the wrong tree (lane A;codex-t1D1;codex-512"Routing mismatch"). Add the absolute root, and flag when the server's cwd lies in a different git work tree than its root.path_not_indexed(hidden.claudedir) instead of naming the worktree that owns it, or routing there when it is linked (codex-512,codex-546, lane A).read_codedocuments "an absolute path auto-routes to the owning project", and the refusal should at least say which project that would be.project_not_foundhint is wrong for worktrees.changed_symbols(project="codex-512")→did_you_mean: ["primary"], hint: "Check [[links]] in .code-index.toml.". That hint sent lane A toward editing the main checkout's config, the wrong fix (see gap 1).search_textboolean queries lose the line census.(a OR b)and multi-term AND queries return hits withmatches_in_file_unmeasured: "no_literal_spelling"and noline_text, so every term had to be searched again on its own (lead:("BEGIN IMMEDIATE" OR "BEGIN");codex-512:"execute_batch" "COMMIT"). Each arm of an OR is a literal, so measure the census per arm and union the lines, tagging each line with its arm.find_callersis silent about value uses.crate::frozen::dirpassed as a function value (install(..., crate::frozen::dir)) is a resolved reference infind_referencesbut absent fromfind_callers.symbol_shape_excluded_refsstays 0, so nothing points the agent to it. A worker fell back to text search.find_callersshould disclose "N resolved non-call references → find_references". The kind label is tracked in #549.Not filed (by design):
search_symbols("discover_root")does not finddetect_root. Name search is not concept search.Dogfood triage round 2 (worker sessions, reproduced or explained by the lead)
read_codeon a non-existent Rust module file (crates/indexer/src/index/resolved_by.rs; the module is inline inindex.rs) →file_not_readableplus a worktree-routing hint, although routing was correct. Suggest the inlinemoddeclaration when indexed, and omit worktree advice when the root is known correct.path_globcannot express two directories. Braces are refused explicitly (unsupported_glob_syntax, which is good), socrates/guest/{javascript,typescript}/*needs two calls. Accept a LIST of globs.file_outlinehas no name filter:file_outline(path, query="Store")→unknown_argument. A 300-row outline was the alternative. Add an optional name-prefix filter.evidence_gaps.partial_sources_in_index: 16beside an emptypartial_sourcesas "the reply cannot name which files are partial". The semantics string says an empty list is a measurement, but the field pair still misleads. Consider omittingpartial_sources_in_indexwhen this reply names none, or renaming itpartial_sources_elsewhere.review_diff/changed_symbolswithbase=master(untracked files reviewed, freshness disclosed); batchedread_code; explicit refusals for unsupported glob syntax.Dogfood (lead session 2026-11-09): two reasons an experienced user still reached for the shell
The lead required code-index from every worker, but reviewed their diffs with
git showand read corpus source withsed. The operator asked why. The honest answers are product gaps:review_diff/changed_symbolssay WHICH symbols changed (risk, test reach, freshness), but a reviewer needs WHAT changed.read_codeserves only the working-tree side, so every review neededgit showanyway. Proposal:changed_symbols/review_difftakeinclude_hunks(the diff hunk clipped to each changed symbol's span, base side and head side, under the token budget), and/orread_codetakesrev(any commit-ish) to serve the base-side bytes of a path or symbol. Then a whole review stays in code-index: findings → hunk → callers.~/.cache/cosi-corpus/cs-dapper, a bind-diff staging dir) meantcode-index query --root <dir>in the shell: cold index 5–60 s, JSON on stdout, no session reuse. Sosed -n 225,235pwon. Proposal:project="<absolute dir>"attaches an ad-hoc read-only project for the session (indexed once, daemon reused, never fanned out, disclosed asrelationship: ad_hoc), or an explicitattach_project(path)tool. This is also what lets agents dogfood code-index on foreign code inside one session.Friction batch from the worker dogfood logs (codex-512 task 2, reproduced by the lead). These are input for the next pass on this issue.
change_impactrefuses the whole batch for one bad seed. One stale seed, or a seed that sits on a nearby blank line, makes the whole multi-seed call refuse. Seen twice. Expected: answer the valid seeds and name the refused one with its reason, the wayread_codebatches already do.stable_handleis the durable id, and the worker confirmed that handles survive body edits. But nothing in the reply points there. Expected: when an id is refused as stale, the refusal (or the reply that issued it) points tostable_handlefor edit loops.safe_deleteon a common word adds prose noise. The text-mention section fills with comment and doc hits for an ordinary English word, which hides the code evidence. Expected: rank or cap prose mentions separately from code mentions.search_textcalls.Not a defect:
review_diffcalls mutation-tested runtime paths "untested". That is a static proxy and is disclosed inuntested_change_semantics.Second friction batch from the worker dogfood logs of 2026-11-09 (codex-531, codex-546r, codex-562, codex-base, codex-d12, agy-557). Each entry was reproduced or seen several times.
change_impactbatch. Now 6 sightings (decide, struct/impl same name, …); first reported in c12880. Expected: answer every unambiguous seed and return each ambiguous one as its own per-seed refusal with its candidates.change_impactcannot be seeded with a non-symbol line (an import line, for example), and answerssymbol_not_found. Expected: the line seeds the symbols of the file that contains it, and the reply discloses that it is file-level.review_diffcaps a single large file before all changed symbols are listed, and there is no continuation for the omitted ones (2 sightings). Expected: anext_cursoror per-file paging for omitted symbols.coverage.classification_degraded: truecomes without a reason. The lead sees it on everyreview_diff. Expected: name the reason, e.g.classification_degraded_reason.path_globwith a trailing/**is refused (the hint is good:*already crosses/). Expected: normalize an unambiguous trailing/**to/*and say so, instead of a round trip.project_overviewwithenvelope:"minimal"is still the largest reply. Expected: a smaller default shape, orsections=to select parts.tests/packages/**.digestand fixture.expectedfiles are not indexed (ineligible_extension). A committed.code-index.tomlwith[index] extra_text_extensions = ["digest", "expected"]would cover them.Dogfood batch 3 from the 2026-11-09 full-run fix workers (codex-f1..f5, codex-dj). The instrument was the installed build
2dcfc615, which predates this train's #521/#558/#562 merges. So the reports of a missing provenance root, of source refused during reconcile, and of historical hunks are re-checked after the next install, not re-filed.Already filed here — new evidence, 5 workers this round:
change_impactrefuses the whole batch for one bad seed (item 1 above). Hit by codex-f1 D5, codex-f2 D5, codex-f3 D11 and D17 (a.toml/.mdseed discards the valid code seeds), and codex-f5 D6 (an ambiguous name). Every one of them cost a retry. It is now the most frequent single friction.classification_degradedcomes without a reason: codex-f1 D8 and codex-f3 D14.New items:
review_diffstill repeats fullstable_handles on every structural member (codex-f2 D7, codex-f3 D26). Withbase: masteron a 120-file train diff, the first page held 15 files and 97 symbols, with handles duplicated from the finding into each member, and 105 files remained. Concise should drop member handles that equal the finding's handle (or every member handle) and offer a findings-only summary.search_text(path=…)andreview_diff(paths=[…])should bepath_glob, andchange_impact(target=…)should besymbol_ids.line_text: "alias"is refused asinvalid_argument_type. The refusals do name the right key, and each one costs a call. Acceptpath/pathsas aliases ofpath_glob, andtarget(a string or a list) onchange_impact, the wayread_codetakes it.did_you_meanrepeats the project root (codex-f3 D12, D13).index_coverage("crates/indexer/src/resolver/member_lookup.rs")does not suggestcrates/indexer/src/index/member_lookup.rs(same basename).read_code("…/index/mod.rs")does not suggest the siblingindex.rs(the Rust module layout). Suggest same-basename paths and themod.rs⇄<dir>.rspair.search_textadvises dropping filters while the file is merely pending (codex-f2 D2). A query overpath_glob=crates/daemon/src/local_index.rsreturnedtotal: 0,basis: filtered, "drop path_glob", whileindex_statesaid reconciling and that file had no row yet. Name the pending paths inside the filter before recommending a different filter.review_diffduringresolution_pendingreportsuntested_changeas if measured (codex-f2 D6). Withminimum_batch_resolution_rate_pctat 0.07,total_affectedwas 0 and there were notest_role_files. Put the unmeasured resolution state next to eachuntested_change, or downgrade it, instead of implying that no tests exist.symbol_not_foundafter the reconcile re-minted it. The hint says ids are project-local; the reply should say the id is stale (a known generation) rather than unknown, and point to thestable_handle.Positive reports (keep): batched
read_coderanges with per-entry refusals (codex-f1 D6, codex-f2 D3, codex-f3 D4);index_coveragenaming the rule.Enum variants without symbols (codex-f3 D16) are already #540's Rust row.
Dogfood triage, batch 4 (worker codex-g1, installed 0.41.47; reproductions by a triage subagent, not re-run by the lead):
review_diffwith apath_globstill reports the unfilteredsummary.changed_files(147) next to a filteredcoverage.filter(1 matched, 146 excluded). Totals and filtered counts should be labelled. Same shape as the earlier codex-f4 entry D8.masteron an integration train,review_diffis capped (diff_truncated) andclassification_degradedis true. A merge-base or worker-base scope would keep a lane review readable. Related to #558.read_codeon a cargo registry path returnspath_outside_known_roots. Dependency source under~/.cargo/registryis a second concrete driver for #559.read_codereturnedpath_not_indexedinstead of waiting, andanswer_provenance.indexed_treesis keyed by name with no root path (see #557).changed_symbolsclassification whose hint does not say whether the census RPC or the base extraction failed. Needs a repro from an uncommitted state.change_impactwith its resolution-rate disclosure was useful.Dogfood batch 5: post-release re-check on the installed v0.41.48 (
81ff0158), via the CLI. A subagent ran it; I read the raw replies but did not re-run them.Confirmed fixed:
"root":"/home/master/…"for the primary checkout,"root":".claude/worktrees/integration"when run from the worktree.read_codewithrev: "v0.41.47"returns the historical bytes withresolved_commit.changed_symbolswithinclude_hunksreturns hunks on changed rows andhunk_in_children: trueon containers.Friction:
base: v0.41.47,path_glob: crates/mcp-server/src/server.rs, the reply carriedhunks_truncated: trueandhunks_omitted_symbols: 12, and thedeletedrow foron_custom_requesthad nohunk. The top-level count says a budget dropped twelve hunks but not which rows lost theirs, so a row without a hunk cannot be told apart from a row that never had one. A per-row marker would settle it. This check therefore did not confirm a deleted-body hunk on the release.primary. It names the right directory, but it is not a path a caller can use without knowing what it is relative to.classification_degraded, and returns nodeletedrows at all. The warning is correct; the missing rows are easy to read as "nothing was deleted".🤖 Generated with Claude Code
Dogfood triage, batch 16 (workers of the last two lanes and two side tasks of the v0.41.49 train; 46 entries)
Groups that grew (earlier → now):
limitonreview_diff, missing aliases): 13 → 15 (also #570)change_impactbatch: 12 → 13Nine of the "works as designed" entries are
index_incompleteon a negative lookup while the index was reconciling. That is the settled-answer contract of this release (docs/operations.md); none of them showed a positive result being withheld. Two entries claim a positive lookup refused during startup; they were not reproduced and stay unconfirmed.New item, reproduced on 0.41.48: a text search filtered to one permanently excluded file advises dropping the filter instead of naming the exclusion.
Expected: when
path_globnames one exact path that the index excludes, the empty result carries that path's coverage reason and its remedy (use shell, or change the rule), so the caller does not need the second call. Same family as the pending-path guidance already recorded here.Dogfood triage, batch 17 (v0.41.50 train; nine worker and side-task logs, 170 entries, instrument: the installed 0.41.49 release).
change_impactlimit: 0still listing test files)33 entries were probed with the installed CLI; every probe answered in under a second.
Groups that grew (entries added in this batch; earlier → now):
minimalReading:
limiton the diff tools are not in it. The next batch will show whether the group shrinks.index_incomplete,resolution_pending): the settlement contract of 0.41.49. The other 35 are documented limits a worker ran into (token caps on reads and outlines,ambiguous_symbolon a common name, name-only matching insearch_symbols). Each is correct as documented; the count says the documentation is not where the worker looks.review_diffgrades deletedpubmembers of apub(crate)type as highapi_break_deleted(#573, reproduced).v0.41.50 released. From batch 17: the excluded-literal-path answer of
search_textand the structured refusal ofcode-index queryon an invalid configuration are in this release (both verified on the installed binary); #573 is open for thereview_diffgrading ofpubmembers of apub(crate)type.Two defects that v0.41.49 also has were found by CI in this train and are fixed in the release: the daemon could stop answering
path_claimswhile a package activation changed, and a one-shotcode-index querybeside a freshly started daemon could answer a negative lookup over an index still being reconciled. #575 is open for the cost of a very longsearch_textliteral.Dogfood triage, batch 18
38 entries from the three workers of the v0.41.51 train (r24, r25, r26), each reproduced on the installed v0.41.50 by a triage run; I re-ran the two new defects myself. Result: 7 defects, 11 friction, 6 by design, 7 confirmed as working well, 4 not reproduced, 3 caused by my worker instructions (a stale local
masteras diff base; corrected in the instructions).Defects
index_coverageadvises "Restart the daemon" during ordinary startup (2 entries)review_diffgrades an edited file-level Rust#[test]asuntested_changesearch_symbolsquery (many name tokens), a longpath_glob, a longlangfilter end ininternal_erroror a JSON-RPC error (3 entries)review_diffsummary mixes the filtered and the whole-diff file countFriction (documented behaviour that still costs calls)
path_globrefuses brace expansionsearch_text {"query":"alpha","path_glob":"crates/{store,daemon}/src/**"}review_diffrefuseslimitreview_diff {"limit":5}limiton the diff tools (#570)envelope: "minimal"search_symbols {"query":["a","b","c"],"envelope":"minimal"}with three misseschange_impactrefuses the whole call when one seed is absentchange_impact {"symbol_ids":["present","absent"],"limit":0}implblock is ambiguous as an impact seedchange_impact {"symbol_ids":["TierDisclosure"]}read_codeon a path under~/.rustuppattern,path,symbol)list_files {"pattern":"**/*.rs"}file_outlinedefault page is large for navigationfile_outline {"path":"<large file>"}top_level_onlynamed in the descriptionclassification_degradedgives no reasonreview_diffon a file whose extraction failed mid-editNot reproduced: a
resolution_pendingstate that persists through a burst of documentation edits and blocks negativesearch_textanswers (the burst fixture settled); numeric symbol ids expiring after a reindex (the id stayed valid in the controlled case). Both stay on the watch list.Confirmed as working well: path-based
read_codeduring startup (3 entries), base-side navigation inreview_diff, untracked files and the low-confidence disclosure inreview_diff, the build-skew disclosure, file coverage routing.Agent context cost and tool surface: ~15k-token tools/list, truncated instructions, overview/search payloads, tool overlap and frictionto Tool discovery and replies cost extra calls, while review and navigation still have gapsV::Valuewith a generic parameterVbinds to a function-localstruct Vin another crate #579Dogfood triage, batch 19
27 entries from the train after v0.41.50 (worker logs r24 D11–D23, r27 D1–D9, and five lead notes), each reproduced on the release v0.41.50 in a scratch fixture. 3 defects, 11 friction, 6 by design, 5 confirmed positives, 2 not reproduced. No entry needs a new issue: the three defects are #578 (two entries, fixed on master) and #579 (now part of #531).
Defects
path_outside_rootread_code({"target": "a/" * 4095 + "a"})file_not_readable), not yet releasedinternal_errorread_code({"target":"Cargo.toml/missing.rs"})V::Valuewith a generic parameterVbound to a function-localstruct Vin another crateFriction, new in this batch
find_references(resolution: "resolved")refusedindex_incompleteuntil 2.6 s after the edit;resolve_progress.scope: "full". A 251-file, 3,000-ref control stayed scoped and settled in 1.1 s. Under a full local test run the same wait was over 60 s on this repository.resolution_pendingwatch in this issue.search_textreports a hit whose only match is in the file's pathtests/path_only.rswith bodypub fn marker() {}matches the querytests"_) cannot be searchedsearch_text({"query":"\"_"})→ not searched, disclosedfind_calleesreturnscall/method_callonlypath_outside_rootcarries the hint "Paths must be project-relative with no absolute or..components" also when the cause is a symbolic link that leaves the root or cannot be resolvedread_codethrough a link to a directory outside the rootindex_incompletesearch_symbolsright after startFriction already recorded (no new proposal)
change_impactrefusing a whole batch for one absent seed; a type name that is ambiguous between a struct and itsimplblocks (#536); brace globs refused inpath_glob; standard-library sources not readable (#559); tool discovery replies that flood the client.Confirmed positives
Coverage routing proves the right worktree in one call; build provenance exposed mixed binaries; head provenance proved the requested commit; direct reproduction through path routing; the widened occurrence census (46 occurrences) was complete.
Dogfood triage, batch 20
34 entries of the worker that fixed #581 (D1–D13, R2-1–R2-21) plus one note of the lead, grouped into 14 mechanisms: 6 known, 2 new, 5 by design, 1 not reproduced. The two
newrows were checked by the lead in the code (qualifyin crates/mcp-server/src/server.rs passes the names-only exemption forsearch_symbolsonly;code-index --helplists no stop command).Calls that do not depend on a starting index were replayed against the release tree. Start-up states were not recreated; the condition that refuses was read from the code.
Dogfood triage, batch 21
23 entries of the workers on #531 step 1 (r29, D1–D16) and on the text-search refusal (r30, D1–D7), grouped into 14 mechanisms: 10 known (16 entries), 1 fixed on the train branch (4 entries), 2 by design, 1 not reproduced, none new.
Calls that do not depend on a starting index were replayed; start-up refusals were checked in the source. The four entries about
search_textrefused while references resolve are the defect fixed on the train branch (a tool now states whether its absence needs resolved references).172bcb20and context_lines 0 returned exact historical source and resolved_commit172bcb202a; #521 Done records historical path/range reads, while its remaining revision-by-symbol gap is different.link addon a project without a config file disables every language: the file it creates carries an explicit emptyenabledlist #585Dogfood triage, batch 22
29 entries from r33, r34, r35 and r37 plus L1–L3, grouped into 18 mechanisms: 10 known, 1 new, 5 by design, 1 fixed on the train branch, 1 not reproduced.
Applicable calls were replayed against the next-train branch; startup states were judged from the quoted replies. Triage by a worker, read by the lead. The one new row is a documentation pointer; no new product defect in this batch. Two defects found by the lead while linking lane worktrees are filed separately: #585 (
link adddisabling languages) and the lock hold recorded on #520.Dogfood triage, batch 23
78 entries (50 in r40–r44, 27 surviving titles from r36/r38/r39, one lead entry), grouped into 28 rows: 14 known, 2 new, 8 by design, 1 fixed on the train branch, 2 not reproduced, 1 title-only row containing eight untriaged entries.
The confirmed resolution-independent refusal mechanism occurs in nine entries, including two unambiguous surviving titles. The r36/r38/r39 files were deleted before triage; their classifications use titles only. Eight insufficient titles remain untriaged, so nine is a confirmed count, not an estimate for the missing evidence. Starting-index states were judged from recorded replies, never recreated; applicable calls were replayed against cwd. No repository writes, builds, tests, process stops or Forgejo posts were performed.
77fbf1dfat skills.rs:39 and live :22 have the identical const declaration, with only surrounding comments changed; supplied backlog tracks unresolved reach, not this comment-only false positive.Dogfood triage, batch 24
20 entries, grouped into 16 rows: 9 known, 0 new, 5 by design, 1 fixed on the train branch, 1 not reproduced. r45-D1 is split between its outline and graph calls. r41 means codex-r41, r45 means codex-r45, and tier3bind retains its filename prefix.
The resolution-independent refusal mechanism occurs in exactly three entries: r41-D22, r45-D1 (outline), and tier3bind-D2. Starting-index states were judged from quoted replies without recreation. Applicable calls were replayed against cwd; the CLI-only corpus example was compared through MCP with absolute targets. No repository writes, builds, cargo runs, process stops or Forgejo posts were performed.
Dogfood triage, batch 25
29 mechanism rows: 13 known, 9 new, 6 by design, 1 fixed on the train branch, and 0 not reproduced. Counts are rows, not reports; a report may contribute to multiple rows, and positive observations are grouped with their relevant contract.
The supplied worker and reviewer logs and the open-issue snapshot were read; absent optional files were skipped, and xrev reports without a Tool friction or Tool note section contribute no entries. No calls were replayed: the observations below are the recorded replies, the field reports are unverified, and no repository writes, builds, process stops, network requests or posts were made.
no_matchamong 17 candidates and a roughly 12-minute re-extract on each version change; no open remaining-scope line covers recovery across host versions.write_all(&wire)hits whose returned current line text is unrelated, with lag disclosed; integ saw conflict markers missed and stale spans.symbols=[], and a changed test file was omitted from review. #521's hunk scope does not establish symbol-recall coverage.kind=[enum,function]was accepted as a string-like filter and emptied all three batches despite matching enum and function symbols.index_updatingadvice said paths were never indexed while coverage reported indexed, stale, reconciling and requeued.changed_symbolsreturnedclassification_degraded=trueduring resolution pending although the reporter expected per-file extraction to suffice; no remaining line requires avoiding unnecessary degradation.absence_requirement(false)for text and outline; these logs report installed-toolindex_incompletewhile resolution was pending.base_span_unavailableanddiff_lines_unavailable.maxItemsas open, and nine or more reads refused at eight.literal_absent_from_body.path,symbol,fileand reviewlimitwere refused with suggestions.review_diffwaited 3000 ms and returnedindex_updatingfor changing files; subsequent calls commonly succeeded.read_codeorlist_filesrather than encountering a tool refusal; #571 Remaining: “Choose measurement scope and run a pilot before claiming adoption”.New, proposed as issues