v0.41.50: module evidence for qualified references, one argument contract, one extraction census #574

Merged
buildagent merged 137 commits from integration-1111 into master 2026-11-12 11:04:34 +01:00
Member

Release train for v0.41.50. Seven lanes, each reviewed from its diff and re-run by the lead, integrated on integration-1111.

What changes for a user

  • Resolution (#566). A qualified reference is not bound across files on name evidence when the file's imports or module declarations contradict the candidate; where module evidence names one candidate, it is bound. Against the last release on the nine pinned repositories: 19 binds removed (all wrong before), 228 added (every candidate addition audited; a blind second audit of 65 rows agrees), 1 retargeted, 133 rule-retagged.
  • MCP arguments (#570). One policy per argument drives the published schema, the runtime check and the error. invalid_argument_value replaces ten older codes; the four malformed-argument codes share one field set. Every other error body is unchanged and nineteen are compared with bodies recorded from the last release. Reference: docs/mcp-arguments.md, checked against the schema both ways.
  • Incomplete extraction (#545, host side). One census behind project_overview, resolution_gaps, index_coverage, list_files and evidence_gaps; host refusals are counted; non-UTF-8 source files are recorded as content_refused.
  • Small fixes. read_code with rev for a path whose directory is gone (#568); application/json on every JSON resource (#569); code-index query on an invalid configuration prints the refusal and exits 1; search_text on a permanently excluded literal path says so (#521); installer check reports a code-index elsewhere on PATH, and the release notes' build line names the run's tag (#572).

Behaviour changes to call out

  • Scripts matching invalid_max_depth, invalid_token_budget, invalid_direction, invalid_role_filter, invalid_ref_kind, invalid_resolution, invalid_response_format, empty_seeds, too_many_seeds or invalid_arguments need invalid_argument_value.
  • code-index query with an invalid .code-index.toml: exit 1 with a JSON refusal (was exit 2, no output).

Evidence

  • Content, cost and stage baselines are blessed in one commit; each reason carries the bind account or the attribution. Content movement (rust-ripgrep +18, ts-zod +13, js-express +1, php-guzzle −2) equals the audited account.
  • Cost against the last release: VM steps +0.7 % to +1.7 % on seven repositories, −14.0 % on ts-zod, −2.5 % on rust-analyzer; full scans +0.7 % to +2.0 %. Two costs were attributed per statement and removed before the bless (five module-evidence statements; one capability check that flipped a plan). The nine bind accounts are byte-identical across every reduction.
  • Every package-supplied input of the new rules passes a capability grant; the pool, ref-kind and visibility registries are updated and a test shows an import without reachability_anchor cannot disambiguate a pool.
  • tools/list 59,167 bytes (ceiling 59,311), skill resource 3,949 tokens (ceiling 4,000); no ceiling was raised.

Qualification

One full gate run on 05ea92f9 (empty package store), 43 steps: 40 green at once, three red, each attributed, fixed in its own commit and its step re-run green.

Step Cause Fix
agent_bench A change in this train (713b1423) emptied change_impact's test_role_files at limit: 0; the benchmark's which-tests questions use that call. Recall 1.000 → 0.974 (rust-ripgrep), 0.970 (python-flask). 3339b685 restores the release behaviour and keeps witness_paths_total. Mutation run red, restored green. Recall 38/38 and 33/33.
tier3 Record not re-recorded with the other baselines. Drift equals the audited account: rust-analyzer +179 resolved (194 added, 15 removed), 120 retagged; py-django 6 retagged. 7db6ebbe bless with the account as reason; green without the bless flag.
pkg_javascript_full Declared unbound-by-scope 42, measured 41 on js-express. One site left the set: test/app.request.js:12:19, a write the builtin bound to an unrelated local; the host now refuses it, the package never bound it. Other three declared counts unchanged. f4d07dbb declares 41. The file is a test declaration, not in the package or its digest. Full JavaScript leg green.

After the fixes: code-index-mcp suite 1,082 passed on each leg (snapshot and daemon), fast gates 519 passed, fmt, clippy and docs exit 0. The whole workspace was not re-run after the three commits; they touch one MCP source file, one MCP test, one test declaration and one record.

CI round 1 (f4d07dbb): Windows 3 failed of 5,404, Linux 1 failed of 5,632

Test Cause Fix
mcp_smoke::revision_read_survives_removed_parent (Windows) The new test used /outside-every-root/lib.rs, which is not absolute on Windows; the product's path_outside_root there is correct. b4f7b0b4: the path comes from a second temp directory.
store_repair_e2e::a_running_daemon_stops_serving_a_publisher_whose_key_was_withdrawn (Windows) Established defect, also in the last release: ProjectExtractors::claims re-acquired the slot read lock it held; with an activation writer queued in between, path_claims never returns. That it caused this run's failure is a hypothesis (128 s fits the 120 s RPC timeout). 0a658f8d: claims answers from one snapshot; Linux test fails without it; the e2e now fails on the first RPC error and prints the daemon's exit record and log tail.
argument_reference_e2e::frozen_legacy_acceptance_matches_the_installed_baseline (Windows) Round 2 named the call: the 400,000-character whole_word literal, server alive and silent for 30 s. Stack samples on Linux with longer literals put the time in SQLite's fts5ParseTokenize, which reallocates the phrase every eight tokens; the Windows allocator copies the block each time. Pre-existing in the product (#575). My round-1 attribution to the regex compile was wrong; that change is reverted (f1cfa9db). b28850b0: the case uses the shortest literal the regex engine refuses (40,000 x ι, limit 31,208), same refusal body as the installed release, a tenth of the FTS tokens. 4ef10253: the replay names the case and prints server stderr on a stall.
query_cli::two_one_shot_queries_at_once_start_one_daemon (Linux) Pre-existing race (reproduced on the last release by forced interleaving; 0 of 60 natural local runs): a one-shot reader beside a live daemon reported its read-only snapshot as ready and answered symbol_not_found over a reconciling index. ff266d0a: that snapshot stays reconciling, so the existing handoff qualifies the answer.

After these: code-index-cli, code-index-daemon and code-index-mcp suites green on both legs locally, fmt, clippy (host and x86_64-pc-windows-gnu) exit 0. CI round 2 (ff266d0a): Windows 5,406 of 5,407 (only the replay above); the store-repair and path tests pass. CI round 3 (f1cfa9db, the final head): all four workflows green; Linux 5,634 passed, Windows 5,406 passed. Windows behaviour is verified by CI only.

Not in this train

  • #545 guest side (string clamp, depth diagnostic, member-chain re-walk, lossy decode) and the requested bytes of a memory-ceiling refusal.
  • #570: output filters on eleven tool cells, aliases, limit on the diff tools, the registry for configuration keys, environment variables and CLI flags.
  • 33 known wrong binds this change does not touch (#566).
  • #571 (agent adoption) waits for operator decisions.
  • #575: the cost of a very long search_text literal (found in CI round 2, pre-existing).

🤖 Generated with Claude Code

https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W

Release train for v0.41.50. Seven lanes, each reviewed from its diff and re-run by the lead, integrated on `integration-1111`. ## What changes for a user - **Resolution (#566).** A qualified reference is not bound across files on name evidence when the file's imports or module declarations contradict the candidate; where module evidence names one candidate, it is bound. Against the last release on the nine pinned repositories: 19 binds removed (all wrong before), 228 added (every candidate addition audited; a blind second audit of 65 rows agrees), 1 retargeted, 133 rule-retagged. - **MCP arguments (#570).** One policy per argument drives the published schema, the runtime check and the error. `invalid_argument_value` replaces ten older codes; the four malformed-argument codes share one field set. Every other error body is unchanged and nineteen are compared with bodies recorded from the last release. Reference: `docs/mcp-arguments.md`, checked against the schema both ways. - **Incomplete extraction (#545, host side).** One census behind `project_overview`, `resolution_gaps`, `index_coverage`, `list_files` and `evidence_gaps`; host refusals are counted; non-UTF-8 source files are recorded as `content_refused`. - **Small fixes.** `read_code` with `rev` for a path whose directory is gone (#568); `application/json` on every JSON resource (#569); `code-index query` on an invalid configuration prints the refusal and exits 1; `search_text` on a permanently excluded literal path says so (#521); installer check reports a `code-index` elsewhere on `PATH`, and the release notes' build line names the run's tag (#572). ## Behaviour changes to call out - Scripts matching `invalid_max_depth`, `invalid_token_budget`, `invalid_direction`, `invalid_role_filter`, `invalid_ref_kind`, `invalid_resolution`, `invalid_response_format`, `empty_seeds`, `too_many_seeds` or `invalid_arguments` need `invalid_argument_value`. - `code-index query` with an invalid `.code-index.toml`: exit 1 with a JSON refusal (was exit 2, no output). ## Evidence - Content, cost and stage baselines are blessed in one commit; each reason carries the bind account or the attribution. Content movement (rust-ripgrep +18, ts-zod +13, js-express +1, php-guzzle −2) equals the audited account. - Cost against the last release: VM steps +0.7 % to +1.7 % on seven repositories, −14.0 % on ts-zod, −2.5 % on rust-analyzer; full scans +0.7 % to +2.0 %. Two costs were attributed per statement and removed before the bless (five module-evidence statements; one capability check that flipped a plan). The nine bind accounts are byte-identical across every reduction. - Every package-supplied input of the new rules passes a capability grant; the pool, ref-kind and visibility registries are updated and a test shows an import without `reachability_anchor` cannot disambiguate a pool. - `tools/list` 59,167 bytes (ceiling 59,311), skill resource 3,949 tokens (ceiling 4,000); no ceiling was raised. ## Qualification One full gate run on `05ea92f9` (empty package store), 43 steps: 40 green at once, three red, each attributed, fixed in its own commit and its step re-run green. | Step | Cause | Fix | |---|---|---| | `agent_bench` | A change in this train (713b1423) emptied `change_impact`'s `test_role_files` at `limit: 0`; the benchmark's which-tests questions use that call. Recall 1.000 → 0.974 (rust-ripgrep), 0.970 (python-flask). | `3339b685` restores the release behaviour and keeps `witness_paths_total`. Mutation run red, restored green. Recall 38/38 and 33/33. | | `tier3` | Record not re-recorded with the other baselines. Drift equals the audited account: rust-analyzer +179 resolved (194 added, 15 removed), 120 retagged; py-django 6 retagged. | `7db6ebbe` bless with the account as reason; green without the bless flag. | | `pkg_javascript_full` | Declared `unbound-by-scope` 42, measured 41 on js-express. One site left the set: `test/app.request.js:12:19`, a write the builtin bound to an unrelated local; the host now refuses it, the package never bound it. Other three declared counts unchanged. | `f4d07dbb` declares 41. The file is a test declaration, not in the package or its digest. Full JavaScript leg green. | After the fixes: `code-index-mcp` suite 1,082 passed on each leg (snapshot and daemon), fast gates 519 passed, fmt, clippy and docs exit 0. The whole workspace was not re-run after the three commits; they touch one MCP source file, one MCP test, one test declaration and one record. ### CI round 1 (`f4d07dbb`): Windows 3 failed of 5,404, Linux 1 failed of 5,632 | Test | Cause | Fix | |---|---|---| | `mcp_smoke::revision_read_survives_removed_parent` (Windows) | The new test used `/outside-every-root/lib.rs`, which is not absolute on Windows; the product's `path_outside_root` there is correct. | `b4f7b0b4`: the path comes from a second temp directory. | | `store_repair_e2e::a_running_daemon_stops_serving_a_publisher_whose_key_was_withdrawn` (Windows) | Established defect, also in the last release: `ProjectExtractors::claims` re-acquired the slot read lock it held; with an activation writer queued in between, `path_claims` never returns. That it caused this run's failure is a hypothesis (128 s fits the 120 s RPC timeout). | `0a658f8d`: `claims` answers from one snapshot; Linux test fails without it; the e2e now fails on the first RPC error and prints the daemon's exit record and log tail. | | `argument_reference_e2e::frozen_legacy_acceptance_matches_the_installed_baseline` (Windows) | Round 2 named the call: the 400,000-character `whole_word` literal, server alive and silent for 30 s. Stack samples on Linux with longer literals put the time in SQLite's `fts5ParseTokenize`, which reallocates the phrase every eight tokens; the Windows allocator copies the block each time. Pre-existing in the product (#575). My round-1 attribution to the regex compile was wrong; that change is reverted (`f1cfa9db`). | `b28850b0`: the case uses the shortest literal the regex engine refuses (40,000 x `ι`, limit 31,208), same refusal body as the installed release, a tenth of the FTS tokens. `4ef10253`: the replay names the case and prints server stderr on a stall. | | `query_cli::two_one_shot_queries_at_once_start_one_daemon` (Linux) | Pre-existing race (reproduced on the last release by forced interleaving; 0 of 60 natural local runs): a one-shot reader beside a live daemon reported its read-only snapshot as `ready` and answered `symbol_not_found` over a reconciling index. | `ff266d0a`: that snapshot stays `reconciling`, so the existing handoff qualifies the answer. | After these: `code-index-cli`, `code-index-daemon` and `code-index-mcp` suites green on both legs locally, fmt, clippy (host and `x86_64-pc-windows-gnu`) exit 0. CI round 2 (`ff266d0a`): Windows 5,406 of 5,407 (only the replay above); the store-repair and path tests pass. CI round 3 (`f1cfa9db`, the final head): all four workflows green; Linux 5,634 passed, Windows 5,406 passed. Windows behaviour is verified by CI only. ## Not in this train - #545 guest side (string clamp, depth diagnostic, member-chain re-walk, lossy decode) and the requested bytes of a memory-ceiling refusal. - #570: output filters on eleven tool cells, aliases, `limit` on the diff tools, the registry for configuration keys, environment variables and CLI flags. - 33 known wrong binds this change does not touch (#566). - #571 (agent adoption) waits for operator decisions. - #575: the cost of a very long `search_text` literal (found in CI round 2, pre-existing). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
Checkpoint recovered #566 work. Workspace all-target check, indexer check and all 13 file_isolation_566 tests pass. Corpus accounting and remaining verification pending.
Keep unresolved disclosure target-specific and deduplicate aliases to the same unresolved import. Revision and epoch changes invalidate the routing snapshot. Indexer check and 16 script-import correctness tests pass.
Preserve named imports whose raw path resolves to the candidate module. Add an exact-target control with a same-stem decoy. Update the reverse-dependency fixture schema for the script-language existence probe without changing its assertions. Indexer check, new fixture and both reverse-dependency tests pass.
Include Rust library hubs when assembling module proofs and gate their explicit extern-crate aliases as reachability anchors. This retains real cross-crate re-exports without file-stem evidence. Exact-target extern-crate fixture, indexer check and all 17 pool registry tests pass.
A same-spelled local value does not shadow a Rust type path, including constructor type heads. Mixed value/type groups stay conservative. Strengthen the positive control to require three exact remote type targets; its shadowing mutation goes red. Indexer check and the strengthened fixture pass.
Stage 1. Targeted strict_and_clamped_ranges_have_different_contracts passed. Ran clamp-to-reject mutation: same test failed at the applied-range assertion (exit 101); restored snapshot and verified md5.
Stage 2 strict ranges. Published-router parity test passed. Ran schema-only depth maximum mutation (20 to 21); that test failed (exit 101), with runtime constants unchanged. Restored snapshot and verified md5.
Stage 2 batch caps. Published-router cardinality test passed. Ran schema-only maxItems +1 mutation; same test failed (exit 101), runtime caps unchanged. Restored snapshot and verified md5.
Stage 2 overlay/clamps. Published-router clamp test passed. Ran mutation adding rejecting maxima to clamps; same test failed at repo_map.token_budget (exit 101). Restored snapshot and verified md5. No runtime domain changed.
Stage 5 formats. Legacy spelling test passed for null omission, empty/Unicode whitespace, mixed case, and distinct read formats. Ran trim-removal mutation: same test failed (exit 101); restored snapshot and verified md5. Publish canonical enum plus null and static effective defaults.
Stage 5 envelope. Legacy test passed for existing aliases, whitespace and case-sensitive rejection. Ran trim-removal mutation: same test failed (exit 101); restored snapshot and verified md5. Environment-dependent defaults remain unpublished.
Stage 5 exact vocabularies. Legacy/schema test passed. Ran mutation replacing out with outgoing; same test failed (exit 101). Restored snapshot and verified md5. Existing exact-case and whitespace rejection preserved; nullable role stays nullable.
Stage 5 optional vocabularies. Resolution/category/ref-kind schema and legacy resolution spelling test passed. Ran trim-removal mutation with verified snapshot: same test failed (exit 101); restored snapshot and verified md5. Category runtime and schema use one daemon constant.
Stage 5 description budget. Policy unit tests and clamp transport test passed. Ran schema maximum mutation: strict parity test failed; ran applied-range removal mutation: updated transport test failed (exit 101). Restored verified snapshots. Retain concise projection behavior in descriptions.
Retain the manifest-only closure and compiling roots alongside permissive layout reachability. Refuse imports, qualified type paths and their members when a complete dependency library contradicts the foreign target; preserve declared and shared-root access. The alias regression fails with the refusal disabled. Manifest layering, Cargo scope, file isolation, scoped equivalence, pool registry, workspace check and warning-denied documentation pass.
Stage 5 follow-up. Full graph target exposed the old prose-only assertion (Option unwrap at line 501) on both legs. Updated assertion test passed. Ran applied-range removal mutation: this test failed at its own metadata assertion (exit 101). Restored snapshot and verified md5.
Notes belong in the lane's scratch directory; the entries were appended there.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
Frozen release-flags candidate: 19 removals, 229 additions, one retarget and 133 rule retags; net 210. File bytes, imports, producer identities and grants match for all nine pinned heads. Named-import rule 141 has zero corpus facts and targets on both sides. Detailed positional/rule tables and immutable-binary provenance are in /tmp/claude-1000/codex-r20/bind-account.md and account/.
One Policy lookup and schema_fragment replace seven semantic lookup helpers. Preserve the published tools/list byte-for-byte (59,243 bytes before and after; cmp exit 0).

Validation: arguments::tests 5 passed. RUN mutation changed direction default both to out: exact_vocabularies_preserve_direction_and_role_acceptance failed with the expected default mismatch (exit 101); restored from md5-verified cp snapshot. No behavior change.
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
D3 substep: add tool, received, accepted and static default to name/presence/type refusals. Wrap rmcp-marked residual decode tool errors in the same flat shape, with no query guess and the decoder message as hint. No redundant typed-decode pass: rmcp already identifies these with its fixed deserialize prefix.

Targeted unknown_args_e2e flat/residual test passed. RUN mutation bypassed boundary completion: this test failed on missing tool (exit 101). Restored from md5-verified cp snapshot. Value-code migration and policy validation follow separately.
193 distinct audited rows: 143 correct additions; 19 wrong-before removals; one wrong-before/correct-after retarget; 28 correct and two wrong unchanged controls. All required integer-stride selections and all small cells are covered. All 31 inherited wrong targets remain bound. Four historical LineIndex mistakes remain refused generically on both sides. Evidence: /tmp/claude-1000/codex-r20/audit-rows.tsv and companion JSON files.
The release-flags rerun has no audited wrong addition or lost correct bind, so no further rule change is justified by these delta audits. The earlier Ruby-only population mismatch was discarded and all nine repositories remeasured. Known unchanged wrong targets remain a release blocker; nothing is blessed or pushed.
D3 substep: translate the 22 malformed-value codes at the common transport boundary, name the actual argument, and retain domain refusals. Give plugin selector refusals explicit argument names. Update wire assertions; mixed read-entry refusals remain for stage 8.

Targeted malformed_values_use_one_code_and_name_the_argument passes (18 cases plus a preserved domain error). RUN mutation removed invalid_resolution translation: this test failed with invalid_resolution instead of invalid_argument_value (exit 101). Restored from md5-verified cp snapshot. Full release inventory: /tmp/claude-1000/codex-r17/error-codes.md.
D3 substep: use the common policy for rejecting ranges and cardinalities, while preserving clamped acceptance. Check integer representation from schemars formats before decoding, preserving name/presence/type ordering. Update the human error contract and canonical envelope documentation.

unknown_args_e2e: 16 passed, including clamped 0/65/u32::MAX. RUN mutation bypassed the uint representation guard: integer_representation_and_policy_bounds_name_the_field failed because negative limit reached the residual decoder and lost its argument name (exit 101); restored by md5-verified cp snapshot. Preserve plugin confirmation isolation while allowing D3 received in its refusal body.
All nine repositories exceed one percent VM growth against a7ce9603. Exact signed deltas for 1,562 normalized statements reconcile every measured dimension; full SQL, source locations and cheaper statement shapes are recorded in /tmp/claude-1000/codex-r20/cost-comparison.md and cost-statement-deltas.tsv. The cost gate remains red for ripgrep scans and zod work; the structural ratchet remains red for the audited movement. No baseline is blessed. Diagnostic printer changes were restored with cp and matching MD5 receipts.
Complete stage 6: each vocabulary Policy carries its legacy acceptance predicate. Schema values stay canonical while runtime validation preserves the existing aliases, whitespace and case rules. Bad category values now receive the same flat value error instead of a raw backend error.

Targeted vocabulary transport test passed, including normalized formats/resolution, blank filters, null and envelope aliases. RUN mutation replaced row-format parsing with exact canonical matching: this test rejected the formerly accepted CONCISE spelling and failed (exit 101); restored by md5-verified cp snapshot.
Stage 8: complete each malformed read entry from the published item schema, preserve domain refusals and successful siblings, and leave text content items untouched.

Mixed read-batch transport test passed for json and text. RUN mutation eagerly rejected boolean entries at the batch gate: this test failed because valid siblings were refused too (exit 101). Restored by md5-verified cp snapshot.
Stage 9 adapter: report arguments_applied.context_tokens only when the accepted request is clamped. Refusals carry no applied-value metadata, and existing limit/line/budget disclosures keep their shapes.

Targeted 0/1/64/65/u32::MAX snippet-width transport test passed. RUN mutation omitted context_tokens completion: this test failed on its missing requested/applied object (exit 101); restored from md5-verified cp snapshot.
Review point 4: the required release corpus_ratchet run passed all 9 tests without any baseline drift; no per-repository changed-file list exists. No baseline was blessed. The run_task branch receives extractor-claimed ParseTasks only; search_text-only metadata follows run_text_only_task and still skips undecodable bytes. Runtime artifacts in /tmp/claude-1000/codex-r18/populations-r2.json and populations-search-r2.json show 14 files, 8 parse_errors, 9 incomplete files; utf8.rs is inventoried with content_refused and per-path evidence, while undecodable sql/csv/txt have no rows. po is unclaimed without extra_text_extensions. No behavioral decision or worker protocol change.
Complete stage 9: snippet completion must preserve limit_clamped, lines_widening and the repo_map token_budget field. Classify snippet bounds by their runtime applied-value disclosure.

Targeted combined-disclosure transport test passed. RUN mutation wrote snippet metadata into limit_clamped: this test failed on the changed limit_clamped shape (exit 101). Restored from md5-verified cp snapshot.
Move historical measurements to /tmp/claude-1000/codex-r18/host-extraction-census-before-after.md for the issue comment. Name the clean-leg assertion requiring verdict normalization, and exercise a real subsequent UTF-8 refusal without clearing it. Its classifier mutation fails at the intended diagnostic assertion. Observed memory bytes remain open; the worker/supervisor protocol is unchanged.
D7/reference substep: publish depth 20, map budget 1500 and the daemon match-line default; omit project defaults whose effective routing depends on the call. Preserve explicit null and omission behavior. Share the map default with its handler.

Targeted defaults transport test passed, including runtime omission controls and refusal default detail. RUN mutation retained the inherited project default: this test failed on the routing/session default assertion (exit 101). Restored from md5-verified cp snapshot.
R substep: hand-maintained defaults, bounds and canonical vocabularies for the first 15 tools (98 arguments), checked against tools/list in both directions. No pass-through registry rows.

Targeted argument_reference_e2e passed. RUN mutation changed only documented max_depth default 20 to 99: this test failed on that contract cell (exit 101); restored from md5-verified cp snapshot. Remaining tools and family/exemption tables follow in the next small commit.
Complete reduced stages 3+4: all 142 published arguments, exact schema/reference names and contract cells in both directions, plus 23 tool families and explicit exemptions. Record exactly eleven deferred output-filter cells as planned, #570. Pending response_format/limit cells are removed as their implementation lands.

Full argument_reference_e2e passed. RUN mutation added a defaulted GetSymbolArgs field without a reference row: this test failed at the reference-name equality assertion (exit 101). Restored from md5-verified cp snapshot.
Stage 10/list_files: keep indexed-file identity, live size/count fields and paging; omit the potentially wide unindexed-file sample, retaining its measured count and scan scope. Default detailed behavior is unchanged. Keep the reference and exemption table synchronized.

Formats and reference transport tests passed. RUN mutation ignored concise projection: list_files_concise_omits_the_wide_sample_and_preserves_inventory failed on the retained sample (exit 101). Restored from md5-verified cp snapshot.
Keep the scoped path seek and revision cache. Read diagnostic, refusal and unclaimed legacy-error candidates once, then aggregate only their file IDs.

Compare totals and per-path codes to the grouped oracle on mixed generations and the hostile registry. Dropping the refusal arm fails the equivalence test (5 versus 6). Release cold 20-run medians: 25.21, 27.02, 28.88 ms for 200,000 contributions.
Stage 10/get_dependencies: concise omits optional aliases while retaining file/module/line identity and both side counts, cursors and uncertainty disclosures. Default detailed behavior remains. Update the checked reference and exemption table.

Dependency-format and reference tests passed. RUN mutation ignored response_format: dependencies_concise_omits_wide_aliases_and_preserves_edges failed on the retained alias (exit 101). Restored from md5-verified cp snapshot.
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
resource_mime_e2e, literal_path_coverage_e2e and hostile_extraction_e2e use
the shared initialize on both legs.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
Complete stage 10: omit per-name example paths/lines in concise resolution_gaps, keeping identity, reasons, counts, scope and degradation. All three new formats preserve their existing detailed defaults and update the checked reference/exemptions.

All three format tests and the full reference test passed. RUN mutation ignored response_format: gaps_concise_omits_example_locations_and_preserves_diagnostics failed on retained example locations (exit 101). Restored from md5-verified cp snapshot.
D4 permitted fallback: keep limit exempt. DiffCursor stores a whole-file offset and both collector paths roll files and tallies back atomically; a strict changed-symbol row maximum needs intra-file continuation, cursor compatibility and collector/rendering changes beyond the 120-line allowance. A smaller symbol_budget alone can still exceed the requested maximum on the first file.

Only unknown limit on changed_symbols/review_diff gains a hint naming fixed response token bounds, whole-file paging and cursor/next_cursor. Update both exemptions with this reason. Targeted hint and reference tests passed. RUN mutation suppressed the special hint: the hint test failed (exit 101); restored from md5-verified cp snapshot.
Stage 12/families: compare every family capability with the published schema, requiring the exact missing-cell exemption set. Pin the eleven planned #570 filter cells and reject pending decisions.

Reference and family gates passed. RUN mutation removed the list_files/lang exemption: family_capabilities_have_exact_named_exemptions failed on the missing-cell set (exit 101). Restored from md5-verified cp snapshot.
Stage 12/legacy: 38 cases observed on the installed binary, whose SHA-256 is recorded in the fixture. Pin normalized spellings, aliases, nullable defaults, integer boundaries, applied caps, batching and metadata bypass; preserve partial read acceptance. The working-tree gate does not derive expectations from Policy.

Installed baseline probe: 38 cases, zero mismatches. Working-tree legacy test passed. RUN mutation turned applied caps into rejecting maxima: the legacy test failed on the formerly accepted usize maximum (exit 101). Restored from md5-verified cp snapshot.
Complete stage 12: tools/list of the built server must fit 59,311 compact UTF-8 bytes. Reclaim only description prose now represented by schema vocabulary, defaults and ranges, keeping behavioral guidance.

Native size gate passed at 59,021 bytes. RUN mutation padded an argument description: this same gate failed above the ceiling (exit 101). Restored from md5-verified cp snapshot. Final cross-leg and workspace verification follows.
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
Verification fixes: derive range/vocabulary/cardinality hints from the same looked-up policy, complete malformed query-batch entries without changing successful siblings, and use received for the original whole-word query. Register the shared map default and keep skill guidance inside its unchanged resource budget.

Targeted contract tests, format/range hints, the skill budget and all seven resource-grading tests passed. New query-batch transport test passed. RUN mutation bypassed query-batch completion: that test failed on the old whole_word_expression_unsupported code (exit 101). Restored from md5-verified cp snapshot. Initial verification reds were introduced by this train and corrected here.
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
Against v0.41.49 on the nine pinned repositories: 19 binds removed, all
audited wrong before; 228 added, all audited correct; 1 retargeted from a
wrong to the correct target; 133 change only their rule tag. A blind second
audit of 65 rows (all removals and the retarget, 45 sampled additions)
agrees on every row. SQLite work per cold index stays within +1.74 % of the
release on every repository (rust-analyzer -2.1 %, ts-zod -13.5 %).

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
The isolation rules raised full-scan steps past the cost gate's ceiling on
two repositories (rust-ripgrep +7.7 %, ts-zod +9.6 %; rust-analyzer +10 %).
Per-statement attribution named five statements in the module-evidence
build; they now drive from the file key or reuse the loaded file set
instead of rescanning the group and anchor tables. Full scans end between
+0.7 % and +2.0 % of v0.41.49 on all nine pinned repositories; VM steps,
sorts and automatic indexes are no higher than before the change. The
bind account is byte-identical on all nine repositories after every commit.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
The statement text followed the map's iteration order; sorted, it is
the same text for the same index.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
Gate producer identities before aggregation, lexical and namespace inputs, and Cargo import propagation. Register the derived relations and ref readers, remove the obsolete visibility exception, and prove the import admission with an ungranted/granted capability fixture.
Remove argument-name queries from rename, malformed read-batch entries, and cross-project graph refusals at their construction sites. Capture eleven reachable kept codes from the installed release, including a bounded-matcher refusal and linked-project mismatch, and document why the guarded syntax mapping has no ordinary call trigger.
Repairs the 18 failures of the interim run on the integrated tree and
the seven registry and contract tests behind them:

- The flat argument fields apply to the four malformed-argument codes
  only. Every other error body is the release's: the fixture now holds a
  release-recorded body for eleven kept codes and eight domain errors.
- changed_symbols and review_diff report a current content_refused row
  as terminal not_indexed.
- Skill resource 3,949 tokens, tools/list 59,206 bytes; no ceiling moved.
- Every producer-supplied input of the module-evidence rules passes a
  capability admission before it can route or refuse a bind; a test shows
  an import without reachability_anchor cannot disambiguate a pool.
  All nine corpus bind accounts are byte-identical with the admissions.

Merge-time change: the contradiction-site admission is a trailing probe
(probe_join). Joined freely it drove the statement from the grant and
cost 26x the VM steps on rust-ripgrep and 90x on cs-dapper.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
Content: rust-ripgrep +18, ts-zod +13, js-express +1, php-guzzle -2
resolved, equal to the audited bind account against v0.41.49 (19 removed,
228 added, 1 retargeted, 133 rule-retagged on the nine pinned
repositories).
Cost: ts-zod -14.0 % VM steps; the other tier-1 repositories +0.7 % to
+1.7 % VM steps and +0.8 % to +2.0 % full-scan steps, after per-statement
attribution and two reductions.
Stage: tier1q_pass1, tier1q_tiebreak and tier3_import_boost move by the
account's per-rule numbers.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
`limit: 0` cleared `test_role_files` since 713b1423 (this train). The
list is the file-level run-set, and `limit: 0` with `response_format:
"concise"` is the cheapest call that names the tests to run: the agent
task benchmark asks its which-tests questions that way and lost one
hand-verified answer on rust-ripgrep and one on python-flask (recall
1.000 -> 0.974 / 0.970). The last release kept the list; so does this.

`witness_paths_total` stays (the count of the list `limit: 0` clears);
`test_role_files_total` is gone with the suppression it described.

Mutation run: clear the list in `apply_count_only_impact` ->
`count_only_keeps_the_run_set_and_counts_the_witness_chains` red
(left 0, right 7); restored by snapshot and md5, green.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
The drift equals the audited account against the previous release:
rust-analyzer 15 binds removed and 194 added (count.resolved +179),
120 retagged tier1q_tiebreak -> tier1q_pass1; py-django 6 retagged, no
bind added or removed. No parse., stage. or activation key moved.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
test(javascript): the declared unbound-by-scope count on js-express is 41
Some checks failed
Package CI / package (svelte) (pull_request) Successful in 3s
Package CI / package (rust) (pull_request) Successful in 3s
Package CI / package (timeline) (pull_request) Successful in 2s
Package CI / package (typescript) (pull_request) Successful in 2s
Package CI / package (xaml) (pull_request) Successful in 2s
Package CI / package (vue) (pull_request) Successful in 2s
Package CI / package-corpus (csharp) (pull_request) Successful in 4s
Package CI / package-corpus (php) (pull_request) Successful in 6s
Package CI / package-corpus (python) (pull_request) Successful in 5s
Package CI / package-corpus (timeline) (pull_request) Successful in 4s
Package CI / package-corpus (ruby) (pull_request) Successful in 6s
Package CI / package-corpus (svelte) (pull_request) Successful in 5s
Package CI / package-corpus (rust) (pull_request) Successful in 5s
Package CI / package-corpus (typescript) (pull_request) Successful in 4s
Package CI / package-corpus (vue) (pull_request) Successful in 3s
Package CI / package-corpus (xaml) (pull_request) Successful in 3s
CI / cargo doc (intra-doc links) (pull_request) Successful in 8m53s
CI / cargo deny (pull_request) Successful in 9m47s
CI / cargo clippy (pull_request) Successful in 11m5s
CI / cargo check (MSRV 1.99.1) (pull_request) Successful in 14m33s
CI / cargo test (abi, 32-bit + wasm32) (pull_request) Successful in 14m49s
CI / cargo check (windows-gnu) (pull_request) Successful in 15m34s
Package CI / package (javascript) (pull_request) Successful in 25m11s
Package CI / package-corpus (javascript) (pull_request) Successful in 28m48s
Package CI / package overhead budgets (nightly, one package at a time) (pull_request) Has been skipped
CI (Windows) / fmt + clippy + build + test (windows) (pull_request) Failing after 51m10s
CI / OSS corpus (tier 1) (pull_request) Successful in 1h18m59s
CI / cargo test (pull_request) Failing after 1h33m16s
CI / cargo test (daemon transport) (pull_request) Has been skipped
CI / Plugin path cost + pool throughput (nightly) (pull_request) Has been skipped
f4d07dbba4
One site left the set: test/app.request.js:12:19, `querystring` in
`app.request.querystring = function () { … }`. The builtin bound that
write to an unrelated local in lib/request.js (tier1q_pass1); the host
now refuses a foreign qualified bind at a script write (#566), so both
sides leave it unbound and the scope verdict has nothing to refuse.
The package side is unchanged (its account row was unbound before and
after). scope-verdict 3425, declared-local 1392 and rebound-by-local 70
are measured unchanged. The file is a test declaration and is not part
of the packed package or its digest.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
A `whole_word` literal past the regex engine's compiled-size limit is
refused `whole_word_needle_unsupported`. The engine found that out by
building the pattern first: 0.24 s for 400,000 characters in a release
build, 1.1 s unoptimised, growing with the request. On the Windows CI
runner (about 18x slower on the rest of the same test) that one reply
missed the harness's 30 s deadline in
`frozen_legacy_acceptance_matches_the_installed_baseline`.

`WordMatcher::NEEDLE_MAX_BYTES` (384 KiB) refuses up front. Measured:
the longest needle the engine compiles is 327,671 bytes (characters
without case variants; `a` stops at 131,068), so no needle that worked
is refused, and the refusal body is unchanged. The replayed case drops
from 1.46 s to 0.46 s locally.

Mutation run: bound = 64 KiB ->
`the_needle_bound_refuses_nothing_the_engine_compiles` red (the engine
compiles a needle of that length); restored by snapshot and md5, green.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
fix(mcp): a one-shot reader beside a live daemon keeps startup pending
Some checks failed
Package CI / package (ruby) (pull_request) Successful in 3s
Package CI / package (rust) (pull_request) Successful in 4s
Package CI / package (svelte) (pull_request) Successful in 4s
Package CI / package (typescript) (pull_request) Successful in 2s
Package CI / package (vue) (pull_request) Successful in 2s
Package CI / package (xaml) (pull_request) Successful in 3s
Package CI / package-corpus (csharp) (pull_request) Successful in 4s
Package CI / package-corpus (php) (pull_request) Successful in 5s
Package CI / package-corpus (svelte) (pull_request) Successful in 4s
Package CI / package-corpus (ruby) (pull_request) Successful in 5s
Package CI / package-corpus (rust) (pull_request) Successful in 6s
Package CI / package-corpus (python) (pull_request) Successful in 6s
Package CI / package-corpus (timeline) (pull_request) Successful in 4s
Package CI / package-corpus (typescript) (pull_request) Successful in 4s
Package CI / package-corpus (vue) (pull_request) Successful in 4s
Package CI / package-corpus (xaml) (pull_request) Successful in 3s
CI / cargo doc (intra-doc links) (pull_request) Successful in 7m42s
CI / cargo deny (pull_request) Successful in 8m20s
CI / cargo clippy (pull_request) Successful in 9m12s
CI / cargo check (MSRV 1.99.1) (pull_request) Successful in 11m29s
CI / cargo test (abi, 32-bit + wasm32) (pull_request) Successful in 12m3s
CI / cargo check (windows-gnu) (pull_request) Successful in 12m16s
Package CI / package (javascript) (pull_request) Successful in 10m55s
Package CI / package-corpus (javascript) (pull_request) Successful in 16m20s
Package CI / package overhead budgets (nightly, one package at a time) (pull_request) Has been skipped
CI (Windows) / fmt + clippy + build + test (windows) (pull_request) Failing after 48m12s
CI / OSS corpus (tier 1) (pull_request) Successful in 59m42s
CI / cargo test (pull_request) Successful in 1h16m14s
CI / Plugin path cost + pool throughput (nightly) (pull_request) Has been cancelled
CI / cargo test (daemon transport) (pull_request) Has been cancelled
ff266d0a66
`code-index query` decides between the daemon and a local `--no-daemon`
server before that server starts. When a daemon appears in between
(two concurrent first queries), the local server opens the index
read-only beside the live owner. That snapshot was built with
`LocalIndex::new`, which reports lifecycle `ready`, so a negative
lookup was answered as a measured absence over an index the owner was
still reconciling: `symbol_not_found` with 201 of 202 files lagging,
where `index_incomplete` was due.

A one-shot reader beside a live owner now keeps the snapshot in the
`reconciling` state, so the existing handoff names the owner and
qualifies negative answers. A long-lived session is unchanged. With a
settled daemon the one-shot call answers through the handoff as before
(probed: positive and negative lookups, with and without --no-daemon).

Pre-existing: a forced interleaving reproduces the stale answer on the
last release. It surfaced once in CI on this branch in
`query_cli::two_one_shot_queries_at_once_start_one_daemon` (0 of 60
local runs).

Mutation run: build the owned one-shot snapshot with `LocalIndex::new`
-> `a_one_shot_owned_snapshot_keeps_startup_pending` red (lifecycle
`ready`); restored by snapshot and md5, green.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
CI round 2 on Windows named the stalled call: legacy case 55, the
400,000-character `whole_word` literal, server alive and silent for
30 s while every other case answered in about 1 ms.

Cause, from stack samples of the server on Linux with longer literals
(6.4 M characters: 23 s): SQLite's `fts5ParseTokenize` reallocates the
phrase every eight tokens. glibc remaps the block in place; the Windows
allocator copies it, 50,000 times up to 16 MB for this literal. The
regex compile was not the cause.

The case now uses 40,000 x `ι`: the engine's size limit is reached at
31,208 of them (four case variants each), so the refusal is the same
and the FTS phrase is ten times shorter. The installed release answers
this literal with the same code, hint and reply size.

The unbounded cost of a long `search_text` query is in every release
and needs a length bound in the argument policy; filed separately.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
Revert "fix(mcp): refuse an over-long whole_word literal without compiling it"
All checks were successful
Package CI / package (svelte) (pull_request) Successful in 3s
Package CI / package (rust) (pull_request) Successful in 3s
Package CI / package (typescript) (pull_request) Successful in 3s
Package CI / package (timeline) (pull_request) Successful in 3s
Package CI / package (vue) (pull_request) Successful in 3s
Package CI / package (xaml) (pull_request) Successful in 2s
Package CI / package-corpus (csharp) (pull_request) Successful in 4s
Package CI / package-corpus (php) (pull_request) Successful in 5s
Package CI / package-corpus (rust) (pull_request) Successful in 5s
Package CI / package-corpus (python) (pull_request) Successful in 5s
Package CI / package-corpus (svelte) (pull_request) Successful in 4s
Package CI / package-corpus (ruby) (pull_request) Successful in 6s
Package CI / package-corpus (timeline) (pull_request) Successful in 5s
Package CI / package-corpus (xaml) (pull_request) Successful in 4s
Package CI / package-corpus (vue) (pull_request) Successful in 4s
Package CI / package-corpus (typescript) (pull_request) Successful in 5s
CI / cargo doc (intra-doc links) (pull_request) Successful in 6m0s
CI / cargo deny (pull_request) Successful in 6m30s
CI / cargo clippy (pull_request) Successful in 7m36s
CI / cargo test (abi, 32-bit + wasm32) (pull_request) Successful in 9m42s
CI / cargo check (MSRV 1.99.1) (pull_request) Successful in 9m45s
CI / cargo check (windows-gnu) (pull_request) Successful in 10m6s
Package CI / package (javascript) (pull_request) Successful in 10m39s
Package CI / package-corpus (javascript) (pull_request) Successful in 14m47s
Package CI / package overhead budgets (nightly, one package at a time) (pull_request) Has been skipped
CI / OSS corpus (tier 1) (pull_request) Successful in 47m38s
CI (Windows) / fmt + clippy + build + test (windows) (pull_request) Successful in 1h2m16s
CI / cargo test (pull_request) Successful in 59m1s
CI / cargo test (daemon transport) (pull_request) Successful in 7m49s
CI / Plugin path cost + pool throughput (nightly) (pull_request) Has been skipped
f1cfa9db17
This reverts commit 3d7463f8. Its premise was wrong: the Windows stall
it was meant to remove is in SQLite's FTS5 phrase construction, not in
the regex compile (see the previous commit). The bound was correct but
is not needed for this release, and a query-length limit in the
argument policy will make it unreachable.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XLNPtTbPwnHBYfKMb3f1W
Sign in to join this conversation.
No reviewers
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.

Dependencies

No dependencies set

Reference
h-dv/code-index!574
No description provided.