Skip to content

v1.40.0

Latest

Choose a tag to compare

@artk0de artk0de released this 15 Aug 15:28
· 1 commit to main since this release

1.40.0 (2026-08-15)

⚡ Indexing & performance

  • Indexing gained --force-enrichments, which rebuilds enrichment data (git and codegraph signals) without re-running embeddings — turning a full reindex's hours into a minutes-long recompute when only enrichment logic changed.
  • Both --force and --force-enrichments now accept --languages, so a rebuild can target a single language's payload instead of the whole project.
  • Indexing supports an opt-in --cpu-prof flag on enrichment worker threads, for profiling slow indexing runs.
  • Schema-drift warnings now name the exact rebuild command needed — enrichment recompute vs. a full reindex — instead of always demanding a full reindex.

🗣 Language support

  • TypeScript call-graph resolution now understands types, not just syntax: union and narrowed receivers, structural/duck-typed and merged-interface receivers, generics and overloads, inferred return types, and JSX component tags all resolve to their real targets — closing gaps where call-graph tools (find_callers, trace_path, blast_radius) silently dropped or misattributed these calls.
  • TypeScript call-graph extraction now also picks up CommonJS require() imports, barrel re-exports, computed-property calls (obj'foo'), .call/.apply/.bind indirection, and methods passed as callback values — patterns it silently missed before.
  • Call-graph resolution can now defer a weak match to a later, more precise pass instead of committing early, recovering call edges that used to be dropped outright.
  • Large TypeScript codebases' codegraph resolution now exposes its parse-cache size and memory budgets as environment variables, letting hosts tune resource usage to their repository size.

🩹 Fixes

  • Dozens of TypeScript call-graph correctness fixes — bare/global calls, destructured and untyped receivers, node_modules noise, tsconfig path mapping, barrel/index re-exports, and resolving imports against the right project root all used to fabricate, misattribute, or drop call edges.
  • Fixed TypeScript codegraph resolution memory/stability issues so long-running or repeated indexing doesn't grow caches unbounded, and a failed parse degrades gracefully instead of crashing the run.
  • Fixed several bugs in --force-enrichments and --force where forced rebuilds silently skipped work, ran extraction twice, refused to combine with --languages, or left a half-built collection behind after a failed rebuild.
  • Fixed multiple codegraph-storage reliability bugs that could crash a rebuild, silently drop or duplicate call-graph data, leave a stuck lock behind after a killed process, or discard the daemon's own crash diagnostics — including a case where find_cycles reported no cycles for a project that had them.
  • Fixed several code-chunking and symbol-naming bugs for JS/TS — nested class members, const-object namespaces, and certain exports now chunk and name correctly instead of producing duplicate, missing, or misnamed search results.
  • Fixed Ruby call-graph type inference wrongly attributing ActiveRecord association types (has_many, belongs_to, etc.) to methods where those macros don't actually apply — they're class-body-only declarations.
  • Server startup no longer logs a spurious "failed to obtain server version" warning against Qdrant.
  • Fixed file-level search rankings occasionally being skewed by one arbitrary method's call-graph centrality score instead of being scored neutrally.

🔧 Environment Variables

  • CODEGRAPH_TS_PROGRAM_CACHE_MAX · Max number of cached TypeScript codegraph programs retained across resolution runs · default: 8 (new)
  • CODEGRAPH_TS_PROGRAM_PARSED_FILES_MAX · Max project source files parsed into a single TypeScript codegraph resolution program · default: 20000 (new)
  • CODEGRAPH_TS_PROGRAM_PARSED_DEPENDENCY_FILES_MAX · Max dependency (.d.ts) files parsed into a TypeScript codegraph resolution program · default: 8000 (new)
  • CODEGRAPH_TS_PROGRAM_RETAINED_TEXT_MB · Max source text retained in memory by the TypeScript codegraph resolution cache · default: 256 (new)
  • CODEGRAPH_TS_PROGRAM_STRATEGY · How TypeScript codegraph resolution builds its type-checking program: whole-project, per-entry-file coverage, or auto-selected · default: auto (new)
  • CODEGRAPH_TS_PROGRAM_WHOLE_ROOT_MAX · Max tsconfig root file count before falling back to per-entry-file resolution instead of a whole-project program · default: 20000 (new)
  • CODEGRAPH_TS_PROGRAM_WHOLE_MIN_ENTRIES · Min distinct files a run must touch before building a whole-project TypeScript program · default: 200 (new)
  • ENRICHMENT_WORKER_MEMORY_LIMIT_MB · Per-worker memory ceiling for enrichment worker threads · default: 6144 (changed)
Full Commits
  • ad384f1 chore(release): 1.40.0
  • 43b253d fix(pipeline): stamp the run's content hashes on the first-index/--force path (o317j)
  • 9361eef perf(pipeline): one payload operation per distinct payload, not per point (6aytq)
  • ce8654c perf(trajectory): write the deferred pass's symbol/chunk join once, not per file (6aytq)
  • 39e80e3 perf(language): root the whole ts.Program at the tsconfig set UNION the run's corpus (6aytq)
  • d3d48b0 perf(adapters): read finalize file overlays setwise, 3 statements not 3 per file (6aytq)
  • 48f3b27 perf(pipeline): stop serializing the post-pass-2 fileFinalize tail (6aytq)
  • e6071e2 perf(trajectory): double-buffer the pass-2 bulk flush so resolve keeps running (6aytq)
  • e4a0033 perf(qdrant): index the fields the enrichment scans filter on (6aytq)
  • 1723953 fix(pipeline): --force-enrichments runs one extraction cycle, not two (6aytq)
  • 4799b32 fix(pipeline): --languages now reaches the codegraph force/repair path
  • 6220285 chore(scripts): heap-limit knob, kill-safe progress and prime parity in the TS harness (6aytq)
  • 0f44d93 fix(language): segment on run-wide files and retire every Program, not just the whole one (6aytq)
  • 0c214ec improve(pipeline): opt-in heap snapshot on the enrichment worker's way down (6aytq)
  • d265402 perf(language): segment the whole ts.Program and gate it on the isolate's heap (6aytq)
  • 7187b2b perf(language): prime the whole ts.Program at pass-2 start on a bulk resolve (6aytq)
  • ccda150 improve(pipeline): enrichment worker heap ceiling 6144 MB, warn when it is inert (6aytq)
  • e69abb6 perf(language): one whole-project ts.Program instead of one per entry file (6aytq)
  • 38c4f6d chore(scripts): whole-project config W and env recording in the TS resolve harness (6aytq)
  • e153af0 feat(language): env knobs for the four TSProgramCache budgets (6aytq)
  • 74dbc41 chore(scripts): offline TS resolve harness over real taxdome under worker limits
  • 3608005 improve(pipeline): chunked in-worker CPU profile that survives a kill
  • 6f38cd9 improve(trajectory): attribute codegraph run wall-clock to phase and language
  • 79592b8 perf(pipeline): give enrichment worker threads a 16MB V8 stack
  • bcd6cd6 fix(pipeline): --force-enrichments codegraph/all now genuinely forces re-extraction
  • 0d271ec fix(language): TSProgramCache#build degrades to null on ts.createProgram failure
  • c17dea9 fix(adapters): interleave upsertFilesBulk's DELETE+INSERT per group, not whole-batch
  • 2b9d11f perf(adapters): batch DELETE across the whole upsertFilesBulk batch, not per-file
  • a8a3b04 fix(trajectory): rebuild cg_symbols_edges_file's drifted secondary index periodically
  • b76fe12 fix(pipeline): route codegraph repair through the run-shared streaming sink
  • 6f9faf6 fix(trajectory): dedup codegraph file-edges by target, surface pass-2 crash context
  • 69a5a2f improve(pipeline): add CODEGRAPH_FORCE_RESOLVE to make pass-2 resolve profilable (bij2m)
  • 7323cd1 perf(language): share pinned dependency ASTs past eviction, budget retained Programs (5je8t)
  • e27f257 perf(language): key the TSProgramCache by coverage, not by entry file (4m2vb)
  • 56e8060 perf(language): replace O(calls x chunks) innermost-chunk scan with O(N log N + C) sweep (vc8j0)
  • b401cea docs(language): name the real lifetime bound on the host probe memos (e6yad)
  • f37928e perf(trajectory): answer run-global non-emptiness in constant time (8zwl9)
  • 81e6003 chore(scripts): count host asks and readFile in the TSProgramCache IO profile (i2nqa)
  • 6153721 perf(language): memoize the TSProgramCache host's filesystem probes (e6yad)
  • 9cbd58b improve(dx): mr-review comments speak human, carry a fix, cite MR-visible paths
  • 70502ce feat(ingest): opt-in --cpu-prof for enrichment worker threads
  • 10ea0c9 fix(language): bound TSProgramCache's dependency .d.ts retention, add worker memory ceiling (8qf86)
  • 9ad730f fix(language): bind TypeScript's tsconfig root per run, not at construction (vrxna)
  • b45fe93 fix(language): resolve TypeScript against the indexed root, not the cwd (f4wcm)
  • 28e1e24 docs(ingest): correct the test list to match the shipped validation (mjzis)
  • f9b538f docs(ingest): make language-narrowed validation the rule for resolver work (mjzis)
  • 4e12db2 fix(language): implement the tsconfig paths pattern language (t6ycg)
  • f595498 feat(ingest): add a --languages selector to both force modes (mjzis)
  • ab7cf78 fix(language): read tsconfig with the compiler's own JSONC parser (t6ycg)
  • dda0e80 docs(ingest): design the --languages selector (mjzis)
  • eae09c4 fix(api): address the physical collection when recomputing enrichments (snbzk)
  • 97766a8 improve(cli): make --force-enrichments imply --wait-enrichments
  • 32d2b74 fix(adapters): drop the codegraph secondary indexes that void their scoped DELETE (oucyv)
  • 389c961 fix(adapters): stop replacePageRanks fataling the codegraph database (snbzk)
  • 4f62753 fix(adapters): drop the cg_symbols_cycles secondary indexes voiding its scoped DELETE (oucyv)
  • d229a5a test(trajectory): pin that a no-op finalize keeps the last resolve measurement
  • e15360e fix(ingest): run --force-enrichments as a real run, not a repair (snbzk, wifim)
  • 77ac723 fix(cli): stop --force-enrichments always failing as mutually exclusive (slywc)
  • de60ade docs: implementation plan for TS bare-global + DOM/BOM vocabulary fix
  • b564097 fix(language): add DOM/BOM vocabulary to the TS external-call guard
  • 16ca4d7 fix(language): classify bare ambient-global calls as external (tea-rags-mcp-4008o)
  • 20a62c2 docs: design for TS bare ambient-global classification + DOM/BOM vocabulary
  • 59dc629 docs(rules): refresh the root CLAUDE.md and fix stale rule citations
  • bafa143 docs(rules): add domain navigators for every src/core domain
  • d14d421 fix(adapters): bound the codegraph daemon stale-build restart retries (tea-rags-mcp-ryoqn)
  • bb7b638 docs(config): make --force-enrichments the default enrichment validation tool (w2ldv)
  • 7a076fe feat(ingest): add --force-enrichments to rebuild enrichments without embeddings (slywc, 3zfpx)
  • abbebb5 test(ingest): pin the non-fatal codegraph remover contract on build discard
  • b36cfe8 feat(drift): name the trajectory a schema drift needs recomputed (865il)
  • a5cd9d2 fix(ingest): discard a failed rebuild's half-built collection when a prior version serves
  • 9a0de22 chore: downgrade the fork copyright to historical attribution
  • 84528e4 fix(trajectory): stop an empty run erasing the codegraph resolve breakdown (nl93h)
  • 0195a2a test(language): pin the TS external guard's continue-not-drop invariant (tea-rags-mcp-owu84)
  • 50cddcc refactor(language): fold three JS isFunctionValuedExpression copies onto infra (tea-rags-mcp-qrjc5)
  • 4008c0f fix(test): widen eslint-layer-guard hook budget to 300s so contention cannot void the gate
  • 97b64b1 fix(language): name module-level const-bound function expressions (tea-rags-mcp-grz07)
  • aeb8c8a fix(language): decline a bare call on a function-scoped const callee (tea-rags-mcp-w7qv4)
  • 9170ead perf(language): walk a TS source file once per parse, not once per call site (tea-rags-mcp-skzu9)
  • 235896c fix(language): let the importBasename park guard read the type checker (tea-rags-mcp-83iz5)
  • ea5c44a perf(language): index TS parse-cache project sources instead of rescanning (tea-rags-mcp-ajvnq)
  • 4d34f2f fix(language): stop untypable local-binding receivers fabricating edges (tea-rags-mcp-z0zqd)
  • 3af5f15 fix(language): count a hook-returned TS callee as external, not a miss (tea-rags-mcp-qdjfu)
  • 0db9f68 chore: credit the package author field to the actual maintainer
  • 6de201f test(chunker): correct export-class assertions to the method-chunk convention
  • d2b7a53 fix(language): decide an annotated TS receiver by where its type comes from (tea-rags-mcp-3somv)
  • 1cd7dc3 fix(chunker): drop export_statement from JS chunkable types (tea-rags-mcp-hlgak)
  • 084cca1 fix(language): bound the TS parse cache by project sources (tea-rags-mcp-qb2s3)
  • 91ba738 fix(chunker): classify the nested-container segment of the parent chain (tea-rags-mcp-cv4k1)
  • 6e7617b fix(language): stop bare calls on destructured locals fabricating edges (tea-rags-mcp-5tatv)
  • e8b6394 fix(language): descend into claimed JS containers so nested members chunk (tea-rags-mcp-ll0u9)
  • 4434d2f fix(language): guard on out-of-project receiver types (tea-rags-mcp-otm6n)
  • 5b07345 fix(language): keep TS checker edges out of node_modules (tea-rags-mcp-otm6n)
  • b0c25a7 fix(chunker): thread the tri-state methodKind through buildSymbolId (tea-rags-mcp-pdv8m)
  • 7fce8b1 fix(language): checker-backed receiver arm for the TS external-call guard (tea-rags-mcp-335eu)
  • 7fa48e6 test(chunker): guard the symbolId lockstep by running both producers (tea-rags-mcp-pdv8m)
  • 8a622cb fix(chunker): compose const-object namespace members as X.m (tea-rags-mcp-62hzr)
  • d3a869f docs(language): reject deferral for the Python and Java file-only fallbacks (tea-rags-mcp-86qfb)
  • 69e758f feat(scripts): measure chain output A/B per language for deferral (tea-rags-mcp-86qfb)
  • 274a015 fix(language): TS guard reads array, alias and utility-type receivers (tea-rags-mcp-yjqi5)
  • c1c7b93 test(codegraph): pin that .d.ts edge targets get node rows (tea-rags-mcp-9f613)
  • 26deb10 docs(language): re-measure deferred resolution after the merge — the TS win is gone (tea-rags-mcp-5onmn)
  • f39782b docs(language): record the measured Ruby outcome for deferred resolution (tea-rags-mcp-xipzw)
  • 0788a63 fix(language): tsNameOf indexes const-object namespaces (tea-rags-mcp-2jhwk)
  • f2a7f04 fix(language): stop TS import passes edging into container constants (tea-rags-mcp-4kx9f)
  • d6d369f fix(scripts): stop the TS oracle calling a correct external answer a phantom (ffju3)
  • 4c3d43d docs(rules): correct the rerank claim for find_similar in search-cascade
  • 9fa68c1 docs(language): deferred symbol resolution design (tea-rags-mcp-5onmn)
  • 25839f2 test(scripts): report the chain's own edge tally in the TS oracle (tea-rags-mcp-5onmn)
  • daae79c improve(language): Ruby constant/require fallbacks defer instead of committing (tea-rags-mcp-xipzw)
  • 5b2db48 fix(language): map TS import file edges directly instead of via the call chain (tea-rags-mcp-5onmn)
  • 95247ef improve(language): TS file-only fallbacks defer instead of committing (tea-rags-mcp-5onmn)
  • bea5f61 feat(contracts): add a deferred resolution outcome for last-resort targets (tea-rags-mcp-5onmn)
  • f352b7f test(adapters): budget the frame-decoder complexity guard for a loaded box (tea-rags-mcp-aowxw)
  • da1b37a fix(scripts): deliver the rule corpus in parts so the hook stops being truncated
  • de24ba3 feat(scripts): decompose the TS oracle's mismatches into defects and agreement (cko34)
  • 2ae9f94 fix(language): map an extensionless import to the directory's index module (tea-rags-mcp-hzsxy)
  • 68c39d2 fix(language): resolve a named import past the barrel to the declaring file (tea-rags-mcp-hzsxy)
  • a92a4fc refactor(language): one receiver-expression finder for the TS checker passes (tea-rags-mcp-un8mv)
  • be11448 test(language): pin the structural-typing pass's external-declaration guard (tea-rags-mcp-7mud8)
  • 6c4cc7e docs(language): sync TS capability descriptor with the typeChecker epic (tea-rags-mcp-nl93h)
  • 497820d fix(adapters): record the codegraph daemon's output instead of discarding it
  • 7c5754f fix(adapters): recover a daemon lock left behind by a killed holder
  • c1ccfdb fix(language): probe .ts/.tsx/.d.ts when mapping a TS import specifier (tea-rags-mcp-f3zcy)
  • 65af0ce fix(language): stop TS short-name passes matching builtin receivers (tea-rags-mcp-6b3gj)
  • 8500c20 refactor(language): lift TS checker symbolId mechanics into one shared module (un8mv)
  • 8e023e4 feat(language): resolve union-typed and narrowed TS receivers via typeChecker (3yj7d)
  • 722729c feat(language): resolve TS structural typing and interface merging via typeChecker (icmnr)
  • c8129a5 feat(scripts): diff the TS resolver chain against the type checker (yttre)
  • b38953c refactor(language): export TS type-checker helpers for the oracle harness
  • be2e7e1 feat(language): resolve JSX component tags to their components (b4pvp)
  • fa8a401 feat(language): type TS receivers from a call's inferred return type (l3uob)
  • 8c220e3 fix(qdrant): stop the client library probing the server version from its constructor
  • 292703d refactor(qdrant): split QdrantManager implementation into seven collaborators (3y9gh)
  • 2904a02 feat(language): close ten tree-sitter-only TS codegraph edge gaps (f2u54)
  • 7f29719 feat(language): resolve TS generics and overloads through the type checker (uclbn)
  • 09badf8 chore(deps): move typescript to runtime dependencies
  • b4fb0bc refactor(language): split the Ruby walker entry into named passes (6ovup)
  • dd40284 refactor(logs): split TtyProgressRenderer#handle into per-frame renderers
  • 8bfb635 improve(presets): rank blastRadius by transitive reach, not one-hop fanIn (8kdfj)
  • ca53f8e fix(rerank): score codegraph chunk signals as 0 at file level, not on a stray chunk
  • edb6d17 fix(language): end the association return-fact scope at a def (gspmf)
  • 60d3488 chore(release): v1.39.0 declarative changelog

👥 Contributors

@artk0de