Correctness release: stops TypeScript fabricating high-confidence call edges, fixes Kotlin import/call/parse gaps against the bundled grammar, retries failed extractions on update, and surfaces claude-cli envelope errors.
- Fix: TypeScript member calls no longer fabricate a high-confidence
callsedge by matching a receiver type by name alone (#2553, thanks @Earthfreedom). A member call resolves only when the receiver's type is defined in the same file or actually imported by the caller's file, so a third-partyimport type { Repo }can no longer bind to an unrelated localclass Repo; table-inferred receivers are tiered to INFERRED rather than EXTRACTED. - Fix: TypeScript/JavaScript calls inside a callback body passed to another call (for example
export const handler = wrapper(async (req) => { helper() })) are no longer dropped (#2552, thanks @Earthfreedom). The callback body is walked and its calls attributed to the declaration, through the same import-gated resolution so it cannot fabricate edges. - Fix: Kotlin imports, fully-qualified calls, and one-line type bodies (#2526, #2550, #2551, thanks @spaceBrownie, @thomasrengot-hub, and @Mustaqeem66 for #2531). The extractor now matches the bundled grammar's
importnode (imports were silently dropped) and resolves each import to the real target node; a fully-qualified call likecom.example.Foo.bar()now produces acallsedge; and a file with syntax the bundled grammar cannot parse (such as a one-lineclass C { val x }) now emits a warning instead of silently extracting nothing, with declarations recovered inside an error span keeping their enclosing class. - Fix:
graphify updatenow retries a file whose extractor failed on a previous run instead of stamping it up-to-date forever (#2543, thanks @michaelxer). A failed extraction is no longer recorded in the manifest as processed, a manifest already poisoned by the old behavior is healed on the next run, and genuinely-unchanged files are not re-processed. - Fix: the claude-cli backend now surfaces an API error carried in the stdout envelope (for example a rate limit returned with a zero exit code) instead of treating it as an empty success (#2554, thanks @annieyii). The error is raised on both the zero and non-zero exit paths.