## Highlights

`Foreground bash now works correctly on Windows.` In v0.20.0 the new foreground-as-polled-background architecture inadvertently routed model-issued bash commands through `cmd.exe` even when the model wrote PowerShell-syntax (`$var = ...`, `Start-Sleep`, `Add-Content`), and a separate process-flag bug made PowerShell wrappers silently exit before writing the exit marker. The fix:

- **PowerShell wrappers can now flush stdout/stderr and reach `Move-Item`** under detached spawn. Replaced `DETACHED_PROCESS` with `CREATE_NO_WINDOW` for Win32 process flags. Under `DETACHED_PROCESS`, pwsh sometimes exited before completing later script statements (the `Move-Item` that writes the exit marker never ran), leaving the bg task forever marked `Failed: process exited without exit marker`. `CREATE_NO_WINDOW` keeps the child without a visible console while still giving it a hidden console handle, so PowerShell file I/O completes correctly.
- **Restored the natural shell priority** (pwsh → powershell → git-bash → cmd). The v0.18-era cmd-first override was a workaround for the now-fixed PS detached-output bug; it silently misrouted PS-syntax commands through cmd, causing immediate `'$marker' is not recognized` failures.

The Windows native E2E gate is back to blocking releases (the `continue-on-error: true` from v0.20.0 is removed). `Test (Windows — bash perms)`, `Linux Docker E2E`, `macOS native E2E`, and `Windows native E2E` all gate publishing now.

**Full Changelog:**
https://github.com/cortexkit/aft/compare/v0.20.0...v0.20.1
