Autostash entries from prior runs piled up indefinitely (50+ on a single
working tree) because every silent restore failure (apply hard-fails on
untracked-overwrite, transient git error, etc.) leaves a permanent stash
and the warn-only behavior trains developers to ignore the warnings.
- Add `sweepAutostashOrphans`, called at merge entry: classifies each
orphan by diffing its stashed paths against HEAD. If every path is
byte-identical to HEAD the dev's work has already landed, so drop the
stash automatically. Live orphans (real lost work) get loud warnings
on both the engine log and the task feed.
- Surface every restore terminal outcome (`restored`, `failed`,
`conflict-needs-manual` from each path) via `store.logEntry` so devs
can see in `fn task show` what happened to their stash without
grepping engine logs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>