Test-Suite mit 5s-Timeout flaky unter 4-shard parallel-load (P2)
14.05.2026
30 min
Behoben
Betroffene Services
- GitHub Actions CI-Pipeline
- 4 in-flight PRs
Summary
Nach dem Vitest-Sharding-Rollout (#659) wurde `eval-suite.test.ts` flaky, weil die kumulative Cold-Import-Zeit auf Shard 4/4 das 5-Sekunden-Default-Timeout überschritten hat. Vier in-flight PRs blockierten kurzzeitig, weil der gemeinsame Shard für alle vier auf demselben Test stolperte.
Root Cause
Vitest verwendet ein Per-Test-Default-Timeout von 5000 ms. Die `eval-suite.test.ts` lädt den Golden-Dataset-Runner mit 20 Aufgaben, importiert `sqlite-vec` plus den kompletten Plugin-Tree und führt anschließend die Eval gegen einen Mock-Provider aus. Lokal auf einem warmen Watch-Mode-Prozess läuft das Ganze in etwa 5 Sekunden — gerade unter dem Default. Unter dem CI-Load, in dem Shard 4/4 nach drei vorangegangenen Shards mit warmem Filesystem-Cache, aber leerem Module-Cache startet, addieren sich Cold-Imports auf 5,3-5,5 Sekunden. Das ist genug, um den Default zu reißen und einen Timeout zu werfen, der oberflächlich wie ein Assertion-Fehler aussieht.
Resolution
PR #686 hat das Per-Test-Timeout auf 30 Sekunden gebumpt — derselbe Pattern, den wir bereits mit #615 (`no-legacy-bridge.test.ts`) etabliert haben: integration-style Tests, die einen großen Import-Tree durchlaufen, definieren ihr Timeout explizit statt auf Default zu vertrauen. Wir haben die vier blockierten PRs nach dem Merge re-triggered; alle vier sind im ersten Retry grün geworden. Branch-Protection wurde währenddessen nicht umgangen — der Workaround war ausschließlich der Re-Run des fehlerhaften Shards nach Landung des Timeout-Fixes.
Preventive Actions
Code-Style-Hinweis in `docs/decisions/test-conventions.md`: alle Integration-Tests, die den Import-Tree komplett laden, definieren ein explizites Timeout zwischen 15 und 30 Sekunden.
CI-Load-Test im pre-merge-Check für Test-Files mit lokaler Runtime > 2 Sekunden, damit wir die Cold-vs-Warm-Differenz schon im PR sehen.
Vitest-Setup-File pflegt eine Liste der bekannten Slow-Tests, damit künftige Sharding-Strategien diese Tests auf weniger gefüllte Shards verteilen.
Timeline
| Zeit (UTC) | Ereignis |
|---|---|
| 20:00 | Erstes Flake-Failure auf PR #681; Shard 4/4 reißt das 5-s-Timeout in `eval-suite.test.ts`. |
| 20:30 | Drei weitere PRs (#682, #683, #685) treffen denselben Shard und werden blockiert. |
| 20:50 | Diagnose: Cold-Import-Zeit auf Shard 4/4 liegt zwischen 5,3 und 5,5 Sekunden. |
| 21:00 | Hotfix-PR #686 (Per-Test-Timeout 30 s) gepusht und Code-Review innerhalb 3 Minuten erhalten. |
| 21:04 | PR #686 gemerged; alle vier blockierten PRs werden re-triggered. |
| 21:18 | Alle vier PRs auf zweitem Retry grün; CI-Pipeline wieder im Normalzustand. |