Skip to content

Merge train: 43 reviewed PRs (2026-11-09) - #1186

Merged
tirth8205 merged 233 commits into
stagingfrom
train/2026-11-09
Nov 9, 2026
Merged

tirth8205 merged 233 commits into
stagingfrom
train/2026-11-09

Conversation

@tirth8205

Copy link
Copy Markdown
Owner

This merges 43 reviewed PRs into staging in 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 testing or main.

Included

Query and search

Review and change analysis

Languages

Build, update, watch and storage

Install, server and platforms

Dependencies and tests

Not included

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:

Larger joins made while resolving conflicts:

On the combined branch, on macOS only:

  • ruff, mypy (91 files) and bandit pass. Schema 15 matches SUPPORTED_SCHEMA_VERSION 15 in the VS Code extension.
  • Full suite: 7,708 passed, 0 failed, 948 skipped. The token-budget tests were counted with the long local temp path taken out of the output. Without that, 4 of them fail on plain staging here too, so CI is the real answer for those four.

Not tested

  • Windows and Linux on this branch: CI covers part of that.
  • The packaging gate and the opt-in cli_surface and surface suites. Here those run an older installed copy of the program, which refuses the schema 15 database.
  • Real clients other than the test MCP client.

Worth knowing

🤖 Generated with Claude Code

MrB1ZZ and others added 30 commits August 4, 2026 05:24
…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
tirth8205 and others added 18 commits November 9, 2026 21:16
#1139 makes graph.py load the parser on first use, so EdgeInfo is only a
type name there. #715 builds EdgeInfo objects when it aligns edges with
colliding names, which raised NameError on every store. The two methods
now import it themselves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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
#1139 loads igraph on first use through _load_igraph, so setting
IGRAPH_AVAILABLE alone no longer makes detect_communities take the Leiden
path when igraph is not installed. The #882 test now stubs the loader too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…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>
@github-actions

github-actions Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

code-review-graph review

Overall 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

Risk Level Symbol Location Tested
0.85 critical code_review_graph/changes.py::_sum_signals code_review_graph/changes.py:1296 indirect
0.85 critical code_review_graph/custom_languages.py::_validate_entry code_review_graph/custom_languages.py:201 yes
0.85 critical code_review_graph/graph.py::_certainty_tier_sql code_review_graph/graph.py:644 indirect
0.85 critical code_review_graph/graph.py::GraphStore._invalidate_cache code_review_graph/graph.py:1156 yes
0.85 critical code_review_graph/graph.py::GraphStore._semantic_signature code_review_graph/graph.py:1283 indirect
0.85 critical code_review_graph/graph.py::GraphStore._row_semantic_signature code_review_graph/graph.py:1297 indirect
0.80 high code-review-graph-vscode/src/backend/sqlite.ts::SqliteReader.checkSchemaCompatibility code-review-graph-vscode/src/backend/sqlite.ts:194 no
0.80 high code_review_graph/communities.py::_reassign_test_nodes code_review_graph/communities.py:271 yes
0.80 high code_review_graph/npm_alias_resolver.py::_token_comparators code_review_graph/npm_alias_resolver.py:362 indirect
0.75 high code_review_graph/changes.py::is_test_gap_exempt code_review_graph/changes.py:67 indirect

Affected execution flows

  • activate — criticality 0.76, 37 node(s) across 8 file(s)
  • benchmark_debug_workflow — criticality 0.74, 839 node(s) across 20 file(s)
  • benchmark_pre_merge_workflow — criticality 0.74, 789 node(s) across 19 file(s)
  • benchmark_architecture_workflow — criticality 0.74, 780 node(s) across 19 file(s)
  • benchmark_onboard_workflow — criticality 0.74, 770 node(s) across 17 file(s)
  • ...and 136 more affected flow(s)

Test gaps

  • code-review-graph-vscode/src/backend/sqlite.ts::SqliteReader (code-review-graph-vscode/src/backend/sqlite.ts:160)
  • code-review-graph-vscode/src/backend/sqlite.ts::SqliteReader.checkSchemaCompatibility (code-review-graph-vscode/src/backend/sqlite.ts:194)
  • code_review_graph/changes.py::_OldSide (code_review_graph/changes.py:796)
  • code_review_graph/changes.py::_bare_call_reaches (code_review_graph/changes.py:859)
  • code_review_graph/changes.py::_RemovedUsers (code_review_graph/changes.py:886)
  • ...and 137 more with no direct test

Reached only through a caller

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

  • code_review_graph/analysis.py::_shortest_loop (code_review_graph/analysis.py:130) — via code_review_graph/analysis.py::find_import_cycles, 1 hop(s)
  • code_review_graph/analysis.py::short (code_review_graph/analysis.py:206) — via code_review_graph/analysis.py::find_import_cycles, 1 hop(s)
  • code_review_graph/analysis.py::adjacency (code_review_graph/analysis.py:210) — via code_review_graph/analysis.py::find_import_cycles, 1 hop(s)
  • code_review_graph/change_details.py::_changed_nodes (code_review_graph/change_details.py:142) — via code_review_graph/change_details.py::build_change_details, 1 hop(s)
  • code_review_graph/change_details.py::_where (code_review_graph/change_details.py:157) — via code_review_graph/change_details.py::build_change_details, 2 hop(s)
  • ...and 198 more reached only through a caller

Token savings: this graph-backed report used ~1,314,833 fewer tokens (~67%) than reading every changed file in full (estimated, chars/4 approximation).

Note: analysis was capped at the configured maximum number of changed functions (set CRG_MAX_CHANGED_FUNCS to adjust).


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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.