Repository navigation
A wide correctness sweep across virtual-dispatch resolution, Dart support, and incremental builds. CHA/virtual-dispatch resolution gets over a dozen fixes closing collision and missed-edge cases around super(), receiver-typed dispatch, and cross-file same-named classes/functions; codegraph info now nudges you toward --no-incremental when an interface gains its first instantiated implementor after an incremental build. Dart gains full dataflow tracking (local variables, arrow-body implicit returns, grouped parameters) alongside extraction fixes for bare calls and bodyless members. Complexity/Halstead metrics now cover Julia, Solidity, R, Groovy, Zig, Objective-C, and CUDA, closing out the per-language rollout started in 3.16.0. Incremental/watch-mode builds gain several correctness fixes (barrel renames, tsconfig/jsconfig aliases, points-to confidence, return-type and invoked-property evidence) that previously required a full rebuild to pick up, and the roles/exports classifiers get sharper about Python entrypoints, declarative-only languages, and top-level-call consumers. Also included: .codegraphrc.json/--db config resolution no longer gets pinned to the invoking directory across a long tail of remaining call sites, several transitive dependency vulnerabilities are patched, and a batch of hooks/CI/skills reliability fixes for the project's own Claude Code tooling.
Bug Fixes
- cha: stop CHA/virtual-dispatch resolution from matching a coincidentally same-named local function or an unrelated same-named class across
super()calls, scope the implementor map per file while walking ancestors for inherited methods, exclude super-dispatch edges from sibling expansion, include the receiver's own instantiated type and RTA evidence fromnewexpressions, make native typed-receiver dispatch additive instead of a last-resort fallback, revisit sibling-implementor callers during the incremental CHA post-pass, seed object-rest-param type annotations for dispatch, scope same-named locals/params by their enclosing function so dispatch collisions can't cross function boundaries, tag super-dispatch edges distinctly in the WASM/JS inline path, and confirm concrete-receiver bare-name matches via type-aware dispatch;codegraph infonudgescodegraph build --no-incrementalwhen an interface gains its first instantiated implementor since the last full build (#2404, #2403, #2400, #2399, #2494, #2493, #2349, #2314, #2317, #2398, #2208, #2236, #2227, #2473) - resolver: seed the typeMap from
as-casts and a missing factory-method heuristic, resolve JSX elements and call-argument identifiers as references, stop.bind()/.call()/.apply()on an inline function from embedding its source as the receiver, remap.mjs/.cjsspecifiers to.mts/.ctssources, resolve workspaceexports-field targets without bypassing anode_modulessymlink, give computed dispatch-table access and this-bound EventEmitter callback registrations real invocation evidence, resolve logical-or/ternary function fallbacks to a real calls edge, resolve Python module imports to files and aliased module calls, preventresolveThisDispatchfrom matching an unrelated same-named class in another file, respect this-binding scope boundaries and distinguish static from instance accessors in same-file call attribution, and qualify object literals returned from factory functions (#2534, #2533, #2529, #2479, #2465, #2457, #2445, #2444, #2432, #2410, #2291, #2323, #2322, #2263) - native/rust: port
package.jsonexports-field resolution to the native engine, resolvecrate::/self::/super::module paths (including via aCargo.tomltarget-path override), resolve if-let-bound method calls to cross-fileOption/Resultreturn types, remove a dead same-file suffix-scan fallback fromresolveByGlobal, stop dropping dotfile-named source files and fix an undercounted build summary, and propagate afile_hashesread failure instead of silently reporting no prior state (#2289, #2215, #2376, #2371, #2209, #2532, #2541) - extractors: recognize array-pattern CJS
require()destructures and extract their rest bindings on the WASM/TS engine, extract rest/default bindings from destructuredconstdeclarations, mark destructuredconstexport bindings as exported, preserve the barrel-renamed declared name for CJSrequire()imports, strip quotes from plain quoted method/property keys, match the export line to the declaration instead of the export keyword, recognize cross-file ES6 getter/setter accessor reads, resolve a same-line decorator upgrade gap in call dedup, and fix var-shadowing at a function boundary so loop heads no longer kill the fallback value (#2268, #2269, #2277, #2294, #2296, #2183, #2460, #2252, #2248, #2440) - dart: port Dart's dataflow rules to the native Rust engine, track local variable declarations and calls, record an implicit return for arrow-body functions, give every name in a grouped-parameter wrapper the same
paramIndex, populate the typeMap for field/parameter types, extract bare calls, fixendLinetruncation and bodyless-member handling, and keep function scope active through Dart's sibling body (#2503, #2499, #2498, #2502, #2477, #2320, #2360) - complexity: add cognitive/cyclomatic/Halstead rules for Julia, Solidity, R, Groovy, Zig, Objective-C, and CUDA; correct switch/case complexity shadowing and comment-prefix undercounting, skip complexity/CFG for bodyless WASM functions and bodyless Rust trait methods, track complexity for anonymous Lua function-expression assignments, and show max cyclomatic complexity in the text summary (#2472, #2313, #2281, #2233, #2202, #2286, #2284, #2282, #2264, #2523)
- ast-analysis: stop misattributing complexity/CFG across same-line anonymous functions, track block-comment state in LOC comment detection, and stop requiring a multi-line span for
hasFuncBody(#2446, #2456, #2452) - roles: recognize
pyproject.tomlconsole-script and Python__main__entrypoints, persist Python entrypoint evidence so attribution survives rebuilds, stop emitting dead-* verdicts for declarative-only languages, apply the reachability downgrade to incremental classification, stop double-counting dead symbols in the roles map, detect transitively-unreachable dead code instead of justfanIn===0, and distinguish zero role matches from an unbuilt graph inroles --role(#2535, #2411, #2434, #2525, #2423, #2522, #2258, #2531) - exports: stop top-level-call consumer entries from masquerading as a named caller, correct the consumer discriminator's misclassification of top-level calls, discriminate file-level from symbol-level consumers, add id-based join fields to file-level exportJSON edges, honor
--functionsfor the json and graphson export formats, and clear stale deleted-export advisories on full builds, not just incremental (#2506, #2364, #2188, #2342, #2141, #2278) - incremental/watch: refresh
package.jsonexports/workspace caches in watch mode, don't purge a file from the graph when its rebuild fails, thread real tsconfig/jsconfig aliases and the known-files list into watch-mode resolution, treat an emptyfile_hashestable as a from-scratch build, persist barrel rename pairs, per-file return-type evidence, and invoked-property-name evidence across builds, upgrade points-to edges to direct confidence and thread the configuredpointsToMaxIterationsthrough the watch-mode points-to map, populatequalified_name/scope/visibility/content_hash/exportedon watch-mode rebuilds, thread renamed barrel exports through to the native FFI, give reverse-dependency edge reconnection a content-hash identity signal, align CHA/pts technique labels across engines, and mirror Kotlin-reflection/reflection-keyExpr call fallbacks (#2458, #2443, #2402, #2372, #2414, #2241, #2340, #2325, #2316, #2308, #2380, #2401, #2221, #2246, #2206, #2405, #2538, #2207) - db/config: derive
rootDircorrectly for a non-conventional--dbfile path, resolve display config fromcustomDbPathinstead ofprocess.cwd(), derive config from the target dir/--dbinstead of a cwd-pinned singleton across the remaining call sites, apply the configuredbusy_timeoutto remaining rawnew Database()call sites, stoppragma()from crashing on a non-TEXT PRAGMA result, add a missing index ondataflow.call_edge_id, back edges'INSERT OR IGNOREwith a real content-uniqueness index, and mirror the JSedges.dynamic_kindmigration in Rust'sinit_schema(#2394, #2393, #2338, #2223, #2226, #2225, #2203, #2298, #2210) - deps: pin
typescriptbelow 7.x with a loud warning on an incompatible version, override transitiveadm-zip/sharpto patched versions, resolve transitivefast-uri/hono/ip-addressvulnerabilities, and bump remaining transitive deps to resolve a high-severity npm audit failure (#2332, #2513, #2267, #2156) - hooks: fix
guard-git.sh's branch validation to use the real push target instead of the hook's own cwd, stop itscheckout --block from false-positiving on flags, stop its clean guard from blocking dry-run and matching raw substrings, surface build failures inupdate-graph.shinstead of silently no-oping (including its template and fallback path), scope its rebuilds to the edited file's own project, and pointpost-git-ops.sh's fallback atdist/cli.jsinstead ofsrc/cli.js(#2527, #2450, #2329, #2303, #2466, #2337, #2192) - ci: verify the comment author before updating/deleting the impact comment, fail open when
detect-changesis cancelled instead of only on failure, pin GitHub Actions to commit SHAs instead of mutable version tags, add a non-blocking reminder for non-closing issue references in PRs, and anchor native-change detection topackage.json's version instead of the latest tag (#2496, #2307, #2350, #2351, #2128) - skills: harden
/fixer,/sweep, and/housekeep— a moved queue head in step 2g, ablockedlabel auto-create,state.json/queue.jsonwrite ordering, crash-resume post-merge CI reconciliation, semantic verification on the reviewer-feedback gate, a self-gated outcome, dynamic repo-slug/SSH-remote detection replacing hardcoded values, macOS-safemktemptemplates, zsh-safe loops, Greptile reaction/convergence recognition and a raised re-trigger cap, squash-merge-aware branch pruning, and rate-limit handling for subagent notifications (#2486, #2504, #2467, #2480, #2416, #2395, #2345, #2343, #2362, #2361, #2185, #2195, #2180, #2171, #2169, #2311, #2231, #2253, #2490, #2469) - rust: recover from a poisoned
glob_cachemutex instead of a silent no-op, dedupe leiden bounds-check reads viafgetOrZero/igetOrZero, and resolve clippy warnings ahead of gating clippy in CI (#2328, #2211, #2484) - tracer: exclude anonymous-class/closure bodies from the JVM tracer's
traceCall()injection, exclude control-flow keywords from the same injection, fix C/C++ tracer source-file attribution via sed injection, and use a POSIX[[:space:]]regex in the Go tracer's BSD-sed-compatiblemain()matcher (#2449, #2273, #2276, #2274) - misc: sort each Tarjan SCC's node array for deterministic cycle order, skip interface methods in PHP's native
handle_method_decl, widenCommandContext.outputResult's data param fromanytoobject, sort query-path definitions by line to match walk/native order, setendLineon Python module-level constant definitions, recognize.mts/.ctsas TypeScript in both engines, tag literal-key bracket-index Lua calls ascomputed-literal, recurse.codegraph/*gitignore rules into nested test-fixture directories, recognize test/fixture directories and per-language conventions in-T, ignore the Rusttarget/build directory during file collection, and distinguish "file not found" from "file has zero functions" incodegraph audit(#2292, #2283, #2275, #2239, #2247, #2300, #2271, #2427, #2424, #2511, #2142)
Performance
- builder: dedupe import edges within a file before batch insert, and cache prepared statements in change-detection (fixing a WASM
detectMsregression) and in the technique-backfill chunk loop (#2463, #2234, #2204)
Refactors
- builder: consolidate barrel-trace-with-fallback duplicates onto a single
traceBarrelTarget(#2462)
Chores
- skills: add the
/fixerskill for end-to-end issue resolution, run housekeep after each batch, stop concurrent agents from colliding over git branches, and remove deadmaxCyclomatic/maxBlastRadiusfields fromCheckCliOpts(#2158, #2228, #2230, #2205) - rust: adopt
cargo fmtas a CI gate (#2327) - ci: auto-bump recall floors after stable releases, and apply the
KNOWN_REGRESSIONSbaseline fallback to the release publish gate, not just dev (#2168, #2129) - bench: only set
CODEGRAPH_ENGINEfor actual engine-comparison forks, and prune stale 3.15.0KNOWN_REGRESSIONSentries (#2341, #2318) - scripts: consolidate duplicated
.js/.tsresolve-loader implementations (#2219) - deps: bump
actions/checkout(6.1.0→7.0.1→7),actions/setup-python/actions/setup-node/actions/setup-goto 7,actions/download-artifact/actions/upload-artifactto 8.0.1/7.0.1,anthropics/claude-code-action(1.0.171→1.0.191 across several bumps),@biomejs/biome(2.5.3→2.5.8 across several bumps),better-sqlite3(12.11.1→13.0.3 across several bumps),@types/better-sqlite3to 9.6.0,tree-sitter-cli/web-tree-sitter(0.26.10→0.26.12),commit-and-tag-version(12.7.3→13.1.2),tree-sitter-gleam,smol-tomlto 1.8.0, andjs-yamlto 4.3.1 (#2516, #2514, #2520, #2519, #2518, #2517, #2515, #2429, #2355, #2354, #2353, #2335, #2334, #2333, #2197, #2200, #2199, #2198, #2196, #2155, #2154, #2153, #2152, #2151, #2122, #2123, #2124, #2126, #2120, #2125, #2121, #2119)