os.open() on Windows defaults to O_TEXT, so the CRT translated \r\n in binary ciphertext: writes grew, offsets shifted, reads came up short and the RAF callbacks failed with EIO (probe/read/write depending on where a 0x0A byte landed). Pass O_BINARY where it exists. Also reconfigure stdout/stderr to UTF-8 in tools/release.py so the ✓/✗/⚠ summary lines don't crash on cp1252 Windows consoles.