Skip to content

v0.54.0

Choose a tag to compare

@github-actions github-actions released this 28 Aug 23:06
· 1050 commits to main since this release

AFT v0.54.0

New

  • Cyclomatic complexity in aft_inspect — new complexity category: 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 checkpointsaft_safety checkpoints 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: true to hoist Pi's powershell tool 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: false keeps wait: true bash calls blocking through user messages. With the knob set, a message containing &detach still force-detaches; the token is stripped before the model sees it.

  • Per-harness config overrides — top-level harnesses key in aft.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=0 refresh loops that left dead_code permanently unavailable; unresolvable path identities degrade to a named disclosure instead of failing every inspection. Reported by OtwakO.
  • null fields in edit calls (#272) — models that serialize optional fields as null (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 patternsgrep '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 textaft_inspect failures 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_call bash on standalone NDJSON — direct tool_call invocations of the bash tool no longer fail with "missing field command" (the tool's command argument 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.