Repository navigation
Epic: compiler call-graph comparison across languages (tooling, skills, per-language references) #3772
Description
Goal
Measure and improve GitGalaxy's function call graph language by language, against a compiler or type-checker reference. Today there are two references: pyan3 for Python (#3332/#3378) and the TypeScript type checker (#3761). Each new language should be cheap in time and tokens.
What the TypeScript round taught us
The TypeScript round (#3756–#3760, #3764, #3767) was spent mostly on five things:
- Building the reference. Several iterations, and TypeScript 7 shipping no JS API broke CI.
- Triaging misses and wrong links by hand. Throwaway scripts, then reading samples by eye. This was the biggest token cost.
- Environment detours. Missing test and ML dependencies, a different
ruffversion, and the tokenizer download blocked by the network policy. - The same verification chain run by hand on every PR. About six commands, each with long output.
- Fixes forced to land one at a time.
Plan
Infrastructure: one PR
- Call-graph comparison: a reference-adapter contract, with a cached reference graph #3773 A reference-adapter contract, with a cached reference graph
- callgraph_triage.py: bucket every missed and wrong call link into a ranked backlog #3774
callgraph_triage.py: miss and wrong-link buckets as a ranked backlog - callgraph_check.py: the call-graph verification chain as one command with a short summary #3775
callgraph_check.py: the whole verification chain as one command with a short summary - Call resolver: explain one link (rung, candidates, qualifier) without reading call_resolver.py #3776 Resolver explain for a single link
- Session setup hook: install the pinned call-graph toolchain for Claude Code on the web #3778 A session setup hook that installs the pinned toolchain
Process
- Skill: callgraph-language-onboarding (add a compiler reference for a new language) #3779 The
callgraph-language-onboardingskill (checklist) - Skill: callgraph-miss-sweep, plus a Haiku callgraph-triage-scout agent #3780 The
callgraph-miss-sweepskill, plus a Haikucallgraph-triage-scoutagent
Languages (rough order)
- Call-graph reference: JavaScript (TypeScript checker with allowJs) #3781 JavaScript: the TS adapter with
allowJs - Call-graph reference: Go (golang.org/x/tools static call graph) #3782 Go:
golang.org/x/toolsstatic call graph - Call-graph reference: evaluate SCIP on Java as a shared route for several languages #3783 Java: evaluate SCIP as a shared route for several languages
- Call-graph reference: C/C++ (clang-based) #3784 C/C++: clang-based
- Call-graph reference: Rust (rust-analyzer SCIP) #3785 Rust: rust-analyzer SCIP
Still open: whether to adopt SCIP (#3783), and whether fixes can run in parallel on more than one branch.
Ground rules
-
A reference is a reference, not ground truth. Disagreements are checked against source before they're claimed (CLAUDE.md, "Comparative-correctness claims").
-
Every finding is filed in this milestone ("Compiler call-graph comparison").
-
Cross-language patterns are expected to recur:
- bodyless interface/abstract members (Call resolver (TypeScript): confident links land on bodyless signatures (interface / abstract / type members) instead of the code that runs #3757's pattern) in Java, C#, Go and Rust;
- calls inside string interpolation;
- built-in method shadowing (Call resolver: an untyped receiver's built-in method call (
str.trim(),map.get()) links confidently to a same-named repo method viafile/import#3756).
Triage should name these buckets, so a known pattern is recognised rather than rediscovered.
Activity
9 remaining items
Golden masters: Java sibling-overload and this(...) call edges (Part of
Golden masters: re-bless llm_brief and pagerank after merging main (P…
Java call resolver: calls to a sibling overload of the same name and …
squid-protocol commentedon Oct 24, 2026
Churn run
3772-20261024T0958Z(host melek) ended without a PR. plan-held on harmless detector.py overlap with 6432; cap full so requeued at front with approved planGolden: re-bless graph fields after rust self-receiver edges (Part of #…
Golden: regenerate llm_brief after merging main (Part of #3772)
Golden: regenerate llm_brief and pagerank after merging main (Part of #…
Call graph (rust): a self receiver reaches impl methods (Part of #3772)…
squid-protocol commentedon Oct 24, 2026
#6448 merged: a partial slice of [c:b43cf8a0] "#3785 Rust: rust-analyzer SCIP"; left: CI gate and toolchain hook, typed receivers/owners left (promoter-bot)
squid-protocol commentedon Oct 24, 2026
#6448 merged: a partial slice of [c:a15ba693] "#3780 The
callgraph-miss-sweepskill, plus a Haikucallgraph-triage-scoutagent"; left: known-pattern row added for rustself.m(); other languages' rows not touched (promoter-bot)Java super(...): pick the caller's own file's parent, lowercase class…
Java call graph: a constructor's super(...) is a call to the supercla…
squid-protocol commentedon Oct 24, 2026
#6456 merged: a partial slice of [c:e759db1c] "#3783 Java: evaluate SCIP as a shared route for several languages"; left: Java call-graph accuracy (super(...) edges) only; the SCIP shared-route evaluation is not done (promoter-bot)
C++ class_start: a namespace-qualified specialization is the last seg…
squid-protocol commentedon Oct 24, 2026
#6493 merged: a partial slice of [c:929272d4] "#3784 C/C++: clang-based"; left: gtest
TEST(Suite,Name)naming in the clang adapter (caller_unmapped 6409) is a measured naming mismatch but raises the denominator and drops precision to 78.9% until C++ overload-by-type and qualified resolution improve; namespace-qualified free calls; owner=foo>garbled template owner; `not_ext (promoter-bot)