v0.49.2
AFT v0.49.2
Patch release: six community-reported fixes, all verified against the reporters' own reproductions.
Fixed
Zombie background tasks after session death (#188). Two distinct shapes, each with its own trigger. When a project root is deleted (reclaimed worktrees), the existing two-sweep absence check now also terminates that root's surviving task process groups, with an explicit root_reclaimed reason visible in bash_status. When a session aborts or dies mid-call with its directory intact, the in-flight foreground bash task is killed through the host's per-call abort signal (call_aborted reason, pending response settles as killed). Deliberately backgrounded tasks are untouched in both cases — a paused session's build still survives a laptop lid-close.
aft_inspect reported analyzer warm-up noise as real errors (#189). Diagnostics from an incomplete collection no longer count toward error/warning totals: they move to provisional_counts, detail rows carry an (analyzer warming) tag, and the status bar keeps its last authoritative numbers. For rust-analyzer specifically, AFT now consumes the experimental/serverStatus quiescence signal, so diagnostics published before the analyzer settles are flagged provisional and refreshed once it does. No more E1104 against a clean cargo check after a big sync.
Pipelines masking upstream failures (#186). git rebase upstream/main | tail -3 reporting success while the rebase failed: for single top-level pipelines on bash/zsh, per-segment exit codes are captured, and when the pipeline exits 0 while an upstream segment failed, the output gains one line naming the failing segment and its code. Healthy pipelines and failing final segments stay silent; command semantics are untouched (no pipefail injection).
Whole-file reads of large files (#187). Truncated reads now end with a footer stating what was shown and naming startLine/endLine and offset/limit; truncation is also machine-visible in structured fields. Untruncated reads over ~20 KB get a one-line note that ranges exist.
aft_zoom on nested JSON (#185). Dotted paths resolve into JSON documents: manifest.host_only_allowlist, array steps like servers[0], chained a.b[0].c. Keys that literally contain dots win over the path interpretation, and a query matching both a literal key and a different path node returns an ambiguity error naming both. Misses report the deepest resolved prefix with a nearest-key suggestion.
Standalone aft warmup could not find the managed ONNX Runtime (#128). The bare binary now resolves the plugin-downloaded runtime from the shared storage directory (highest compatible version) when ORT_DYLIB_PATH is unset; an explicitly set environment variable always wins.
Changed
- macOS staging scripts pin the codesign identifier to the deploy name, so identifier-keyed system grants survive rebuilds.
- The v0.49 release gate now derives the shipping version from the workspace instead of a pinned literal, removing a failure mode where patch releases failed their own gate.
- Edit-mode errors now state that unused optional fields should be omitted entirely, and an
editsarray containing only empty placeholder items no longer claims the edits mode (completes the #171 fix for models that serialize the whole schema).
Thanks to @iceteaSA for five detailed reports with reproductions — and for verifying four of the six fixes against the built binary before this release.