release v0.32.1 — fix the v0.32.0 review findings #302

Merged
buildagent merged 54 commits from release/v0.32.1 into master 2026-09-26 06:45:51 +02:00
Member

Fixes the precision and recall defects that two independent deep reviews found in v0.32.0 (4e3034a), plus the findings of a final review of the combined branch.

Lanes (records in _prdoc/records/)

  • I073, resolver (lane F).
    • The own-import rule now binds only proven, visible, free-symbol imports.
    • New pytest fixture rule.
    • Aliased-import and local refusals are scoped.
    • Parameter fixes for JS/TS/Rust.
    • Cost: every repo is within +2.0% VM steps.
  • I074, Python scope at extraction (lane G).
    • Adds the LEXICAL_LOCAL and PYTEST_FIXTURE role bits.
    • The per-pass Python re-parse is deleted.
    • Comprehension, walrus, match and PEP 695 scopes.
    • Byte/char column fix.
    • Migration 71 invalidates all code once.
  • I075, MCP/CLI (lane H).
    • Readable refusal when the index schema is newer than the build.
    • Batch exit code.
    • Warnings for a copied CLI and for build skew.
    • review_diff grades by visibility.
    • reconcile_pending disclosure.
  • I076, final-review fixes (lane I).
    • Class and duplicate fixture tests.
    • parametrize handling.
    • The innermost visible import wins.
    • reconcile_pending count honesty.
    • --log passthrough.
    • Fork lock in query_cli.
    • Docs.

Measured against v0.32.0 (nine pinned repositories, bind by bind, every change read at source)

Repo Wrong binds removed Correct binds lost Fixture edges gained
rust-analyzer 92 7 (glob re-exports) —
Zod 25 1 —
Django 9 0 —
Express 4 0 —
Flask 237 retargeted to their fixtures 0 786

No wrong binds were added anywhere. Guzzle, Sinatra and Dapper are unchanged.

Local gates

Lane I's final HEAD 3df2510:

  • fmt, clippy and rustdoc: clean
  • workspace: 4,171 passed, 0 failed
  • daemon leg: 876 passed
  • all corpus and package ratchets: pass
  • precision_gate: 7/7, 0 phantoms
  • Windows check: clean

Release commit 1f4189b:

  • version_site_registry, corpus_ratchet, corpus_stage and corpus_tier3_ratchet pass after the rewording
  • fmt and clippy: clean
  • query_cli, abi_report, pytest_fixture_binding and exec_copy_registry: pass
  • precision_gate: 7/7
  • guest_gates.sh: pass

Filed as out of scope for this release: #300 (six wrong-bind shapes that predate it) and #301 (make resolution resumable).

🤖 Generated with Claude Code

https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu

Fixes the precision and recall defects that two independent deep reviews found in v0.32.0 (4e3034a), plus the findings of a final review of the combined branch. ## Lanes (records in `_prdoc/records/`) - **I073, resolver (lane F).** - The own-import rule now binds only proven, visible, free-symbol imports. - New pytest fixture rule. - Aliased-import and local refusals are scoped. - Parameter fixes for JS/TS/Rust. - Cost: every repo is within +2.0% VM steps. - **I074, Python scope at extraction (lane G).** - Adds the `LEXICAL_LOCAL` and `PYTEST_FIXTURE` role bits. - The per-pass Python re-parse is deleted. - Comprehension, walrus, match and PEP 695 scopes. - Byte/char column fix. - Migration 71 invalidates all code once. - **I075, MCP/CLI (lane H).** - Readable refusal when the index schema is newer than the build. - Batch exit code. - Warnings for a copied CLI and for build skew. - `review_diff` grades by visibility. - `reconcile_pending` disclosure. - **I076, final-review fixes (lane I).** - Class and duplicate fixture tests. - `parametrize` handling. - The innermost visible import wins. - `reconcile_pending` count honesty. - `--log` passthrough. - Fork lock in `query_cli`. - Docs. ## Measured against v0.32.0 (nine pinned repositories, bind by bind, every change read at source) | Repo | Wrong binds removed | Correct binds lost | Fixture edges gained | |---|---:|---:|---:| | rust-analyzer | 92 | 7 (glob re-exports) | — | | Zod | 25 | 1 | — | | Django | 9 | 0 | — | | Express | 4 | 0 | — | | Flask | 237 retargeted to their fixtures | 0 | 786 | No wrong binds were added anywhere. Guzzle, Sinatra and Dapper are unchanged. ## Local gates Lane I's final HEAD `3df2510`: - fmt, clippy and rustdoc: clean - workspace: 4,171 passed, 0 failed - daemon leg: 876 passed - all corpus and package ratchets: pass - precision_gate: 7/7, 0 phantoms - Windows check: clean Release commit `1f4189b`: - version_site_registry, corpus_ratchet, corpus_stage and corpus_tier3_ratchet pass after the rewording - fmt and clippy: clean - query_cli, abi_report, pytest_fixture_binding and exec_copy_registry: pass - precision_gate: 7/7 - guest_gates.sh: pass Filed as out of scope for this release: #300 (six wrong-bind shapes that predate it) and #301 (make resolution resumable). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
I072 R4 (`follow_own_imports`) copied ANY resolved import bind onto every
bare use of the name. Reviewed bind for bind on rust-analyzer it spread 80
phantoms: `quote` 41, `check` 29, `crate_def_map` 4, `Ordering` 4, `Id` 2.

Three structural clauses:
(a) the target is free (`temp.sym_free`): never a method, field or any
    symbol with a non-module parent;
(b) every import row of the name was proven: tier1q_pass1 or
    tier1q_rel_samefile, or -- for a tie-break/rel_pkg bind -- the path
    names the target's FILE by the language's module convention (Rust
    `crate::`/`super::`/`self::`/exact package head -> src/a/b.rs or
    a/b/mod.rs, target top-level there or re-exported by a proven import;
    Python dotted module -> trailing path components);
(c) a Rust `use` head is a relative marker, a workspace package tail, or a
    module the importing file declares.

At source (tier 1Q stem arm, Rust only): a one-segment qualifier naming a
package is kept to that package's root, so `use hir::Label` no longer
tie-breaks onto hir-def/src/hir.rs.

Corpus, occurrence-joined vs 4e3034a: rust-analyzer -89 (80 phantoms +
2 Label phantoms removed, 7 correct glob-re-export binds lost), 1 retarget
(Label use site back to its pre-existing dc841af tier-3 target); the other
eight repos bind-for-bind identical.

precision_gate rust: +11 probes, +10 forbid sites (7 phantom classes, 2
positives); every forbid site BOUND with index.rs at 4e3034a. Clause
mutations each went RED on exactly their decoy.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
I072 R1 refuses every parameter as a module-level declaration, which
removed every fixture-injection edge: python-flask tests/conftest.py::client
went from 305 references (dc841af) to 0 (v0.32.0).

New rule `pytest_fixture` (resolved_by 100), structural facts only, read
from the stored syntax the Python scope module already parses (no
extractor or schema change): a PARAMETER of a consumer -- `test_*` at
module level, a method of a module-level `Test*` class, or a function
decorated `@pytest.fixture`/`@fixture` -- binds a function decorated
`@pytest.fixture`/`@fixture` (called or not; `name=` is the fixture name)
in the same file (consumer's class first, then module) or the NEAREST
conftest.py in the same or an ancestor directory. A fixture never
resolves to itself (`def app(app)` reaches the outer one), two
definitions at the deciding level refuse, and a `call` of the parameter
binds nothing (it calls the fixture's value). Applied after the tiers,
through the EXPORTED_CANDIDATE admission.

Corpus vs item 1: python-flask +786 gained, 237 retargeted (params
T2-bound to a same-file class member in v0.32.0, now the fixture), 3
rule-only; all 1 026 adjudicated by an independent Python-ast oracle
(1 019 agree; the 7 it cannot model are closures/lambdas, read by hand,
correct). conftest client: 268 -- dc841af's other 37 were phantoms on
locals `client = app.test_client()`. Other eight repos identical.

Registered in resolved_by::ALL, the provenance promises and the pool
capability registry. Tests: pytest_fixture_binding (6), a scope unit
test, and 9 new Python precision-gate probes / 7 forbid sites; every
listed mutation run RED.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
In Zod `formatError(error, mapper = (issue: I) => issue.message)` the
header binding row for `issue` was taken as a parameter of formatError.
A header binding row is now a parameter only when it is not a parameter
of a function nested in the header (`header_nested_parameters`: arrows and
`function` expressions inside the parameter list's defaults); a use of
such a name ON the header line is local to the arrow.

Correcting that alone re-exposed 22 Zod phantoms (`for (const issue of
error.issues)` onto util.ts::issue) that the bug had refused by accident.
JavaScript/TypeScript body binding rows are therefore scoped to the
enclosing indexed function, as Python's are: an over-approximation of
block scope, measured.

Corpus vs item 2: ts-zod -22, js-express -4, rust-analyzer -3 (its TS
editor code), py-django -6 (admin JS); 34 of 35 refusals are locals that
had bound a same-named module declaration, read at source. ONE correct
bind lost: zod v3/types.ts:818, `emojiRegex = new RegExp(...)` assigns the
module-level `let`, which a binding row cannot tell from a declaration.

Tests: local_scope_review_fixes (item 3 case) and a unit test for
header_nested_parameters; five mutations run RED (a sixth guard, `j > 0`,
was redundant with the parameter-list bound and was removed).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
`try: from m import A as B` / `except ImportError: class B: ...` refused
every use of `B`, including the file's own fallback class. The R5 alias
refusal now leaves a decision standing when its target is a FREE Python
declaration in the ref's own file.

Both conditions were measured against the corpus before they existed:
admitting any same-file target bound py-django's module-level
`Database.x` (after `import oracledb as Database`) to the class attribute
`Database = Database` (42 sites over four backends) and `pdb` to a class
field (2), and bound rust-analyzer's `Vec<_>` to `const _` beside `use ...
as _` (3). Rust, PHP and C# reject an aliased import beside a same-named
item, so the exemption is Python's only.

Corpus vs item 3: bind-for-bind identical in all nine repositories (the
fallback shape does not occur in them).

Tests: two cases in local_scope_review_fixes; three mutations (exemption
off, member admitted, language admitted) each RED.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
The release review found 21 correct dc841af binds on py-django lost to
locals assigned from dynamic values (ContentType 8, Permission 9, Site 2
via apps.get_model; LEVEL_TAGS 1 via importlib.import_module; ChangeList 1
via get_changelist()).

The one narrow rule proposed -- a local assigned from a call whose string
arguments spell the local's own name is an alias of that name -- was
implemented, tested and measured on all nine repositories: +31 on
py-django, 19 of them the lost binds and 12 phantoms (`TestCase =
type("TestCase", ...)` 9, a migration-state `Blog` 2, `password_changed =
getattr(validator, "password_changed", ...)` 1); the other eight repos
were unchanged. Per the brief it phantoms, so it is dropped and no code
ships; the rejected patch is kept out of tree. The measured loss is
recorded in the I072 record.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
The handoff Zod database predated the final named-import guard. Measured
on the released 4e3034a binary, occurrence-joined against dc841af, Zod is
33 gained / 129 refused / 0 retargeted / 0 rule-only. The witness
`v4/classic/compat.ts:31` was wrong: the release binds `core.output<T>` at
:31 and :35 to `ZodFunction.output` (a method) through tier 3.

Not fixed here: the TypeScript extractor emits the leaf of a
nested_type_identifier as a bare, unqualified type ref; qualifying it
moves ~2 900 Zod type refs at once, which is not a cheap fix. Recorded as
a finding.

Also discloses Flask's fixture refusals: 324 of the 383 restored by
item 2's rule to the identical dc841af target; the 59 that stay refused
are locals and calls of a fixture's value.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
corpus_cost fired on all seven tier-1 repositories. Attributed per
statement before anything was blessed:

* the own-import row scan (item 1) drove from `import_name_target` into
  `refs` by (file, name), which no index covers: 3.57 M VM steps on
  rust-ripgrep, 6.3% of a cold index. Driven from `refs` like the INSERT
  above it: 229 K.
* the alias refusal arm (item 4) let SQLite scan all of `refs` and probe
  `shadow_alias`; fullscan_step +6.5..9.2% on every repo, each within 3% of
  its ref count (php-guzzle: 38 732 of the 38 733 refs, attributed with
  SQLITE_STMTSTATUS_FULLSCAN_STEP). CROSS JOIN from the alias rows.
* the pytest fixture UPDATE (item 2) now drives FROM `fixture_bind` and is
  skipped when it is empty.

corpus_cost now passes with no bless (vs the blessed baseline, vm_step /
fullscan_step: ripgrep +0.5/+0.1%, flask +3.6/+0.7%, zod +0.5/+0.3%,
express +0.6/+0.2%, guzzle +0.5/+0.1%, sinatra +0.6/+0.3%, dapper
+0.5/+0.2%). Nine-repo bind diff against the previous head: identical.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Reviewer B: `follow_own_imports` keys `import_name_target` by (file,
name), so `mod tests { use crate:🅱️:build; }` or a function-local
`from pkg.b_mod import build` decided every bare `build` in the file.

New clause (d): every use site tier 3 is about to decide must SEE an
import of the name -- a file-level one, or a nested one whose function,
method, class or Rust inline-`mod` body holds the site -- and every import
it sees must be resolved to the table's one target; an unresolved nested
import still rebinds its scope. Otherwise the name is left to
reachability. Same rule in all seven languages; the table is also cut to
the names tier 3 is deciding before any per-row work.

A first cut (file-level imports only) withdrew 670 correct rust-analyzer
binds (574 `check_diagnostics` inside `mod tests`), 110 ripgrep and 32
py-django; this form is measured instead. Corpus vs the previous head:
py-django -2 (proxy_model_inheritance/tests.py:33 was a phantom -- a
method-local import rebinds ProxyModel there -- and :51 a correct bind the
per-name decision cannot keep); the other eight repos identical.

Tests: Rust and Python precision decoys (reviewer B's rs1/user.rs:4 and
py3/own.py:5 shapes; both BOUND on 4e3034a), an indexer test for the
unresolved nested import. Mutations RUN: scope check off -> both decoys
PHANTOM; target check off -> indexer test RED.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Reviewer B: the R5 barrier was per file. A function-local `from
pkg.a_mod import thing as fast` refused every `fast` in the file, so a
module-level `def fast` lost its callers elsewhere; `mod inner { use
crate:🅱️:Settings as Config; }` refused the file's own `struct Config`.

Each aliased import now carries the span it binds in (the innermost
function, method, class or Rust inline-`mod` body holding it; none for a
file-level import), and a site is barred only by aliases whose span holds
it. Item 4's same-file fallback exemption now applies only when every
barring alias is FILE-LEVEL -- inside a function that aliases the name
itself, the alias wins over the module definition (it did not before this
change: B's alias.py:3 would have bound the module `def fast`).

Generic, no Python-specific code (lane G). Corpus: bind-for-bind
identical in all nine repositories.

Tests: Rust and Python precision probes -- required binds at `alias_make`
and `alias_g` (both unresolved on 4e3034a) and forbidden sites inside the
aliasing scope. Mutations RUN: span check off -> both RECALL misses;
file-level condition off -> `alias_f` PHANTOM.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Reviewer B attributed 69.5% of python-flask's blessed +1.87 M VM steps,
and 68 M on py-django, to I072 R2's "module-level static head" SELECT: it
scanned every unresolved qualified access ref in scope, probed `symbols`
per ref, and copied the ids through a Rust loop that discarded the
qualifier it fetched. Now ONE INSERT ... SELECT driven from the Python
module-level `static` symbols into their own file's refs, with a
case-sensitive prefix test (`LIKE` folds case and reads `_` as a
wildcard).

Also drives B1's scope pass from the files that hold a candidate name
(rust-ripgrep 655 K -> 377 K VM steps).

Measured: python-flask 17.07 M -> 16.67 M VM steps (-2.4% vs the blessed
baseline); py-django 938 M (4e3034a, reviewer B) -> 881 M; the Django
`t1q_groups_info` step 2 257 ms -> 723 ms (pre-I072: 711 ms). corpus_cost
passes with no bless: vm_step vs blessed ripgrep +1.0%, flask -2.4%, zod
+1.2%, express +1.9%, guzzle +1.3%, sinatra +2.0%, dapper +1.5%.
Nine-repo bind diff: identical.

Finding, not changed: the arm matches NOTHING in the corpus. Python
module-level values are extracted as kind `const` (py-django: 1 682
`const`, 0 `static`), so the "static head" test never fires; widening it
to `const` was measured and is also bind-for-bind identical.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Reviewer B: `function gen<T extends (a: number) => void>(cb: T) { return
a(); }` -- `header_parameters` took the first `(` of the signature, the
generic constraint's function type, so the body's `a()` was refused as a
parameter and the real parameter `cb` was not one.

`parameter_list_open` finds the first `(` at `<…>` depth 0 (the `>` of
`=>` closes nothing); `header_parameters` and `header_nested_parameters`
both use it, and the parameters of function TYPES inside the generics are
counted as nested (parameters of nothing that runs here).

Tests: a unit test and a bind-level test. Mutations RUN: first `(` again
-> both RED; generics scan off -> unit test RED (the bind test stays green:
the TypeScript extractor writes no binding row for a function type's
parameters today, so that clause is belt and braces, recorded as such).
Corpus: bind-for-bind identical in all nine repositories.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Reviewer B, three parameters that are locals and were not refused:

* a one-line JS/TS function (`function oneLine(helper) { return helper();
  }`): the parameter rule required a line after the header. A one-line
  signature now yields the column where the body starts on that line;
* an arrow parameter used on its own line (`items.map((x) => x.y)`):
  binding rows compared by line only. They now compare by (line, column);
* a Rust parameter whose type has no nameable head (`helper: fn() ->
  u32`): the extractor wrote binding rows for path-typed parameters only.
  It now writes one for every identifier parameter, qualifier-less when
  the type has no head -- tier 1R already reads that as "type unknown".
  The module doc, which claimed all typed parameters, is corrected.

Corpus vs B7: rust-analyzer -7, ts-zod -4, all phantoms read at source
(`resolver(path)` and `normalize(ty)` on `impl Fn` parameters had bound
`pub mod resolver` / `mod normalize`; `select`; Zod arrow parameters
`a`, `b`, `iss`); 0 recall loss. New binding rows: rust-analyzer +4 618,
rust-ripgrep +607 refs (the baseline `refs` counts move by exactly that).

Not modelled still, and recorded: an arrow OUTSIDE every indexed
function (a module-level `const f = (h) => h()`) has binding rows but no
enclosing scope to bound them.

Tests: one bind-level test with three sites; three mutations RUN, each RED
on its site.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Reviewer B: dropping `package_index_dir` (M8) survived precision_gate and
the whole indexer suite, and the Python oracle attributed the `pick`
probes to it -- they are carried by the Python module map (the import)
and `follow_own_imports` (the call, M5).

New Rust probe: `crate::idxm::IdxThing` in a signature names
`src/idxm/mod.rs`, whose stem is `mod`; `mod idxm;` plants its key on
lib.rs, which declares no `IdxThing`, so only the directory key gives the
tier-1Q tie-break the stem `idxm`. M8 RUN: RECALL miss on `idx_probe`
(the bind was also verified on the 4e3034a CLI: tier1q_tiebreak to
mod.rs:2). The Python oracle comment is corrected.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Reviewer B: dropping the import-REF generation gate in
`follow_own_imports` (M9) survived the whole workspace and precision_gate.

New generation_isolation arm: a call only the own-import rule can decide
(two same-directory candidates), then ONLY its import ref re-attributed to
a contribution in an unfinished generation, keeping its resolved target.

Measured on the way, and recorded in the test: a first version stayed
green under every gate mutation, because the stale-name refill NULLs the
import before any tier reads it; the arm now keeps the name out of the
refill. With that, M9 ALONE still survives -- B1's clause (d) re-reads the
import refs under the same gate -- and M9 together with (d)'s gate turns
the arm RED. One fact enforced twice, recorded as such.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
I072 removed `use writer::emit_record;` from the influence_classification
fixture so the own-import rule would not disambiguate the call the arms
need ambiguous -- leaving Rust no crate could compile. A glob import
binds no single name, so the own-import rule cannot follow it, and the
fixture is ordinary Rust again (reviewer B's M15a: all 13 green).

Mutation RUN: the explicit `use writer::emit_record;` -> 2 of 13 RED
(`a_dynamic_candidate_that_destroys_a_bind_is_reported`,
`a_grant_held_only_by_a_pending_generation_influences_nothing`), which is
why the fixture must not name the function.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Every moved dimension is attributed in the bless reason and in
_prdoc/records/I073-v0.32.1-resolver-review-fixes.md; each changed bind
was read at source (flask's 1 026 pytest_fixture rows by an independent
Python-ast oracle, 0 wrong). Summary vs 4e3034a: python-flask resolved
+786 (all correct); rust-analyzer -99 (92 phantoms, 7 correct glob
re-export binds), py-django -8 (7 phantoms, 1 correct ProxyModel),
ts-zod -26 (25 phantoms, 1 correct emojiRegex), js-express -4 (4
phantoms); refs +4 618 / +607 on rust-analyzer / ripgrep
from B8's parameter binding rows. php-guzzle, ruby-sinatra and cs-dapper
identical. The cost baseline is NOT blessed: corpus_cost passes.

Verified afterwards with no bless switch: corpus_ratchet, corpus_stage,
corpus_cost, corpus_tier3_ratchet, package_baseline, ruby_package_cost
and agent_task_bench all green.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
B8 made binding rows compare by (line, column); the module doc and the R1
comment still said "earlier line". Python-specific wording is left to
lane G.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
The full `cargo test --workspace` run on 857429b failed 3 of 4 126:

* abi_projection: Rust now projects 175 refs, up from 163. The +12 are
  B8's binding rows for parameters whose type has no nameable head. The
  pin is updated, with the reason.
* ref_kind_stance_registry: B1's scope pass reads bare use sites, and
  `follow_own_imports` now spells `binding` and `method_call`. The
  registry row now declares both and says why no target comes from them.
* version_site_registry: a new test's doc named the release version.
  It now names the commit instead.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Independent review B of v0.32.0 found three mutations of the
search_symbols token tier that no test killed:

- M12: narrow mode recording the tier under "primary". Only
  project="primary" was ever tested narrow, where the wrong key and the
  right one agree. The fan-out test now also narrows to its LINKED
  project and asserts the tier, the row tags and the population split
  are keyed by that name.
- M13: the note appended to a non-`measured` empty_population when the
  tier refuses. New fixture: the only prefix match is a struct, so under
  kind="function" the basis is `filtered` while the tier refuses 201
  functions.
- M14: ranking token rows by name length instead of name-token count.
  New names where the two rules disagree (4 tokens in 35 bytes vs 5 in
  19), in the e2e fan-out and in the merge unit test.

Each mutation was run and goes red on the named assertion.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Observed live: an installed v0.30.1 (schema 69) against a schema-70
index. Every MCP call failed with a generic "exited with status 1",
`code-index query` said only "project_not_available: opening database
<path>", and the migration runner's refusal went to the daemon's
stderr, which an MCP-spawned daemon has redirected to null.

- MCP server: a project slot that is not ready is probed for a schema
  newer than CURRENT_VERSION (the --db path for the primary). If so,
  both legs return project_not_available with one canonical hint --
  "index schema N is newer than this build supports (M); upgrade
  code-index (or delete .code-index to rebuild with this version)" --
  and a structured `schema_skew: {index_schema, supported_schema}`.
  Before this the daemon leg said `warming_up` (retry) and the snapshot
  leg the bare outer context.
- Slot errors keep the whole anyhow chain (`{e:#}`), not only the
  outermost context, for every attach failure.
- Daemon: a fatal error from `run` is logged to daemon.log before exit.
- CLI: a refusal carrying `schema_skew` also prints the sentence on
  stderr.

Tests: schema_newer_refusal_e2e (both legs, two tools, daemon.log) and
query_cli::an_index_newer_than_this_build_is_refused_with_the_repair.
Mutations run: skew refusal -> None (both RED), daemon log dropped
(RED), CLI stderr line dropped (RED).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Python locals are now classified where the tree is already parsed. The
extractor builds the file's scopes once (python/scope.rs) and stamps the
new LOCAL role bit LEXICAL_LOCAL on every lookup ref whose name (or, for
a qualified access, whose qualifier head) is bound below module scope.
The resolver's locality refusal reads the bit and no longer re-parses
stored source inside the resolve transaction; local_scope/python.rs and
its stored-text length check are retired.

New scope rules beyond v0.32.0: comprehension scopes with the first
iterable outside, walrus binding in the enclosing function, match
captures (bare, keyword, star, mapping, as), PEP 695 type-parameter
scopes, flow-ordered class bodies hidden from nested functions, and
byte-exact regions (the non-ASCII column mix is gone).

Migration 71 invalidates Python caches so existing indexes regain the
refusals. Six precision decoys, each a phantom on 4e3034a.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
A refused Python local stays a same-name unresolved row that
find_references still reports, so bit 21 reaches a DTO site. The new
case indexes real Python and asserts the stored bit and the masked wire
value; widening SCIP_MASK turns it red.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
version_site_registry refuses an undeclared file naming the current
release; these comments name a historical tree, which is a commit.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
The package leg's +0.15% vm_step is the local_scope candidate SELECT
projecting the LEXICAL_LOCAL bit for package-language rows; the paired
wall ratio was surveyed over eight runs on a shared box and the 129%
reading kept, not the two load-3 readings of 153/159%.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
A list `query` returns `{"batches": [...]}` as one successful MCP
reply, each entry carrying its own `error`, so `isError` is never set
and a batch in which every query was refused exited 0 -- the code of an
answer -- while each query asked alone exits 1.

Contract, documented in `query --help`, the README CLI reference and
`query::every_batch_entry_refused`: exit 1 only when EVERY entry
refused; otherwise 0, with refused entries named in batches[i].error.
What counts as an entry's refusal is the tool's own (search_text
answers a miss with total: 0, alone and batched). The stderr line says
"every one of the N batch entries refused".

Test: query_cli::a_batch_exits_one_only_when_every_entry_refused.
Mutations run: drop the batch check (RED: all-refused exits 0); all ->
any (RED: partly answered exits 1).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Migration 71 now invalidates ALL code files, not only Python: lane F
(I073) changed binds in every language, and a schema-70 index would keep
them until each file was edited. Its test stages old binds in a Rust, a
JavaScript and a Python file at schema 70 and requires all three
repaired and the text file's cache untouched.

The pytest re-homing itself (ref_role::PYTEST_FIXTURE, the row-reading
FixtureIndex, the binding-reader skips) landed while resolving the
rebase of the I074 extraction commit onto lane F. This adds the test
that grades tier 1R's skip of a fixture definition row.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Sibling-first lookup was already the design everywhere: the CLI spawns
`code-index-mcp` from beside itself (else PATH), the server spawns
`code-index-daemon` from beside itself (else PATH), and the plugin host
is looked for ONLY beside the running server. The observed failure was
a `code-index` copied ALONE: the sibling lookup found nothing and fell
back to the installed older server on PATH silently, and that server
then spoke for its own daemon. The "plugin packages could not be
carried" failure lost its reason the same way item 2's did: the slot
stored only the outer anyhow context.

- CLI: warn on stderr when code-index-mcp was not found beside the
  CLI and PATH is used.
- CLI: warn when the build that answered differs from the CLI's own
  (`CODE_INDEX_VERSION`, version + hash): the server's, read off the
  reply's `answer_provenance.build`, and the attached daemon's, read
  off its registration (with the pid to stop). An unreadable daemon
  build warns too; the agreeing case is silent.
- MCP server: the slot stores the whole chain via `slot_error`, so the
  plugin-host refusal now reaches the payload with its witness and
  repair.
- query_cli's sibling server (and the daemon) are now built every run:
  a sibling left from an earlier commit IS a different build, and the
  new warning said so on the first run.

Tests: query_cli::{a_copied_cli_says_it_is_using_the_server_on_path
(with a no-warning negative control), a_query_answered_by_a_server_of_
another_build_says_so (unix), a_query_answered_by_a_daemon_of_another_
build_says_so (real daemon)}, query::build_skew_tests, main.rs
slot_error_tests. Five mutations run, all RED.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
cost_attribution on python-flask against lane F's head: the per-candidate
consumer lookup (an ORDER BY over every earlier function, 1081 calls)
cost 398k VM steps and a sorter each (sort 789 -> 1877, over the
corpus_cost ceiling). The file's functions are now read once per pass
and searched in memory, and the candidate SELECT reads refs.roles once
instead of three bit expressions. python-flask vm_step: 16,452,458
(20cdf33) -> 16,359,019 (-0.6%).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Measured against lane F's head 20cdf33, joined on (path, line, col, name,
occurrence) over all nine repos:
* python-flask refs +24: the new pytest fixture DEFINITION rows (22
  plain, 2 aliased), which replace the fixture rule's files_fts re-parse;
  resolved 3930 = 3930, no bind moved;
* py-django resolved -2: two generator-expression targets that bound
  module functions (dispatcher.py:315 receiver, cache.py:262 etag),
  read at source, both phantoms;
* nothing else moved in any repo. Schema 70 -> 71 in every record.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Two over-reports found reviewing v0.32.0.

1. Deleting `pub(super)` items was `high api_break_deleted`. The Rust
   plugin records pub(crate)/pub(super)/pub(in ..) (and C# internal) as
   `module` visibility: crate/package-internal, unreachable from outside
   the project. Such a deletion is now `low internal_symbol_deleted`.
   `exported`/`unknown`/absent stay `high api_break_deleted`; private
   deletions stay unreported. Tool description and ReviewFinding docs
   updated.

2. `untested_change` flagged items tested only through a const table (a
   migrations runner) or trait dispatch. Reproduced: `m1` referenced
   only as a value in `const MIGRATIONS: &[fn() -> u32] = &[m1]` has no
   ref row at all, and `s.run()` on `&dyn Step` stays unresolved. Both
   are extraction/resolution facts outside this lane, and each generic
   widening available at the review layer (credit via the container,
   via a trait-dispatch edge) hides a truly untested change. So the
   finding keeps its severity and the reply carries
   `untested_change_semantics` -- once, exactly when such a finding is
   present -- naming the three shapes it cannot see.

Test: review_diff_grading_e2e (pub/private controls, deletion-only and
const/trait fixtures). Mutations run: module arm graded high (RED),
module arm disabled (RED), semantics always (RED), semantics never
(RED).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
- Upgrade cost, measured on the pinned py-django repo (release build):
  the schema-70 reparse of 2,970 code files takes ~58 s via `index`,
  ~71 s to `initial reconciliation complete` under a daemon (serving
  from 1.7 s, `state: reconciling`), against 48.7 s cold.
- A trap the notes must name: a one-shot `code-index query` with no
  daemon never finishes the reparse -- 80 consecutive queries over
  166 s all returned warming_up, 2,970 -> 2,070 files left. Upgrade
  instruction: run `code-index index` once per project.
- Count correction: the CI corpus job runs 76 tests in 14 suites (71 in
  13 indexer suites + agent_task_bench's 5), not "42 corpus/package
  checks"; counted with `-- --list`.
- The pytest fixture-parameter regression (0.32.0) and its 0.32.1
  restoration by lane F, listed.
- Lane H's own user-visible changes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Ruby package cost at schema 71 on the rebased tree: vm_step -0.2%, paired
wall ratio 144% after a five-run unblessed survey (142-150%, load 7-9).
I074 now records the conflict resolutions, the pytest re-homing, the
single all-code migration 71, the cost fix and bind diffs against both
4e3034a and lane F's 20cdf33.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Drop the test-only LocalScopes::is_local (lookup is the one entry point;
the module doc now links it), and use the HashMap entry API in the
fixture index's per-file caches.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
pool_capability_registry: I073's fixture_symbol row becomes defs_of and
consumer_of, the two regions that now read symbols for the re-homed
pytest rule. version_site_registry: the m0071 test doc cited the release
string; it names the schema instead.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
After a schema upgrade, a one-shot `code-index query` with no daemon
answered `warming_up` ("retry in 1-2 seconds") forever: on the pinned
django repo, 80 queries over 166 s, every one warming_up.

Option (b), durable per-call progress, was measured first and does not
converge: reparsed files ARE durable (killing `index` every 15 s took
pending code files 2,970 -> 1,570 -> 370 -> 0), but the
reference-resolution stage after them is ONE transaction (32 s on
django) and twelve 15 s windows never completed it. Converging per call
needs a window longer than the resolve, which grows with the repo, or
a resumable resolver -- indexer work outside this lane.

So option (a), disclosure: `code-index query` passes a new
`code-index-mcp --one-shot`; a one-shot server with no daemon to heal to
(no re-attach launcher) answers `warming_up` with `reconcile_pending`
{converges_on_retry: false, code_files_awaiting_reparse,
code_files_total, remedy, semantics}, and its hint no longer promises
retries succeed. The remedy: "run `code-index index` once, or start the
daemon (`code-index watch` / the MCP server)". The CLI prints it on
stderr. Long-lived sessions keep the ordinary warming_up: a retry does
converge there.

Test: query_cli::a_one_shot_query_mid_upgrade_names_the_remedy stages
the upgrade exactly as migration 70 does (1,500 generated files),
asserts the premise (the reply IS warming_up), the block, the stderr
line, and that the named remedy then works. Mutations run: block
disabled (RED), `--one-shot` not passed (RED). I075 record updated.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
defs_of reads only binding rows carrying PYTEST_FIXTURE; no import,
read or write row can reach its result.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
version_site_registry::every_file_that_names_this_release_is_a_declared_site
failed on three comments naming the v0.32.0 release, and version_bump.sh
refused the bump for the same reason.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Items 2-4 of the final review. Three rules of the fixture search had no
test: the consumer's class level (O4: module level only survived, and
moves 4 flask binds), the refusal of two fixtures at the deciding level
(O3: pick the first survived), and the local_bind skip of fixture
definition rows (removing it binds engine.speed in the review's lb2
shape to src/engine/core.py::Motor.speed). Two integration tests cover
all three; O4, O3 and the skip removal were each run and went red.

The python_imports skip is documented as defensive: the review ran its
removal and no reachable bind changed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Item 5 of the final review. A parameter named by @pytest.mark.parametrize
(or @mark.parametrize) on the def or on its Test class is injected by
parametrize, not by the fixture of that name, yet it bound the conftest
fixture. The scope walk now drops parametrized argnames from a
consumer's fixture parameters: string argnames with commas and spaces,
list and tuple forms, positional or argnames=. indirect=True and
indirect=[...] keep the routed names as fixture requests. Unreadable
argnames refuse every parameter of that def (never a guess).

Tests: a unit test on the extraction bits, an integration test on the
review's pt shape, and a Python precision decoy (2 forbid sites, both
PHANTOM with the rule removed). Five mutations run, all red.
Corpus: python-flask and py-django bind-for-bind identical to f208704.
No migration: m0071 already re-extracts every code file.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Item 10 (coordinator, found by a whole-workspace run on f208704):
exec_copy_registry::every_written_executable_goes_through_the_fork_lock
failed on query_cli.rs, whose stand-in `sh` server was written and
chmodded +x outside the fork lock. It now goes through write_executable,
link_or_copy's copy fallback through install_executable, and every
spawn in the target through locked_output/locked_status/locked_spawn.

MUTATION (RUN): revert query()'s locked_output to .output() -> RED in
a_file_that_installs_an_executable_locks_its_spawns_too. Before this
change the registry test itself was the red half.

Every other test touched since 4e3034a was checked for an executable
write or copy: none.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Item 6 of the final review. A one-shot query on an unindexed django said
"0 of 247 code files await reparse" while ~2,700 files had never been
walked: the count reads files already in the index whose cache an
upgrade invalidated, and a file the walk has not reached is not in the
index. Both count fields are now omitted when no indexed file awaits
reparse, the semantics and the field doc say what the count cannot see,
and the CLI's stderr says "indexed code files ... after the upgrade".

Tests: a server unit test (one-shot vs attached vs long-lived, and the
count's value 2 of 3), the mid-upgrade query_cli test now asserts the
count's value, and a new query_cli test on a first index.
MUTATIONS (RUN): O5 (count mtime_ns = -2) red in both the unit test and
query_cli; O6 (drop the can_reattach guard) red in the unit test;
dropping the new filter red in both.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Item 7 of the final review. B1 (I073) decided the own-import rule per
(file, name) and withdrew the whole name when any use did not see an
import, which refused correct nested binds: Rust
`mod tests { use crate:🅱️:build; build() }` beside a glob-imported
build() at file level, and Python's function-local import beside a star
import (reviewer B's own.py:10).

Each use is now graded on the INNERMOST import it can see, by the
language's scoping: Rust inline modules do not inherit the parent's use
except through `use super::*` (any other glob there may supply the
name); a Python class body's import is invisible to its methods; other
languages see an import wherever its scope holds the use. Where some
uses see the import and others do not, and reachability decides nothing
for the name, the name is decided and the out-of-scope uses are refused
per site (temp.own_import_refused, applied with the other per-site
refusals, and only where the import is what decides the name).

Tests: two integration tests (Rust inline mod, super::* glob, other
glob; Python shadowing and class body; and a refusal that must not
withhold a tier-2 bind), plus both fixtures as REQUIRED binds in the
Rust and Python precision oracles. Six mutations run, all red; the
whole-name withdrawal also turns both gates' recall red.

Corpus bind diff against f208704, all nine repos: py-django +1
(proxy_model_inheritance/tests.py:51 ProxyModel -> models.py:8,
correct; I073 recorded it as the bind the per-name rule could not
keep). Every other repo identical.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Item 9 of the final review. `code-index query --log error` still printed
the child server's WARN lines, because Server::spawn passed a constant
`--log warn`. The server now runs at the CLI's own --log, else
CODE_INDEX_LOG, else warn (query::server_log_level).

Test: the_cli_log_level_reaches_the_spawned_server, on a project with an
undecodable text file: at --log warn the WARN line is printed (the
premise), at --log error it is not. MUTATION (RUN): pass "warn" again
-> RED.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Item 8 of the final review. SKILL.md's `warming_up` entry said only
"retry in 1-2 seconds"; it now names `reconcile_pending` /
`converges_on_retry: false` and the remedy (15,287 of the 16,000-char
resource budget). The README gains "Upgrading to 0.32": run
`code-index index` once per project, why a one-shot query cannot finish
the reparse, and a short description of pytest fixture binding. No
install line or release tag is touched; the bump script owns those.

The agent rules source did not change, so no derived rules file needs
regenerating (`code-index rules --check`: every tracked file current).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
py-django +1 resolved / +1 edge / +1 resolved_type / tier3_import_boost
+1: tests/proxy_model_inheritance/tests.py:51 ProxyModel ->
models.py:8, read at source and correct. Occurrence-joined bind diff
against f208704 over all nine repos: the only change. corpus_ratchet,
corpus_stage, corpus_cost, package_baseline and ruby_package_cost pass
unblessed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Items 1-10, each with its tests, the mutations run and their results,
the nine-repo bind diff after items 5 and 7 (py-django +1, adjudicated
correct; everything else identical to f208704), and the one baseline
moved (tier3, that bind).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Follow-up to item 7, caught by the whole-workspace run: the Rust glob
read of `imports` in follow_own_imports asked no generation
(generation_build::the_ungated_import_reads_are_the_two_that_decide_nothing),
and the new temp relation own_import_refused had no stance in the pool
capability registry. The read now carries the pass's generation_gate;
own_import_refused is Bookkeeping (it only feeds shadow_refused, which
removes targets and never admits one). Recorded in I076.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
release: v0.32.1
Some checks failed
CI / cargo fmt (pull_request) Successful in 50s
CI / OSS corpus tier-3 scale (nightly) (pull_request) Has been skipped
CI / Grammar rebuild from source (nightly) (pull_request) Has been skipped
CI / guest crates (fmt, clippy, doc) (pull_request) Successful in 59s
CI / CI lane wall-clock headroom (pull_request) Successful in 1m5s
CI / cargo doc (intra-doc links) (pull_request) Successful in 4m57s
CI / cargo clippy (pull_request) Successful in 5m57s
CI / cargo deny (pull_request) Successful in 6m3s
CI / cargo check (MSRV 1.98) (pull_request) Successful in 6m12s
CI / cargo test (abi, 32-bit + wasm32) (pull_request) Successful in 6m35s
CI / cargo check (windows-gnu) (pull_request) Successful in 6m47s
CI / OSS corpus (tier 1) (pull_request) Failing after 28m42s
CI / cargo test (pull_request) Successful in 30m54s
CI / cargo test (daemon transport) (pull_request) Successful in 10m56s
CI / Plugin path cost + pool throughput (nightly) (pull_request) Has been skipped
CI (Windows) / fmt + clippy + build + test (windows) (pull_request) Successful in 1h4m4s
1f4189b9a7
Bump every version site to 0.32.1 (version_bump.sh, 8 sites) and reword
eight prose mentions of the in-progress release number — doc comments and
three corpus bless reasons — to cite their records (I073, I076) instead,
so version_site_registry keeps every file that names the release a
declared bump site. No measured value changes; corpus_ratchet,
corpus_stage and corpus_tier3_ratchet pass unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
CI's corpus_mutation on the release commit: deleting (or renaming away)
python-flask's tests/conftest.py left 237 fixture parameters that fell
through to the tiers, e.g. test_basic.py:33 `app` -> the FIELD
PrefixPathMiddleware.app by tier2_same_file. R1 refused them only for
module-level targets (temp.sym_free excludes members by design).

Every fixture-consumer parameter ref is now recorded in
temp.fixture_param, found fixture or not, and that table (not its found
subset fixture_bind) joins shadow_refused: the pytest rule is the only
thing that decides such a ref, and without a fixture it stays unresolved.

Tests: an integration test (conftest present / deleted / renamed, with a
module value and a nested-class field lure) and a Python precision decoy
(fx_orphan). MUTATION (RUN): the pre-fix refusal -> RED in the test, the
gate (PHANTOM) and corpus_mutation (237 rebinds); never recording
fixture_param -> RED.

corpus_mutation passes with KNOWN_REBINDS EMPTY: its one row stopped
biting because best_victim now picks conftest.py, not because the
defect was fixed; the row is deleted and its reason kept in I076.

Bind diff vs f208704, nine repos: python-flask -8 (calls of the `invoke`
fixture VALUE that had bound the fixture method), py-django -1 (a
mock.patch-injected parameter bound to the patched method) and +1 (item
7), all read at source. baseline.json, stage-baseline.json and
tier3-baseline.json blessed with those reasons. I076 addendum.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
Cite records, not the release number, in two new doc comments
All checks were successful
CI / cargo fmt (pull_request) Successful in 47s
CI / OSS corpus tier-3 scale (nightly) (pull_request) Has been skipped
CI / Grammar rebuild from source (nightly) (pull_request) Has been skipped
CI / guest crates (fmt, clippy, doc) (pull_request) Successful in 1m1s
CI / CI lane wall-clock headroom (pull_request) Successful in 1m2s
CI / cargo doc (intra-doc links) (pull_request) Successful in 6m0s
CI / cargo deny (pull_request) Successful in 7m15s
CI / cargo test (abi, 32-bit + wasm32) (pull_request) Successful in 7m22s
CI / cargo clippy (pull_request) Successful in 7m46s
CI / cargo check (MSRV 1.98) (pull_request) Successful in 8m1s
CI / cargo check (windows-gnu) (pull_request) Successful in 8m22s
CI / OSS corpus (tier 1) (pull_request) Successful in 35m1s
CI / cargo test (pull_request) Successful in 36m20s
CI / cargo test (daemon transport) (pull_request) Successful in 12m3s
CI / Plugin path cost + pool throughput (nightly) (pull_request) Has been skipped
CI (Windows) / fmt + clippy + build + test (windows) (pull_request) Successful in 1h0m35s
2ac7930345
`version_site_registry` requires every file that names the release to be
a declared bump site. Two comments added with the fixture-parameter fix
named it (a record filename and "the v0.32.1 release commit"); they now
cite record I076 and commit 1f4189b.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0126PDDLB4wNHxKXvWM1VNmu
buildagent referenced this pull request from a commit 2026-09-26 06:45:52 +02:00
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!302
No description provided.