Audit · branch codex/fix-task-plan-checkboxes · e2da7fac

1.854 de linii ca să bifezi un checkbox. Merită?

Codex raportează că a reparat toate regresiile la checkbox-urile de Plan Steps. Am trimis 12 agenți de audit (Fable, Opus + un review independent gpt-5.6-sol) pe toate suprafețele atinse. Verdictul scurt: funcționalitatea e reală și merită — dar o treime din cod apără de un pericol pe care nu-l poate opri.

Valoare reală: DA Server: impecabil Client: supra-inginerit Teste: contract respectat Toate cele 4 afirmații Codex: confirmate

4 commit-uri · 28 fișiere · +1.854 / −48 · audit 2026-07-13 · 12 agenți, 6 dimensiuni + verificare adversarială

ACTUL 1

Ce primești: checkbox-ul învie

Pe main, checkbox-urile de Plan Steps sunt decorative — desenate pe ecran, dar moarte la click. Branch-ul le face reale. Încearcă ambele:

DEMO · task real: „Trimite oferta Holzbiber v2"
main · azi în producție
Trimite oferta Holzbiber v2
2/3 steps
click pe un pas nebifat…
branch · după merge
Trimite oferta Holzbiber v2
2/3 steps
click pe un pas nebifat…

Consumatorul nu e ipotetic: 30 din 327 de task-uri live au deja Plan Steps (ADR-0089 a intrat pe 12 iulie), iar pagina de Tasks e suprafața ta zilnică. Până acum, singura cale de a bifa un pas era un agent prin API — tu, din UI, nu puteai.

Designul „deliberately dumb" din ADR-0089 e respectat: pașii rămân {id, text, done}, endpoint-ul nou schimbă doar done, iar un pas promovat în Task rămâne blocat (one-way).

ACTUL 2

Unde s-au dus cele 1.854 de linii

Aici se desparte binele de rău. Click pe fiecare segment:

HARTA DIFF-ULUI · linii adăugate
proporțional discutabil suport

Serverul e partea bună a poveștii: rută de 41 de linii, helper de 93 cu tranzacție + row lock (SELECT … FOR UPDATE), guard-ul de promotion aplicat în trei locuri — și, bonus real, a închis un race pre-existent în PATCH-ul generic (lock + re-read înainte de verificarea promotion-ului).

Clientul e partea umflată: un „coordinator" de 398 de linii — coadă de intenții, fereastră de liniște de 300ms, pompă serializată global și un token bucket propriu — ca să persiste un boolean per click.

ACTUL 3

Mașinăria care nu-și poate ține promisiunea

Cea mai speculativă piesă: un token bucket în browser (5 click-uri burst, apoi 1 la 3 secunde) care promite să te țină sub limita serverului de 30 de scrieri/minut. Testează promisiunea — apasă cât de repede poți:

SIMULATOR · limita reală din middleware.ts (30/min, bucket «local:write»)

Click-urile tale

0
un task are max 20 de pași — singur nu poți depăși 30/min

Scrieri trimise de UI

0
bucket-ul client: 5 burst + 1/3s — încetinește ce oricum nu ardea

Bucket-ul serverului (30/min)

0 / 30
împărțit cu toate scrierile locale

Poanta, confirmată de verificarea adversarială: bucket-ul serverului (local:write) e împărțit cu toate scrierile CLI/agenți de pe mașină, pe care browserul nu le vede. Clientul își încetinește doar propriile scrieri — care, cu maxim 20 de pași per task, oricum nu puteau atinge limita. Iar dacă limita totuși pică din cauza agenților, calea de eroare (toast + resync) exista deja.

Tot în modul: un contor de versiuni pe care nu-l citește nimeni, flush() și getPendingChanges() fără apelant de producție, 5 opțiuni de constructor folosite doar în teste. Iar mecanismul (nu doar comportamentul) a fost scris în DESIGN-LANGUAGE.md ca doc obligatoriu — într-un repo unde docurile sunt review-ul, complexitatea se auto-protejează.

ACTUL 4

Duelul auditorilor: „do not merge" ținea?

Auditorii Claude au zis „solid, cu rezerve de simplitate". Review-ul independent gpt-5.6-sol a zis „do not merge — 4 bug-uri P1". Am verificat fiecare P1 în cod, cu git show pe main. Click pe fiecare:

CELE 4 „P1" ALE LUI CODEX · click pentru verdictul verificării

Scor final: 0 din 4 blochează merge-ul. Două sunt semantici care există deja pe main (branch-ul chiar le-a îmbunătățit), două sunt ferestre de milisecunde dintr-un singur browser, cu resync automat. Lecția veche rămâne: review-ul Codex e dovadă, nu autoritate — dar și auditorii entuziaști au avut nevoie de verificare adversarială: din 7 finding-uri P1/P2 ale Claude, 4 au fost retrogradate la verificare.

ACTUL 5

Verdictul, pe criteriile tale

Criteriul tău, citat: „soluții concise, simple; dacă o problemă se poate rezolva mai simplu, propune varianta simplă". Aplicat pe fiecare suprafață:

SuprafațăCalitateSimplitateNota auditului
API · PATCH /plan-steps/:stepIdexcelent41 liniiparitate completă cu rutele-surori, tranzacție + lock, guard promotion
Lib server · plan-step-toggle.tsexcelent93 liniia închis și un race pre-existent din PATCH-ul generic
Client · coordinator + bucketcorect398 liniifuncționează, dar ~150 de linii sunt mașinărie speculativă
Teste · 10 fișiere, ~1.044 liniicontract OK2 gap-urizero negative-path pe endpoint-ul nou; un test face grep pe sursă
Docs · API.md, ADR-0089, skillactualizate1 excesDESIGN-LANGUAGE.md canonizează mecanismul, nu invarianta
Fix-ul conta (călător în branch)îmbunătățire−sleep 150msNU e test slăbit — scoate un anti-pattern, păstrează toate aserțiunile
recomandarea · APLICATĂ în 7f06127e

Merge după o tunsoare mică

  • Taie token bucket-ul + mașinăria moartă (~150 linii cod + feliile lor de teste)
  • Rescrie fraza din DESIGN-LANGUAGE.md la invariantă („fără backlog de request-uri"), nu mecanism
  • Adaugă 2–3 teste negative-path pe endpoint (stepId inexistent, task șters, body invalid)
acceptabil

Merge as-is + issue de follow-up

  • Nimic nu e greșit funcțional — toate afirmațiile Codex s-au confirmat, testele trec în worktree
  • Dar complexitatea intră în canon și devine mai scumpă de scos mai târziu
Confirmat empiric: testele unit (4,3s) și integration (6,6s) trec în worktree; counter 3/3, fără toast verde, fără „Saving…", compaction sub rate-limit, recovery cu resync — toate cele 4 afirmații Codex verificate în cod, cu file:line.
Producția neatinsă: confirmat — branch-ul trăiește în worktree-ul lui, main e curat.
Backlog separat (pre-existente pe main, nu ale acestui branch): marker-ul de promotion e forjabil ca text prin API; PATCH-ul generic pe plan_steps rămâne last-write-wins.

„Serverul a rezolvat problema.
Clientul a rezolvat o problemă pe care doar el o vedea."

Audit 2026-07-13 · branch codex/fix-task-plan-checkboxes @ e2da7fac · 12 agenți / 6 dimensiuni / verificare adversarială · sursă: workflow wf_0e84c1c7