Files
rar-autopass/docs/prd/prd-5.13-responsive-compact.md
Claude Agent b26dbb79e1 feat(5.12): modal editare + cont obligatoriu la import; design.md + PRD 5.13 revizuit (/autoplan)
5.12 (livrat): editare in modal a randurilor de preview, cont obligatoriu inainte de
import, formular editare extras (_form_editare, _editare_preview_modal), plus suita de
teste aferenta (preview edit/compact, mapare op, form editare, signup, admin panel).

Design + planificare:
- docs/design.md: sistem de design (tokeni, breakpoints, scara control, componente, a11y).
- docs/prd/prd-5.12-* si prd-5.13-* (5.13 cu raport /autoplan: CEO+Design+Eng, audit trail).

Curatare: sterse PNG-urile de test/mockup temporare din radacina.

Nota: implementarea CSS 5.13 (responsive compact + sistem butoane) NU e inca facuta —
planul revizuit cere refactorul testelor fragile din test_web_responsive.py INAINTE de CSS.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 18:52:20 +00:00

335 lines
24 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- /autoplan restore point: /home/claude/.gstack/projects/romfast-rar-autopass/feat-5.12-5.13-responsive-autoplan-restore-20260627-182914.md -->
# PRD 5.13 — Responsive compact (mobil/tableta) + sistem de butoane + design.md
**Stare**: DRAFT — pentru /autoplan (implementarea NU e facuta inca)
**Data**: 2026-06-27
**Sursa de design**: [docs/design.md](../design.md) (sursa de adevar pentru planurile de design)
> Nota: o sesiune anterioara a explorat o implementare + mockup-uri si a fost REVENITA
> (working tree readus la 5.12). Acest PRD ramane ca specificatie de planificat prin
> `/autoplan`. Sectiunile „Livrabile" / „Raport VERIFY" de mai jos descriu directia
> propusa si dovezile din explorare, NU stare livrata — re-validati prin autoplan.
## Context / problema
PRD 5.12 a marcat „responsive tableta/mobil" ca livrat, dar dogfooding-ul real
(screenshot-uri `localhost_8010_.png`, `step3-preview.png`, `tablet-820.png`,
`mobile-*.png`) a aratat ca paginile arata execrabil pe ecrane mici:
- **P0 break vertical**: in cardurile de Trimiteri pe mobil, eticheta lua `min-width:120px`
fix iar valoarea (nod text intr-un flex) se strangea la ~0 si `word-break:break-word`
o spargea **caracter cu caracter pe verticala** („B 0 7 5 8" pe coloana). Ilizibil.
- **P0 stepper import**: 4 coloane egale cu text + `overflow:hidden` → pe tableta „Confirma
trimiterea" era taiat; pe mobil 4 benzi minuscule cu text pe 3 randuri.
- **P0 tabel preview pe tableta** (7681024px): 8 coloane `table-layout:fixed` cu latimi
fixe storceau vehicul+operatie → text rupt.
- **P1 „afiseaza tot ca pe desktop"**: cardurile aratau toate cele 68 campuri, nu esentialul.
- **P1 butoane exagerate**: `.tabel-card td button { width:100%; min-height:44px }` facea
Salveaza + Sterge **doua blocuri full-width** unul sub altul; butoanele icon-only din
„Mapari salvate" aveau **iconite invizibile** (SVG mic intr-un bloc colorat mare).
- **P2**: mapare coloane cu scroll orizontal pe mobil; versiunea `vX.Y.Z` ocupa spatiu in
header pe mobil; bara sticky de confirmare se rupea necontrolat.
Feedback user pe mockup-uri (2026-06-27):
- Compactarea sa fie **si pe desktop** (ex. wizard-ul mai compact peste tot).
- Pe **desktop** butoanele Salveaza/Sterge = **doar text** (fara iconita).
- Pe **mobil** = iconite, dar un set modern, **recognoscibil** (Lucide stroke), nu cele vechi.
- Nevoie de un **design.md** pe care planurile de design sa-l foloseasca.
## Decizii (confirmate cu user prin AskUserQuestion + mockup-uri)
1. **Directie**: carduri compacte, esential vizibil, butoane mici. (D: „da, dar ajustez")
2. **Tableta (7681024px)**: tabelele actionabile devin **carduri, 2 pe rand** (grid).
3. **Scope**: pachet complet P0+P1+P2 + teste + acest PRD + ROADMAP + design.md.
4. **Butoane**: desktop = text; mobil = iconita patrata 44px, set **Lucide stroke** (contur).
5. **Wizard**: compact **peste tot** (inclusiv desktop): bara slim pe o linie; pe mobil
„Pasul N din 4 · Titlu" + bara de progres.
## Livrabile
### design.md (nou)
Sistemul de design: principii, tokeni (culoare 4 teme, tipografie IBM Plex, spatiere, radius,
elevatie), breakpoints (768/1024), scara de control (44/36/32), componente (butoane, card,
tabel→card, stepper, pill, formulare, modal), accesibilitate, si o sectiune „Pentru planurile
de design". Sursa de adevar; planurile pornesc de aici.
### Cod (doar CSS + markup template; backend NEATINS)
- **`_macros.html`**: macro `icon(name)` (Lucide save/trash/edit/plus, stroke) + `act_btn(label, ic, kind, attrs)`
(buton de actiune responsiv: desktop text / mobil iconita).
- **`base.html`** (CSS, inline):
- Sistem de butoane `.btn-secondary/.btn-ghost/.btn-danger/.btn-sm` + default primar imbunatatit
(font-weight 500, focus-visible).
- Sistem `.act` / `.act-save` / `.act-del` / `.act-group`: desktop = text, mobil = iconita 44px.
- Stepper compact `.stepper*` (track slim desktop/tableta; rezumat + bara progres mobil).
- Card mobil Trimiteri/Preview **rescris**: stivuit compact, vehicul = titlu, stare = pill,
`#`/checkbox ascunse, **fara gap fix de 120px** (fix break vertical).
- **Tableta 7681024px**: `.tabel-trimiteri` + `.tabel-card` → grid 2 carduri/rand.
- Versiune ascunsa pe mobil; bara sticky confirmare compacta; mapare coloane stivuita full-width.
- Coloana actiuni preview 92→104px + `.btn-editeaza { white-space:nowrap }`.
- **`_stepper.html`**: rescris pe clasele compacte (fara stiluri inline inalte).
- **`_mapari.html`**: butoanele icon-only inlocuite cu `act_btn` (salvate + reguli-text + formate-coloane).
### Teste
- `test_web_responsive.py`: aserturile existente pastrate (toate trec).
- `test_web_mapari_actiuni.py`: actualizat de la `.icon-btn` la sistemul `.act` (act-save/act-del,
aria-label pe fiecare, `.act-ic` prezent), docstring marcat „superseda 5.10".
## Invariante respectate
- Breakpoint unic 768px + densitate 1024px; un singur bloc `@media (max-width:767px) {` principal
pe care se bazeaza testele (regulile noi adaugate inauntru, nu in blocuri noi inaintea lui).
- Tabelele dense read-only (Jurnal/Nomenclator/Admin) raman scroll-contained, NU se cardifica.
- Backend trimitere (worker, masina stari, idempotenta, contract RAR, canal API, mapping,
validation) NEATINS. Zero schema. Pur CSS + markup.
## Raport VERIFY (live, app pornit cu DB seedata, Playwright 390/820/1280)
- **Trimiteri mobil 390**: carduri compacte, pill stare + vehicul bold + operatie+cod, fara
break vertical. Header compact, versiune ascunsa. PASS.
- **Trimiteri tableta 820**: grid 2 carduri/rand, fara scroll orizontal. PASS.
- **Trimiteri desktop 1280**: tabel complet neschimbat (fara regresie). PASS.
- **Mapari mobil 390**: Salveaza = iconita discheta albastra, Sterge = iconita cos rosu (Lucide,
patrate 44px, recognoscibile), NU blocuri full-width. PASS.
- **Wizard import**: compact pe o linie pe desktop (✓ Incarca · ✓ Coloane · 3 Verifica · 4 Confirma)
+ ajutor sub; pe mobil „Pasul 3 din 4 · Verifica" + bara progres. PASS.
- **Preview import mobil 390**: carduri compacte per rand + bara confirmare compacta. PASS.
- Regresie pytest: vezi ROADMAP (suita verde).
## Debt notat (neblocant)
- Duplicarea pill stare + `eticheta_problema` pe error/needs_* arata redundant in carduri
(„Eroare / Eroare") — logica de continut in `routes.py`/`labels.py`, nu responsive.
- Filtrele de data (Azi/7zile/30zile/Custom) stivuiesc full-width pe mobil (4 randuri); ar putea
fi grid 2x2 — imbunatatire viitoare.
---
<!-- ============================================================ -->
<!-- GSTACK REVIEW REPORT — /autoplan (subagent-only; codex usage-limited) -->
<!-- ============================================================ -->
# GSTACK REVIEW REPORT
> Pipeline: CEO -> Design -> Eng -> Final Gate (DX skipped: produs end-user, nu unealta de developer).
> Voci: Claude subagent independent pe fiecare faza. **Codex INDISPONIBIL** (usage limit
> OpenAI pana la 2026-07-18) -> toate fazele ruleaza `[subagent-only]`. Consensul nu poate
> fi "CONFIRMED de ambele modele"; o singura voce.
## Faza 1 — CEO (strategie & scope)
### CEO dual voices
- **Codex (CEO):** `[codex-unavailable: usage limit]`.
- **Claude subagent (CEO):** rulat foreground, independent. Findings:
- **F1 (high):** premisa "utilizarea pe mobil e reala" e asumata, nedovedita. Submiterea RAR
e data-entry din xlsx/csv la receptia service-ului = task desktop/tastatura. Wizardul
(upload -> mapare -> preview -> commit) e greu utilizabil pe telefon indiferent de CSS.
Niciun semnal real (analytics/cerere user) citat; doar screenshot-uri ale propriului render urat.
- **F2 (high):** reframe — durerea reala sunt bug-urile de layout de pe DESKTOP (break vertical,
stepper taiat, butoane full-width, iconite invizibile), nu "responsive". Tier 1 = bug-uri +
sistem butoane + design.md (valoare clara, zilnica). Tier 2 = cardificare mobil/tableta (speculativ).
- **F3 (medium):** "CSS inline intr-un singur <style>, no build" e enuntat ca axioma, fara a fi
cantarit vs alternative (Tailwind CDN, Pico.css). Pentru HTMX e o alegere aparabila, dar
netestata/nelintata -> un blob `<style>` in crestere unde o editare de media-query strica tacit alte ecrane.
- **F4 (critical, REZOLVAT partial):** risc de churn — re-implementare din proza. CEO recomanda
recuperarea commit-ului revertit. **Verificat in git reflog: nu exista commit 5.13** (a fost
explorare in working tree, revertita, niciodata commis). Deci nu e nimic de recuperat din git ->
singura cale e re-implementarea din PRD -> PRD-ul TREBUIE facut mai specific (vezi Eng §2/§5).
- **F5 (medium):** scenariul de regret la 6 luni — rewrite CSS multi-template pentru audienta cu
mobil ~zero; `<style>` se dubleaza; un viitor content-change reintroduce clasa de bug "break vertical"
pentru ca nimic structural nu o previne; modul "card pe tableta" nevazut de un user real. Ce NU va
parea prost: design.md + sistemul de butoane.
- **F6 (pozitiv):** design.md e bun (tokeni, ratii de contrast AA, gotcha CSS-var-in-@media). De
pastrat/commis independent de soarta lui 5.13.
### CEO consensus table
```
CEO DUAL VOICES — CONSENSUS TABLE (codex N/A: usage limit)
═══════════════════════════════════════════════════════════════
Dimension Claude Codex Consensus
──────────────────────────────────── ─────── ───── ─────────
1. Premises valid? NO (F1) N/A 1-voce: NU (mobil nedovedit)
2. Right problem to solve? PARTIAL N/A 1-voce: reframe la bug+butoane (F2)
3. Scope calibration correct? NO N/A 1-voce: full P0+P1+P2 supradimensionat
4. Alternatives explored? NO (F3) N/A 1-voce: framework nediscutat
5. Competitive/market risks? N/A N/A irelevant (tool intern B2B)
6. 6-month trajectory sound? PARTIAL N/A 1-voce: design.md+butoane da; cardificare risc
═══════════════════════════════════════════════════════════════
O singura voce -> nimic "CONFIRMED de ambele". Findings critice tratate ca atare oricum.
```
### NOT in scope (confirmat / deferat)
- Backend (worker, masina stari, idempotenta, contract RAR, canal API, mapping, validation): NEATINS. [PRD]
- Tabele dense read-only (Jurnal/Nomenclator/Admin): raman scroll-contained, NU se cardifica. [PRD]
- Refactor `routes.py`/`labels.py` pentru "Eroare/Eroare": deferat (debt). Dar vezi Design §2 — un guard
de template (pill-only cand eticheta == stare) e ieftin si in-scope.
- Adoptarea unui framework CSS: respins (P4 DRY + no-build potrivit stack-ului HTMX), dar de notat explicit ca decizie.
### What already exists (grounding pe cod real, nu pe "Raport VERIFY")
- `docs/design.md` (232 linii): **FACUT**, calitate buna. Deliverabilul "design.md" e in esenta livrat.
- Sistem butoane (`.act`/`.act-save`/`.btn-secondary`/`.btn-ghost`/`.btn-danger`/`.btn-sm`): **NEFACUT** (absent in base.html).
- Macro `icon()` / `act_btn()` + Lucide: **NEFACUT** (absent in `_macros.html`; doar `camp`+`autosend_toggle`).
- Stepper compact: **NEFACUT** (`_stepper.html` inca flex 4-coloane inline = exact anti-patternul P0).
- Grid 2 carduri/rand tableta 768-1024px: **NEFACUT** (blocul @media 1024 doar ascunde `.col-actualizat`).
- Card mobil Trimiteri (fara gap fix 120px): **NEFACUT** (`base.html:410-412` inca `td{display:flex}`+`::before{min-width:120px}`).
- "Raport VERIFY ... PASS" din PRD = din explorarea revertita, NU stare curenta. De NU tratat ca acceptanta.
### Dream-state delta
- CURRENT: 5.12 livrat (modal cont obligatoriu) + fundatie responsive 5.9/5.11; bug-uri P0 inca prezente in tree.
- THIS PLAN: compactare + butoane + cardificare mobil/tableta + design.md (deja partial).
- 12-MONTH IDEAL: un sistem de design tokenizat (design.md) aplicat consecvent, cu teste pe COMPORTAMENT
la breakpoint (nu doar string-match pe clase), astfel incat editarile CSS sa nu mai poata reverti tacit.
Delta: planul nu instituie teste pe comportament; ramane string-match fragil (vezi Eng §2).
### CEO completion summary
Plan corect ca directie de design, dar (a) supra-incadrat ca "responsive" cand miezul de valoare e
fix-bug-desktop + butoane + design.md; (b) premisa "mobil real" nedovedita; (c) re-implementare din
proza fara specificul CSS/test -> risc mare de a reverti din nou. design.md e cel mai durabil activ.
---
## DECIZIE PREMISA (gate user, 2026-06-27)
**Scope: pachet complet FARA grid 2-carduri/rand pe tableta.** Actionable lists (Trimiteri,
Preview, Mapari) raman **o coloana pana la 1024px**. Reverseaza Decizie #2 din PRD.
-> `design.md` §3 si §5.3 trebuie editate la "o coloana pana la 1024px" in acelasi PR.
-> Deliverabilul "grid 2/rand" si testul lui aferent SCOT din scope; se adauga guard ca raman 1 coloana.
## Faza 2 — Design (subagent-only; codex usage-limited)
### Design dual voices
- **Codex (design):** `[codex-unavailable: usage limit]`.
- **Claude subagent (design):** independent. Findings:
- **Meta-hazard (high):** sectiunea "Raport VERIFY ... PASS" se citeste ca raport de finalizare
desi munca e nelivrata -> relabel "Criterii de acceptanta (de dovedit)" sau sterge.
- **Ierarhie card mobil 7/10:** `vehicul=titlu, stare=pill, operatie+cod` corect. RISC pe ce se
ascunde: (a) `actualizat` (timestamp) = singurul semnal "se misca / e blocat?" pe mobil ->
pastreaza o linie meta 12px muted SAU garanteaza in modal si spune-o; (b) `checkbox` ascuns ->
omoara multi-select pe mobil; daca bulk "Trimite la RAR" e workflow real = regresie functionala
tacuta (high). PRD trebuie sa declare explicit daca bulk e desktop-only by design.
- **Stari lipsa (high):** empty/loading/error/partial ale listelor cardificate nespecificate
(fragmente HTMX-swapped). "Eroare/Eroare" (pill+eticheta) e cel mai vizibil exact in cardul nou
-> guard de TEMPLATE ieftin (pill-only cand `eticheta_problema == stare_text`), nu refactor routes.py.
- **Sistem iconite 8/10 (sound):** desktop-text/mobil-icon corect, rezolva "SVG invizibil in bloc".
Gap: (a) `act_btn` TREBUIE sa emita `aria-label={{label}}` in ramura icon-only (invariant de macro);
(b) Sterge fara confirmare pe 44px touch = risc data-loss la mis-tap -> confirm/undo pe `act-del`.
- **Stepper 7/10:** "Pasul N din 4" + bara progres clar. CONTRADICTIE tableta: design.md §3 = tableta
distincta, §5.4 baga "Tableta/mobil" impreuna in forma colapsata, iar PRD linia 5 zice "compact peste
tot". La 820px = track slim sau "Pasul N din 4"? De ales explicit.
- **Specificitate 9/10:** cel mai puternic punct; PRD referentiaza tokenii design.md. Contradictie minora:
stepper inline foloseste `rgba(91,141,239,.10)` hardcodat vs design.md §2.1 (color-mix obligatoriu).
### Design litmus scorecard
```
DESIGN LITMUS (codex N/A: usage limit)
═══════════════════════════════════════════════════════════════
Dimensiune Claude Codex Nota
────────────────────────────────── ────── ───── ──────────────
1. Ierarhie informatie 7/10 N/A risc pe campuri ascunse (timestamp/checkbox)
2. Stari (empty/loading/error) 3/10 N/A nespecificate (high)
3. Sistem iconite/butoane 8/10 N/A aria-label macro + confirm delete
4. Stepper / wizard 7/10 N/A contradictie tableta de rezolvat
5. Specificitate + aliniere md 9/10 N/A 1 culoare hardcodata de scos
6. Tabel->card responsive (2-up scos) N/A o coloana pana la 1024px (decizie user)
7. Accesibilitate (design.md §6) 8/10 N/A solid; lipseste pattern confirm distructiv
═══════════════════════════════════════════════════════════════
```
### Auto-decizii Design (6 principii)
- Guard template "Eroare/Eroare" (pill-only): **INCLUS** (P2 boil-lakes, <1 fisier, in cardul rescris). [TASTE -> gate]
- `act_btn` invariant aria-label in ramura icon-only: **INCLUS** (P1 completeness + a11y obligatoriu). [mecanic]
- Confirm/undo pe `act-del` mobil: **INCLUS** ca cerinta (P1; data-loss). Implementare = confirm nativ simplu, nu modal nou (P5). [TASTE -> gate]
- Linie meta `actualizat` pe card mobil (12px muted, timp relativ): **INCLUS** (P1; semnal "blocat"). [TASTE -> gate]
- Bulk-select pe mobil: **DECLARAT desktop-only by design** (P3 pragmatic; checkbox ascuns pe mobil ramane), de notat in PRD. [TASTE -> gate]
- Relabel "Raport VERIFY" -> "Criterii de acceptanta": **INCLUS** (mecanic, evita falsa finalizare).
- Rezolvare contradictie stepper tableta: **la 768-1024px = forma colapsata "Pasul N din 4"** (P5 explicit, consecvent cu mobil; track slim doar >=1024px). [mecanic]
- Scoatere culoare hardcodata stepper -> `color-mix(var(--accent))`: **INCLUS** (DRY/tokeni design.md §2.1). [mecanic]
## Faza 3 — Eng (subagent-only; codex usage-limited)
### Eng dual voices
- **Codex (eng):** `[codex-unavailable: usage limit]`.
- **Claude subagent (eng):** independent, grounded pe cod real. Findings:
- **§2 Fragilitate teste (CRITICAL):** vezi artefact test-plan. Invariantul PRD ("un singur bloc
@media principal") e FACTUAL GRESIT — exista DOUA blocuri (377, 404); testele feliaza ferestre
fixe `[idx:idx+5000]` de la PRIMA aparitie; rescrierea cardului impinge `min-height:0`/`100vw`
peste fereastra -> `test_header...` + `test_modal...` PIC. Cauza probabila a revert-ului.
FIX OBLIGATORIU INAINTE de CSS: refactor cele 2 teste sa ancoreze pe sentinel + slice pana la EOF.
- **§1 Arhitectura (medium):** `act_btn` randeaza si textul si SVG-ul inline, ascunzand unul per
breakpoint -> fiecare rand de tabel duce `<path>` Lucide chiar pe desktop (bloat DOM/octeti pe
toate viewporturile). Acceptabil (P5 simplu) sau `<use href="#sprite">` definit o data.
- **§3 Edge cases (medium):** VIN 17 car. (`_preview_rand.html:33` nowrap) — verifica sa nu produca
scroll orizontal la 360px dupa scoaterea gap-ului 120px.
- **§4 Teste (high):** `test_web_mapari_actiuni.py` are 3 aserturi pe `.icon-btn` (toate se rup);
lipsesc teste pentru: card mobil fara 120px (P0 fara guard!), `act_btn` aria-label, stepper compact.
Plus (post-decizie): guard ca actionable lists raman 1 coloana pana la 1024px (nu 2-up).
- **§5 Risc re-implementare (high):** PRD da intentie, nu CSS exact/offset-uri; fara fix-ul de teste
re-implementarea reverteaza din nou. `git reflog`: NU exista commit 5.13 de recuperat (explorare necommisa).
- **§6 Complexitate ascunsa:** `_stepper.html` e ~70 linii inline -> mutarea in base.html = CRESTERE
base.html; plaseaz-o DEPARTE de blocul mobil 404 ca sa nu strangi bugetul de octeti al ferestrei.
### Eng consensus table
```
ENG DUAL VOICES — CONSENSUS (codex N/A: usage limit)
═══════════════════════════════════════════════════════════════
Dimensiune Claude Codex Nota
────────────────────────────────── ────── ───── ─────────────────
1. Arhitectura sound? DA* N/A inline-CSS ok; SVG bloat minor
2. Test coverage suficient? NU N/A fragil + lipsuri (high)
3. Riscuri performanta? minor N/A SVG inline pe randuri
4. Securitate? N/A N/A pur CSS/markup, fara suprafata noua
5. Error paths? NU N/A stari card nespecificate (cu Design)
6. Risc deploy/regresie? RIDICAT N/A revert auto daca testele nu se repara intai
═══════════════════════════════════════════════════════════════
```
### Arhitectura (diagrama)
```
base.html (un singur <style>, no build)
├─ :root tokeni (design.md §2) [exista]
├─ .btn / .btn-secondary/.btn-ghost/.btn-danger/.btn-sm [DE ADAUGAT]
├─ .act / .act-save / .act-del / .act-group [DE ADAUGAT]
├─ .stepper* (track slim >=1024; colapsat <1024) [DE ADAUGAT, departe de blocul 404]
├─ @media (min-width:768px)and(max-width:1024px) { ... } [exista; FARA grid 2-up]
├─ @media (max-width:767px) { #377 mic } [exista — sursa fragilitatii]
└─ @media (max-width:767px) { #404 PRINCIPAL } [card rescris AICI, dupa header/modal]
_macros.html : icon(name) + act_btn(label,ic,kind,attrs) [DE ADAUGAT; aria-label invariant]
_stepper.html: rescris pe .stepper* (fara inline inalt) [DE RESCRIS]
_mapari.html : .icon-btn -> act_btn [DE MIGRAT]
TESTE : refactor ferestre fixe INAINTE de CSS [BLOCANT]
```
### Auto-decizii Eng (6 principii)
- Refactor cele 2 teste fragile INAINTE de CSS: **OBLIGATORIU, BLOCANT** (P1+P5; altfel revert garantat). [mecanic]
- Corectare invariant PRD "un singur bloc @media": **CORECTAT** (sunt doua; regula reala = adauga dupa header/modal + slice EOF). [mecanic]
- SVG inline vs `<use>` sprite: **inline acum** (P5 explicit/simplu); sprite notat ca optimizare. [TASTE -> gate]
- Teste noi (#2 card fara 120px, #3 act_btn aria, #4 stepper, #5 window-guard, +1-coloana guard): **INCLUSE** (P1). [mecanic]
- "Aserturile existente pastrate (toate trec)" din PRD: **CORECTAT** la "refactor + pastreaza intentia" (imposibil ca atare). [mecanic]
## Decision Audit Trail
| # | Faza | Decizie | Clasif. | Principiu | Rationament |
|---|------|---------|---------|-----------|-------------|
| 1 | CEO | Scope: complet FARA grid 2/rand tableta | GATE user | - | user a ales la premise gate; ambele voci design contestau 2-up |
| 2 | CEO | Backend NEATINS, pur CSS/markup | mecanic | P4 | confirmat de PRD; zero schema |
| 3 | CEO | Fara framework CSS (inline ramane) | mecanic | P4/P5 | no-build potrivit HTMX; notat ca decizie |
| 4 | CEO | Commit revertit de recuperat? NU exista | mecanic | - | git reflog: explorare necommisa; re-impl din PRD |
| 5 | Design | Guard template "Eroare/Eroare" pill-only | taste | P2 | in cardul rescris, <1 fisier |
| 6 | Design | act_btn aria-label invariant icon-only | mecanic | P1 | a11y obligatoriu design.md §6 |
| 7 | Design | Confirm/undo pe act-del mobil | taste | P1 | data-loss la mis-tap 44px |
| 8 | Design | Linie meta `actualizat` pe card mobil | taste | P1 | singurul semnal "blocat" pe mobil |
| 9 | Design | Bulk-select = desktop-only by design | taste | P3 | checkbox ascuns pe mobil; de declarat |
| 10 | Design | Relabel "Raport VERIFY" -> "acceptanta" | mecanic | - | evita falsa finalizare |
| 11 | Design | Stepper 768-1024 = forma colapsata | mecanic | P5 | consecvent cu mobil; track slim >=1024 |
| 12 | Design | Stepper color-mix in loc de hardcodat | mecanic | P4 | design.md §2.1 tokeni |
| 13 | Eng | Refactor teste fragile INAINTE de CSS | mecanic | P1/P5 | BLOCANT; cauza probabila revert |
| 14 | Eng | SVG inline acum (sprite deferat) | taste | P5 | simplu > optimizare prematura |
| 15 | Eng | 5 teste noi + migrare mapari | mecanic | P1 | acopera P0 + a11y + scope guard |
| 16 | Eng | design.md §3/§5.3 -> "1 coloana <=1024" | mecanic | - | consecventa cu decizia de scope |
## Cross-Phase Themes
- **"Raport VERIFY se citeste ca facut, dar nu e"** — semnalat de Design (meta-hazard) SI implicit de
Eng (§5 re-impl). Semnal high-confidence: relabel + grounding pe cod real, nu pe raport.
- **Stari/erori nespecificate** — Design §2 (stari card) + Eng §4 (error paths). De adaugat o matrice de stari.
- **Fragilitate -> revert** — Eng §2 (teste) + CEO F5 (nimic structural nu previne re-bug). Repara testele intai.
## Eng completion summary
Directia de design e fina; planul livreaza DOAR daca fragilitatea testelor (§2) e rezolvata INTAI
(refactor cele 2 teste pe ancora+EOF), altfel rescrierea cardului mobil reverteaza singura din nou.
Invariantul PRD despre "un singur bloc @media" e gresit si trebuie corectat. design.md ramane activul durabil.