Toate testele împart o singură bază de date. Până când?
Fiecare flake din ultimele luni — inclusiv perechea de azi-noapte — are aceeași rădăcină: vitest rulează fișierele în paralel, dar toate scriu în aceeași bază Postgres. Am cartografiat tot sistemul (2 workflow-uri, 16 agenți, Codex gpt-5.6-sol inclus), am construit 3 prototipuri reale și le-am măsurat. Nimic de mai jos nu e estimare — totul a rulat pe mașina ta.
Boala și cicatricile ei
Nu am doar o părere că baza partajată e problema — am inventarul cicatricilor. Fiecare mecanism de mai jos există doar ca să gestioneze consecințele bazei comune. Apasă pe fiecare.
Ideea centrală: fiecare worker cu baza lui
Fix-ul structural e aproape jenant de ieftin: o bază-template migrată o dată (~1s), clonată per worker cu createdb -T în 0,14s. Joacă-te cu simulatorul — e aritmetica reală, măsurată.
Ce au arătat prototipurile (rulate, nu promise)
Trei prototipuri pe branch-uri separate, măsurate câte 3 rulări, apoi atacate de un review Codex gpt-5.6-sol și un sceptic care a re-rulat el însuși testele de aur. Toate cele 6 verdicte: solide.
Perechea pipeline-pause × pipeline-watchdog (+ automations-health-panel), cu band-aid-ul de mock-uri scos, rulată de 10 ori pe clone per worker:
Variantele tale, cu pro și contra
Toate cele patru sunt viabile — de-asta alegi tu. Apasă „detalii" pentru contra-argumentele complete și fix-urile cerute de review înainte de merge.
Rămânem cum e
- Zero efort acum
- Fiecare flake nou = încă o convenție, încă un mock, încă o lecție în doc (banda de alergat de la #743 încoace)
- #1282 rămâne deschis; CI rămâne la 1 worker
- Fiecare agent nou re-învață ~130 de linii de reguli
Prototipul A singur
- 311 linii, 5 fișiere, zero schimbare de model — poate intra azi
- Șterge taxa de 24s (404 forkuri de guard → 1 per mediu), guard-ul rămâne intact (verificat cu env otrăvit)
- Livrează promisiunea deja scrisă în ci.yml și vitest.config
- Nu vindecă nimic: toate cicatricile și #1282 rămân
- Lana cu DB rămâne la 2 workeri (25%)
A + B: split + clone per worker
- Flake-class-ul dispare prin construcție — dovada: 10/10 fără mock-uri
- Se ȘTERG: suite-lock, SERIAL_FIRST, vi.mock pinning, mare parte din cleanup + regulile din doc — mai puțin de învățat pentru agenți, nu mai mult
- Anti-drift dublu: mock-urile pleacă, template-ul e hash-uit pe migrații (nu poate rămâne stale în tăcere)
- Buget de conexiuni MAI MIC ca azi (peak 14 vs ~42); janitor auto după crash (kill -9 verificat)
- 0 linii în src/; flag-gated (oprit = comportamentul de azi, byte-identic)
- 267 linii de infrastructură nouă de întreținut (un modul cu invariante clare)
- Fișierele din ACELAȘI worker împart clona secvențial — regula „scope-your-counts" rămâne pentru cazul ăla (sau escaladezi la V3)
- Lana integration-api rămâne pe modelul vechi (server unic) — pas separat
Bază per FIȘIER (nu doar per worker)
- Mental model perfect pentru agenți: „fișierul tău = baza ta, fă orice"
- Ar șterge și restul disciplinei de cleanup
- ~0,3s clonă+drop × 153 fișiere DB — plătești mereu, câștigi doar dacă leakage-ul secvențial intra-worker chiar mușcă
- Ambii ideatori (Codex și Fable) au zis: doar dacă V2 se dovedește insuficient
| Criteriu | V0 azi | V1 doar A | V2 A+B ★ | V3 per-file |
|---|---|---|---|---|
| Flaky? | clase vii, gestionate manual | la fel ca V0 | clasa DB eliminată structural | idem + intra-worker |
| Viteză (lana unit) | 58s · CI 1 worker | ~33s | ~23s · CI deblocat | ~31s (est.) |
| Risc de drift | mock-urile se înmulțesc | neschimbat | mock-uri șterse + template hash-uit | idem |
| De învățat pentru agenți | ~130 linii de reguli | la fel | o frază: „workerul tău are baza lui" | „fișierul tău are baza lui" |
| Mentenanță | convenții în creștere | minimă | un modul de 267 linii ÎN LOC de 4 sisteme de convenții | + janitor per-file |
| Cod de producție atins | — | 0 | 0 | 0 |
Dacă alegi, ce se întâmplă concret
- Prototipurile există deja pe branch-uri — A:
worktree-wf_4406b992-336-1, B + combinația:worktree-wf_4406b992-336-2, F:worktree-wf_4406b992-336-3— nu se reia munca, se productionizează: fix-urile din review, ștergerea mecanismelor retirate, TESTING.md + ADR, apoi PR-uri normale prin CI. - V2 se livrează în două PR-uri independente (A întâi — util chiar singur; B peste el), fiecare cu flag, fiecare reversibil.
- F merge oricând separat — după fix-ul NEXT_PUBLIC_* — și scutește minutele de build la fiecare iterație pe testele de integrare.
- Independent de alegere: #1282 punctul 3 (dublu-dispatch în producție la resume) rămâne singura problemă cu miză de producție găsită în tot exercițiul — merită propriul bilet.
Izolarea care ține e cea construită, nu cea documentată: o clonă de 0,14s bate o pagină de reguli.