# v0.37.2: Background code-health scans stop rebuilding the call graph

This patch removes the biggest background CPU sink in AFT. If you've seen sustained multi-core usage attributed to `aft` processes (#108), this release is for you.

## Dead-code scans read the persisted call-graph store

Background code-health scans (the `dead_code` category behind `aft_inspect` and the status bar) used to rebuild a full call graph from scratch on every refresh — parsing every project file each time. On a ~3,000-file repo that meant 60+ seconds of snapshot building plus minutes of scanning, re-triggered by ordinary file activity (saving in your editor was enough).

The scan now projects from the persisted call-graph store that AFT already maintains incrementally: one cold build per project (the same store that powers `aft_callgraph`), then millisecond updates per file change. Measured on a 903-file repo: snapshot assembly went from ~93 seconds to ~250 milliseconds, and a full dead_code pass from over 3 minutes to well under a second.

While the store is still building (first open of a project), dead code reports `unavailable (call graph building/retrying)` instead of a wrong number, and fills in automatically once the build lands.

## Remote source files in aft_outline and aft_zoom

URLs pointing at source files (unpkg, raw.githubusercontent, any CDN) now work: the file extension in the URL path decides how the content is parsed, so `aft_outline https://unpkg.com/pkg/dist/index.mjs` returns real symbols instead of an unsupported-content-type error. This also fixes a silent bug where raw.githubusercontent files (served as `text/plain`) were cached as markdown and outlined as headings.

## Fixes

- **Call-graph store survives project moves and renames.** Moving a repository used to leave the store referencing the old path, permanently disabling dead-code analysis. The store now re-roots itself on open (or rebuilds once when necessary).
- **A single stale row in the call-graph store no longer disables dead-code analysis.** Orphaned call references now fall back to the file's top-level scope instead of failing the whole projection, and incremental refreshes keep symbol and reference rows coherent so the orphans stop appearing.
- **The status bar no longer shows `D0` when dead code is unavailable** — it keeps the last known count, and the `aft_inspect` body says unavailable explicitly.

[Join our Discord](https://discord.gg/DSa65w8wuf)
