PR 30639 runtime verification, 2026-11-04, Linux Boat VM Main: 8b44f42b14 (github/main) Original PR: 53edc75cc53688bd77164fdcfe838de303b74e87 Fixed PR: 7c444b9734e16ab8ac440aade13cc8811a8a2454 Client: repo Playwright 1.60.0, /usr/bin/google-chrome, actual web dev client Provider: codex-cli 0.164.0 app-server, gpt-6.1-sol, real local proxy Data: git project created on disk and added through UI; real threads and provider turns Network fault: task-local TCP forwarder, 127.0.0.1:28318 -> 127.0.0.1:28317 Codex launch overrides base_url to forwarding port. Initial HTTP-only probe used supports_websockets=false. Final verification restored default websocket support and exercised websocket retries plus automatic HTTP fallback. No generated provider responses or replay traffic. One dev server at a time: main web 8693/server16733 stopped by captured PID before PR web5733/server13773 started. UI prompt: Write the numbers 1 through 300, one per line. Do not use tools or change files. Forward actual upstream response headers and initial bytes, then close the TCP stream on subsequent bytes. Keep fault through retry exhaustion. Observed native Codex sequence on main and original PR: retry notification: willRetry=true, responseStreamDisconnected.httpStatusCode=null final notification: willRetry=false, codexErrorInfo=other turn/completed: status=failed, codexErrorInfo=other terminal message exactly repeats prior retry additionalDetails. Client WebSocket events (observed, not synthesized): main 08:16:38.745Z retry5/5: status=running class=transport_error code=responseStreamDisconnected main 08:16:45.417Z terminal: status=failed class=provider_error code=other original PR 08:19 terminal: status=failed class=provider_error code=other fixed 08:26:24.296Z retry5/5: status=running class=transport_error code=responseStreamDisconnected fixed 08:26:30.160Z terminal: status=failed class=transport_error code=other fixed 08:27:15.845Z cancel during retry: status=interrupted class=transport_error Neighboring behavior through the same UI/thread/provider: normal turn returned CONNECTION_BASELINE_OK restore TCP pass-through, same thread returned CONNECTION_RECOVERY_OK interrupt another retry with Stop generation: Run interrupted / Stopped by user restore connection, same thread returned CONNECTION_AFTER_CANCEL_OK reload client: all messages and interrupted state persisted UI keeps its existing generic Provider error label for both failure classes; wire event proves the classification. Existing test table extended with native generic-terminal sequence and different-message/HTTP503 controls. Before follow-up: generic-disconnection test failed, expected transport_error got provider_error. After follow-up: all158 CodexAdapterV2 tests passed on Blacksmith. Blacksmith: vp run check:changed 567a105705bc7c8e963387f69c484178e0d8ae55 --concurrency 2 PASS format, lint, knip1/2, knip2/2, GraphQL generation check, typecheck3packages, tests162/162. Unverified in real runtime: native desktop/mobile, macOS/Windows, remote/relay/tunnel modes, genuine upstream HTTP503/429 and other two structured connection variants. Their existing adapter cases passed; these were not induced against the real upstream service. Final raw-text guard: retained unformatted native retry details; input.failureMessage must match them exactly. Different long messages sharing a truncated prefix failed the regression before this guard and pass after it. Final default websocket-path run: DEFAULT_WEBSOCKET_OK completed; real TCP stream interrupted; native websocket retries then HTTP fallback; terminal at08:36:51.351Z status=failed class=transport_error code=other; restore connection, DEFAULT_RECOVERY_OK completed. Final head7c444b rerun: LATEST_BASELINE_OK; at08:55:16.049Z terminal status=failed class=transport_error code=other; restore connection -> FINAL_RECOVERY_OK. Default websocket retry and HTTP fallback exercised. Latest terminal notification HTTP status takes precedence over old retry evidence; statusless exhaustion preserves matching raw transport evidence. Both regressions failed before correction; all162 focused tests and check:changed passed afterward. Two independent final reviewers found no remaining issues.