Skip to content

v0.57.1

Choose a tag to compare

@github-actions github-actions released this 22 Sep 11:46
· 7172 commits to main since this release

v0.57.1

A patch release with two user-facing memory and correctness fixes, plus the instrumentation that found them.

Symbol extraction sees interface members and object-property functions (#329)

TypeScript interface method signatures and functions assigned as object-literal properties were never extracted as symbols. Because the call graph is built from extracted symbols, they were invisible to aft_callgraph, aft_zoom and aft_outline alike: asking for callers of a method declared on an interface returned symbol_not_found, while a sibling export const of the same name resolved correctly.

The reporter watched a model reach for the call graph first, get "not found", and fall back to sixteen grep calls to answer a question one navigation call should have answered. A tool that fails like absence is worse than a slow one.

Now extracted for TypeScript and TSX: interface method signatures and function-typed property signatures, functions and arrows assigned to object properties, shorthand object methods, and class fields holding arrows or function expressions. Where a named function expression's own name differs from its property key (parse: function _parse(...)), both spellings resolve, so neither is a dead end.

Interface members keep declaration-only ranges, so aft_zoom on one returns its signature rather than implying a body it does not have, and large interfaces still render as a member menu rather than dumping their source.

Symbol prewarm no longer holds one syntax tree per file (#327)

The symbol cache prewarm created a single parser and reused it across every file in the corpus. That parser caches one syntax tree per path with no eviction, so a whole-corpus prewarm retained every tree until the pass finished.

Measured on a generated corpus at the reporter's file count, prewarm peak RSS:

corpus before after
37,212 files 5,246.9 MB 320.0 MB
9,303 files 1,349.1 MB 115.9 MB

Through the full harness, including semantic state that is legitimately corpus-sized, 37,212 files fell from 6,032.4 MB to 1,252.5 MB. Prewarm wall time is unchanged at 12.817s against 12.814s across alternating three-run medians, so nothing was traded for the memory.

The fix evicts each tree once its symbols are extracted rather than disabling the cache, so callers that repeatedly parse the same file keep their reuse.

Note for anyone tracking #327: a second, unrelated mechanism is now filed as #330 — the Tier-2 dead-code projection materializes the whole callgraph store resident. This release does not address that one.

aft.db retention drains its backlog (#310 follow-up)

Terminal bash_tasks rows past the 30-day horizon were pruned at a fixed rate that incoming writes outpaced, so a backlog could never clear: 270,885 eligible rows had accumulated against 415,081 total. Retention now drains a backlog through independently committed bounded transactions that yield between batches, so interactive work always wins the mutex. Measured on a copy of a 1.5 GB database: 270,885 eligible rows to zero in 16.3 seconds, worst observed lock hold 35.9 ms across 1,084 transactions.

health.check now reports the eligible-but-unpruned count, so retention falling behind is visible instead of silent. That reporting is deliberately taken before the filesystem and live-task safeguards, so protected rows stay counted rather than being quietly excluded.

Diagnostics

Write census now separates physical writes it attributes from writes it cannot measure by design — close-time WAL checkpoint frames are deliberately uncredited, because counting them would mean opening a live SQLite file set and dropping the POSIX locks that protect it. An unexplained remainder is now distinguishable from an intentional omission.

The nightly OSS cost gate passes again after four stacked causes, each of which had been hiding the next: a baseline broken on arrival, a real memory regression masked by an uncalibrated floor, a code-health scan racing a callgraph cold build, and an exact-recall stage validating a provisioning record nothing wrote.