Azathothas
Tested the published **wsl-toolkit-v1.3.0 Windows amd64** binary on Windows 11/WSL2 on 2026-09-10. SHA-256: `71b2ef9b0cf50da0acda45e7cc9293185a2b18d8aa403812e20ed29222d54424`, matching the release manifest. Related: #10. ## Summary Every successful job injects one newline into stderr even when the payload writes none. JSON, byte counts, and complete transcripts all present that synthetic byte as command output. ## Reproduction ```powershell & $wtk run --image alpine --json -c 'printf ONLY-STDOUT' & $wtk run --image alpine --json -c 'printf ERR-LIVE >&2' ``` Observed on both direct and helper paths: - A no-stderr command returned `"stderr":"\n"` and `stderr_bytes: 1`; `stderr.log` contained a blank line. - The real-stderr command returned `"stderr":"\nERR-LIVE"` (with its terminator) and counted one byte more than the payload wrote. ## Cause The container wrapper prints the completion token to stderr as `printf '\n%s\n' ...`. `markerStripper.Write` removes the marker but deliberately writes the leading newline back to the destination. That newline is synthetic when the payload had no unterminated stderr text, and it also precedes genuine stderr. ## Impact JSON consumers cannot distinguish “no stderr” from output, exact byte accounting is wrong, and transcript comparison/golden tests see data the Linux command never produced. ## Expected Protocol framing must not alter the payload streams. Preserve an unterminated final payload line without manufacturing a byte for empty or newline-terminated stderr. Test empty stderr, terminated stderr, unterminated stderr, marker-like payload text, direct and helper paths, and exact byte counts/transcripts.