cc2105dc65
User asked why this test is uniquely affected. Answer: it's the ONLY tier-3 test where the AI call runs ASYNCHRONOUSLY in the io_pool worker while the imgui-bundle render loop continues on the main thread. Verified: test_visual_orchestration.py::test_mma_epic_lifecycle uses the same provider setup (gemini_cli + mock_gemini_cli.py + click) but calls orchestrator_pm.generate_tracks() synchronously in the main thread, blocking the render loop. It PASSES in 11s. test_mma_step_mode_sim.py::test_mma_step_mode_approval_flow also uses the async path but is @pytest.mark.skipif(not RUN_MMA_INTEGRATION) - skipped by default. Would likely also crash if unsuppressed. All other MockProvider tests short-circuit at ai_client.send and never spawn a subprocess. The crash is on the MAIN thread (1.94 MB stack, verified via kernel32.GetCurrentThreadStackLimits), not the io_pool worker (which has 8MB after threading.stack_size(8MB) patch). The main thread's imgui-bundle render loop runs concurrently with the io_pool worker's subprocess.Popen / process.communicate. The accumulated imgui-bundle C++ frames exhaust the main thread's 1.94 MB stack. This explains: - Why bumping io_pool stack to 8MB doesn't help (the patch can't reach the main thread, which was created before any sitecustomize runs). - Why the standalone subprocess call works (no render loop concurrent). - Why the no-click baseline survives 60s (no AI call to trigger the race). Next step: capture a Windows crash dump via procdump or cdb.exe to confirm the crashing thread is the main thread and identify the specific imgui-bundle C++ stack frame.