Repository navigation
Merge train: 43 reviewed PRs (2026-11-09) - #1186
Conversation
…nchmark - full_build and incremental_update now run Jedi call-resolution enrichment after the other resolvers. Best-effort: skipped without the [enrichment] extra or with CRG_DISABLE_ENRICHMENT=1; stats surface as result['jedi_enrichment']. - jedi_resolver: rebase resolved target paths onto the repo root as given to full_build, so enriched CALLS edges match stored node qualified names (fixes /var vs /private/var mismatches). - impact_accuracy: normalize changed-file paths to the stored absolute form so seed/neighbor/flow lookups hit; count File-node-sourced (module-level and IMPORTS_FROM) edges as neighbor files. - tests: full_build/incremental_update wiring regression tests and the co-change mock guard.
…chment - Remove 'harness needs fixing' note (co-change mode now works) - Clarify why published eval CSVs show predicted_files=0 (non-code seeds) - Update limitations section to reflect working co-change mode
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Two comments carried a "ponytail" marker that appears nowhere else in the codebase and does not read as English. State the same limits directly: why loose .cs files fall back to the review root, and why C# rebinding forces a full flow retrace rather than a changed-file trace. Comment only; no behaviour change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Namespace-aware binding refused every constructed receiver, so a call on a repository-local generic type that main resolved was left raw: Box<int>::Run rather than App.Box.Run. Key generic declarations by arity instead of excluding them. The parser records the type-parameter count, the resolver indexes App.Box`1, and a receiver's key is derived from its syntax, so nested arguments and tuples count correctly. Arity is what separates the declarations, so I<int> reaches I<T> while the separate I stays out of reach, and Pair<int> matches neither when only Pair<K, V> exists. A constructed containing type carries a second arity that one key cannot describe, so Outer<T>.Inner stays unresolved. The receiver's spelling is retained on the call; only the lookup key is derived from it. Type argument substitution, constraints and overload selection remain out of scope. Identity version 4 -> 5 reparses graphs built without arity evidence. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Preserve staging's batch storage, import context, freshness reconciliation, and C++ identity retry handling alongside the C# namespace changes. Keep source offsets in batch edge identity and refresh target classification after project-only C# rebinding. Add integration regressions for project ownership changes and independent C++/C# retry checkpoints. Update staging's inheritance fixtures to query namespace-qualified C# declarations while retaining their ambiguity assertions.
Updates the requirements on [fastmcp](https://github.com/PrefectHQ/fastmcp) to permit the latest version. - [Release notes](https://github.com/PrefectHQ/fastmcp/releases) - [Changelog](https://github.com/PrefectHQ/fastmcp/blob/main/docs/changelog.mdx) - [Commits](PrefectHQ/fastmcp@v3.2.4...v4.0.3) --- updated-dependencies: - dependency-name: fastmcp dependency-version: 4.0.3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com>
Combine staging's per-spec import scope with C# lexical using metadata. Keep C# identity and failed-file metadata ahead of the postprocess checkpoint. Cover both import metadata dictionaries on persisted edges and checkpoint ordering, and document the callers_of tradeoff for unresolved C# targets. Keep the C# changelog entries under Unreleased after staging's 2.3.9 release.
…ed paths Addresses the review on #823: - Incremental updates no longer make Jedi read every Python file. enrich_jedi_calls takes an optional files scope; incremental_update passes only the Python files it re-parsed. Full builds still scan all. - README: the co-change zeros were caused by the relative/absolute path bug, not doc seeds (code seeds such as cli.py and gin context.go were zero too). Note that the recall table predates the fix. - Co-change rows record seed_file relative to the repo root instead of the local clone path. - Merged latest staging. The Jedi step runs before _refresh_target_resolution, which stays last. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GDCA6EwHMWTPTSxZGBYHfa
Deleting a function its callers still need breaks them, yet the overall score stayed 0.00 and fail-on-risk let it through. A removed symbol with users is now scored by compute_risk_score's own terms: the flows it was in are traced again with it put back, callers from other communities, test coverage, security names, caller count and churn. One nothing uses scores 0. The overall risk_score, and so the Action's gate, takes the maximum. On click, deleting echo (20 callers) scores 0.65; changing it scores 0.40. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…train/2026-11-09 # Conflicts: # code_review_graph/graph.py # code_review_graph/rescript_resolver.py
…ain/2026-11-09 # Conflicts: # code_review_graph/graph.py # code_review_graph/parser.py
…rge train) #1154 lets the parser bind a receiver typed by a class in the same Java package, so pet.getName() is written as Pet.getName and the #1185 inherited pass moves it to NamedEntity.getName. The target is the one #1185 expects; the edge records the move under inherited_endpoint, not inherited_through. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ain/2026-11-09 # Conflicts: # code_review_graph/main.py
…n/2026-11-09 # Conflicts: # code_review_graph/skills.py
…1-09 # Conflicts: # README.md # code_review_graph/cli.py # code_review_graph/docs/LLM-OPTIMIZED-REFERENCE.md # code_review_graph/graph.py # code_review_graph/main.py # code_review_graph/parser.py # code_review_graph/search.py # code_review_graph/visualization.py # docs/COMMANDS.md # docs/USAGE.md # docs/schema.md # tests/test_visualization.py
…rain/2026-11-09 # Conflicts: # CLAUDE.md # code_review_graph/tools/query.py
…train/2026-11-09 # Conflicts: # code_review_graph/tools/query.py # docs/COMMANDS.md
…ain/2026-11-09 # Conflicts: # CLAUDE.md # code_review_graph/communities.py
…rain/2026-11-09 # Conflicts: # code_review_graph/incremental.py # code_review_graph/tools/build.py
…train/2026-11-09 # Conflicts: # code_review_graph/cli.py # docs/USAGE.md
… train/2026-11-09 # Conflicts: # code_review_graph/graph.py
…s' into train/2026-11-09 # Conflicts: # README.md # code_review_graph/changes.py # code_review_graph/tools/review.py
…rge train) #1171 turns an edge whose qualified target no longer exists back into the plain name and keeps the old target under claimed_endpoint. #1184 looked up the users of a deleted symbol by that old target, so a caller in another file was missed and the removed symbol read as unused. The lookup now also reads the claim. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The #895 test expects a search for helper_0_0_0 to fill less than its window. When sentence-transformers is installed, the embed_graph_tool case earlier in the module leaves vectors behind, vector search ranks every node and the window fills. The test now stubs vector search, so it gives the same answer whichever extras are present. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
code-review-graph reviewOverall risk: 0.85 (CRITICAL) — 500 changed function(s)/class(es), 141 affected flow(s), 345 test gap(s) (142 with no tested caller found, 203 reached only through a caller) Risk-scored changes
Affected execution flows
Test gaps
Reached only through a callerNo test names these directly, but a tested caller reaches them along the call path shown. That is a path in the call graph, not a record of execution -- the caller's tests may never take this branch. Treat it as where to look, not as coverage: these count as gaps and are scored as untested.
Token savings: this graph-backed report used ~1,314,833 fewer tokens (~67%) than reading every changed file in full (estimated, chars/4 approximation).
Powered by code-review-graph — local-first analysis; no code leaves the CI runner. |
The multi-repo HTTP tests unpacked three values from the Streamable HTTP client, but mcp 2.x yields two. The Jedi tests matched the stored path against root.resolve(), which Windows can spell differently. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mcp 2.x takes the client read timeout in seconds rather than a timedelta, and renamed CallToolResult.isError to is_error. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This merges 43 reviewed PRs into
stagingin one CI run. Merge it with a merge commit, so each PR is marked as merged under its author's name.This is not a release. The version stays 2.3.9, with no tag and nothing sent to
testingormain.Included
Query and search
Review and change analysis
Languages
Build, update, watch and storage
Install, server and platforms
Dependencies and tests
Not included
--dry-runpreview) sends every file read and write through a new install plan. fix(install): never wipe a hook settings file it cannot read as strict JSON #1157 replaced those same reads and writes with a JSONC-safe merge, and feat: add an opt-in steering hook for Claude Code #1155, fix: edit hook updates the repo that holds the edited file (#311) #1172 and feat(install): opt-in --gitignore block for the files install created (#471) #1180 build on that. The two cannot be joined by resolving conflicts: fix(install): show each change in --dry-run and write nothing before the question #1173 needs to be redone on top of this train, or a dry run would still write files.How it was checked
Each PR was reviewed on its own first. Contributor PRs come in through their reviewed
int/<number>branches. After each merge that clashed, the tests for the clashing files were run before the next merge.Seven faults came from PRs meeting each other, not from any one PR. Each is fixed on the train as its own
fix: ... (merge train)commit:GraphStorewhile they first loaded left its mock in them, and the search test from feat(build): wire Jedi enrichment into builds; fix impact-accuracy benchmark #823 then found nothing. The test conftest now loads them up front.EdgeInfoa type-only name ingraph.py, and fix(graph): preserve same-file nodes on qualified_name collision (#585) #715 buildsEdgeInfoobjects there. Every store raisedNameError.pet.getName(). The target is the same, so the test now checks how the move is recorded._load_igraph, so the Leiden test from feat(action): expose richer graph context in PR review reports #882 now stubs the loader too.Larger joins made while resolving conflicts:
risk_signalsand the score of a removed symbol now come from the same evidence, so the comment can never disagree with the score.Outputkind and the JSON filter are one full-text statement.Messagecomes fromfastmcp.prompts, so the prompt module still loads late.idx_nodes_nameindex stays, anddocs/schema.mdlists it.On the combined branch, on macOS only:
SUPPORTED_SCHEMA_VERSION15 in the VS Code extension.staginghere too, so CI is the real answer for those four.Not tested
cli_surfaceandsurfacesuites. Here those run an older installed copy of the program, which refuses the schema 15 database.Worth knowing
community_summaries,flow_snapshots,risk_indexand three covered indexes. The file keeps its size untilVACUUM.buildonce to pick up HTML, XSLT, JSON, Liquid,.cjsand.ktsfiles.--gitignore(feat(install): opt-in --gitignore block for the files install created (#471) #1180), context history (feat: opt-in local context history log and context-history command #1175) and Jedi enrichment (feat(build): wire Jedi enrichment into builds; fix impact-accuracy benchmark #823) are all off unless asked for.🤖 Generated with Claude Code