Tool discovery and replies cost extra calls, while review and navigation still have gaps #521

Open
opened 2026-11-09 08:03:47 +01:00 by buildagent · 20 comments
Member

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

  • Scoped/root provenance is in 4fd63f0c; session prose and provenance dedup shipped in v0.41.48 and are tested by the_default_envelope_is_unchanged_and_a_bad_mode_is_refused and session cases in crates/mcp-server/tests/tool_ux_e3_e2e.rs.
  • Historical path/range reads and clipped hunks are tested by 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_budget and ownership cases in crates/mcp-server/tests/mcp_smoke.rs.
  • Literal excluded-path disclosure shipped in v0.41.50 (43a3bfb0/53621b67); shared argument policy, applied values and concise formats are in crates/mcp-server/src/arguments.rs and docs/mcp-arguments.md.
  • On master, review summary changed_files uses the matched population under a filter and otherwise the whole diff; review_summary_counts_the_filtered_population in crates/mcp-server/tests/diff_paging_e2e.rs grades the fix.

Remaining

Discovery and tool surface

  • Meet the tool-list/instruction budgets; put orientation first in project_overview with optional admin detail/sections, and expose state, cost, limits and top_level_only guidance where agents look. (#521)
  • Consolidate overlapping lookup/diff/handle tools around context_pack; preserve resolved-edge deltas, span dedup and witness diversity. Add unreferenced search only if a measured task needs it. (#521)
  • Recheck the CLI warming_up contradiction and query-quoting friction from the existing checklist; complete the remaining remedy and keep naming aliases coordinated with #570. Applied numeric clamps are already disclosed by arguments_applied. (#521)
  • Run a controlled before/after discovery experiment and record wrong answers and unused-tool reasons. (#521)

Worktree and path routing

  • Discover sibling worktrees and the main checkout without a gitignored setup file; never fan out worktree links, retain override/opt-out and list relationship: worktree. Cover existing-worktree project_not_found hints and owning-project routing for absolute paths (gaps 1, 2, 4, 5). (#521)
  • Finish gap 3 with usable absolute provenance roots and cwd/root mismatch disclosure; supplied root provenance alone does not establish that the whole gap is closed. (#521)
  • Suggest same-basename paths, inline Rust modules and mod.rs/dir.rs pairs on missing paths; avoid routing advice when the root is correct, and name escaping/unresolvable symbolic links in path_outside_root hints. (#521)

Search evidence and filters

  • Keep the full match in snippets, locate $ names, add exclude_tests and label path-only matches; make bounded matched-line text the default. (#521, #557)
  • Measure OR/AND line censuses and union literal arms with per-arm labels; consider a bounded scan for explicitly quoted short literals while preserving not-searched disclosure. (#521)
  • Support list-of-globs, trailing /** normalization and outline name-prefix filtering; coordinate aliases, common filters and diff limits with #570. (#521)

Batch results, seeds and handles

  • Return per-seed impact answers/refusals for absent, stale or ambiguous seeds; support metadata/comment/import lines as disclosed file-level seeds. (#521)
  • Identify stale numeric ids by generation and point to stable_handle for edit loops; retain the unreproduced expiry case on the watch list. (#521)

Reference navigation

  • Disclose resolved non-call uses in find_callers with a find_references hint; list outgoing resolved references of non-call kinds for a file/symbol. Reproduction in #579 and batch 19. (#521, #579)
  • Rank/cap prose mentions separately from code evidence in safe_delete. (#521)

Review classification and hunks

  • Provide per-file continuation for omitted symbols, classification-degradation reason/producer/path/refusal, and a findings-only summary without duplicate member handles. (#521)
  • Put unresolved/pending test reach next to untested_change or downgrade it; explain train-base scope and build-skew omissions so absent deleted rows are not read as no deletions. (#521)
  • Complete deleted/base-span/metadata/leading-comment hunk coverage and mark every omitted hunk per row; qualify with the zero-shell review benchmark. (#521, #558)
  • Implement historical symbol-target reads or obtain an explicit scope decision: the requested revision-by-symbol form is still refused as revision_symbol_unsupported; path/range reads are only the delivered subset. (#558)

Reply budgets and disclosures

  • Bound batched read payloads and changed-symbol per-file summaries; hoist repeated absence guidance even under minimal and clarify partial_sources_in_index when the current reply has no partial sources. (#521, #557)
  • Design a bounded test run-set shape with total and one-call which-tests evidence; do not repeat the withdrawn limit=0 empty-list change. Complete semantics-key/disclosure registration and benchmark byte acceptance. (#557)

Index state and coverage guidance

  • Name pending filtered paths before suggesting dropped filters; decide .digest/.expected indexing policy and use shared shipped-package setup for MCP fixtures. (#521)
  • Disclose the reason for a full-scope resolve pass, measure its delay under load before changing thresholds, and annotate answered batch entries when other entries are refused because the index is incomplete. (#521)

Acceptance

  • Tools/list is ≤6k tokens; server instructions are under 3.5k characters and fit the client cutoff, with cost/state guidance discoverable. Record before/after sizes and a controlled discovery run with wrong-answer rate and reasons unused tools went unused.
  • On the task benchmark, median reply bytes for search_symbols/search_text/find_callers/read_code fall ≥40% without lost disclosures; all semantics keys are registered, session-resolvable and mutation-tested.
  • One-call searches return bounded useful matched text; batches preserve valid results with per-seed refusals. Worktree, pending-state and stale-handle fixtures cover their documented routes.
  • Rename/body/deletion review fixtures preserve clipped base/head hunks, exact omitted-row markers and historical navigation; restoring unclipped hunks fails a fixture and the review task uses zero shell calls.
  • Payload caps preserve one-call which-tests answers; any run-set diet has a benchmark plan that retains that answer.

Suggested order

  1. Reduce discovery cost and choose the consolidated surface; host only, no language package release or bind account needed.
  2. Fix batch, routing, search and diagnostic gaps; host only unless a producer deficiency is found, bind invariance checked.
  3. Complete review/read payloads and historical coverage, then run discovery/reply/review benchmarks; no package release or bind account for presentation-only changes.

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.

What Measured
tools/list, 23 tools 60.7k chars ≈ 15k tokens (descriptions alone 33,063 chars, mean 1,437 per tool; search_symbols 2,522, find_references 2,273, changed_symbols 2,235)
Server instructions 4,926 chars. Claude Code cut it at about 4,009, so the last section ("STATE AND HANDLES": warming_up, reconciling, degraded) and the only mention of envelope="minimal" never reach the agent
envelope parameter present on every tool as {"type":"string"} with no description; AGENTS.md mentions it 0 times
find_callers with response_format: concise 1,733 chars, of which 1,493 are disclosure blocks (evidence_gaps, answer_provenance, index_snapshot, confidence); 86% overhead for 3 rows
envelope: minimal saves only 17–20%
answer_provenance lists all six trees' heads (primary plus five worktrees), about 593 chars, on every MCP call, even when project="primary"

Most of each description re-explains the zero/denominator contract (name_fallback_count, "ABSENT means …"). The payload fields and code-index://docs/* already carry that, and meanwhile the one sentence that says when to use this tool instead of the shell gets buried.

Proposal

  1. Description budget: each tool description is at most ~400 chars and covers purpose, when to use it instead of the shell, and its key arguments, then points to code-index://docs/<topic> for the contract. Enforce the limit with a registry test (the tree already has a tool-description registry style).
  2. Instructions budget: keep the server instructions under 3.5k chars, with state and cost guidance first and the extension lists last.
  3. Document envelope in the shared schema, and make concise imply minimal.
  4. Scope provenance to the projects the reply actually read.
  5. Merge overlapping tools. find_callers is find_references(kinds=[call]); changed_symbols is a subset of review_diff, which is a subset of context_pack(diff_base); resolve_handle duplicates handle acceptance that every tool already has; get_symbol overlaps exact-name search_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/list is at most 6k tokens.
  • The instructions fit inside the client's cut-off.
  • Before and after numbers for the table above are recorded in the PR.

Related: #70, #34. Raw captures: scratchpad/dog/mcp.out from 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.

## 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 - Scoped/root provenance is in 4fd63f0c; session prose and provenance dedup shipped in v0.41.48 and are tested by `the_default_envelope_is_unchanged_and_a_bad_mode_is_refused` and session cases in `crates/mcp-server/tests/tool_ux_e3_e2e.rs`. - Historical path/range reads and clipped hunks are tested by `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_budget` and ownership cases in `crates/mcp-server/tests/mcp_smoke.rs`. - Literal excluded-path disclosure shipped in v0.41.50 (43a3bfb0/53621b67); shared argument policy, applied values and concise formats are in `crates/mcp-server/src/arguments.rs` and `docs/mcp-arguments.md`. - On master, review summary changed_files uses the matched population under a filter and otherwise the whole diff; `review_summary_counts_the_filtered_population` in `crates/mcp-server/tests/diff_paging_e2e.rs` grades the fix. ## Remaining ### Discovery and tool surface - Meet the tool-list/instruction budgets; put orientation first in project_overview with optional admin detail/sections, and expose state, cost, limits and top_level_only guidance where agents look. (#521) - Consolidate overlapping lookup/diff/handle tools around context_pack; preserve resolved-edge deltas, span dedup and witness diversity. Add unreferenced search only if a measured task needs it. (#521) - Recheck the CLI warming_up contradiction and query-quoting friction from the existing checklist; complete the remaining remedy and keep naming aliases coordinated with #570. Applied numeric clamps are already disclosed by arguments_applied. (#521) - Run a controlled before/after discovery experiment and record wrong answers and unused-tool reasons. (#521) ### Worktree and path routing - Discover sibling worktrees and the main checkout without a gitignored setup file; never fan out worktree links, retain override/opt-out and list relationship: worktree. Cover existing-worktree project_not_found hints and owning-project routing for absolute paths (gaps 1, 2, 4, 5). (#521) - Finish gap 3 with usable absolute provenance roots and cwd/root mismatch disclosure; supplied root provenance alone does not establish that the whole gap is closed. (#521) - Suggest same-basename paths, inline Rust modules and mod.rs/dir.rs pairs on missing paths; avoid routing advice when the root is correct, and name escaping/unresolvable symbolic links in path_outside_root hints. (#521) ### Search evidence and filters - Keep the full match in snippets, locate $ names, add exclude_tests and label path-only matches; make bounded matched-line text the default. (#521, #557) - Measure OR/AND line censuses and union literal arms with per-arm labels; consider a bounded scan for explicitly quoted short literals while preserving not-searched disclosure. (#521) - Support list-of-globs, trailing /** normalization and outline name-prefix filtering; coordinate aliases, common filters and diff limits with #570. (#521) ### Batch results, seeds and handles - Return per-seed impact answers/refusals for absent, stale or ambiguous seeds; support metadata/comment/import lines as disclosed file-level seeds. (#521) - Identify stale numeric ids by generation and point to stable_handle for edit loops; retain the unreproduced expiry case on the watch list. (#521) ### Reference navigation - Disclose resolved non-call uses in find_callers with a find_references hint; list outgoing resolved references of non-call kinds for a file/symbol. Reproduction in #579 and batch 19. (#521, #579) - Rank/cap prose mentions separately from code evidence in safe_delete. (#521) ### Review classification and hunks - Provide per-file continuation for omitted symbols, classification-degradation reason/producer/path/refusal, and a findings-only summary without duplicate member handles. (#521) - Put unresolved/pending test reach next to untested_change or downgrade it; explain train-base scope and build-skew omissions so absent deleted rows are not read as no deletions. (#521) - Complete deleted/base-span/metadata/leading-comment hunk coverage and mark every omitted hunk per row; qualify with the zero-shell review benchmark. (#521, #558) - Implement historical symbol-target reads or obtain an explicit scope decision: the requested revision-by-symbol form is still refused as revision_symbol_unsupported; path/range reads are only the delivered subset. (#558) ### Reply budgets and disclosures - Bound batched read payloads and changed-symbol per-file summaries; hoist repeated absence guidance even under minimal and clarify partial_sources_in_index when the current reply has no partial sources. (#521, #557) - Design a bounded test run-set shape with total and one-call which-tests evidence; do not repeat the withdrawn limit=0 empty-list change. Complete semantics-key/disclosure registration and benchmark byte acceptance. (#557) ### Index state and coverage guidance - Name pending filtered paths before suggesting dropped filters; decide .digest/.expected indexing policy and use shared shipped-package setup for MCP fixtures. (#521) - Disclose the reason for a full-scope resolve pass, measure its delay under load before changing thresholds, and annotate answered batch entries when other entries are refused because the index is incomplete. (#521) ## Acceptance - Tools/list is ≤6k tokens; server instructions are under 3.5k characters and fit the client cutoff, with cost/state guidance discoverable. Record before/after sizes and a controlled discovery run with wrong-answer rate and reasons unused tools went unused. - On the task benchmark, median reply bytes for search_symbols/search_text/find_callers/read_code fall ≥40% without lost disclosures; all semantics keys are registered, session-resolvable and mutation-tested. - One-call searches return bounded useful matched text; batches preserve valid results with per-seed refusals. Worktree, pending-state and stale-handle fixtures cover their documented routes. - Rename/body/deletion review fixtures preserve clipped base/head hunks, exact omitted-row markers and historical navigation; restoring unclipped hunks fails a fixture and the review task uses zero shell calls. - Payload caps preserve one-call which-tests answers; any run-set diet has a benchmark plan that retains that answer. ## Suggested order 1. Reduce discovery cost and choose the consolidated surface; host only, no language package release or bind account needed. 2. Fix batch, routing, search and diagnostic gaps; host only unless a producer deficiency is found, bind invariance checked. 3. Complete review/read payloads and historical coverage, then run discovery/reply/review benchmarks; no package release or bind account for presentation-only changes. ## 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. | What | Measured | |---|---| | `tools/list`, 23 tools | 60.7k chars ≈ **15k tokens** (descriptions alone 33,063 chars, mean 1,437 per tool; `search_symbols` 2,522, `find_references` 2,273, `changed_symbols` 2,235) | | Server instructions | 4,926 chars. **Claude Code cut it at about 4,009**, so the last section ("STATE AND HANDLES": `warming_up`, `reconciling`, `degraded`) and the only mention of `envelope="minimal"` never reach the agent | | `envelope` parameter | present on every tool as `{"type":"string"}` with **no description**; AGENTS.md mentions it 0 times | | `find_callers` with `response_format: concise` | 1,733 chars, of which 1,493 are disclosure blocks (`evidence_gaps`, `answer_provenance`, `index_snapshot`, `confidence`); 86% overhead for 3 rows | | `envelope: minimal` | saves only 17–20% | | `answer_provenance` | lists **all six trees' heads** (primary plus five worktrees), about 593 chars, on every MCP call, even when `project="primary"` | Most of each description re-explains the zero/denominator contract (`name_fallback_count`, "ABSENT means …"). The payload fields and `code-index://docs/*` already carry that, and meanwhile the one sentence that says *when to use this tool instead of the shell* gets buried. ## Proposal 1. **Description budget:** each tool description is at most ~400 chars and covers purpose, when to use it instead of the shell, and its key arguments, then points to `code-index://docs/<topic>` for the contract. Enforce the limit with a registry test (the tree already has a tool-description registry style). 2. **Instructions budget:** keep the server instructions under 3.5k chars, with state and cost guidance **first** and the extension lists last. 3. **Document `envelope`** in the shared schema, and make `concise` imply `minimal`. 4. **Scope provenance** to the projects the reply actually read. 5. **Merge overlapping tools.** `find_callers` is `find_references(kinds=[call])`; `changed_symbols` is a subset of `review_diff`, which is a subset of `context_pack(diff_base)`; `resolve_handle` duplicates handle acceptance that every tool already has; `get_symbol` overlaps exact-name `search_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/list` is at most 6k tokens. - The instructions fit inside the client's cut-off. - Before and after numbers for the table above are recorded in the PR. Related: #70, #34. Raw captures: `scratchpad/dog/mcp.out` from 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._
buildagent changed title from Agent context cost: tools/list is ~15k tokens, server instructions are truncated by the client, and envelope/concise are undiscoverable to Agent context cost and tool surface: ~15k-token tools/list, truncated instructions, overview/search payloads, tool overlap and friction 2026-11-09 09:21:00 +01:00
Author
Member

Added 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.

Added 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.
Author
Member

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_root let the main checkout's untracked .code-index.toml capture every nested worktree, now filed as #553. Gaps 1–2 stay valid on their own.

  • Gap 3: a session cannot tell WHICH tree answers. answer_provenance.indexed_trees.primary carries head, uncommitted_changes and sibling_worktrees but no root path. Worktrees share HEAD, so three sessions independently could not prove they were on the wrong tree (lane A; codex-t1 D1; 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.
  • Gap 4: an absolute path into a sibling worktree is refused as path_not_indexed (hidden .claude dir) instead of naming the worktree that owns it, or routing there when it is linked (codex-512, codex-546, lane A). read_code documents "an absolute path auto-routes to the owning project", and the refusal should at least say which project that would be.
  • Gap 5: the project_not_found hint 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_text boolean queries lose the line census. (a OR b) and multi-term AND queries return hits with matches_in_file_unmeasured: "no_literal_spelling" and no line_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_callers is silent about value uses. crate::frozen::dir passed as a function value (install(..., crate::frozen::dir)) is a resolved reference in find_references but absent from find_callers. symbol_shape_excluded_refs stays 0, so nothing points the agent to it. A worker fell back to text search. find_callers should 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 find detect_root. Name search is not concept search.

## 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_root` let the main checkout's untracked `.code-index.toml` capture every nested worktree, now filed as #553. Gaps 1–2 stay valid on their own. - [ ] **Gap 3: a session cannot tell WHICH tree answers.** `answer_provenance.indexed_trees.primary` carries `head`, `uncommitted_changes` and `sibling_worktrees` but no root path. Worktrees share HEAD, so three sessions independently could not prove they were on the wrong tree (lane A; `codex-t1` D1; `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. - [ ] **Gap 4: an absolute path into a sibling worktree is refused as `path_not_indexed` (hidden `.claude` dir)** instead of naming the worktree that owns it, or routing there when it is linked (`codex-512`, `codex-546`, lane A). `read_code` documents "an absolute path auto-routes to the owning project", and the refusal should at least say which project that would be. - [ ] **Gap 5: the `project_not_found` hint 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_text` boolean queries lose the line census.** `(a OR b)` and multi-term AND queries return hits with `matches_in_file_unmeasured: "no_literal_spelling"` and no `line_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_callers` is silent about value uses.** `crate::frozen::dir` passed as a function value (`install(..., crate::frozen::dir)`) is a resolved reference in `find_references` but absent from `find_callers`. `symbol_shape_excluded_refs` stays 0, so nothing points the agent to it. A worker fell back to text search. `find_callers` should 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 find `detect_root`. Name search is not concept search.
Author
Member

Dogfood triage round 2 (worker sessions, reproduced or explained by the lead)

  • read_code on a non-existent Rust module file (crates/indexer/src/index/resolved_by.rs; the module is inline in index.rs) → file_not_readable plus a worktree-routing hint, although routing was correct. Suggest the inline mod declaration when indexed, and omit worktree advice when the root is known correct.
  • path_glob cannot express two directories. Braces are refused explicitly (unsupported_glob_syntax, which is good), so crates/guest/{javascript,typescript}/* needs two calls. Accept a LIST of globs.
  • file_outline has no name filter: file_outline(path, query="Store") → unknown_argument. A 300-row outline was the alternative. Add an optional name-prefix filter.
  • Doc clarity: a worker read evidence_gaps.partial_sources_in_index: 16 beside an empty partial_sources as "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 omitting partial_sources_in_index when this reply names none, or renaming it partial_sources_elsewhere.
  • Worked well, keep: review_diff/changed_symbols with base=master (untracked files reviewed, freshness disclosed); batched read_code; explicit refusals for unsupported glob syntax.
## Dogfood triage round 2 (worker sessions, reproduced or explained by the lead) - [ ] `read_code` on a non-existent Rust module file (`crates/indexer/src/index/resolved_by.rs`; the module is inline in `index.rs`) → `file_not_readable` plus a worktree-routing hint, although routing was correct. Suggest the inline `mod` declaration when indexed, and omit worktree advice when the root is known correct. - [ ] `path_glob` cannot express two directories. Braces are refused explicitly (`unsupported_glob_syntax`, which is good), so `crates/guest/{javascript,typescript}/*` needs two calls. Accept a LIST of globs. - [ ] `file_outline` has no name filter: `file_outline(path, query="Store")` → `unknown_argument`. A 300-row outline was the alternative. Add an optional name-prefix filter. - [ ] Doc clarity: a worker read `evidence_gaps.partial_sources_in_index: 16` beside an empty `partial_sources` as "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 omitting `partial_sources_in_index` when this reply names none, or renaming it `partial_sources_elsewhere`. - [x] Worked well, keep: `review_diff`/`changed_symbols` with `base=master` (untracked files reviewed, freshness disclosed); batched `read_code`; explicit refusals for unsupported glob syntax.
Author
Member

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 show and read corpus source with sed. The operator asked why. The honest answers are product gaps:

  • No before/after view of a change. review_diff/changed_symbols say WHICH symbols changed (risk, test reach, freshness), but a reviewer needs WHAT changed. read_code serves only the working-tree side, so every review needed git show anyway. Proposal: changed_symbols/review_diff take include_hunks (the diff hunk clipped to each changed symbol's span, base side and head side, under the token budget), and/or read_code takes rev (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.
  • No way to query a directory that is not a configured project. Checking a corpus copy (~/.cache/cosi-corpus/cs-dapper, a bind-diff staging dir) meant code-index query --root <dir> in the shell: cold index 5–60 s, JSON on stdout, no session reuse. So sed -n 225,235p won. Proposal: project="<absolute dir>" attaches an ad-hoc read-only project for the session (indexed once, daemon reused, never fanned out, disclosed as relationship: ad_hoc), or an explicit attach_project(path) tool. This is also what lets agents dogfood code-index on foreign code inside one session.
## 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 show` and read corpus source with `sed`. The operator asked why. The honest answers are product gaps: - [ ] **No before/after view of a change.** `review_diff`/`changed_symbols` say WHICH symbols changed (risk, test reach, freshness), but a reviewer needs WHAT changed. `read_code` serves only the working-tree side, so every review needed `git show` anyway. Proposal: `changed_symbols`/`review_diff` take `include_hunks` (the diff hunk clipped to each changed symbol's span, base side and head side, under the token budget), and/or `read_code` takes `rev` (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. - [ ] **No way to query a directory that is not a configured project.** Checking a corpus copy (`~/.cache/cosi-corpus/cs-dapper`, a bind-diff staging dir) meant `code-index query --root <dir>` in the shell: cold index 5–60 s, JSON on stdout, no session reuse. So `sed -n 225,235p` won. Proposal: `project="<absolute dir>"` attaches an ad-hoc read-only project for the session (indexed once, daemon reused, never fanned out, disclosed as `relationship: ad_hoc`), or an explicit `attach_project(path)` tool. This is also what lets agents dogfood code-index on foreign code inside one session.
Author
Member

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.

  1. change_impact refuses 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 way read_code batches already do.
  2. Numeric symbol ids expire during a live edit loop. A re-index renumbers the ids, so an id copied from a reply made before the edit stops resolving after it. This is by design, because stable_handle is 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 to stable_handle for edit loops.
  3. safe_delete on 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.
  4. Census by OR-query. Agents want one census over several names, such as "how many of A|B|C". Today that takes N search_text calls.

Not a defect: review_diff calls mutation-tested runtime paths "untested". That is a static proxy and is disclosed in untested_change_semantics.

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. 1. **`change_impact` refuses 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 way `read_code` batches already do. 2. **Numeric symbol ids expire during a live edit loop.** A re-index renumbers the ids, so an id copied from a reply made before the edit stops resolving after it. This is by design, because `stable_handle` is 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 to `stable_handle` for edit loops. 3. **`safe_delete` on 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. 4. **Census by OR-query.** Agents want one census over several names, such as "how many of A|B|C". Today that takes N `search_text` calls. Not a defect: `review_diff` calls mutation-tested runtime paths "untested". That is a static proxy and is disclosed in `untested_change_semantics`.
Author
Member

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.

  1. An ambiguous seed aborts the whole change_impact batch. 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.
  2. change_impact cannot be seeded with a non-symbol line (an import line, for example), and answers symbol_not_found. Expected: the line seeds the symbols of the file that contains it, and the reply discloses that it is file-level.
  3. review_diff caps a single large file before all changed symbols are listed, and there is no continuation for the omitted ones (2 sightings). Expected: a next_cursor or per-file paging for omitted symbols.
  4. coverage.classification_degraded: true comes without a reason. The lead sees it on every review_diff. Expected: name the reason, e.g. classification_degraded_reason.
  5. path_glob with a trailing /** is refused (the hint is good: * already crosses /). Expected: normalize an unambiguous trailing /** to /* and say so, instead of a round trip.
  6. project_overview with envelope:"minimal" is still the largest reply. Expected: a smaller default shape, or sections= to select parts.
  7. Repo hygiene for dogfooding: the tests/packages/**.digest and fixture .expected files are not indexed (ineligible_extension). A committed .code-index.toml with [index] extra_text_extensions = ["digest", "expected"] would cover them.
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. 1. **An ambiguous seed aborts the whole `change_impact` batch.** 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. 2. **`change_impact` cannot be seeded with a non-symbol line** (an import line, for example), and answers `symbol_not_found`. Expected: the line seeds the symbols of the file that contains it, and the reply discloses that it is file-level. 3. **`review_diff` caps a single large file before all changed symbols are listed**, and there is no continuation for the omitted ones (2 sightings). Expected: a `next_cursor` or per-file paging for omitted symbols. 4. **`coverage.classification_degraded: true` comes without a reason.** The lead sees it on every `review_diff`. Expected: name the reason, e.g. `classification_degraded_reason`. 5. **`path_glob` with a trailing `/**`** is refused (the hint is good: `*` already crosses `/`). Expected: normalize an unambiguous trailing `/**` to `/*` and say so, instead of a round trip. 6. **`project_overview` with `envelope:"minimal"` is still the largest reply.** Expected: a smaller default shape, or `sections=` to select parts. 7. **Repo hygiene for dogfooding:** the `tests/packages/**.digest` and fixture `.expected` files are not indexed (`ineligible_extension`). A committed `.code-index.toml` with `[index] extra_text_extensions = ["digest", "expected"]` would cover them.
Author
Member

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_impact refuses 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/.md seed 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_degraded comes without a reason: codex-f1 D8 and codex-f3 D14.

New items:

  • Concise review_diff still repeats full stable_handles on every structural member (codex-f2 D7, codex-f3 D26). With base: master on 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.
  • Common argument spellings are refused, not mapped (codex-f3 D20–D23). search_text(path=…) and review_diff(paths=[…]) should be path_glob, and change_impact(target=…) should be symbol_ids. line_text: "alias" is refused as invalid_argument_type. The refusals do name the right key, and each one costs a call. Accept path/paths as aliases of path_glob, and target (a string or a list) on change_impact, the way read_code takes it.
  • A missing path's did_you_mean repeats the project root (codex-f3 D12, D13). index_coverage("crates/indexer/src/resolver/member_lookup.rs") does not suggest crates/indexer/src/index/member_lookup.rs (same basename). read_code("…/index/mod.rs") does not suggest the sibling index.rs (the Rust module layout). Suggest same-basename paths and the mod.rs ⇄ <dir>.rs pair.
  • search_text advises dropping filters while the file is merely pending (codex-f2 D2). A query over path_glob=crates/daemon/src/local_index.rs returned total: 0, basis: filtered, "drop path_glob", while index_state said reconciling and that file had no row yet. Name the pending paths inside the filter before recommending a different filter.
  • review_diff during resolution_pending reports untested_change as if measured (codex-f2 D6). With minimum_batch_resolution_rate_pct at 0.07, total_affected was 0 and there were no test_role_files. Put the unmeasured resolution state next to each untested_change, or downgrade it, instead of implying that no tests exist.
  • Numeric symbol ids expire across a reconcile (codex-f3 D10, D27). An id taken from an earlier reply answered symbol_not_found after 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 the stable_handle.

Positive reports (keep): batched read_code ranges with per-entry refusals (codex-f1 D6, codex-f2 D3, codex-f3 D4); index_coverage naming the rule.

Enum variants without symbols (codex-f3 D16) are already #540's Rust row.

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_impact` refuses 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`/`.md` seed 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_degraded` comes without a reason: codex-f1 D8 and codex-f3 D14. **New items:** - [ ] **Concise `review_diff` still repeats full `stable_handle`s on every structural member** (codex-f2 D7, codex-f3 D26). With `base: master` on 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. - [ ] **Common argument spellings are refused, not mapped** (codex-f3 D20–D23). `search_text(path=…)` and `review_diff(paths=[…])` should be `path_glob`, and `change_impact(target=…)` should be `symbol_ids`. `line_text: "alias"` is refused as `invalid_argument_type`. The refusals do name the right key, and each one costs a call. Accept `path`/`paths` as aliases of `path_glob`, and `target` (a string or a list) on `change_impact`, the way `read_code` takes it. - [ ] **A missing path's `did_you_mean` repeats the project root** (codex-f3 D12, D13). `index_coverage("crates/indexer/src/resolver/member_lookup.rs")` does not suggest `crates/indexer/src/index/member_lookup.rs` (same basename). `read_code("…/index/mod.rs")` does not suggest the sibling `index.rs` (the Rust module layout). Suggest same-basename paths and the `mod.rs` ⇄ `<dir>.rs` pair. - [ ] **`search_text` advises dropping filters while the file is merely pending** (codex-f2 D2). A query over `path_glob=crates/daemon/src/local_index.rs` returned `total: 0`, `basis: filtered`, "drop path_glob", while `index_state` said reconciling and that file had no row yet. Name the pending paths inside the filter before recommending a different filter. - [ ] **`review_diff` during `resolution_pending` reports `untested_change` as if measured** (codex-f2 D6). With `minimum_batch_resolution_rate_pct` at 0.07, `total_affected` was 0 and there were no `test_role_files`. Put the unmeasured resolution state next to each `untested_change`, or downgrade it, instead of implying that no tests exist. - [ ] **Numeric symbol ids expire across a reconcile** (codex-f3 D10, D27). An id taken from an earlier reply answered `symbol_not_found` after 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 the `stable_handle`. Positive reports (keep): batched `read_code` ranges with per-entry refusals (codex-f1 D6, codex-f2 D3, codex-f3 D4); `index_coverage` naming the rule. Enum variants without symbols (codex-f3 D16) are already #540's Rust row.
Author
Member

Dogfood triage, batch 4 (worker codex-g1, installed 0.41.47; reproductions by a triage subagent, not re-run by the lead):

  • Reproduced: review_diff with a path_glob still reports the unfiltered summary.changed_files (147) next to a filtered coverage.filter (1 matched, 146 excluded). Totals and filtered counts should be labelled. Same shape as the earlier codex-f4 entry D8.
  • Reproduced: against master on an integration train, review_diff is capped (diff_truncated) and classification_degraded is true. A merge-base or worker-base scope would keep a lane review readable. Related to #558.
  • Reproduced: read_code on a cargo registry path returns path_outside_known_roots. Dependency source under ~/.cargo/registry is a second concrete driver for #559.
  • Not reproducible after the fact: during a worktree's initial reconcile, read_code returned path_not_indexed instead of waiting, and answer_provenance.indexed_trees is keyed by name with no root path (see #557).
  • Not reproduced: a degraded changed_symbols classification whose hint does not say whether the census RPC or the base extraction failed. Needs a repro from an uncommitted state.
  • Positive: concise change_impact with its resolution-rate disclosure was useful.
Dogfood triage, batch 4 (worker codex-g1, installed 0.41.47; reproductions by a triage subagent, not re-run by the lead): - **Reproduced:** `review_diff` with a `path_glob` still reports the unfiltered `summary.changed_files` (147) next to a filtered `coverage.filter` (1 matched, 146 excluded). Totals and filtered counts should be labelled. Same shape as the earlier codex-f4 entry D8. - **Reproduced:** against `master` on an integration train, `review_diff` is capped (`diff_truncated`) and `classification_degraded` is true. A merge-base or worker-base scope would keep a lane review readable. Related to #558. - **Reproduced:** `read_code` on a cargo registry path returns `path_outside_known_roots`. Dependency source under `~/.cargo/registry` is a second concrete driver for #559. - **Not reproducible after the fact:** during a worktree's initial reconcile, `read_code` returned `path_not_indexed` instead of waiting, and `answer_provenance.indexed_trees` is keyed by name with no root path (see #557). - **Not reproduced:** a degraded `changed_symbols` classification whose hint does not say whether the census RPC or the base extraction failed. Needs a repro from an uncommitted state. - **Positive:** concise `change_impact` with its resolution-rate disclosure was useful.
Author
Member

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:

  • Provenance names its root when sibling worktrees exist: "root":"/home/master/…" for the primary checkout, "root":".claude/worktrees/integration" when run from the worktree.
  • read_code with rev: "v0.41.47" returns the historical bytes with resolved_commit.
  • changed_symbols with include_hunks returns hunks on changed rows and hunk_in_children: true on containers.

Friction:

  1. Dropped hunks are not marked per row. For base: v0.41.47, path_glob: crates/mcp-server/src/server.rs, the reply carried hunks_truncated: true and hunks_omitted_symbols: 12, and the deleted row for on_custom_request had no hunk. 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.
  2. A worktree's root prints relative and under the key primary. It names the right directory, but it is not a path a caller can use without knowing what it is relative to.
  3. Build skew hides deletions. With a daemon of the previous build still serving, the newer CLI warns, flags classification_degraded, and returns no deleted rows at all. The warning is correct; the missing rows are easy to read as "nothing was deleted".

🤖 Generated with Claude Code

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: - Provenance names its root when sibling worktrees exist: `"root":"/home/master/…"` for the primary checkout, `"root":".claude/worktrees/integration"` when run from the worktree. - `read_code` with `rev: "v0.41.47"` returns the historical bytes with `resolved_commit`. - `changed_symbols` with `include_hunks` returns hunks on changed rows and `hunk_in_children: true` on containers. Friction: 1. **Dropped hunks are not marked per row.** For `base: v0.41.47`, `path_glob: crates/mcp-server/src/server.rs`, the reply carried `hunks_truncated: true` and `hunks_omitted_symbols: 12`, and the `deleted` row for `on_custom_request` had no `hunk`. 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. 2. **A worktree's root prints relative** and under the key `primary`. It names the right directory, but it is not a path a caller can use without knowing what it is relative to. 3. **Build skew hides deletions.** With a daemon of the previous build still serving, the newer CLI warns, flags `classification_degraded`, and returns no `deleted` rows at all. The warning is correct; the missing rows are easy to read as "nothing was deleted". 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Author
Member

Dogfood triage, batch 16 (workers of the last two lanes and two side tasks of the v0.41.49 train; 46 entries)

Verdict Entries
Duplicate of a tracked item 12
Works as designed 20
Positive 11
Not reproduced (the cold state was not recreated) 2
New 1

Groups that grew (earlier → now):

  • Review scope against a train base reports the repository-wide changed-file count beside a one-file filter: 4 → 7
  • Argument discovery (limit on review_diff, missing aliases): 13 → 15 (also #570)
  • Count-only impact still lists hundreds of test paths: 13 → 15 (#557)
  • Missing hunks for deleted, metadata or leading-comment lines: 7 → 9 (#558)
  • One invalid or ambiguous seed refuses a whole change_impact batch: 12 → 13
  • No impact seed on metadata or comment lines: 5 → 6

Nine of the "works as designed" entries are index_incomplete on 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.

code-index query search_text '{"query":"ci-timing","path_glob":".config/nextest.toml","limit":5}'
  → total 0, empty_population.basis "filtered", note: drop `path_glob`
code-index query index_coverage '{"path":".config/nextest.toml"}'
  → verdict "never", reason "hidden", proof.at ".config"

Expected: when path_glob names 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 16** (workers of the last two lanes and two side tasks of the v0.41.49 train; 46 entries) | Verdict | Entries | |---|---:| | Duplicate of a tracked item | 12 | | Works as designed | 20 | | Positive | 11 | | Not reproduced (the cold state was not recreated) | 2 | | New | 1 | Groups that grew (earlier → now): - Review scope against a train base reports the repository-wide changed-file count beside a one-file filter: 4 → 7 - Argument discovery (`limit` on `review_diff`, missing aliases): 13 → 15 (also #570) - Count-only impact still lists hundreds of test paths: 13 → 15 (#557) - Missing hunks for deleted, metadata or leading-comment lines: 7 → 9 (#558) - One invalid or ambiguous seed refuses a whole `change_impact` batch: 12 → 13 - No impact seed on metadata or comment lines: 5 → 6 Nine of the "works as designed" entries are `index_incomplete` on 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. ``` code-index query search_text '{"query":"ci-timing","path_glob":".config/nextest.toml","limit":5}' → total 0, empty_population.basis "filtered", note: drop `path_glob` code-index query index_coverage '{"path":".config/nextest.toml"}' → verdict "never", reason "hidden", proof.at ".config" ``` Expected: when `path_glob` names 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.
Author
Member

Dogfood triage, batch 17 (v0.41.50 train; nine worker and side-task logs, 170 entries, instrument: the installed 0.41.49 release).

Verdict Entries
Duplicate of an open issue 55
Works as designed (with the doc or field that says so) 54
Positive 31
Cannot reproduce (state not recreated; no index was rebuilt to force it) 27
Fixed in the next release (change_impact limit: 0 still listing test files) 2
New defect 1 → #573

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):

Group Added Total Issue
Argument discovery, missing aliases, list limits 11 15 → 26 #521 / #570
Train-wide review scope, inherited history 7 7 → 14 #521
Review symbol cap, missing classification reason 5 4 → 9 #521
Foreign corpus, dependency or explicit-database access 4 11 → 15 #559
Missing-path diagnostic, wrong routing advice 4 4 → 8 #521
Numeric symbol ids expire 4 4 → 8 #521
Payload size, prose despite minimal 4 15 → 19 #557
Impact batch discarded by one invalid or ambiguous seed 3 13 → 16 #521
Impact has no seed on metadata or comment lines 3 6 → 9 #521
Missing historical, metadata or base-span hunks 3 9 → 12 #558

Reading:

  • Argument discovery is again the largest group. The train under review (#570) publishes enums, defaults and bounds in the schema and one error shape for malformed arguments; aliases and a limit on the diff tools are not in it. The next batch will show whether the group shrinks.
  • Of the 54 "works as designed" entries, 19 are refusals of a negative answer while a worktree was being rebuilt (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_symbol on a common name, name-only matching in search_symbols). Each is correct as documented; the count says the documentation is not where the worker looks.
  • New: review_diff grades deleted pub members of a pub(crate) type as high api_break_deleted (#573, reproduced).
**Dogfood triage, batch 17** (v0.41.50 train; nine worker and side-task logs, 170 entries, instrument: the installed 0.41.49 release). | Verdict | Entries | |---|---:| | Duplicate of an open issue | 55 | | Works as designed (with the doc or field that says so) | 54 | | Positive | 31 | | Cannot reproduce (state not recreated; no index was rebuilt to force it) | 27 | | Fixed in the next release (`change_impact` `limit: 0` still listing test files) | 2 | | New defect | 1 → #573 | 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): | Group | Added | Total | Issue | |---|---:|---|---| | Argument discovery, missing aliases, list limits | 11 | 15 → 26 | #521 / #570 | | Train-wide review scope, inherited history | 7 | 7 → 14 | #521 | | Review symbol cap, missing classification reason | 5 | 4 → 9 | #521 | | Foreign corpus, dependency or explicit-database access | 4 | 11 → 15 | #559 | | Missing-path diagnostic, wrong routing advice | 4 | 4 → 8 | #521 | | Numeric symbol ids expire | 4 | 4 → 8 | #521 | | Payload size, prose despite `minimal` | 4 | 15 → 19 | #557 | | Impact batch discarded by one invalid or ambiguous seed | 3 | 13 → 16 | #521 | | Impact has no seed on metadata or comment lines | 3 | 6 → 9 | #521 | | Missing historical, metadata or base-span hunks | 3 | 9 → 12 | #558 | Reading: - Argument discovery is again the largest group. The train under review (#570) publishes enums, defaults and bounds in the schema and one error shape for malformed arguments; aliases and a `limit` on the diff tools are not in it. The next batch will show whether the group shrinks. - Of the 54 "works as designed" entries, 19 are refusals of a negative answer while a worktree was being rebuilt (`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_symbol` on a common name, name-only matching in `search_symbols`). Each is correct as documented; the count says the documentation is not where the worker looks. - New: `review_diff` grades deleted `pub` members of a `pub(crate)` type as high `api_break_deleted` (#573, reproduced).
Author
Member

v0.41.50 released. From batch 17: the excluded-literal-path answer of search_text and the structured refusal of code-index query on an invalid configuration are in this release (both verified on the installed binary); #573 is open for the review_diff grading of pub members of a pub(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_claims while a package activation changed, and a one-shot code-index query beside a freshly started daemon could answer a negative lookup over an index still being reconciled. #575 is open for the cost of a very long search_text literal.

v0.41.50 released. From batch 17: the excluded-literal-path answer of `search_text` and the structured refusal of `code-index query` on an invalid configuration are in this release (both verified on the installed binary); #573 is open for the `review_diff` grading of `pub` members of a `pub(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_claims` while a package activation changed, and a one-shot `code-index query` beside a freshly started daemon could answer a negative lookup over an index still being reconciled. #575 is open for the cost of a very long `search_text` literal.
Author
Member

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 master as diff base; corrected in the instructions).

Defects

What State
index_coverage advises "Restart the daemon" during ordinary startup (2 entries) #576, lane running
review_diff grades an edited file-level Rust #[test] as untested_change #577, lane running
A long search_symbols query (many name tokens), a long path_glob, a long lang filter end in internal_error or a JSON-RPC error (3 entries) being fixed with #575: one length rule for every string argument and a gate over the published tool list
review_diff summary mixes the filtered and the whole-diff file count fixed on the integration branch

Friction (documented behaviour that still costs calls)

What One call that shows it Proposed handling
path_glob refuses brace expansion search_text {"query":"alpha","path_glob":"crates/{store,daemon}/src/**"} accept a list of globs (already listed under #570)
review_diff refuses limit review_diff {"limit":5} limit on the diff tools (#570)
A batch repeats the same long absence prose per entry under envelope: "minimal" search_symbols {"query":["a","b","c"],"envelope":"minimal"} with three misses hoist repeated guidance once per reply (#557)
change_impact refuses the whole call when one seed is absent change_impact {"symbol_ids":["present","absent"],"limit":0} per-seed results and refusals (already in this issue's list)
A type name with an impl block is ambiguous as an impact seed change_impact {"symbol_ids":["TierDisclosure"]} declaration groups (#536)
Reading a file outside every root (toolchain sources) read_code on a path under ~/.rustup ad-hoc attach (#559)
Guessed argument names (pattern, path, symbol) list_files {"pattern":"**/*.rs"} the refusal already names the accepted arguments; aliases are under #570
file_outline default page is large for navigation file_outline {"path":"<large file>"} smaller default or top_level_only named in the description
classification_degraded gives no reason review_diff on a file whose extraction failed mid-edit a reason field with producer, path and refusal
MCP test fixtures index C# through the native producer, not the package test support a shared shipped-package fixture setup

Not reproduced: a resolution_pending state that persists through a burst of documentation edits and blocks negative search_text answers (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_code during startup (3 entries), base-side navigation in review_diff, untracked files and the low-confidence disclosure in review_diff, the build-skew disclosure, file coverage routing.

## 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 `master` as diff base; corrected in the instructions). **Defects** | What | State | |---|---| | `index_coverage` advises "Restart the daemon" during ordinary startup (2 entries) | #576, lane running | | `review_diff` grades an edited file-level Rust `#[test]` as `untested_change` | #577, lane running | | A long `search_symbols` query (many name tokens), a long `path_glob`, a long `lang` filter end in `internal_error` or a JSON-RPC error (3 entries) | being fixed with #575: one length rule for every string argument and a gate over the published tool list | | `review_diff` summary mixes the filtered and the whole-diff file count | fixed on the integration branch | **Friction (documented behaviour that still costs calls)** | What | One call that shows it | Proposed handling | |---|---|---| | `path_glob` refuses brace expansion | `search_text {"query":"alpha","path_glob":"crates/{store,daemon}/src/**"}` | accept a list of globs (already listed under #570) | | `review_diff` refuses `limit` | `review_diff {"limit":5}` | `limit` on the diff tools (#570) | | A batch repeats the same long absence prose per entry under `envelope: "minimal"` | `search_symbols {"query":["a","b","c"],"envelope":"minimal"}` with three misses | hoist repeated guidance once per reply (#557) | | `change_impact` refuses the whole call when one seed is absent | `change_impact {"symbol_ids":["present","absent"],"limit":0}` | per-seed results and refusals (already in this issue's list) | | A type name with an `impl` block is ambiguous as an impact seed | `change_impact {"symbol_ids":["TierDisclosure"]}` | declaration groups (#536) | | Reading a file outside every root (toolchain sources) | `read_code` on a path under `~/.rustup` | ad-hoc attach (#559) | | Guessed argument names (`pattern`, `path`, `symbol`) | `list_files {"pattern":"**/*.rs"}` | the refusal already names the accepted arguments; aliases are under #570 | | `file_outline` default page is large for navigation | `file_outline {"path":"<large file>"}` | smaller default or `top_level_only` named in the description | | `classification_degraded` gives no reason | `review_diff` on a file whose extraction failed mid-edit | a reason field with producer, path and refusal | | MCP test fixtures index C# through the native producer, not the package | test support | a shared shipped-package fixture setup | **Not reproduced:** a `resolution_pending` state that persists through a burst of documentation edits and blocks negative `search_text` answers (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_code` during startup (3 entries), base-side navigation in `review_diff`, untracked files and the low-confidence disclosure in `review_diff`, the build-skew disclosure, file coverage routing.
buildagent changed title from Agent context cost and tool surface: ~15k-token tools/list, truncated instructions, overview/search payloads, tool overlap and friction to Tool discovery and replies cost extra calls, while review and navigation still have gaps 2026-11-12 22:22:54 +01:00
Author
Member

Dogfood 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

Entry Reproduction State
A contained path longer than the OS limit answered path_outside_root read_code({"target": "a/" * 4095 + "a"}) #578, fixed on master (file_not_readable), not yet released
A file used as a directory answered internal_error read_code({"target":"Cargo.toml/missing.rs"}) #578, fixed on master, not yet released
V::Value with a generic parameter V bound to a function-local struct V in another crate see #579 merged into #531, open

Friction, new in this batch

What Reproduction Proposed handling
A one-line edit can start a full-scope resolve pass; negative reference answers are refused meanwhile 252 Rust files, about 25,000 call refs, one line changed: find_references(resolution: "resolved") refused index_incomplete until 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. The full pass is the documented fallback when an outline edit reaches over half of a project with more than 20,000 refs. Report the reason for the full scope in the reply, and measure under load before changing the threshold. Belongs with the existing resolution_pending watch in this issue.
search_text reports a hit whose only match is in the file's path a file tests/path_only.rs with body pub fn marker() {} matches the query tests Label path-only hits as such in the row.
A quoted two-character literal ("_) cannot be searched search_text({"query":"\"_"}) → not searched, disclosed Consider a bounded scan for short explicit literals; keep the disclosure.
No tool lists the resolved references going out of a file or symbol for kinds other than calls find_callees returns call/method_call only Recorded in #579, where it cost the attribution several guessed lookups.
path_outside_root carries 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 resolved read_code through a link to a directory outside the root Name the link case in the hint. The hint text is pinned by the legacy acceptance fixture, so it needs a deliberate fixture change.
During reconciliation, batch entries with hits answer and entries without hits are refused index_incomplete batched search_symbols right after start Consistent with the settlement rule; reads as flaky. A per-entry note on answered entries that they come from an incomplete index would help.

Friction already recorded (no new proposal)

change_impact refusing a whole batch for one absent seed; a type name that is ambiguous between a struct and its impl blocks (#536); brace globs refused in path_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 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 | Entry | Reproduction | State | |---|---|---| | A contained path longer than the OS limit answered `path_outside_root` | `read_code({"target": "a/" * 4095 + "a"})` | #578, fixed on master (`file_not_readable`), not yet released | | A file used as a directory answered `internal_error` | `read_code({"target":"Cargo.toml/missing.rs"})` | #578, fixed on master, not yet released | | `V::Value` with a generic parameter `V` bound to a function-local `struct V` in another crate | see #579 | merged into #531, open | ### Friction, new in this batch | What | Reproduction | Proposed handling | |---|---|---| | A one-line edit can start a full-scope resolve pass; negative reference answers are refused meanwhile | 252 Rust files, about 25,000 call refs, one line changed: `find_references(resolution: "resolved")` refused `index_incomplete` until 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. | The full pass is the documented fallback when an outline edit reaches over half of a project with more than 20,000 refs. Report the reason for the full scope in the reply, and measure under load before changing the threshold. Belongs with the existing `resolution_pending` watch in this issue. | | `search_text` reports a hit whose only match is in the file's path | a file `tests/path_only.rs` with body `pub fn marker() {}` matches the query `tests` | Label path-only hits as such in the row. | | A quoted two-character literal (`"_`) cannot be searched | `search_text({"query":"\"_"})` → not searched, disclosed | Consider a bounded scan for short explicit literals; keep the disclosure. | | No tool lists the resolved references going out of a file or symbol for kinds other than calls | `find_callees` returns `call`/`method_call` only | Recorded in #579, where it cost the attribution several guessed lookups. | | `path_outside_root` carries 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 resolved | `read_code` through a link to a directory outside the root | Name the link case in the hint. The hint text is pinned by the legacy acceptance fixture, so it needs a deliberate fixture change. | | During reconciliation, batch entries with hits answer and entries without hits are refused `index_incomplete` | batched `search_symbols` right after start | Consistent with the settlement rule; reads as flaky. A per-entry note on answered entries that they come from an incomplete index would help. | ### Friction already recorded (no new proposal) `change_impact` refusing a whole batch for one absent seed; a type name that is ambiguous between a struct and its `impl` blocks (#536); brace globs refused in `path_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.
Author
Member

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 new rows were checked by the lead in the code (qualify in crates/mcp-server/src/server.rs passes the names-only exemption for search_symbols only; code-index --help lists 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.

Mechanism Entries Classification Evidence in one line Proposed change in one line
Negative symbol lookup during startup D1, D9 by design server.rs:633–750 qualifies warming_up or negative/empty answers when index_is_unsettled is true; eligibility.rs:172 exempts search_symbols from resolution_pending/promotion_resolving, but parsing/reconciling can still add names; references are unnecessary; documented in src/docs/envelope.md:127–135,170 under crates/mcp-server. Preserve the distinction between parsing and resolution; no provisional absence is needed once parsing settles.
Text misses blocked by reference resolution D8, D10–D13, R2-9–R2-15 new crates/mcp-server/src/server.rs:633–750 passes names_only=true only for search_symbols, so empty search_text answers become index_incomplete during resolution_pending although text lookup needs no resolved refs; nonempty batch arms survive, explaining the mixed replies; cold parsing/reconciling remains a legitimate reason to defer absence. Give lexical text misses the same resolution-only exemption as symbol names, while retaining parsing and eligibility settlement checks.
Graph evidence deferred during resolution R2-16–R2-20 by design crates/mcp-server/src/server.rs:633–750 qualifies missing seeds/empty callers during unsettled resolution; change_impact resolves seeds before traversing target_id edges at :22285–22370, and callers read resolved counts at :18145–18215; both need references for complete answers; src/docs/envelope.md:119–135 documents floors and negative refusals. Keep floors on partial graph answers and refuse unsupported negative conclusions; these entries do not establish a new blanket refusal of all nonempty graphs.
Metadata lines cannot seed symbol impact D6 known #521: “Return per-seed impact answers/refusals for absent, stale or ambiguous seeds; support metadata/comment/import lines as disclosed file-level seeds.” Current change_impact resolves a symbol before graph access; the shared negative-evidence gate can replace its missing seed with index_incomplete; file eligibility needs no references, but transitive impact does. Validate and disclose metadata/file seeds before graph settlement, then provide the already requested file-level impact contract.
Pending coverage restart advice D7 not reproduced No startup was forced: crates/mcp-server/src/server.rs:21676–21749 emits pending/eligibility_unavailable when no row and no eligibility proof exist; eligibility.rs:434,486,529–542 now separates discovery from resolution and says retry during startup, reserving restart for degraded; path eligibility needs no resolved refs. Preserve the current lifecycle-specific remedy and its tests.
Brace expansion in path filters D2 known Same call returned unsupported_glob_syntax with two concrete alternatives; #521: “Support list-of-globs, trailing /** normalization and outline name-prefix filtering; coordinate aliases, common filters and diff limits with #570.” Add the tracked list-of-globs support; retain explicit refusal until supported.
Unbounded impact test-file list D4 known Same path-line call returned 18 test_role_files despite limit=0 (the line now selects installed); crates/mcp-server/src/server.rs:22282 documents that exception; #521: “Design a bounded test run-set shape with total and one-call which-tests evidence; do not repeat the withdrawn limit=0 empty-list change. Complete semantics-key/disclosure registration and benchmark byte acceptance.” Implement the tracked bounded run-set shape with totals and continuation; do not empty the file list merely because limit=0.
Struct and impl share an ambiguous name D5 known StoredPackage again returned ambiguous_symbol with struct at approval.rs:2463 and impl at :2553, candidate ids/path_line but no stable handles; #555: “Track wrong-target and missing-use work in #531/#536/#540, reply/discovery/review gaps in #521, foreign read-only attach in #559 and optional adoption hook in #571; retain not-ready-versus-absent settlement evidence.” This is the #536 ambiguity also identified in batch 19. Address type/impl identity under #536 and offer durable candidate handles; never silently choose an unrelated shifted line.
Argument and paging discovery R2-2, R2-4, R2-5, R2-7, R2-8 known All five same calls returned unknown_argument with accepted names; review_diff also explains fixed-budget cursor paging; docs/mcp-arguments.md documents the schema; #521: “Meet the tool-list/instruction budgets; put orientation first in project_overview with optional admin detail/sections, and expose state, cost, limits and top_level_only guidance where agents look.” Improve discovery of existing argument schemas and fixed paging; retain rejection of silently dropped filters.
Symbol queries are literal prefixes R2-3 by design Same alternation string returned symbol_not_found; search_symbols discovery explicitly specifies ASCII case-insensitive prefix matching and accepts a list of names already. Use query:["installed","parse","warnings","known_language"]; no new list feature is needed.
Coverage requires a file, not the root R2-1 by design The integration-root call returned path_not_resolvable and “index_coverage answers about a FILE; this names the project root.” The file-coverage contract is described at crates/mcp-server/src/server.rs:20870–20874. Use index_coverage("Cargo.toml") for provenance; an optional root-provenance convenience can be considered separately.
Live source reads and worktree-local callers D3, R2-6 by design Same source range read succeeded; Cargo.toml coverage was indexed/current; original worker id 13760 is absent here, as ids are project-local; resolving known_language_names_in locally then find_callers returned 2 resolved callers; tool discovery documents live reads, local ids and minimal-envelope provenance omission. Preserve these positive contracts; reacquire ids in each project and use a full envelope only when explicit provenance is required.
Outline pagination hides later containers R2-21 known Same path/limit with required concise returned 266 symbols total, 67 rows, next_cursor and budget degradation; #521: “Support list-of-globs, trailing /** normalization and outline name-prefix filtering; coordinate aliases, common filters and diff limits with #570.” Add the tracked outline name filter and advertise existing top_level_only/cursor controls; consider source-line or container starts.
No supported daemon-stop command Lead new code-index --help lists no stop/shutdown command, confirmed by Command in crates/cli/src/main.rs:49–183; daemon/lifecycle.rs:10–16 documents daemon.toml PID and daemon/main.rs:609–632 handles SIGTERM; neither remaining list names a stop command, and daemon-lifetime regression coverage in #555 is a different mechanism. Add a root-scoped daemon stop command that verifies the registered daemon identity, requests graceful termination and waits for exit, replacing PID-file parsing in scripts.
## 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 `new` rows were checked by the lead in the code (`qualify` in crates/mcp-server/src/server.rs passes the names-only exemption for `search_symbols` only; `code-index --help` lists 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. | Mechanism | Entries | Classification | Evidence in one line | Proposed change in one line | |---|---|---|---|---| | Negative symbol lookup during startup | D1, D9 | by design | server.rs:633–750 qualifies warming_up or negative/empty answers when index_is_unsettled is true; eligibility.rs:172 exempts search_symbols from resolution_pending/promotion_resolving, but parsing/reconciling can still add names; references are unnecessary; documented in src/docs/envelope.md:127–135,170 under crates/mcp-server. | Preserve the distinction between parsing and resolution; no provisional absence is needed once parsing settles. | | Text misses blocked by reference resolution | D8, D10–D13, R2-9–R2-15 | new | crates/mcp-server/src/server.rs:633–750 passes names_only=true only for search_symbols, so empty search_text answers become index_incomplete during resolution_pending although text lookup needs no resolved refs; nonempty batch arms survive, explaining the mixed replies; cold parsing/reconciling remains a legitimate reason to defer absence. | Give lexical text misses the same resolution-only exemption as symbol names, while retaining parsing and eligibility settlement checks. | | Graph evidence deferred during resolution | R2-16–R2-20 | by design | crates/mcp-server/src/server.rs:633–750 qualifies missing seeds/empty callers during unsettled resolution; change_impact resolves seeds before traversing target_id edges at :22285–22370, and callers read resolved counts at :18145–18215; both need references for complete answers; src/docs/envelope.md:119–135 documents floors and negative refusals. | Keep floors on partial graph answers and refuse unsupported negative conclusions; these entries do not establish a new blanket refusal of all nonempty graphs. | | Metadata lines cannot seed symbol impact | D6 | known | #521: “Return per-seed impact answers/refusals for absent, stale or ambiguous seeds; support metadata/comment/import lines as disclosed file-level seeds.” Current change_impact resolves a symbol before graph access; the shared negative-evidence gate can replace its missing seed with index_incomplete; file eligibility needs no references, but transitive impact does. | Validate and disclose metadata/file seeds before graph settlement, then provide the already requested file-level impact contract. | | Pending coverage restart advice | D7 | not reproduced | No startup was forced: crates/mcp-server/src/server.rs:21676–21749 emits pending/eligibility_unavailable when no row and no eligibility proof exist; eligibility.rs:434,486,529–542 now separates discovery from resolution and says retry during startup, reserving restart for degraded; path eligibility needs no resolved refs. | Preserve the current lifecycle-specific remedy and its tests. | | Brace expansion in path filters | D2 | known | Same call returned unsupported_glob_syntax with two concrete alternatives; #521: “Support list-of-globs, trailing /** normalization and outline name-prefix filtering; coordinate aliases, common filters and diff limits with #570.” | Add the tracked list-of-globs support; retain explicit refusal until supported. | | Unbounded impact test-file list | D4 | known | Same path-line call returned 18 test_role_files despite limit=0 (the line now selects installed); crates/mcp-server/src/server.rs:22282 documents that exception; #521: “Design a bounded test run-set shape with total and one-call which-tests evidence; do not repeat the withdrawn limit=0 empty-list change. Complete semantics-key/disclosure registration and benchmark byte acceptance.” | Implement the tracked bounded run-set shape with totals and continuation; do not empty the file list merely because limit=0. | | Struct and impl share an ambiguous name | D5 | known | StoredPackage again returned ambiguous_symbol with struct at approval.rs:2463 and impl at :2553, candidate ids/path_line but no stable handles; #555: “Track wrong-target and missing-use work in #531/#536/#540, reply/discovery/review gaps in #521, foreign read-only attach in #559 and optional adoption hook in #571; retain not-ready-versus-absent settlement evidence.” This is the #536 ambiguity also identified in batch 19. | Address type/impl identity under #536 and offer durable candidate handles; never silently choose an unrelated shifted line. | | Argument and paging discovery | R2-2, R2-4, R2-5, R2-7, R2-8 | known | All five same calls returned unknown_argument with accepted names; review_diff also explains fixed-budget cursor paging; docs/mcp-arguments.md documents the schema; #521: “Meet the tool-list/instruction budgets; put orientation first in project_overview with optional admin detail/sections, and expose state, cost, limits and top_level_only guidance where agents look.” | Improve discovery of existing argument schemas and fixed paging; retain rejection of silently dropped filters. | | Symbol queries are literal prefixes | R2-3 | by design | Same alternation string returned symbol_not_found; search_symbols discovery explicitly specifies ASCII case-insensitive prefix matching and accepts a list of names already. | Use query:["installed","parse","warnings","known_language"]; no new list feature is needed. | | Coverage requires a file, not the root | R2-1 | by design | The integration-root call returned path_not_resolvable and “index_coverage answers about a FILE; this names the project root.” The file-coverage contract is described at crates/mcp-server/src/server.rs:20870–20874. | Use index_coverage("Cargo.toml") for provenance; an optional root-provenance convenience can be considered separately. | | Live source reads and worktree-local callers | D3, R2-6 | by design | Same source range read succeeded; Cargo.toml coverage was indexed/current; original worker id 13760 is absent here, as ids are project-local; resolving known_language_names_in locally then find_callers returned 2 resolved callers; tool discovery documents live reads, local ids and minimal-envelope provenance omission. | Preserve these positive contracts; reacquire ids in each project and use a full envelope only when explicit provenance is required. | | Outline pagination hides later containers | R2-21 | known | Same path/limit with required concise returned 266 symbols total, 67 rows, next_cursor and budget degradation; #521: “Support list-of-globs, trailing /** normalization and outline name-prefix filtering; coordinate aliases, common filters and diff limits with #570.” | Add the tracked outline name filter and advertise existing top_level_only/cursor controls; consider source-line or container starts. | | No supported daemon-stop command | Lead | new | code-index --help lists no stop/shutdown command, confirmed by Command in crates/cli/src/main.rs:49–183; daemon/lifecycle.rs:10–16 documents daemon.toml PID and daemon/main.rs:609–632 handles SIGTERM; neither remaining list names a stop command, and daemon-lifetime regression coverage in #555 is a different mechanism. | Add a root-scoped daemon stop command that verifies the registered daemon identity, requests graceful termination and waits for exit, replacing PID-file parsing in scripts. |
Author
Member

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_text refused while references resolve are the defect fixed on the train branch (a tool now states whether its absence needs resolved references).

Mechanism Entries Classification Evidence in one line Proposed change in one line
Root coverage requires a file r29-D1 known Same cwd-root probe returned path_not_resolvable; batch 20, “Coverage requires a file, not the root”: “index_coverage answers about a FILE; this names the project root.” Use a file probe; consider root provenance within the existing discovery work.
Negative navigation during parsing r29-D2, r30-D1 known Batch 20, “Negative symbol lookup during startup”: “parsing/reconciling can still add names; references are unnecessary”; server.rs:670–758 qualifies warming_up and empty/no_outline answers when eligibility.rs:172–179 marks parsing unsettled; neither text lookup nor outline declarations require resolved references; envelope.md:119–135,160–170 documents the gate. Keep parsing/discovery settlement distinct from resolution-only settlement and retain retry guidance.
Unregistered corpus and scratch roots r29-D3, r29-D10, r29-D14 known Both recorded corpus probes again returned path_outside_known_roots with only primary registered; #555: “Track wrong-target and missing-use work in #531/#536/#540, reply/discovery/review gaps in #521, foreign read-only attach in #559 and optional adoption hook in #571; retain not-ready-versus-absent settlement evidence.” The explicit read-only-root gap is #559. Deliver the tracked read-only attach workflow for corpus and scratch roots.
Live batched reads and worktree-local coverage r29-D4, r30-D2 known All three recorded ranges succeeded and server.rs coverage was current in this cwd; batch 20, “Live source reads and worktree-local callers”: “Same source range read succeeded; Cargo.toml coverage was indexed/current”; pending path reads need disk bytes, not resolved references, as documented by read_code discovery. Preserve live path reads, batched targets and project-local routing.
Unbounded impact test-file roster and contradictory zero-limit help r29-D5, r29-D13 known Batch 20, “Unbounded impact test-file list”: “returned 18 test_role_files despite limit=0”; #521: “Design a bounded test run-set shape with total and one-call which-tests evidence; do not repeat the withdrawn limit=0 empty-list change.” The same path-line seed now selected resolve_ref_targets_in_tx_observed and returned no test files; worker numeric ids refused index_incomplete here, so the original roster size was not reproduced; schema help still contradicts itself about limit=0. Implement the tracked bounded run-set shape and correct contradictory concise help; do not restore the withdrawn empty-list change.
Reference resolution blocks lexical text absence r29-D6, r29-D9, r30-D3, r30-D6 fixed on the train branch Accepted as already decided, without replay or further investigation: absence_requirement in crates/mcp-server/src/server.rs fixes reference-independent tools refused during resolution; these text answers need no resolved references. Retain the train fix and its settlement distinctions.
Discovery payload and concept-location cost r29-D7, r30-D5 known Tool metadata still serializes to 147107 characters for 23 tools; both recorded registry-search batches were replayed and project_overview did not name tool_router; #521: “Meet the tool-list/instruction budgets; put orientation first in project_overview with optional admin detail/sections, and expose state, cost, limits and top_level_only guidance where agents look.” Batch 20 calls this “Argument and paging discovery”; empty guesses during reconciling use the parsing gate above, not a reference requirement. Deliver bounded discovery and focused repository orientation; discover names before full schemas.
Brace glob refusal r29-D8 known Same review_diff call returned unsupported_glob_syntax and both alternative globs; batch 20, “Brace expansion in path filters”: “Same call returned unsupported_glob_syntax with two concrete alternatives”; #521: “Support list-of-globs, trailing /** normalization and outline name-prefix filtering; coordinate aliases, common filters and diff limits with #570.” Preserve explicit refusal and deliver the tracked list-of-globs support.
Historical path bytes are available r29-D11 not reproduced Both recorded diff calls returned review/classification data as expected; read_code with target server.rs:630-655, rev 172bcb20 and context_lines 0 returned exact historical source and resolved_commit 172bcb202a; #521 Done records historical path/range reads, while its remaining revision-by-symbol gap is different. Use read_code rev for historical file bytes and continue bounded ranges when truncated.
Classification degradation hides the failing producer r29-D12 known Both recorded diff calls again reported classification_degraded and an umbrella RPC/base-extraction hint without per-file failure details; #521: “Provide per-file continuation for omitted symbols, classification-degradation reason/producer/path/refusal, and a findings-only summary without duplicate member handles.” Expose the failed file, RPC and producer diagnostic alongside heuristic classification.
Missing base spans and aggregate review payload r30-D4 known Same include_hunks review produced 33 base_span_unavailable rows and about 86.6 KB of serialized tool output; server.rs:2747–2750 marks a modified symbol without a base span unavailable; #521: “Complete deleted/base-span/metadata/leading-comment hunk coverage and mark every omitted hunk per row; qualify with the zero-shell review benchmark.” Complete base-span coverage and bound aggregate concise review bytes with continuation.
Unsettled static reachability presented as untested r30-D7 known Same review returned untested_change with minimum_batch_resolution_rate_pct 0 and classification_degraded; server.rs:5788–5813 defines reachability through resolved references, so this evidence needs resolution, unlike text and outlines; #521: “Put unresolved/pending test reach next to untested_change or downgrade it; explain train-base scope and build-skew omissions so absent deleted rows are not read as no deletions.” Qualify or downgrade untested findings beside each affected row; passing runtime tests are separate evidence.
Exact structured records through matched lines r29-D15 by design Same search returned all seven records at lines 160–166 with lines_truncated false; search_text schema documents line_text as matching-line text with a 240-character per-line cap and max_lines_per_file as the census bound. Preserve this bounded structured-record workflow.
Default context consumes a bounded range read r29-D16 by design Same range served 147–153 with truncated true; read_code discovery documents default context_lines 3, approximately 4000 tokens, exact served bounds and continuation; the same range with context_lines 0 served 150–168 without truncation and included all seven records. Use the existing context_lines 0 control or a focused line_text search for metadata; no new zero-context option is needed.
## 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_text` refused while references resolve are the defect fixed on the train branch (a tool now states whether its absence needs resolved references). | Mechanism | Entries | Classification | Evidence in one line | Proposed change in one line | |---|---|---|---|---| | Root coverage requires a file | r29-D1 | known | Same cwd-root probe returned path_not_resolvable; batch 20, “Coverage requires a file, not the root”: “index_coverage answers about a FILE; this names the project root.” | Use a file probe; consider root provenance within the existing discovery work. | | Negative navigation during parsing | r29-D2, r30-D1 | known | Batch 20, “Negative symbol lookup during startup”: “parsing/reconciling can still add names; references are unnecessary”; server.rs:670–758 qualifies warming_up and empty/no_outline answers when eligibility.rs:172–179 marks parsing unsettled; neither text lookup nor outline declarations require resolved references; envelope.md:119–135,160–170 documents the gate. | Keep parsing/discovery settlement distinct from resolution-only settlement and retain retry guidance. | | Unregistered corpus and scratch roots | r29-D3, r29-D10, r29-D14 | known | Both recorded corpus probes again returned path_outside_known_roots with only primary registered; #555: “Track wrong-target and missing-use work in #531/#536/#540, reply/discovery/review gaps in #521, foreign read-only attach in #559 and optional adoption hook in #571; retain not-ready-versus-absent settlement evidence.” The explicit read-only-root gap is #559. | Deliver the tracked read-only attach workflow for corpus and scratch roots. | | Live batched reads and worktree-local coverage | r29-D4, r30-D2 | known | All three recorded ranges succeeded and server.rs coverage was current in this cwd; batch 20, “Live source reads and worktree-local callers”: “Same source range read succeeded; Cargo.toml coverage was indexed/current”; pending path reads need disk bytes, not resolved references, as documented by read_code discovery. | Preserve live path reads, batched targets and project-local routing. | | Unbounded impact test-file roster and contradictory zero-limit help | r29-D5, r29-D13 | known | Batch 20, “Unbounded impact test-file list”: “returned 18 test_role_files despite limit=0”; #521: “Design a bounded test run-set shape with total and one-call which-tests evidence; do not repeat the withdrawn limit=0 empty-list change.” The same path-line seed now selected resolve_ref_targets_in_tx_observed and returned no test files; worker numeric ids refused index_incomplete here, so the original roster size was not reproduced; schema help still contradicts itself about limit=0. | Implement the tracked bounded run-set shape and correct contradictory concise help; do not restore the withdrawn empty-list change. | | Reference resolution blocks lexical text absence | r29-D6, r29-D9, r30-D3, r30-D6 | fixed on the train branch | Accepted as already decided, without replay or further investigation: absence_requirement in crates/mcp-server/src/server.rs fixes reference-independent tools refused during resolution; these text answers need no resolved references. | Retain the train fix and its settlement distinctions. | | Discovery payload and concept-location cost | r29-D7, r30-D5 | known | Tool metadata still serializes to 147107 characters for 23 tools; both recorded registry-search batches were replayed and project_overview did not name tool_router; #521: “Meet the tool-list/instruction budgets; put orientation first in project_overview with optional admin detail/sections, and expose state, cost, limits and top_level_only guidance where agents look.” Batch 20 calls this “Argument and paging discovery”; empty guesses during reconciling use the parsing gate above, not a reference requirement. | Deliver bounded discovery and focused repository orientation; discover names before full schemas. | | Brace glob refusal | r29-D8 | known | Same review_diff call returned unsupported_glob_syntax and both alternative globs; batch 20, “Brace expansion in path filters”: “Same call returned unsupported_glob_syntax with two concrete alternatives”; #521: “Support list-of-globs, trailing /** normalization and outline name-prefix filtering; coordinate aliases, common filters and diff limits with #570.” | Preserve explicit refusal and deliver the tracked list-of-globs support. | | Historical path bytes are available | r29-D11 | not reproduced | Both recorded diff calls returned review/classification data as expected; read_code with target server.rs:630-655, rev 172bcb20 and context_lines 0 returned exact historical source and resolved_commit 172bcb202abea4ca78cc116c6865ee156a4afc41; #521 Done records historical path/range reads, while its remaining revision-by-symbol gap is different. | Use read_code rev for historical file bytes and continue bounded ranges when truncated. | | Classification degradation hides the failing producer | r29-D12 | known | Both recorded diff calls again reported classification_degraded and an umbrella RPC/base-extraction hint without per-file failure details; #521: “Provide per-file continuation for omitted symbols, classification-degradation reason/producer/path/refusal, and a findings-only summary without duplicate member handles.” | Expose the failed file, RPC and producer diagnostic alongside heuristic classification. | | Missing base spans and aggregate review payload | r30-D4 | known | Same include_hunks review produced 33 base_span_unavailable rows and about 86.6 KB of serialized tool output; server.rs:2747–2750 marks a modified symbol without a base span unavailable; #521: “Complete deleted/base-span/metadata/leading-comment hunk coverage and mark every omitted hunk per row; qualify with the zero-shell review benchmark.” | Complete base-span coverage and bound aggregate concise review bytes with continuation. | | Unsettled static reachability presented as untested | r30-D7 | known | Same review returned untested_change with minimum_batch_resolution_rate_pct 0 and classification_degraded; server.rs:5788–5813 defines reachability through resolved references, so this evidence needs resolution, unlike text and outlines; #521: “Put unresolved/pending test reach next to untested_change or downgrade it; explain train-base scope and build-skew omissions so absent deleted rows are not read as no deletions.” | Qualify or downgrade untested findings beside each affected row; passing runtime tests are separate evidence. | | Exact structured records through matched lines | r29-D15 | by design | Same search returned all seven records at lines 160–166 with lines_truncated false; search_text schema documents line_text as matching-line text with a 240-character per-line cap and max_lines_per_file as the census bound. | Preserve this bounded structured-record workflow. | | Default context consumes a bounded range read | r29-D16 | by design | Same range served 147–153 with truncated true; read_code discovery documents default context_lines 3, approximately 4000 tokens, exact served bounds and continuation; the same range with context_lines 0 served 150–168 without truncation and included all seven records. | Use the existing context_lines 0 control or a focused line_text search for metadata; no new zero-context option is needed. |
Author
Member

Dogfood 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 add disabling languages) and the lock hold recorded on #520.

Mechanism Entries Classification Evidence in one line Proposed change in one line
Reference-independent navigation refused during startup r33-D1, r33-D3, r34-D1, r35-D2, r35-D8, r37-D1 fixed on the train branch Accepted as already decided: all refused navigation tools are search_text, file_outline or search_symbols, each marked absence_requirement(false) in server.rs; envelope.md:160–170 lists them as independent of resolved references, while preserving parsing/discovery qualification. Retain the train fix and the distinction between parsing and reference resolution.
Worktree coverage provenance r33-D2 known Batch 20: “Same source range read succeeded; Cargo.toml coverage was indexed/current”; the harness coverage replay returned indexed but stale in this cwd, with provenance intentionally omitted by minimal, so the original worker root/head was not reverified. Preserve project-local coverage and use a provenance-bearing envelope when checking roots outside this constrained triage.
Live and batched path reads r34-D3, r35-D3 known Batch 21: “All three recorded ranges succeeded and server.rs coverage was current in this cwd”; both recorded read calls succeeded here, including all four batched ranges, with changed_since_indexed disclosure where applicable. Preserve live disk reads and bounded batched ranges during reconciliation.
Rust type and impl seed ambiguity r33-D4, r34-D2 known Batch 20: “Struct and impl share an ambiguous name”; identical calls again refused IndexRuntimeState with two candidates and RpcIndex with three, without analyzing siblings. Address type/impl identity under #536 and offer an explicit combined type seed without silently choosing a declaration.
One invalid impact seed blocks valid siblings r35-D4, r37-D2 known #521: “Return per-seed impact answers/refusals for absent, stale or ambiguous seeds”; cmd_remove again refused with two candidates, while correctness.rs:284 returned index_incomplete during reconciliation instead of reproducing its settled symbol_not_found. Return per-seed status and valid-seed impact; offer nearby declarations for uncovered positions without silently moving the seed.
Unqualified method ambiguity r34-D6 by design The identical invoke call again returned eight candidates; the change_impact discovery contract requires disambiguation, and its refusal documents qualified names; RpcIndex::invoke succeeded here. Use the existing qualified name or candidate id and project.
Unbounded zero-limit impact file roster r35-D6 known #521: “Design a bounded test run-set shape with total and one-call which-tests evidence; do not repeat the withdrawn limit=0 empty-list change”; the identical batch returned a 256-file roster for is_nested_checkout and disclosed missing numeric seed 20131; schema help still contradicts itself. Implement the tracked file-list budget and totals, and remove contradictory zero-limit advice without restoring the withdrawn behavior.
Numeric id expiry during edit loops r35-D7 known #521: “Identify stale numeric ids by generation and point to stable_handle for edit loops; retain the unreproduced expiry case on the watch list”; replaying 30581/30584 returned retryable index_incomplete here, so expiry itself was not reproduced. Retain the watch item and provide generation-aware stale-id guidance toward stable handles.
Graph evidence while references resolve r34-D4 by design The quoted review reports zero resolved reach with resolution_pending, and callers disclose name fallbacks and influence_unavailable; envelope.md:119–130,160–170 documents floors and incomplete-negative qualification for reference-dependent tools, with retry guidance. Retain the graph settlement guard and keep unresolved reach beside zero-impact findings, as already tracked in #521.
Directory coverage refusal and omitted provenance r35-D1 known Batch 20: “index_coverage answers about a FILE; this names the project root”; crates/cli again returned path_is_directory and advised a file probe; minimal explicitly omits answer_provenance, so that omission alone is not a new routing defect. Use Cargo.toml or another file for coverage; retain the existing discovery work for a root-provenance convenience.
Historical hook record points to a missing path r34-D5 new The identical coverage call returned path_not_found, and text search found only _prdoc/records/S-301-oneshot-convergence.md:50 naming hooks/blast_radius.py; the worker reports the installed hook under an excluded .claude directory, and neither Remaining list nor batch comment tracks this stale hook pointer. Clarify the historical path in the record and document how to locate the currently installed hook without implying that an excluded local installation is indexed.
Positive symbol-hunk review replays blocked by freshness r33-D5, r35-D5, r37-D5 not reproduced All four recorded review/changed-symbol calls with their original bases and path filters returned index_updating after the bounded wait, naming pending changed files; no hunk evidence was returned in this session. Preserve the recorded positive cases and replay after freshness settles; this triage does not establish a hunk regression.
Aggregate concise review cost and member handles r33-D6, L1 known #521: “Provide per-file continuation for omitted symbols, classification-degradation reason/producer/path/refusal, and a findings-only summary without duplicate member handles”; the whole-diff replay returned index_updating, so neither the reported token size nor handle width was measured here; discovery says changed_symbols concise omits stable_handle but review_diff retains it. Deliver bounded review payloads and omitted-hunk continuation, and remove duplicate member handles from findings-only output.
Brace alternatives in path filters L2 known The replay returned unsupported_glob_syntax with both concrete alternatives; #521: “Support list-of-globs, trailing /** normalization and outline name-prefix filtering”; batch 21 also records “Brace glob refusal.” Deliver the tracked list-of-globs support and retain the clear refusal until then.
Freshly edited review waits for current spans r35-D9 by design The recorded refusal is index_updating followed by a successful retry; replay again named three pending CLI test files, including config_writers.rs; changed_symbols/review_diff discovery documents the bounded freshness wait and same-call retry. Preserve the explicit freshness refusal and retry guidance rather than returning stale spans.
Measured fixture file and symbol census r37-D3 by design Replayed project-scoped Rust, TypeScript and C# globs returned totals 10/6/4 and lexical-scope symbol counts 3/3/4 with no extraction diagnostics; list_files discovery documents measured file counts and symbol populations. Preserve the combined census and explicit scan scope.
Repeated tool-discovery contract r37-D4 known #521: “Meet the tool-list/instruction budgets”; metadata discovery still serializes 23 code-index tool descriptions to 147135 characters and repeats the shared contract, reproducing the oversized discovery mechanism. Share the contract once, shorten per-tool discovery, and expose names before complete descriptions.
New worktree link appears without restarting MCP L3 by design The positive report depends on a live link change and was not recreated under the no-repository-write constraint; main.rs:289–294 documents served-set rederivation without restart, and :744 invokes derive_links again for refreshed configuration. Preserve live project-set refresh and its lifecycle disclosure.
## Dogfood 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 add` disabling languages) and the lock hold recorded on #520. | Mechanism | Entries | Classification | Evidence in one line | Proposed change in one line | |---|---|---|---|---| | Reference-independent navigation refused during startup | r33-D1, r33-D3, r34-D1, r35-D2, r35-D8, r37-D1 | fixed on the train branch | Accepted as already decided: all refused navigation tools are search_text, file_outline or search_symbols, each marked absence_requirement(false) in server.rs; envelope.md:160–170 lists them as independent of resolved references, while preserving parsing/discovery qualification. | Retain the train fix and the distinction between parsing and reference resolution. | | Worktree coverage provenance | r33-D2 | known | Batch 20: “Same source range read succeeded; Cargo.toml coverage was indexed/current”; the harness coverage replay returned indexed but stale in this cwd, with provenance intentionally omitted by minimal, so the original worker root/head was not reverified. | Preserve project-local coverage and use a provenance-bearing envelope when checking roots outside this constrained triage. | | Live and batched path reads | r34-D3, r35-D3 | known | Batch 21: “All three recorded ranges succeeded and server.rs coverage was current in this cwd”; both recorded read calls succeeded here, including all four batched ranges, with changed_since_indexed disclosure where applicable. | Preserve live disk reads and bounded batched ranges during reconciliation. | | Rust type and impl seed ambiguity | r33-D4, r34-D2 | known | Batch 20: “Struct and impl share an ambiguous name”; identical calls again refused IndexRuntimeState with two candidates and RpcIndex with three, without analyzing siblings. | Address type/impl identity under #536 and offer an explicit combined type seed without silently choosing a declaration. | | One invalid impact seed blocks valid siblings | r35-D4, r37-D2 | known | #521: “Return per-seed impact answers/refusals for absent, stale or ambiguous seeds”; cmd_remove again refused with two candidates, while correctness.rs:284 returned index_incomplete during reconciliation instead of reproducing its settled symbol_not_found. | Return per-seed status and valid-seed impact; offer nearby declarations for uncovered positions without silently moving the seed. | | Unqualified method ambiguity | r34-D6 | by design | The identical invoke call again returned eight candidates; the change_impact discovery contract requires disambiguation, and its refusal documents qualified names; RpcIndex::invoke succeeded here. | Use the existing qualified name or candidate id and project. | | Unbounded zero-limit impact file roster | r35-D6 | known | #521: “Design a bounded test run-set shape with total and one-call which-tests evidence; do not repeat the withdrawn limit=0 empty-list change”; the identical batch returned a 256-file roster for is_nested_checkout and disclosed missing numeric seed 20131; schema help still contradicts itself. | Implement the tracked file-list budget and totals, and remove contradictory zero-limit advice without restoring the withdrawn behavior. | | Numeric id expiry during edit loops | r35-D7 | known | #521: “Identify stale numeric ids by generation and point to stable_handle for edit loops; retain the unreproduced expiry case on the watch list”; replaying 30581/30584 returned retryable index_incomplete here, so expiry itself was not reproduced. | Retain the watch item and provide generation-aware stale-id guidance toward stable handles. | | Graph evidence while references resolve | r34-D4 | by design | The quoted review reports zero resolved reach with resolution_pending, and callers disclose name fallbacks and influence_unavailable; envelope.md:119–130,160–170 documents floors and incomplete-negative qualification for reference-dependent tools, with retry guidance. | Retain the graph settlement guard and keep unresolved reach beside zero-impact findings, as already tracked in #521. | | Directory coverage refusal and omitted provenance | r35-D1 | known | Batch 20: “index_coverage answers about a FILE; this names the project root”; crates/cli again returned path_is_directory and advised a file probe; minimal explicitly omits answer_provenance, so that omission alone is not a new routing defect. | Use Cargo.toml or another file for coverage; retain the existing discovery work for a root-provenance convenience. | | Historical hook record points to a missing path | r34-D5 | new | The identical coverage call returned path_not_found, and text search found only _prdoc/records/S-301-oneshot-convergence.md:50 naming hooks/blast_radius.py; the worker reports the installed hook under an excluded .claude directory, and neither Remaining list nor batch comment tracks this stale hook pointer. | Clarify the historical path in the record and document how to locate the currently installed hook without implying that an excluded local installation is indexed. | | Positive symbol-hunk review replays blocked by freshness | r33-D5, r35-D5, r37-D5 | not reproduced | All four recorded review/changed-symbol calls with their original bases and path filters returned index_updating after the bounded wait, naming pending changed files; no hunk evidence was returned in this session. | Preserve the recorded positive cases and replay after freshness settles; this triage does not establish a hunk regression. | | Aggregate concise review cost and member handles | r33-D6, L1 | known | #521: “Provide per-file continuation for omitted symbols, classification-degradation reason/producer/path/refusal, and a findings-only summary without duplicate member handles”; the whole-diff replay returned index_updating, so neither the reported token size nor handle width was measured here; discovery says changed_symbols concise omits stable_handle but review_diff retains it. | Deliver bounded review payloads and omitted-hunk continuation, and remove duplicate member handles from findings-only output. | | Brace alternatives in path filters | L2 | known | The replay returned unsupported_glob_syntax with both concrete alternatives; #521: “Support list-of-globs, trailing /** normalization and outline name-prefix filtering”; batch 21 also records “Brace glob refusal.” | Deliver the tracked list-of-globs support and retain the clear refusal until then. | | Freshly edited review waits for current spans | r35-D9 | by design | The recorded refusal is index_updating followed by a successful retry; replay again named three pending CLI test files, including config_writers.rs; changed_symbols/review_diff discovery documents the bounded freshness wait and same-call retry. | Preserve the explicit freshness refusal and retry guidance rather than returning stale spans. | | Measured fixture file and symbol census | r37-D3 | by design | Replayed project-scoped Rust, TypeScript and C# globs returned totals 10/6/4 and lexical-scope symbol counts 3/3/4 with no extraction diagnostics; list_files discovery documents measured file counts and symbol populations. | Preserve the combined census and explicit scan scope. | | Repeated tool-discovery contract | r37-D4 | known | #521: “Meet the tool-list/instruction budgets”; metadata discovery still serializes 23 code-index tool descriptions to 147135 characters and repeats the shared contract, reproducing the oversized discovery mechanism. | Share the contract once, shorten per-tool discovery, and expose names before complete descriptions. | | New worktree link appears without restarting MCP | L3 | by design | The positive report depends on a live link change and was not recreated under the no-repository-write constraint; main.rs:289–294 documents served-set rederivation without restart, and :744 invokes derive_links again for refreshed configuration. | Preserve live project-set refresh and its lifecycle disclosure. |
Author
Member

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.

Mechanism Entries Classification Evidence in one line Proposed change in one line
Reference-independent navigation refused during reconciliation r40-D1, r40-D7, r42-D1 (text), r43-D2, r43-D5, r44-D1, r44-D2, r36-D2, r36-D5 fixed on the train branch Nine entries, including two title-only reports; refused search_text, file_outline and search_symbols are absence_requirement(false) at server.rs:24369,22648,17748; envelope.md:160–170 documents reference independence; r42 impact is separate below. Retain the train fix and parsing/discovery qualification; the installed release still has this defect.
Reference-dependent graph settlement r42-D1 (impact), r38-D8 by design Quoted workflow impact refused index_incomplete with retryable:true; the surviving r38 title reports pending graph proxies; envelope.md:119–130,160–170 documents floors and reference-dependent negative refusals. Retry the same graph call after settlement; zero static reach while pending proves no absence.
Partial text inventory during parsing r41-D2 by design The recorded reply says reconciling and omitted source reads, without quoting a refused call; envelope.md:119–130 documents nonempty floor answers while the required population is unsettled. Retain partial-result disclosure; do not count an unquoted refusal as the resolution-only defect.
Live range reads, local coverage and positive symbol hunks r40-D2, r41-D4, r41-D5, r41-D10, r42-D2, r44-D4, r36-D1, r36-D6, r38-D6, r39-D2, r39-D12 known Batch 22: “Preserve live disk reads and bounded batched ranges during reconciliation”; all recorded range batches succeeded, support/mcp.rs coverage is current, and daemon/main.rs returns base/head plus deleted-function hunks; deleted lanes supply titles only. Preserve these working contracts and reacquire ids per project; minimal intentionally omits provenance.
Scratch files outside registered roots r40-D3, r40-D12 known #555: “foreign read-only attach in #559”; both exact scratch coverage probes returned path_outside_known_roots naming only integration. Deliver the tracked read-only scratch/corpus attachment workflow.
Oversized tool discovery r40-D4, r40-D10, r41-D8, r41-D13 known #521: “Meet the tool-list/instruction budgets”; discovery still contains 23 descriptions totaling 147135 serialized characters. Expose names and compact schemas before repeated usage contracts.
Directory and root coverage setup r40-D6, r41-D1, r43-D1, r39-D5 (directory) known Batch 20: “index_coverage answers about a FILE; this names the project root”; cwd-root and cli/src probes reproduce path_not_resolvable/path_is_directory; original sibling roots are outside this session; r43 pending file state was not recreated. Use a file probe; retain the tracked root-provenance discovery improvement.
Numeric ids expire and impact siblings receive inconsistent treatment r40-D8, r41-D11, r36-D4 known #521: “Identify stale numeric ids by generation” and “Return per-seed impact answers/refusals”; numeric replays returned index_incomplete rather than the workers’ symbol_not_found/missing_seeds; r36 supplies only its explicit partial-impact title. Use generation-aware ids and durable handles, with consistent per-seed statuses.
Caller fallback positive cannot reuse worker id r40-D9 not reproduced The identical find_callers(25748) returned retryable index_incomplete; it did not reproduce automatic.rs:165 or its name_fallback row; ids are project-local per discovery. Preserve the recorded fallback disclosure; reacquire Store::installed in this project before comparing callers.
Safe-delete positive cannot reuse worker ids r43-D4 not reproduced safe_delete(11098) returned retryable index_incomplete and 11099 returned symbol_not_found; neither reproduced the reported consumer roster or text safety net. Reacquire current ids before checking the positive case; no regression is established.
Unqualified rename helper is ambiguous r40-D11 by design Identical check_rename returned two declared_manifest candidates with id, project and path_line; its refusal explicitly documents retry with those or a qualified name. Use the supplied approval.rs path_line; no path-qualified seed feature is missing.
Brace alternatives in path filters r41-D3, r44-D3, r36-D3, r38-D2 known #521: “Support list-of-globs”; both exact search calls returned unsupported_glob_syntax and concrete split alternatives; the deleted-lane titles name the same mechanism. Deliver the tracked glob-list support and retain actionable refusal.
Static test reach misses subprocess and dynamic-import coverage r40-D5, r41-D6, r42-D4, r39-D7 known #521: “Put unresolved/pending test reach next to untested_change or downgrade it”; review still flags eight automatic.rs symbols despite changed subprocess tests, and reporter call has zero test population at 10.85% resolution; its test uses spec_from_file_location. Qualify each no-static-reach finding and track dynamic-import missing uses under #555’s #540 work; runtime coverage remains separate.
Missing paths get generic routing advice r41-D7, r41-D12 known #521: “Suggest same-basename paths, inline Rust modules and mod.rs/dir.rs pairs on missing paths; avoid routing advice when the root is correct”; both absent harness/common and tests/reactivate paths reproduce file_not_readable. Suggest support/mcp.rs and src/reactivate.rs without implying that the correct root is wrong.
Harness daemon build and launch profiles diverge r41-D9 new Recorded read replay succeeded; support/mcp.rs:260 selects the daemon beside mcp_bin(), store_home.rs:78 uses CARGO_BIN_EXE, but build_daemon at :340–374 runs cargo build without --release/profile; neither Remaining list nor supplied comments tracks this mismatch. Make the daemon builder and selected executable use the same profile; this is a harness defect exposed by correct source reads, not an MCP read failure.
One ambiguous impact seed blocks siblings r41-D14, r38-D5, r39-D3 known #521: “Return per-seed impact answers/refusals for absent, stale or ambiguous seeds”; replay of the exact two-name batch was blocked earlier by index_incomplete for the first name; the deleted-lane titles explicitly identify ambiguity. Return valid-seed impact alongside individual refusals; do not silently choose a declaration.
Diff freshness waits for current spans r41-D15 by design The quoted index_updating followed a bounded 3000ms wait and then succeeded; changed_symbols/review_diff discovery documents this freshness guard and same-call retry. Retain the bounded wait, named pending paths and retry guidance.
Argument and hidden batch-limit discovery r41-D16, r43-D3, r43-D6 (argument), r39-D5 (arguments), r39-D11 known Batch 20: “Argument and paging discovery”; exact read batch again refused with maxItems:8, and all seven recorded wrong-argument variants refused with accepted names; the read schema still lacks the eight-entry bound. Publish maxItems and callable argument schemas; retain rejection rather than silently dropping filters.
Misspelled literal hook name r41-D17 by design Exact six-query replay found five intended spellings and initially qualified the guessed spelling with index_incomplete; search_text discovery documents literal substring matching, with no fuzzy-name promise; the entry reports the real spelling includes TEST. Correct the literal spelling; optional spelling suggestions are a convenience, not missing literal matches.
Short query explicitly not searched r41-D18 by design Exact #[ replay retained text_scan.reliable:false, minimum_term_chars:3 and total_basis:not_searched, initially with index_incomplete too; search_text discovery documents the trigram floor. Use a longer literal or outline; preserve the explicit not-searched evidence.
Missing deletion, attribute, metadata and base hunks r41-D19, r41-D20, r43-D7, lead known #521: “Complete deleted/base-span/metadata/leading-comment hunk coverage”; lead replay reproduces internal_tool_err base_span_unavailable plus classification_degraded; r43 review has symbol-free workflow rows and diff_lines_unavailable on the const; r41 filters now match zero changed files. Complete hunk coverage and expose the failed base-extraction producer/path; do not infer no edit from an absent symbol hunk.
Shifted path-line seed selects its present occupant r41-D21, r39-D4 by design get_symbol discovery at server.rs:17963–17969 defines the smallest declaration covering the supplied position; the recorded old line selected struct Function; replay returned index_incomplete, and the registry path is now absent; r39 is title only. Use current ids or handles; an optional expected-name guard could detect stale caller anchors.
Symbol-free metadata has no impact seed r42-D3 known #521: “support metadata/comment/import lines as disclosed file-level seeds”; identical empty symbol_ids returned invalid_argument_value with minItems:1 rather than analyzing metadata. Document review_diff for existing metadata edits and deliver the tracked disclosed file-level impact seeds.
Workflow header reads return the requested comments r42-D5 by design All four identical ranges succeeded, including ci.yml’s long comment header; read_code discovery documents exact range bytes and caps, while search_text already locates trigger keys. Search for the trigger key before reading ranges; a YAML key outline is an optional convenience.
Comment-only symbol edit triggers untested_change r43-D6 (finding) new Exact review again flags CODE_INDEX_SKILL_MD; rev 77fbf1df at 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. Distinguish comment-only edits before issuing executable-test findings; retain their text review and hunks.
Concise review remains large and repeats handles r44-D5, r36-D7 known #521: “a findings-only summary without duplicate member handles” and “Bound batched read payloads and changed-symbol per-file summaries”; identical rpc_index review returned 17 changed symbols with hunks and findings; r36’s title explicitly reports diff size. Add tracked review filtering/budgets and continuation without losing omitted-symbol evidence.
Oversized outlines r39-D6 known Title only, but unambiguously the batch 20 mechanism “Outline pagination hides later containers”; #521: “outline name-prefix filtering”; no original path or call survives for replay. Deliver the tracked outline name filter and advertise top_level_only, concise and cursors.
Deleted notes with insufficient surviving detail r38-D1, r38-D3, r38-D4, r38-D7, r39-D1, r39-D8, r39-D9, r39-D10 title only, not triaged Only generic navigation/reconciliation, registry-text, restored-snapshot, setup/worktree, timeout-search and unresolved-impact titles survive; they do not identify the refused tool/state or enough evidence to assign a mechanism safely. Recover original calls/replies before classification; exclude these eight from the confirmed fixed-entry count.
## 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. | Mechanism | Entries | Classification | Evidence in one line | Proposed change in one line | |---|---|---|---|---| | Reference-independent navigation refused during reconciliation | r40-D1, r40-D7, r42-D1 (text), r43-D2, r43-D5, r44-D1, r44-D2, r36-D2, r36-D5 | fixed on the train branch | Nine entries, including two title-only reports; refused search_text, file_outline and search_symbols are absence_requirement(false) at server.rs:24369,22648,17748; envelope.md:160–170 documents reference independence; r42 impact is separate below. | Retain the train fix and parsing/discovery qualification; the installed release still has this defect. | | Reference-dependent graph settlement | r42-D1 (impact), r38-D8 | by design | Quoted workflow impact refused index_incomplete with retryable:true; the surviving r38 title reports pending graph proxies; envelope.md:119–130,160–170 documents floors and reference-dependent negative refusals. | Retry the same graph call after settlement; zero static reach while pending proves no absence. | | Partial text inventory during parsing | r41-D2 | by design | The recorded reply says reconciling and omitted source reads, without quoting a refused call; envelope.md:119–130 documents nonempty floor answers while the required population is unsettled. | Retain partial-result disclosure; do not count an unquoted refusal as the resolution-only defect. | | Live range reads, local coverage and positive symbol hunks | r40-D2, r41-D4, r41-D5, r41-D10, r42-D2, r44-D4, r36-D1, r36-D6, r38-D6, r39-D2, r39-D12 | known | Batch 22: “Preserve live disk reads and bounded batched ranges during reconciliation”; all recorded range batches succeeded, support/mcp.rs coverage is current, and daemon/main.rs returns base/head plus deleted-function hunks; deleted lanes supply titles only. | Preserve these working contracts and reacquire ids per project; minimal intentionally omits provenance. | | Scratch files outside registered roots | r40-D3, r40-D12 | known | #555: “foreign read-only attach in #559”; both exact scratch coverage probes returned path_outside_known_roots naming only integration. | Deliver the tracked read-only scratch/corpus attachment workflow. | | Oversized tool discovery | r40-D4, r40-D10, r41-D8, r41-D13 | known | #521: “Meet the tool-list/instruction budgets”; discovery still contains 23 descriptions totaling 147135 serialized characters. | Expose names and compact schemas before repeated usage contracts. | | Directory and root coverage setup | r40-D6, r41-D1, r43-D1, r39-D5 (directory) | known | Batch 20: “index_coverage answers about a FILE; this names the project root”; cwd-root and cli/src probes reproduce path_not_resolvable/path_is_directory; original sibling roots are outside this session; r43 pending file state was not recreated. | Use a file probe; retain the tracked root-provenance discovery improvement. | | Numeric ids expire and impact siblings receive inconsistent treatment | r40-D8, r41-D11, r36-D4 | known | #521: “Identify stale numeric ids by generation” and “Return per-seed impact answers/refusals”; numeric replays returned index_incomplete rather than the workers’ symbol_not_found/missing_seeds; r36 supplies only its explicit partial-impact title. | Use generation-aware ids and durable handles, with consistent per-seed statuses. | | Caller fallback positive cannot reuse worker id | r40-D9 | not reproduced | The identical find_callers(25748) returned retryable index_incomplete; it did not reproduce automatic.rs:165 or its name_fallback row; ids are project-local per discovery. | Preserve the recorded fallback disclosure; reacquire Store::installed in this project before comparing callers. | | Safe-delete positive cannot reuse worker ids | r43-D4 | not reproduced | safe_delete(11098) returned retryable index_incomplete and 11099 returned symbol_not_found; neither reproduced the reported consumer roster or text safety net. | Reacquire current ids before checking the positive case; no regression is established. | | Unqualified rename helper is ambiguous | r40-D11 | by design | Identical check_rename returned two declared_manifest candidates with id, project and path_line; its refusal explicitly documents retry with those or a qualified name. | Use the supplied approval.rs path_line; no path-qualified seed feature is missing. | | Brace alternatives in path filters | r41-D3, r44-D3, r36-D3, r38-D2 | known | #521: “Support list-of-globs”; both exact search calls returned unsupported_glob_syntax and concrete split alternatives; the deleted-lane titles name the same mechanism. | Deliver the tracked glob-list support and retain actionable refusal. | | Static test reach misses subprocess and dynamic-import coverage | r40-D5, r41-D6, r42-D4, r39-D7 | known | #521: “Put unresolved/pending test reach next to untested_change or downgrade it”; review still flags eight automatic.rs symbols despite changed subprocess tests, and reporter __call__ has zero test population at 10.85% resolution; its test uses spec_from_file_location. | Qualify each no-static-reach finding and track dynamic-import missing uses under #555’s #540 work; runtime coverage remains separate. | | Missing paths get generic routing advice | r41-D7, r41-D12 | known | #521: “Suggest same-basename paths, inline Rust modules and mod.rs/dir.rs pairs on missing paths; avoid routing advice when the root is correct”; both absent harness/common and tests/reactivate paths reproduce file_not_readable. | Suggest support/mcp.rs and src/reactivate.rs without implying that the correct root is wrong. | | Harness daemon build and launch profiles diverge | r41-D9 | new | Recorded read replay succeeded; support/mcp.rs:260 selects the daemon beside mcp_bin(), store_home.rs:78 uses CARGO_BIN_EXE, but build_daemon at :340–374 runs cargo build without --release/profile; neither Remaining list nor supplied comments tracks this mismatch. | Make the daemon builder and selected executable use the same profile; this is a harness defect exposed by correct source reads, not an MCP read failure. | | One ambiguous impact seed blocks siblings | r41-D14, r38-D5, r39-D3 | known | #521: “Return per-seed impact answers/refusals for absent, stale or ambiguous seeds”; replay of the exact two-name batch was blocked earlier by index_incomplete for the first name; the deleted-lane titles explicitly identify ambiguity. | Return valid-seed impact alongside individual refusals; do not silently choose a declaration. | | Diff freshness waits for current spans | r41-D15 | by design | The quoted index_updating followed a bounded 3000ms wait and then succeeded; changed_symbols/review_diff discovery documents this freshness guard and same-call retry. | Retain the bounded wait, named pending paths and retry guidance. | | Argument and hidden batch-limit discovery | r41-D16, r43-D3, r43-D6 (argument), r39-D5 (arguments), r39-D11 | known | Batch 20: “Argument and paging discovery”; exact read batch again refused with maxItems:8, and all seven recorded wrong-argument variants refused with accepted names; the read schema still lacks the eight-entry bound. | Publish maxItems and callable argument schemas; retain rejection rather than silently dropping filters. | | Misspelled literal hook name | r41-D17 | by design | Exact six-query replay found five intended spellings and initially qualified the guessed spelling with index_incomplete; search_text discovery documents literal substring matching, with no fuzzy-name promise; the entry reports the real spelling includes TEST. | Correct the literal spelling; optional spelling suggestions are a convenience, not missing literal matches. | | Short query explicitly not searched | r41-D18 | by design | Exact #[ replay retained text_scan.reliable:false, minimum_term_chars:3 and total_basis:not_searched, initially with index_incomplete too; search_text discovery documents the trigram floor. | Use a longer literal or outline; preserve the explicit not-searched evidence. | | Missing deletion, attribute, metadata and base hunks | r41-D19, r41-D20, r43-D7, lead | known | #521: “Complete deleted/base-span/metadata/leading-comment hunk coverage”; lead replay reproduces internal_tool_err base_span_unavailable plus classification_degraded; r43 review has symbol-free workflow rows and diff_lines_unavailable on the const; r41 filters now match zero changed files. | Complete hunk coverage and expose the failed base-extraction producer/path; do not infer no edit from an absent symbol hunk. | | Shifted path-line seed selects its present occupant | r41-D21, r39-D4 | by design | get_symbol discovery at server.rs:17963–17969 defines the smallest declaration covering the supplied position; the recorded old line selected struct Function; replay returned index_incomplete, and the registry path is now absent; r39 is title only. | Use current ids or handles; an optional expected-name guard could detect stale caller anchors. | | Symbol-free metadata has no impact seed | r42-D3 | known | #521: “support metadata/comment/import lines as disclosed file-level seeds”; identical empty symbol_ids returned invalid_argument_value with minItems:1 rather than analyzing metadata. | Document review_diff for existing metadata edits and deliver the tracked disclosed file-level impact seeds. | | Workflow header reads return the requested comments | r42-D5 | by design | All four identical ranges succeeded, including ci.yml’s long comment header; read_code discovery documents exact range bytes and caps, while search_text already locates trigger keys. | Search for the trigger key before reading ranges; a YAML key outline is an optional convenience. | | Comment-only symbol edit triggers untested_change | r43-D6 (finding) | new | Exact review again flags CODE_INDEX_SKILL_MD; rev 77fbf1df at 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. | Distinguish comment-only edits before issuing executable-test findings; retain their text review and hunks. | | Concise review remains large and repeats handles | r44-D5, r36-D7 | known | #521: “a findings-only summary without duplicate member handles” and “Bound batched read payloads and changed-symbol per-file summaries”; identical rpc_index review returned 17 changed symbols with hunks and findings; r36’s title explicitly reports diff size. | Add tracked review filtering/budgets and continuation without losing omitted-symbol evidence. | | Oversized outlines | r39-D6 | known | Title only, but unambiguously the batch 20 mechanism “Outline pagination hides later containers”; #521: “outline name-prefix filtering”; no original path or call survives for replay. | Deliver the tracked outline name filter and advertise top_level_only, concise and cursors. | | Deleted notes with insufficient surviving detail | r38-D1, r38-D3, r38-D4, r38-D7, r39-D1, r39-D8, r39-D9, r39-D10 | title only, not triaged | Only generic navigation/reconciliation, registry-text, restored-snapshot, setup/worktree, timeout-search and unresolved-impact titles survive; they do not identify the refused tool/state or enough evidence to assign a mechanism safely. | Recover original calls/replies before classification; exclude these eight from the confirmed fixed-entry count. |
Author
Member

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.

Mechanism Entries Classification Evidence in one line Proposed change in one line
Reference-independent navigation refused during resolution or reconciliation r41-D22, r45-D1 (outline), tier3bind-D2 fixed on the train branch Three entries; search_text and file_outline are explicitly absence_requirement(false) at crates/mcp-server/src/server.rs:24371 and :22650; crates/mcp-server/src/docs/envelope.md:163–170 documents independence from resolved references. Retain the train fix and parsing/discovery qualification; the installed release still has this defect.
Reference-dependent graph settlement r45-D1 (impact) by design Quoted change_impact refusal is index_incomplete during reconciling; crates/mcp-server/src/docs/envelope.md:119–130,163–170 documents incomplete-negative qualification for reference-dependent tools. Retry the same graph call after settlement and retain the retry hint.
Live source reads and local file coverage r41-D10, r41-D23, r45-D3 known Batch 21/comment 13429: “All three recorded ranges succeeded and server.rs coverage was current in this cwd”; both source-read calls succeeded here and support/mcp.rs is indexed/current; minimal omits provenance, so the original r41 root was not reverified. Preserve live batched ranges and current file coverage; use a provenance-bearing envelope when checking roots outside this constrained triage.
Numeric id expiry during edit loops r41-D11 known #521 Remaining: “Identify stale numeric ids by generation and point to stable_handle for edit loops”; exact batch now refuses symbol_not_found for 4272, rather than returning the worker’s missing_seeds and sibling results. Provide generation-aware stale-id guidance and consistent per-seed answers/refusals as already tracked.
Missing paths receive generic routing advice r41-D12 known #521 Remaining: “Suggest same-basename paths, inline Rust modules and mod.rs/dir.rs pairs on missing paths; avoid routing advice when the root is correct”; exact read again returns file_not_readable and root advice without src/reactivate.rs. Suggest the nearby src/reactivate.rs path and suppress irrelevant routing advice.
Oversized tool discovery r41-D13 known #521 Remaining: “Meet the tool-list/instruction budgets”; discovery still serializes 23 code-index tool descriptions to 147135 characters and repeats shared guidance, matching batch 22/comment 13489. Expose compact names and schemas before repeated usage documentation.
One invalid impact seed blocks valid siblings r41-D14 known #521 Remaining: “Return per-seed impact answers/refusals for absent, stale or ambiguous seeds”; quoted ambiguity withheld the valid sibling, while exact replay now stops at symbol_not_found for the first name before reaching inventory. Return valid-seed results alongside individual refusals without silently selecting ambiguous declarations.
Diff freshness waits for current spans r41-D15 by design Quoted index_updating followed a bounded 3000ms wait and succeeded on retry; changed_symbols/review_diff tool discovery documents the freshness guard and same-call retry. Preserve the bounded wait, pending-path disclosure and retry guidance.
Hidden read batch limit r41-D16 known Batch 20/comment 13417: “Argument and paging discovery”; the identical 41-target read refuses invalid_argument_value with maxItems:8, while callable read_code metadata still does not publish that bound. Publish the eight-target bound in the schema and discovery metadata.
Misspelled literal hook name r41-D17 by design Exact six-query replay returns five nonempty arms and measured total:0 for CODE_INDEX_PACKAGE_DISCOVERY_DELAY_MS; search_text discovery at server.rs:24372 documents literal substring matching, without a fuzzy-name promise. Correct the name to include TEST; optional spelling suggestions can remain a convenience.
Short query explicitly not searched r41-D18 by design Exact #[ replay returns text_scan.reliable:false, minimum_term_chars:3 and total_basis:not_searched; search_text discovery at server.rs:24372 documents the trigram floor. Use longer literals or an outline and preserve the not-searched disclosure.
Missing deletion and attribute hunks r41-D19, r41-D20 known #521 Remaining: “Complete deleted/base-span/metadata/leading-comment hunk coverage and mark every omitted hunk per row”; both exact changed_symbols replays now match zero of 44 changed files, so the recorded omissions were not reproduced in this diff. Complete tracked deletion and leading-attribute hunk coverage; never infer no edit from absent symbol hunks.
Shifted path-line seed selects its current occupant r41-D21 by design server.rs:17966 documents resolving the smallest symbol covering the supplied position; the worker reused an old line and selected struct Function; exact replay now returns symbol_not_found for that path-line. Use current ids or handles; an optional expected-name guard could detect stale caller anchors.
Pending static test reach presented as untested r45-D2 known #521 Remaining: “Put unresolved/pending test reach next to untested_change or downgrade it”; quoted review flags capacity_sample at minimum_batch_resolution_rate_pct:0.0 and resolution_pending, matching batch 21’s unsettled reach finding. Qualify or downgrade each pending untested_change finding; distinguish static reach from runtime coverage.
Unregistered corpus root cannot be read through MCP tier3bind-D1 known #555 Remaining: “foreign read-only attach in #559”; identical absolute read again returns path_outside_known_roots and lists only integration as primary. Deliver the tracked read-only corpus attachment workflow without requiring project-link edits.
Positive corpus CLI range reads cannot be replayed through MCP tier3bind-D3 not reproduced The entry uses CLI --root with --no-daemon; MCP read_code has no root override, and its equivalent absolute two-target batch returns entries_refused:2 with path_outside_known_roots rather than source ranges. Preserve the recorded CLI success and verify it separately when CLI execution is in scope; MCP parity belongs to the tracked #559 workflow.
## 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. | Mechanism | Entries | Classification | Evidence in one line | Proposed change in one line | |---|---|---|---|---| | Reference-independent navigation refused during resolution or reconciliation | r41-D22, r45-D1 (outline), tier3bind-D2 | fixed on the train branch | Three entries; search_text and file_outline are explicitly absence_requirement(false) at crates/mcp-server/src/server.rs:24371 and :22650; crates/mcp-server/src/docs/envelope.md:163–170 documents independence from resolved references. | Retain the train fix and parsing/discovery qualification; the installed release still has this defect. | | Reference-dependent graph settlement | r45-D1 (impact) | by design | Quoted change_impact refusal is index_incomplete during reconciling; crates/mcp-server/src/docs/envelope.md:119–130,163–170 documents incomplete-negative qualification for reference-dependent tools. | Retry the same graph call after settlement and retain the retry hint. | | Live source reads and local file coverage | r41-D10, r41-D23, r45-D3 | known | Batch 21/comment 13429: “All three recorded ranges succeeded and server.rs coverage was current in this cwd”; both source-read calls succeeded here and support/mcp.rs is indexed/current; minimal omits provenance, so the original r41 root was not reverified. | Preserve live batched ranges and current file coverage; use a provenance-bearing envelope when checking roots outside this constrained triage. | | Numeric id expiry during edit loops | r41-D11 | known | #521 Remaining: “Identify stale numeric ids by generation and point to stable_handle for edit loops”; exact batch now refuses symbol_not_found for 4272, rather than returning the worker’s missing_seeds and sibling results. | Provide generation-aware stale-id guidance and consistent per-seed answers/refusals as already tracked. | | Missing paths receive generic routing advice | r41-D12 | known | #521 Remaining: “Suggest same-basename paths, inline Rust modules and mod.rs/dir.rs pairs on missing paths; avoid routing advice when the root is correct”; exact read again returns file_not_readable and root advice without src/reactivate.rs. | Suggest the nearby src/reactivate.rs path and suppress irrelevant routing advice. | | Oversized tool discovery | r41-D13 | known | #521 Remaining: “Meet the tool-list/instruction budgets”; discovery still serializes 23 code-index tool descriptions to 147135 characters and repeats shared guidance, matching batch 22/comment 13489. | Expose compact names and schemas before repeated usage documentation. | | One invalid impact seed blocks valid siblings | r41-D14 | known | #521 Remaining: “Return per-seed impact answers/refusals for absent, stale or ambiguous seeds”; quoted ambiguity withheld the valid sibling, while exact replay now stops at symbol_not_found for the first name before reaching inventory. | Return valid-seed results alongside individual refusals without silently selecting ambiguous declarations. | | Diff freshness waits for current spans | r41-D15 | by design | Quoted index_updating followed a bounded 3000ms wait and succeeded on retry; changed_symbols/review_diff tool discovery documents the freshness guard and same-call retry. | Preserve the bounded wait, pending-path disclosure and retry guidance. | | Hidden read batch limit | r41-D16 | known | Batch 20/comment 13417: “Argument and paging discovery”; the identical 41-target read refuses invalid_argument_value with maxItems:8, while callable read_code metadata still does not publish that bound. | Publish the eight-target bound in the schema and discovery metadata. | | Misspelled literal hook name | r41-D17 | by design | Exact six-query replay returns five nonempty arms and measured total:0 for CODE_INDEX_PACKAGE_DISCOVERY_DELAY_MS; search_text discovery at server.rs:24372 documents literal substring matching, without a fuzzy-name promise. | Correct the name to include TEST; optional spelling suggestions can remain a convenience. | | Short query explicitly not searched | r41-D18 | by design | Exact #[ replay returns text_scan.reliable:false, minimum_term_chars:3 and total_basis:not_searched; search_text discovery at server.rs:24372 documents the trigram floor. | Use longer literals or an outline and preserve the not-searched disclosure. | | Missing deletion and attribute hunks | r41-D19, r41-D20 | known | #521 Remaining: “Complete deleted/base-span/metadata/leading-comment hunk coverage and mark every omitted hunk per row”; both exact changed_symbols replays now match zero of 44 changed files, so the recorded omissions were not reproduced in this diff. | Complete tracked deletion and leading-attribute hunk coverage; never infer no edit from absent symbol hunks. | | Shifted path-line seed selects its current occupant | r41-D21 | by design | server.rs:17966 documents resolving the smallest symbol covering the supplied position; the worker reused an old line and selected struct Function; exact replay now returns symbol_not_found for that path-line. | Use current ids or handles; an optional expected-name guard could detect stale caller anchors. | | Pending static test reach presented as untested | r45-D2 | known | #521 Remaining: “Put unresolved/pending test reach next to untested_change or downgrade it”; quoted review flags capacity_sample at minimum_batch_resolution_rate_pct:0.0 and resolution_pending, matching batch 21’s unsettled reach finding. | Qualify or downgrade each pending untested_change finding; distinguish static reach from runtime coverage. | | Unregistered corpus root cannot be read through MCP | tier3bind-D1 | known | #555 Remaining: “foreign read-only attach in #559”; identical absolute read again returns path_outside_known_roots and lists only integration as primary. | Deliver the tracked read-only corpus attachment workflow without requiring project-link edits. | | Positive corpus CLI range reads cannot be replayed through MCP | tier3bind-D3 | not reproduced | The entry uses CLI --root with --no-daemon; MCP read_code has no root override, and its equivalent absolute two-target batch returns entries_refused:2 with path_outside_known_roots rather than source ranges. | Preserve the recorded CLI success and verify it separately when CLI execution is in scope; MCP parity belongs to the tracked #559 workflow. |
Author
Member

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.

Mechanism Entries Classification Evidence in one line Proposed change in one line
Host-version change prevents recorded activation recovery 2026-11-08 field report (a) new Same five packages and digests reportedly produce no_match among 17 candidates and a roughly 12-minute re-extract on each version change; no open remaining-scope line covers recovery across host versions. Reproduce with unchanged packages across a host upgrade; recover a compatible recorded activation and report the exact identity mismatch otherwise.
Upgrade silently retains older running daemon 2026-11-08 field report (b) new Reporter says the MCP continues speaking to the old daemon after upgrade; no open remaining-scope line covers daemon replacement or version mismatch disclosure. Negotiate versions and replace or clearly disclose the old daemon with a safe upgrade path.
Search uses stale positions with live text integ merge; L2 R3 D5 and R4 D4; L3 R4; r46 R3 new L2 reports write_all(&wire) hits whose returned current line text is unrelated, with lag disclosed; integ saw conflict markers missed and stale spans. Recompute positions against the served bytes or withhold stale hits and line text until current.
Attribute and deletion edits omit changed symbols or test files r41review D7; r41-round3 D19, D26 new An added cfg omitted a known test without omission disclosure; a deletion returned symbols=[], and a changed test file was omitted from review. #521's hunk scope does not establish symbol-recall coverage. Map leading attributes and zero-head-line deletions to affected declarations and disclose any unmapped changed file.
List supplied to scalar kind silently matches nothing lead-D1 new kind=[enum,function] was accepted as a string-like filter and emptied all three batches despite matching enum and function symbols. Validate the scalar shape with an actionable refusal or explicitly implement OR-list semantics.
Repeated freshness refusal suggests indexed paths are never indexed L2 R5 final retries new Repeated index_updating advice said paths were never indexed while coverage reported indexed, stale, reconciling and requeued. Distinguish pending indexed files from permanently unindexed paths in retry guidance.
Large outline cannot jump to tail or expose file length L1 1 new Outline returned 75 of 242 declarations and no total line count; reaching the tail required paging or another search. Offer total lines and bounded tail or reverse pagination for outlines.
Degraded diff classification lacks independent producer rationale L1 6 new changed_symbols returned classification_degraded=true during resolution pending although the reporter expected per-file extraction to suffice; no remaining line requires avoiding unnecessary degradation. Determine whether classification actually depends on resolution and avoid degradation when its per-file inputs are ready.
Reference-independent searches refused during resolution r41-round3 D22; r46 rounds 1–3; r47 rounds 1–2; L2 initial; L3 initial; L4 rounds 1–3; integ merge fixed on the train branch Batch 24 recorded the train's absence_requirement(false) for text and outline; these logs report installed-tool index_incomplete while resolution was pending. Retain and qualify the train fix, including startup and parsing readiness; do not treat an incomplete result as absence.
Missing review hunks race587; r41review D2; r41-round3 D20; r46; r47; review1115; xrev-r47 known #521 Remaining: “Complete deleted/base-span/metadata/leading-comment hunk coverage and mark every omitted hunk per row”; reviewers recorded base_span_unavailable and diff_lines_unavailable. Deliver the tracked before/after hunk coverage and explicit omission markers.
Historical diff cannot select an end revision r41review D4; review1115 new Base/current-tree review cannot isolate an older commit or inspect an unmerged end commit; historical path reads do not provide a historical diff. Add an optional explicit head revision to diff review, retaining the working-tree default.
Impact batch loses valid siblings r41-round3 D14, D28; L2 R3 D4; L3 initial; r47 R2 known #521 Remaining: “Return per-seed impact answers/refusals for absent, stale or ambiguous seeds”; ambiguous or pending seeds blocked valid siblings. Return independent results and refusals for each seed, including metadata and import seeds.
Stale numeric handles r41-round3 D11 known #521 Remaining: “Identify stale numeric ids by generation and point to stable_handle for edit loops”; reverted edits yielded missing seeds. Surface stale generations and stable-handle recovery.
Missing paths offer generic routing guidance r41-round3 D7, D12; L1 2; L2 initial and R4 D2; L4 R2 known #521 Remaining: “Suggest same-basename paths, inline Rust modules and mod.rs/dir.rs pairs on missing paths; avoid routing advice when the root is correct”; guessed paths received generic root hints. Suggest nearby indexed files and suppress irrelevant root advice.
Worktree alias or root provenance friction race587; r41-round3 D1; L1 4; L2 R3 setup; r41review D1 known #521 Remaining: “Cover existing-worktree project_not_found hints and owning-project routing for absolute paths”; race587's requested alias was refused and an r41 root probe required a file. Improve worktree discovery and root-level provenance probes while preserving successful full-envelope provenance.
Foreign corpus roots unavailable to MCP L1 5; L3 rounds 1–3 known #555 Remaining: “foreign read-only attach in #559”; corpus reads outside primary required bounded external reads. Provide the tracked ad-hoc read-only attachment and bounded source facts.
Oversized discovery and repeated minimal prose race587; r41-round3 D8, D13, D30; r47 R2; L4 startup known #521 Remaining: “Meet the tool-list/instruction budgets”; discovery was about 38k tokens and minimal batches repeated advisory prose. Publish compact discovery and hoist repeated advice once per response.
Read batch capacity not advertised r41review D3; r41-round3 D16; L2 R3 D2 known #521 Remaining: “expose state, cost, limits and top_level_only guidance where agents look”; #570 S3 also identifies maxItems as open, and nine or more reads refused at eight. Publish the actual eight-item bound in the callable schema and reference.
Static review labels unmeasured test reach untested r41-round3 D6; r46; r47 R2; L2 rounds 1–5; L3 rounds 1–3; L4 rounds 1–4 known #521 Remaining: “Put unresolved/pending test reach next to untested_change or downgrade it”; several reviews flagged exercised functions at 0% resolution. Qualify each finding as a static floor or downgrade it while test reach is pending.
Path-only search hit lacks origin L1 3 known #521 Remaining: “Keep the full match in snippets, locate $ names, add exclude_tests and label path-only matches”; path hit said literal_absent_from_body. Label path-column matches explicitly.
Multi-path glob requests refused r41-round3 D3; r46; r47; integ; L2 R5; L4 R3 known #521 Remaining: “Support list-of-globs, trailing /** normalization and outline name-prefix filtering”; brace globs were refused with a useful SQLite explanation. Support an explicit list of globs with bounded union semantics.
Line inventory truncates within files r41review D6 known #521 Remaining: “Measure OR/AND line censuses and union literal arms with per-arm labels”; one query disclosed truncated per-file matches without a next cursor. Provide bounded per-file continuation for complete literal inventories.
Argument aliases and diff limits L2 R2 and R5 D1; L4 initial known #570 Remaining: “Complete eleven planned lang/path_glob filter cells, additive aliases and diff limits”; path, symbol, file and review limit were refused with suggestions. Coordinate compatible aliases and applicable diff controls with the argument registry.
Incomplete graph reach during settlement r41-round3 D25; r46; r47; integ; L2 R3 D3 and R4; L3 rounds 1–4; L4 rounds 2–5 by design Reports disclose pending resolution, unresolved references and floor measurements; zero affected is not proof of no callers. Preserve the floor and retry disclosures and corroborate consequential impact with text and source.
Freshness guard refuses active edits r41-round3 D15; r46; integ; L2 rounds 1–5; L3 R3–4; L4 rounds 1, 4–5 by design review_diff waited 3000 ms and returned index_updating for changing files; subsequent calls commonly succeeded. Preserve bounded waits and current-source reads; retry once indexing settles.
Literal search, invalid inputs and unsupported caller guesses r41-round3 D17, D18, D21; r46 filtered batch; L2 R3 D1 and R4 D1/D5; L4 R5 by design Short query was explicitly not searched; typo, empty query, stale path-line, snapshot-changed cursor and filtered zeros were disclosed or were caller errors. Use valid literals, current anchors and list_files for path-only discovery; preserve clear refusals.
Partial reads, provenance and historical reads work r41review D1, D5; r41-round3 D4, D5, D10, D23, D24, D27, D29; r46 initial; L2 R3 positive; L4 R2; xrev-r47 by design Reports show live bytes with pending disclosure, successful bounded historical reads and resolved commits, and correct worktree provenance. Preserve live and revision reads and use a provenance-bearing envelope when verifying routing.
Instruction-file shell reads skipped the index r46 rounds 3–4; r47 R2; L2 R3 D6 and R4; L4 rounds 2–3 by design Workers explicitly skipped available read_code or list_files rather than encountering a tool refusal; #571 Remaining: “Choose measurement scope and run a pilot before claiming adoption”. Read tracked instructions through the index and include this adoption behavior in the measured pilot.
Test harness profile and registry naming observations r41-round3 D9; r47 R2 by design The test harness chose a release sibling despite a debug build command; registry correctly rejected names lacking its required marker, then workers corrected them. Keep harness build/spawn profile selection explicit and retain registry naming diagnostics.

New, proposed as issues

  • Recover recorded activations when only the host version changes.
  • Detect and handle an older running daemon after an upgrade.
  • Keep search hits and returned line text on the same source snapshot.
  • Include declarations and test files affected by attribute-only and deletion-only changes.
  • Reject unsupported list shapes for scalar symbol-kind filters.
  • Correct retry advice for indexed files awaiting reconciliation.
  • Add file length and tail access to large outlines.
  • Avoid unnecessary diff classification degradation during reference resolution.
  • Support an explicit end revision for diff review.
## 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. | Mechanism | Entries | Classification | Evidence in one line | Proposed change in one line | |---|---|---|---|---| | Host-version change prevents recorded activation recovery | 2026-11-08 field report (a) | new | Same five packages and digests reportedly produce `no_match` among 17 candidates and a roughly 12-minute re-extract on each version change; no open remaining-scope line covers recovery across host versions. | Reproduce with unchanged packages across a host upgrade; recover a compatible recorded activation and report the exact identity mismatch otherwise. | | Upgrade silently retains older running daemon | 2026-11-08 field report (b) | new | Reporter says the MCP continues speaking to the old daemon after upgrade; no open remaining-scope line covers daemon replacement or version mismatch disclosure. | Negotiate versions and replace or clearly disclose the old daemon with a safe upgrade path. | | Search uses stale positions with live text | integ merge; L2 R3 D5 and R4 D4; L3 R4; r46 R3 | new | L2 reports `write_all(&wire)` hits whose returned current line text is unrelated, with lag disclosed; integ saw conflict markers missed and stale spans. | Recompute positions against the served bytes or withhold stale hits and line text until current. | | Attribute and deletion edits omit changed symbols or test files | r41review D7; r41-round3 D19, D26 | new | An added cfg omitted a known test without omission disclosure; a deletion returned `symbols=[]`, and a changed test file was omitted from review. #521's hunk scope does not establish symbol-recall coverage. | Map leading attributes and zero-head-line deletions to affected declarations and disclose any unmapped changed file. | | List supplied to scalar kind silently matches nothing | lead-D1 | new | `kind=[enum,function]` was accepted as a string-like filter and emptied all three batches despite matching enum and function symbols. | Validate the scalar shape with an actionable refusal or explicitly implement OR-list semantics. | | Repeated freshness refusal suggests indexed paths are never indexed | L2 R5 final retries | new | Repeated `index_updating` advice said paths were never indexed while coverage reported indexed, stale, reconciling and requeued. | Distinguish pending indexed files from permanently unindexed paths in retry guidance. | | Large outline cannot jump to tail or expose file length | L1 1 | new | Outline returned 75 of 242 declarations and no total line count; reaching the tail required paging or another search. | Offer total lines and bounded tail or reverse pagination for outlines. | | Degraded diff classification lacks independent producer rationale | L1 6 | new | `changed_symbols` returned `classification_degraded=true` during resolution pending although the reporter expected per-file extraction to suffice; no remaining line requires avoiding unnecessary degradation. | Determine whether classification actually depends on resolution and avoid degradation when its per-file inputs are ready. | | Reference-independent searches refused during resolution | r41-round3 D22; r46 rounds 1–3; r47 rounds 1–2; L2 initial; L3 initial; L4 rounds 1–3; integ merge | fixed on the train branch | Batch 24 recorded the train's `absence_requirement(false)` for text and outline; these logs report installed-tool `index_incomplete` while resolution was pending. | Retain and qualify the train fix, including startup and parsing readiness; do not treat an incomplete result as absence. | | Missing review hunks | race587; r41review D2; r41-round3 D20; r46; r47; review1115; xrev-r47 | known | #521 Remaining: “Complete deleted/base-span/metadata/leading-comment hunk coverage and mark every omitted hunk per row”; reviewers recorded `base_span_unavailable` and `diff_lines_unavailable`. | Deliver the tracked before/after hunk coverage and explicit omission markers. | | Historical diff cannot select an end revision | r41review D4; review1115 | new | Base/current-tree review cannot isolate an older commit or inspect an unmerged end commit; historical path reads do not provide a historical diff. | Add an optional explicit head revision to diff review, retaining the working-tree default. | | Impact batch loses valid siblings | r41-round3 D14, D28; L2 R3 D4; L3 initial; r47 R2 | known | #521 Remaining: “Return per-seed impact answers/refusals for absent, stale or ambiguous seeds”; ambiguous or pending seeds blocked valid siblings. | Return independent results and refusals for each seed, including metadata and import seeds. | | Stale numeric handles | r41-round3 D11 | known | #521 Remaining: “Identify stale numeric ids by generation and point to stable_handle for edit loops”; reverted edits yielded missing seeds. | Surface stale generations and stable-handle recovery. | | Missing paths offer generic routing guidance | r41-round3 D7, D12; L1 2; L2 initial and R4 D2; L4 R2 | known | #521 Remaining: “Suggest same-basename paths, inline Rust modules and mod.rs/dir.rs pairs on missing paths; avoid routing advice when the root is correct”; guessed paths received generic root hints. | Suggest nearby indexed files and suppress irrelevant root advice. | | Worktree alias or root provenance friction | race587; r41-round3 D1; L1 4; L2 R3 setup; r41review D1 | known | #521 Remaining: “Cover existing-worktree project_not_found hints and owning-project routing for absolute paths”; race587's requested alias was refused and an r41 root probe required a file. | Improve worktree discovery and root-level provenance probes while preserving successful full-envelope provenance. | | Foreign corpus roots unavailable to MCP | L1 5; L3 rounds 1–3 | known | #555 Remaining: “foreign read-only attach in #559”; corpus reads outside primary required bounded external reads. | Provide the tracked ad-hoc read-only attachment and bounded source facts. | | Oversized discovery and repeated minimal prose | race587; r41-round3 D8, D13, D30; r47 R2; L4 startup | known | #521 Remaining: “Meet the tool-list/instruction budgets”; discovery was about 38k tokens and minimal batches repeated advisory prose. | Publish compact discovery and hoist repeated advice once per response. | | Read batch capacity not advertised | r41review D3; r41-round3 D16; L2 R3 D2 | known | #521 Remaining: “expose state, cost, limits and top_level_only guidance where agents look”; #570 S3 also identifies `maxItems` as open, and nine or more reads refused at eight. | Publish the actual eight-item bound in the callable schema and reference. | | Static review labels unmeasured test reach untested | r41-round3 D6; r46; r47 R2; L2 rounds 1–5; L3 rounds 1–3; L4 rounds 1–4 | known | #521 Remaining: “Put unresolved/pending test reach next to untested_change or downgrade it”; several reviews flagged exercised functions at 0% resolution. | Qualify each finding as a static floor or downgrade it while test reach is pending. | | Path-only search hit lacks origin | L1 3 | known | #521 Remaining: “Keep the full match in snippets, locate $ names, add exclude_tests and label path-only matches”; path hit said `literal_absent_from_body`. | Label path-column matches explicitly. | | Multi-path glob requests refused | r41-round3 D3; r46; r47; integ; L2 R5; L4 R3 | known | #521 Remaining: “Support list-of-globs, trailing /** normalization and outline name-prefix filtering”; brace globs were refused with a useful SQLite explanation. | Support an explicit list of globs with bounded union semantics. | | Line inventory truncates within files | r41review D6 | known | #521 Remaining: “Measure OR/AND line censuses and union literal arms with per-arm labels”; one query disclosed truncated per-file matches without a next cursor. | Provide bounded per-file continuation for complete literal inventories. | | Argument aliases and diff limits | L2 R2 and R5 D1; L4 initial | known | #570 Remaining: “Complete eleven planned lang/path_glob filter cells, additive aliases and diff limits”; `path`, `symbol`, `file` and review `limit` were refused with suggestions. | Coordinate compatible aliases and applicable diff controls with the argument registry. | | Incomplete graph reach during settlement | r41-round3 D25; r46; r47; integ; L2 R3 D3 and R4; L3 rounds 1–4; L4 rounds 2–5 | by design | Reports disclose pending resolution, unresolved references and floor measurements; zero affected is not proof of no callers. | Preserve the floor and retry disclosures and corroborate consequential impact with text and source. | | Freshness guard refuses active edits | r41-round3 D15; r46; integ; L2 rounds 1–5; L3 R3–4; L4 rounds 1, 4–5 | by design | `review_diff` waited 3000 ms and returned `index_updating` for changing files; subsequent calls commonly succeeded. | Preserve bounded waits and current-source reads; retry once indexing settles. | | Literal search, invalid inputs and unsupported caller guesses | r41-round3 D17, D18, D21; r46 filtered batch; L2 R3 D1 and R4 D1/D5; L4 R5 | by design | Short query was explicitly not searched; typo, empty query, stale path-line, snapshot-changed cursor and filtered zeros were disclosed or were caller errors. | Use valid literals, current anchors and list_files for path-only discovery; preserve clear refusals. | | Partial reads, provenance and historical reads work | r41review D1, D5; r41-round3 D4, D5, D10, D23, D24, D27, D29; r46 initial; L2 R3 positive; L4 R2; xrev-r47 | by design | Reports show live bytes with pending disclosure, successful bounded historical reads and resolved commits, and correct worktree provenance. | Preserve live and revision reads and use a provenance-bearing envelope when verifying routing. | | Instruction-file shell reads skipped the index | r46 rounds 3–4; r47 R2; L2 R3 D6 and R4; L4 rounds 2–3 | by design | Workers explicitly skipped available `read_code` or `list_files` rather than encountering a tool refusal; #571 Remaining: “Choose measurement scope and run a pilot before claiming adoption”. | Read tracked instructions through the index and include this adoption behavior in the measured pilot. | | Test harness profile and registry naming observations | r41-round3 D9; r47 R2 | by design | The test harness chose a release sibling despite a debug build command; registry correctly rejected names lacking its required marker, then workers corrected them. | Keep harness build/spawn profile selection explicit and retain registry naming diagnostics. | ### New, proposed as issues - Recover recorded activations when only the host version changes. - Detect and handle an older running daemon after an upgrade. - Keep search hits and returned line text on the same source snapshot. - Include declarations and test files affected by attribute-only and deletion-only changes. - Reject unsupported list shapes for scalar symbol-kind filters. - Correct retry advice for indexed files awaiting reconciliation. - Add file length and tail access to large outlines. - Avoid unnecessary diff classification degradation during reference resolution. - Support an explicit end revision for diff review.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
h-dv/code-index#521
No description provided.