PR #24255: real Linux dev verification main: 32ecd71726 (github/main) PR: f6d1ad59351dfb6dec4e8c3948aa9522e4f2a431 Started main with vp run dev in /home/user/main after vp i. Created utf8-preview-check using the app New project flow. Codex gpt-6.1-sol generated actual boundary files in a real git repo. Stopped main (captured PID 27130) before starting PR. Started exact PR head with vp run dev --home-dir /home/user/t3code/.t3 after vp i. Added the same project through the app Local folder flow. Codex gpt-6.1-sol read and confirmed the original file bytes. Playwright 1.60.0 with /usr/bin/google-chrome drove the Files panel. Observed the actual projects.readFile WebSocket responses from UI clicks. main euro.md/euro.txt: 1048581 bytes, truncated=true, contents length=1048576, tail="aaa�". PR euro.md/euro.txt: 1048581 bytes, truncated=true, contents length=1048575, tail="aaa". main emoji.md: 1048581 bytes, truncated=true, contents length=1048575, tail="aa�". PR emoji.md/emoji.txt: 1048581 bytes, truncated=true, contents length=1048574, tail="aa". main plain-text viewer subsequently loads the full file and masks the bounded-response defect. main markdown source preview displays the replacement character; PR source preview omits it. Both captures use the same euro.md bytes, same viewport, same final source line 38837. PR neighboring behavior through UI and WebSocket: ascii.txt: 1048586 bytes, truncated=true, exactly 1048576 ASCII characters. complete.txt: 22 bytes, truncated=false, contents="café € 中文 😀\n". malformed.txt: 3 bytes, truncated=false, contents="ok�" (lenient decoding preserved). binary.bin: ProjectReadFileError.failure=binary_file; UI rejects text preview. blacksmith-check run --id "vp i && vp test run apps/server/src/workspace/WorkspaceFileSystem.test.ts apps/server/src/ws.test.ts" Test Files 2 passed (2) Tests 28 passed (28) No source changes, commits or pushes. Not exercised: native mobile, Electron shell, macOS/Windows, remote/relay/tunnel, other providers.