Provider failure diagnostic takeover: PR #16303 Reviewed/runtime head: db12cad0a26dbd3c5600c1f294179753c5be73ed Pinned integrated main / actual before runtime: 821189362209838136064e7eb86f7aaf99a9c405 Original contributor head ff1bfc7b522d94f0c03a05eeb0d8a11a89bfede5 retained; main merged, never rebased/force-pushed. Test-only fresh Codex gpt-6-astra high run reduced original new mapper block 97 to 59 lines. Main mapper 11 cases -> contributor 14 -> rewritten 15 runtime cases (14 declarations, two reasons individually parameterized). Existing Claude missing-image start rejection strengthened, no added adapter case. Three assertion failures against actual pinned main production (two reason cases + actual Claude rejection), then exact restoration of all ten production file hashes and 17 focused passes. Separate fresh Codex gpt-6.1-sol high implementation independently retained the optional internal reason + fixed tables + twelve boundary annotations; simplified Codex construction and kept schema private. No contracts/client changes. One fresh parallel full-diff review round: Codex gpt-6-sol high and Claude Opus 5.5 high, both no blockers. Seven scoped provider/server typechecks pass. Targeted lint/format pass (five existing unused-variable warnings). Reviewer also ran full Claude/Codex 455, other four adapter suites 191, RunExecutionService 54, mapper15, all pass. Parent independently reran six targeted diagnostic/adapter cases, all pass, 311 skipped. Actual integrated web proof, headless Linux, 1280x800: Normal browser file picker uploaded the same disposable PNG and ordinary composer submitted the same text to Claude Sonnet 5.5. A Linux inotify watcher moved only the new claimed image copy out of the worktree attachment directory after copy completion, before adapter read; the pending original upload was preserved. This injected a real filesystem read failure, not a fabricated error event or projection. The native Claude prompt was not reached for this failed turn; account/model quality is not verified. On head db12cad, the app persisted and rendered: The provider could not start this turn: an attachment could not be read. Retry the turn; if it keeps failing, check the provider setup and server logs. On actual detached main821189, the same flow persisted/rendered the old generic category message. Full main and head runtimes were started separately inside the batch worktree, then the contributor branch was restored clean. Captures re-render the respective actual recorded failures on their corresponding source revisions, with matching fixture, viewport, hidden panels, and no obstructing update toast. Attachment thumbnails correctly become unavailable after the deliberate file removal. Browser-only font registration works around missing system fonts; no app CSS/DOM error-message edits. The previous-turn-active wording is covered by focused mapper/adapter verification; an overlapping active-turn failure was not forced through the ordinary UI, which serializes turns. No claimed live coverage of every adapter or native provider account. An initial trial accidentally remained on the old Pi model selection and therefore produced its intentionally unchanged generic error; it is excluded from the comparison. Correct Claude selection was verified before both accepted runs. Limits: macOS, Windows, iOS, Android, Electron desktop, remote/relay/tunnel clients, all-provider native accounts, and active-turn UI overlap unverified. OpenCode2 direct unwrapped error stays generic (handoff wrapping can show the reason); Pi/Muse unreadable-image behavior remains outside this scope. Pre-existing explicit message overrides in provider session-open/thread-load failures are outside this change and are not covered by the new fixed-reason privacy claim. All owned dev servers and watcher command sessions stopped after proof. No writes to the live T3 database or sibling worktree; no screenshots/proof assets committed. PR remains unmerged. Current-head hosted CI must be checked after publishing.