Root cause: OcamlBridge._send() used write() without drain(). asyncio.StreamWriter buffers writes — without drain(), multiple commands accumulate and flush as a batch. The kernel processes them sequentially, sending responses, but Python only reads one response per command → pipe desync → "unexpected response" errors. Fix: _send() is now async, calls drain() after every write. All 14 callers updated to await. Playwright tests rewritten: - test_home_has_header: verifies #logo-opacity visible (was only checking for "sx" text — never caught missing header) - test_home_has_nav_children: Geography link must be visible - test_home_has_main_panel: #main-panel must have child elements - TestDirectPageLoad: fresh browser.new_context() per test to avoid stale component hash in localStorage - _setup_error_capture + _check_no_fatal_errors helpers _render_to_sx uses aser_slot (not aser) — layout wrappers contain re-parsed content that needs full expansion capability. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
26 KiB
26 KiB