mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
The push-event e2e smoke flaked ~1/50 with ``RuntimeError: Future ... attached to a different loop`` in test_create_seam_materializes_note_flag_on_and_off (and the janitor test shares the same helper). Root cause: _fresh_factory returned the app's SHARED get_session_factory() (_DbHolder engine), so the test's session shared a connection pool with the uvicorn server thread (loop B). A lingering app handler from a prior test could check out a connection on loop B; asyncpg's pool is not loop-affinity-aware, so it then handed the vault test a connection created on loop B, awaited on the test's function-scoped loop A → cross-loop. _reset_lazy_db_holder only resets at teardown, so it can't stop a lingering handler contaminating the fresh pool mid-test. Fix: _fresh_factory builds a PRIVATE engine from e2e_stack.db_url and returns (factory, engine); the caller disposes it in finally. The create/janitor seams use only the passed session (assemble_task_note_data, get_project_service, VaultJanitor never call get_session_factory), so a private engine against the same e2e DB exercises the real wiring while keeping its pool loop-pure — the app can't reach it. This is the e2e-suite cross-loop flake that was blocking PR #516's push-event e2e check (the pull_request run passed, the push run hit this unrelated vault test). Pre-existing; not introduced by the auditor fix.