Skip to content

v0.45.0

Choose a tag to compare

@github-actions github-actions released this 03 Jul 14:44
· 2213 commits to main since this release

v0.45.0

Code Health accuracy release. A 12-repository field audit (Next.js, NestJS, SvelteKit, Vite, Express, Rust workspaces, Tauri, Go, Python, Java/Kotlin, mixed monorepos, codegen-heavy) drove a set of dead-code and unused-export correctness fixes, re-verified against the same repositories after the fixes.

aft_inspect correctness

  • No fabricated results for outline-tier languages. Dead code is now reported only for languages with a real liveness substrate (TS/JS via oxc; Rust, Go, C, C++, C#, Zig via the call graph). Java, Kotlin, and other outline-tier languages are excluded and listed as not analyzed instead of producing false findings. On OkHttp this removes 8,122 spurious dead-code items.
  • Dead code no longer sticks at unavailable or serves stale counts. Fixed a harness-storage mismatch that left dead code permanently unavailable on some large repos even after warmup (Biome: unavailable → available), and a cache-reuse gap where watcher-driven file changes and deletions didn't refresh the call-graph projection, pinning stale counts.
  • Same-file references keep exports alive. Exported functions called earlier in the same file (or captured via object shorthand) were flagged dead under entry-point reachability. Found live in Vite (createParseErrorInfo, updateStyle).
  • Convention entry points. Tool config defaults (*.config.ts for Playwright, ESLint, tsup, tsdown, oxlint, Vitest), Storybook CSF story exports, Mocha root hooks referenced from package.json, and SvelteKit hooks.server/client special exports are now framework-called liveness roots. SvelteKit $lib/* imports resolve without a generated tsconfig, ambient .d.ts declaration-module exports are no longer dead-code candidates, and package.json exports subpaths (including conditional and build-output targets) propagate public-API liveness through barrels.
  • Rust call resolution. Function-scoped use ... as module aliases, module-qualified calls to inline sibling modules, cross-crate pub use re-exports, and turbofish method calls now resolve to their targets. Calls inside macro token trees (json!, custom UI macros) remain a known limitation.
  • Go interface dispatch. Methods invoked only through interfaces (sort.Interface's Len/Less/Swap, Bubble Tea's FilterValue) are no longer flagged dead. The new method-only gate also stops dispatch names from accidentally rescuing same-named plain functions, so some Go repos report a more honest, higher count.
  • Generated code is bucketed, not mixed in. Dead code, unused exports, and duplicates split generated files (gen/ trees, *_pb.ts, @generated/DO NOT EDIT banners) out of the headline count into a generated: N bucket. On protobuf-es the dead-code headline drops from 5,091 to 52 with 2,283 bucketed as generated. Totals always add up; nothing is hidden.

CLI

  • Fixed npx @cortexkit/aft doctor --fix and setup failing to download the binary ("Stripping types is currently unsupported for files under node_modules"). The published CLI resolved an installed dependency at runtime instead of bundling it; the bundle is now fully self-contained, with a regression guard.
  • wait-release-style release tooling: run discovery now attaches to already-running workflows.

Reliability

  • Bridges detect when the on-disk aft binary changed (e.g. after an update) and gracefully respawn onto the new binary at the next idle window instead of running the old one until restart.
  • Bumped @cortexkit/subc-client to 0.3.0 (timeout arbitration recovers replies raced by request deadlines under heavy load).

Field audit harness

  • New benchmarks/inspect-field-audit/ harness: clones 12 repository categories, runs warmup + aft_inspect, and produces per-repo verification reports. Used as the acceptance gate for this release and rerunnable for future correctness work.