v0.48.1
v0.48.1
Patch release: correctness and performance fixes. No new features, no config changes.
Sandbox (beta)
- Fixed the Linux sandbox breaking exit-code recording for every sandboxed bash command. The Landlock launcher's descriptor-hygiene step closed the two file descriptors AFT uses to record a command's exit status, so sandboxed commands finished with no exit code (and a command interrupted mid-git could leave a stale
.git/index.lockbehind). The hygiene step now preserves those descriptors, and a Linux CI test runs a real sandboxed command end-to-end to verify exit codes are recorded. macOS was unaffected. (#167)
Search
- Cross-project
aft_searchon a repository that has no AFT index now returns a bounded lexical scan with a disclosure instead of failing withnot_indexed. The error dead-ended agents into shell fallbacks; the same situation ingrepalready degraded gracefully, and the two tools now behave consistently. Semantic ranking still requires an index built by a session in that project, and the disclosure says so. (#166)
Import management
Three silent-mutation bugs in aft_import, all in the same defect class (import statement shapes modeled too coarsely):
- Solidity: single-quoted import paths (
import './X.sol';) were stored with their quotes, soremovereportedmodule_not_foundwhile the import remained, andaddinserted a duplicate with the other quote style. Both quote styles now parse identically across all four Solidity import forms. - Scala 2:
addin a Scala 2 file never recognized an already-present import (an internal dialect marker made the comparison always fail), so repeated adds accumulated duplicate lines. Deduplication now works; Scala 2 syntax generation is unchanged. - Lua: removing an import from a mixed declaration like
local x = require("x"), sideEffect()deleted the entire line including the unrelated call, while reporting success. Mixed declarations are no longer treated as imports: remove leaves them byte-identical and reportsmodule_not_found; plainlocal x = require("x")declarations behave as before.
Performance
- Call graph extraction no longer rescans the file's AST once per symbol. Cold builds and watcher refreshes of symbol-heavy files scale linearly instead of quadratically (measured: 1,000-symbol file 102ms → 23ms; output byte-identical).
- Code-health scans (
aft_inspectmetrics and TODO categories) previously thrashed a fixed-size cache on projects over ~4,000 files, re-reading every file on every scan. The cache now sizes to the project, and unchanged warm scans read nothing (measured: 12,000-file warm scan 101ms → 45ms for metrics, ~90ms → ~40ms for TODOs). - Outline generation (also used by
aft_zoomcontainer menus and top-ranked search snippets) replaced a quadratic insertion scan with an indexed one. Files with thousands of one-method containers render ~11x faster (measured: 16,000 symbols 65ms → 5.7ms; output byte-identical).
Build
- Fixed
cargo test --releasecompilation of the library test suite (debug-only test helpers were referenced from tests that compile in release mode).