v0.54.0
AFT v0.54.0
New
-
Cyclomatic complexity in
aft_inspect— newcomplexitycategory: per-function cyclomatic complexity across all ~24 supported code languages via native tree-sitter branch counting (no external tools), with ranked hotspot drill-down (file:line, worst-first) and honest per-language disclosure for formats that aren't analyzed. Verified against radon on Python. -
Durable named checkpoints —
aft_safetycheckpoints now persist on disk and survive daemon/bridge restarts. Create responses name the storage path and durability contract; retention is 20 per session with a 14-day sweep, and evictions are disclosed. Untracked and gitignored files are fully supported (and always were — now with tests proving byte-exact restore). -
PowerShell tool for Pi (opt-in) — set
bash.powershell_tool: trueto hoist Pi'spowershelltool through AFT with the full background-task, compression, and notification stack. PowerShell commands skip POSIX-shell rewrites and take a conservative permission path. -
Steering messages no longer force bash detach (configurable) —
bash.detach_on_user_message: falsekeepswait: truebash calls blocking through user messages. With the knob set, a message containing&detachstill force-detaches; the token is stripped before the model sees it. -
Per-harness config overrides — top-level
harnesseskey inaft.jsonc(user and project tier):"harnesses": { "opencode": {...}, "pi": {...} }. Merge order is base-user → user-harness → base-project → project-harness; tier trust rules unchanged (project harness overrides cannot touch user-only keys).
Fixed
- Interactive shells no longer freeze the session (#273) — non-PTY bash children now run in their own session without a controlling terminal, so
zsh -i(and anything doing terminal job control) can no longer stop the parent agent process. Reported by letterk. - Callgraph attribution on aliased filesystems (#274) — deleted/aliased watcher paths (WSL v9fs mounts, symlinked roots) now canonicalize through their existing parent, fixing endless
refreshed_own=0refresh loops that leftdead_codepermanently unavailable; unresolvable path identities degrade to a named disclosure instead of failing every inspection. Reported by OtwakO. nullfields in edit calls (#272) — models that serialize optional fields asnull(observed on kimi-k3) no longer get false "mixes find/replace and line-range fields" rejections; null-valued optional fields are treated as absent at both the plugin and engine boundaries. Reported by ybw0014.- Hashline snapshot eviction (#269) — fresh file versions are no longer evicted first after partial-snapshot coalescing; Pi session identity is stable across awaits. Reported in the field.
- Basic-regex grep patterns —
grep 'a+b'-style BRE patterns are no longer silently reinterpreted as extended-regex quantifiers by the bash rewrite path. - Search during index load — searches issued while a shared index is loading now engage a bounded wait, continue loading in the background (readiness no longer depends on query traffic), and report one coherent status instead of contradictory "unavailable + 0 results" text.
- Inspect failure text —
aft_inspectfailures now carry the failure reason, detail, and retry steering in the rendered text instead of a bare "request failed". - Checkpoint sweeps — the empty-scope retention sweep can no longer run against a mis-derived storage root.
- Storage-isolation leak + index GC — test-spawned binaries can no longer index temp fixtures into shared storage; orphaned index directories are now garbage-collected (age + liveness gated, bounded per pass).
- Semantic catch-up waste — superseded embed workers now stop within one batch instead of running full corpus embeds destined for discard; duplicate same-corpus builders adopt the live build. Embed progress (
chunks,batches) is now visible per root in health output while a build runs. tool_callbash on standalone NDJSON — directtool_callinvocations of thebashtool no longer fail with "missing fieldcommand" (the tool'scommandargument collided with the request envelope's field of the same name). Plugin users were unaffected. Contributed by gge-services-bot (PR #275).- Kill markers racing child exit writes (Windows) — killing a task at the moment its child writes the exit marker no longer fails the kill with a false "multiple hard links" refusal; a concurrently replaced artifact is re-opened instead.
- Daemon crash on unmounted volumes — background walks no longer cross device/mount boundaries (simulator disk images, network volumes), eliminating an uncatchable abort when a mount vanished mid-walk; foreign-mount skips are disclosed.
Notes
- npm cmd-shim LSP installs on Windows now route through cmd.exe correctly (PR #270 pending author's final CI, may land in this release or next).
- Thanks to letterk, OtwakO, ybw0014, SettingDust, Sarenik, Qiiks, and TreyThomasCodes for reports and contributions.