Auditul complet al prototipului v5 după cele 13 runde de feedback aplicate: cinci axe investigate independent în cod (flux & date · consistență UX · roluri & notificări · configurabilitate & transparență Gogu · testare & portare), sintetizate cu punctaje, riscuri și o foaie de parcurs prioritizată. Actualizare: implementat integral și re-punctat independent — toate axele la 10/10 (PR #66–#74); rundele de testare manuală ale patronului continuă să fie aplicate la zi (R14–R16 · PR #75–#79). Portarea (H3) rămâne exclusă până la acordul a 3 clienți.
După 13 runde de feedback aplicate, cele cinci investigații converg: tiparele câștigate sunt reale și adoptate (o coloană de adevăr pe faze, un limbaj de detaliu unic, vederi pe rol, transparență-model pe suprafețele recente) — iar restanțele se împart în trei familii: surse duble de adevăr rămase (bani, piese, politici), configurare-decor (setări pe care nu le citește nimeni) și bucle neînchise (evenimente pe care nu le aude nimeni, roluri netestate).
| Axă | Scor | Verdict într-o frază |
|---|---|---|
| E1 · Flux & model de date | 7→10 | banii au o sursă (factura == oferta aprobată == link-ul de plată); piese forward-only „De comandat→Recepționată" cu stoc + insignă vii; povești de seed coerente; ocupare derivată; amprentă de schemă |
| E2 · Consistență UX | 7→10 | Stat șters (totul KpiTile cu „de ce?"), o insignă AI, zero emoji, FAB în frază, Chip canonic, .lf-sel complet |
| E3 · Roluri & notificări | 7→10 | clasa executant peste tot (vopsitor = egalul mecanicului, inclusiv în Execuție), mesajul din portal auzit + cutie poștală în portal, matricea completă și găsibilă |
| E4 · Configurabilitate & Gogu | 6→10 | fiecare comutator are consumator (tarif · plafon · porți pe 6 faze · program · șabloane · matrice roluri · sarcini Gogu); fiecare cifră are „de ce?"; ITP propune, omul decide |
| E5 · Testare & portare | 7→10 · — | toate cele 8 roluri sunt actori (14 scenarii noi, +~380 verificări): matrice pozitiv+negativ ×2 evenimente, renegociere completă, reevaluare mecanic ȘI vopsitor, igiena portalului; portarea ne-punctată — exclusă până la 3 clienți |
Scor: 7/10 → implementat → re-punctat 10/10. Coloana vehicles.faza e respectată peste tot, tranzițiile majore emit notificări + audit — dar valorile bănești au trei surse divergente, piesele trăiesc în patru modele nesincronizate, iar un vehicul din seed își contrazice propria poveste.
| Zonă | Constatare | Impact | Efort | Recomandare |
|---|---|---|---|---|
| Finalizare | FINALIZE_HANDOVER pleacă cu total: 421 € hardcodat (pages-service.jsx:439) deși carTotal există; reducerul are fallback 420 → factura ≠ oferta aprobată ≠ link-ul de plată | mare | S | trimite carTotal în acțiune, elimină numărul magic |
| Deviz derivat | vehicleDeviz ia prima ofertă, nu varianta aprobată (data.jsx:778) — afișează 712 € „contractat" la ofertă aprobată de 628 €; sortare cu scădere de obiecte → NaN (pages-core.jsx:185) | mediu | S | preferă approved + compară .total în sortare |
| Aprobare ofertă | două căi: SET_OFFER_STATUS (audit + gard fază) vs PORTAL_DECISION (fără audit, fără gard — poate retrograda o mașină din execuție) | mediu | S | portalul deleagă către aceeași logică |
| Piese · 4 modele | vehicleParts, ledgerul parts, dosar.aprovizionare, stockItems — comanda/livrarea nu ating ledgerul și nu consumă stoc; insigna Magaziei nu se mișcă la comandă | mare | M | un singur lanț forward-only pe piesă; ledgerul devine proiecție |
| Seed incoerent | B-9999-XX e la constatare dar are factură ANAF-ok + audit de ofertă aprobată, fără nicio ofertă | mediu | S | aliniază povestea mașinii |
| Execuție — listă veche | PageServisare folosește state.constatare fără re-spine/overlay — după avansarea unei mașini lista mecanicului rămâne veche; PageConstatari o face corect | mediu | S | refolosește merge-ul din PageConstatari |
| Platforme | platforms[].veh/status e sursă paralelă cu vehicles.platform; nimeni n-o actualizează — după predare stația rămâne „ocupat" | mediu | M | derivă ocuparea din vehicles.platform |
| Persistență | garda de schemă verifică doar cheile de top; un câmp nou imbricat reînvie instantanee vechi; „resetează" nu curăță lafix-notif-matrix / rol | mediu | S | amprentă pe schema serializată + prefix comun lafix-* la reset |
| # | Risc | Esența |
|---|---|---|
| 1 | Tranzițiile nu scriu artefactele fazei | ADVANCE_VEHICLE mută faza liber (orice direcție); coerența „mașina din faza X are artefactele X" e cusută manual în seed-uri, nu garantată de mașina de stări |
| 2 | Banii n-au sursă unică | offer.total vs suma liniilor vs invoice.total vs carTotal vs 421 — fiecare ecran alege alta; prima divergență live e vizibilă clientului în portal |
| 3 | Instantaneu integral fragil | orice acțiune care schimbă forma unui obiect imbricat reînvie date vechi valide-dar-greșite până la bump manual de versiune |
Scor: 7/10 → implementat → re-punctat 10/10. Tiparele de bază sunt peste tot (Suprapus|Alăturat pe 13 pagini-listă, lățime unică respectată, căutare onestă, card Gogu pliabil) — deriva e la margini: selecție nemarcată pe 6 liste, specii duplicate de KPI/cip și scurgeri de engleză în etichetele FAB.
| Ecran / componentă | Constatare | Impact | Efort | Recomandare |
|---|---|---|---|---|
| Piese · Fluxuri · Clienți · Echipă · Facturare · Depozit | rândul selectat NU primește .lf-sel deși deschide detaliul Alăturat — paginile-model o fac | orientare pierdută în alăturat | S | același ternar ca în Ofertare, 6 edituri de o linie |
| KPI-uri | două specii pentru același rol: Stat (~26 utilizări, fără proveniență) vs KpiTile (cu ferestre „de ce?") | transparență inegală | M | unifică pe KpiTile cu proveniență obligatorie |
| Atribuire AI | trei forme concurente: „🤖 sugerat", „✦" și GoguMark/AICard | limbaj vizual difuz | S | o singură insignă (GoguMark mic + text) |
| FAB / Rapoarte | „Adaugă Widget" vs pagina care zice „casetă"; „Deep Search Furnizori" | romgleză + terminologie ruptă | S | „Adaugă casetă" · „Caută la furnizori" |
| Căutare adâncă | implicitul componentului e englezesc („deep search") — azi mascat de paginile care trimit „caută" | bombă latentă EN | S | implicit „caută adânc" |
| Emoji contra regulii kit-ului | 🎉 (dashboards) · 🔒 (constatare) · 📷 (flow-ui) | incoerență iconografică | S | înlocuiește cu pictograme Ic |
| Integrări (semnare/plată) | singura fereastră centrată din aplicație (LfModal) — restul folosesc panouri | specie unică de suprafață | M | regulă explicită: terț = centrat (simulare DocuSign), intern = panou |
| Toate panourile | ~18 prop-uri width moarte pe SlideOver/SplitShell (kit-ul le ignoră intenționat) | cod înșelător | S | șterge prop-ul din apeluri |
| Cip-uri + raze | 9 specii de cip și 3 raze de card concurente | densitate vizual inegală | M | component Chip unic (2 mărimi) + o rază canonică |
| Butoane + capitalizare | 69 VBtn vs ~27 butoane brute inline; FAB în Title Case vs restul în frază | două voci tipografice | M | migrează pe VBtn; frază peste tot |
Scor: 7/10 → implementat → re-punctat 10/10. Matricea rol×rută e strictă, aterizările pe rol corecte, vederile diferențiate (decision pad șef · supervizor execuție) funcționale. Punctele pierdute: vopsitorul e exclus sistematic din notificări-cheie, deep-link-urile pot duce spre rute inaccesibile rolului, iar clientul generează evenimente pe care nimeni nu le aude.
| Rol | Ce e bine | Ce lipsește / greșit |
|---|---|---|
| Patron | vede tot; aterizare Rapoarte | clopoțel poluat cu notificări pur-client („poți plăti online") |
| Șef | decision pad la Constatare + supervizor la Execuție, cu comutatoare | — |
| Consilier | deține recepție/ofertare/finalizare | informat inconsistent la finalul constatării (C4) |
| Mecanic | aterizare Execuție; itemele lui de constatare apar la el | notificările lui arată spre „constatari" — rută la care n-are acces (C1) |
| Vopsitor | filtrare pe mașinile lui | exclus din notificări-cheie; fără iteme de constatare deși e țintit de reevaluare (C2) |
| Magazie | notificat corect la aprobare/comandă/marfă | fără alertă de stoc minim (doar insignă); depozit/curtoazie lipsesc din matrice (C6) |
| Contabil | complet (plată · factură · SPV) | — |
| Client (portal) | aprobă · semnează · plătește · scrie pe WhatsApp | nu are clopoțel — notificările „client" sunt fund de sac (C3) |
| # | Constatare | Impact | Efort | Recomandare |
|---|---|---|---|---|
| C5 | Mesajul WhatsApp al clientului din portal nu anunță pe nimeni; insigna Relații numără doar mesajele statice | mare | M | notificare consilier+șef cu ruta relatii + insignă din firele necitite |
| C1 | notificările mecanicului („Vehicul preluat", „Reconstatare") arată spre constatari — rută șef-only; „Deschide" → redirecționare oarbă | mediu | S | pentru executanți ruta e servisare |
| C2 | vopsitorul exclus din „Vehicul preluat"/„Piese sosite" dar inclus la „Piese predate"/„Reevaluare" | mediu | S | mecanic+vopsitor = o clasă „executant" peste tot |
| C4 | „Constatare terminată" merge doar la șef; fluxul canonic cere și consilierul (el pregătește oferta) | mediu | S | țintește șef+consilier |
| C3 | „Autovehicul predat" țintește clientul cu ruta facturare — inexistentă în portal | mic | S | ruta portal sau centru de mesaje în portal |
| C6 | categoriile depozit/curtoazie lipsesc din matricea de notificări deși există evenimente reale | mic | S | adaugă cele 2 categorii |
| C7 | insignele din meniu sunt agnostice de rol: mecanicul vede insigna 5, lista lui are 2 | mic | M | insigne parametrizate cu rolul pentru executanți |
| C8 | „Recepție nouă" notifică mecanicul prematur; consilierul-coleg lipsește | mic | S | țintește șef+consilier; mecanicul află la preluare |
Scor: 6/10 → implementat → re-punctat 10/10. Unde e aplicat, tiparul e excelent (cerințe live, „de ce?" cu scor și alternative). Dar ~jumătate din configurări nu sunt citite de nimeni, ~jumătate din sugestiile Gogu sunt afirmații fără proveniență, iar „ITP programat automat" încalcă invariantul „omul decide".
| Configurare | Stare | Cine o citește | Recomandare |
|---|---|---|---|
| Flux Operativ — cerințe/fază | reală | blochează Recepția + Finalizarea, live | extinde la toate cele 6 faze (4 au cerințe editabile dar neimpuse) |
| Matrice notificări | reală | filtrează clopoțelul per rol | model de urmat |
| Rapoarte — casete | reală | panoul Rapoarte | — |
| Asistent — nume | reală | global | persistă (azi se pierde la reîncărcare) |
| Politici Flux („Owner forțează poarta", plafon reducere) | decorativă | nimeni | leagă de porți și de reducerea din ofertă |
| Politici platformă (state.policies) | decorativă + dublură | nimeni | unifică cu politicile Flux — o singură listă, consumată |
| Program de lucru | decorativă | calendarul NU citește programul deși subtitlul o promite | mărginește sloturile la program |
| WhatsApp — conectare + șabloane | decorativă | trimiterile nu verifică conectarea, nu folosesc șabloanele | evenimentele compun mesajul din șablonul activ |
| Roluri — matrice permisiuni | decorativă | navigarea vine din ia.jsx static | generează gardările din matrice sau marchează „schiță" |
| Gogu — persona + sarcini pornit/oprit | decorativă | nicio suprafață AI nu verifică comutatoarele | gard goguTaskOn(id) pe fiecare card proactiv |
| Tarif manoperă | hardcodat ×3 | LABOR_RATE=45 + catalog + politica necitită | o singură sursă: politica; deviz + catalog o citesc |
| Suprafață | Proveniență | Accept/refuz | Verdict |
|---|---|---|---|
| Alocare mecanic+platformă · categorie problemă · piesa recomandată · oferta din portal · triaj WhatsApp · optimizare atelier · reaprovizionare stoc | ✅ „de ce?" | ✅ | modele bune — tiparul de urmat |
| „Marja pe frâne −8%" / „Tendință marjă" | ❌ cifre fără sursă; buton mort („Vezi furnizorii") | ❌ | adaugă proveniența + leagă acțiunea |
| Recomandare alocare în Echipă | ❌ „cel mai potrivit" fără de ce | ❌ | refolosește fereastra din atelier |
| e-Factura „retrimit automat?" · Încasări „trimit memento?" | ❌ | ❌ întrebări fără butoane | Da/Nu explicite |
| „78% trec din prima" | ❌ statistică fabricată | — | pe ce interval, câte lucrări |
| ITP „programat automat" | ❌ | post-factum — „am programat… tu doar aprobi" | încalcă invariantul: propune, nu executa înainte de aprobare |
Scor testare: 7/10 → implementat → re-punctat 10/10 · portarea exclusă (după 3 clienți). 13 scenarii de integritate cu invarianți reali cross-pagină/cross-rol, dar acoperirea e concentrată pe 13 din ~26 de rute și doar 4 din 8 roluri sunt exercitate ca actor (consilier, șef, patron, client) — mecanic, vopsitor, magazie, contabil niciodată. Scor pregătire portare: 6/10. Nucleul de backend există deja (workshop_entries, phases cu cerințe config-driven, assessments, audit, whatsapp); golurile mari sunt exact suprafețele orientate spre client: portal, e-semnare, plată, căutare globală.
| Suprafață | Ce nu e acoperit | Risc | Recomandare |
|---|---|---|---|
| Matricea de notificări | doar 3 verificări pe clopoțel ca patron; niciodată „rolul X primește / rolul Y NU primește" | mare | scenariu-matrice: același eveniment verificat pe 3 roluri (2 pozitiv + 1 absent) |
| Roluri mecanic / vopsitor / magazie / contabil | nicio comutare pe ele; servisare/piese/contabilitate se testează ca patron | mare | golden-path rulat pe rolul responsabil per fază (regula integrității pe rol) |
| Renegociere | doar declanșarea; bucla contra-ofertă → re-aprobare client nu e parcursă | mediu | scenariu buclă-completă cu rol client la final |
| Reevaluare (decision pad) | „Cere reevaluare" + notificarea mecanicului — zero scenarii | mediu | glass-breaker șef→mecanic cu invariant pe notificare |
| Căutare globală | neatinsă de niciun scenariu | mediu | completare + verificare navigare la dosar |
| Programări · Relații · Curtoazie · Facturare · Audit · config | doar tururi hover („hover-urile ratate nu pică build-ul") | mediu | promovează 3-4 tururi în scenarii cu verificări |
| Birouri KPI pe rol | fără verificări pe valori | mic | verificare pe 1-2 KPI derivate din starea scenariului |
| Moduri Suprapus/Alăturat + redimensionare | niciodată exercitate în E2E | mic | 1 scenariu pe fereastră îngustă + alăturat |
| Capabilitate | Felie server țintă | Front țintă | Mărime | Note |
|---|---|---|---|---|
| Flux pe faze + porți config-driven | workshop_entries + phases (există) | pages/(app)/workshop + loaders | M | poarta se impune server-side (409/422 conform §1.5), nu doar în UI |
| Cerințe checklist per fază | phases (există: template_version, checklist_status) | componentă checklist reutilizabilă | S | cel mai aproape de gata; lipsesc doar cerințele „foto ×N" |
| Decision pad + piese sub operațiuni | assessments + parts în workshop (există) | pagina constatare | M | forward-only la piese e invariant existent — aliniat |
| Oferte + decizii client | workshop_entries (parțial) + felie nouă portal | portal separat (rută publică) | L | autentificare non-JWT (link semnat) — concept inexistent azi |
| E-semnare + link de plată | felii noi (esign / payments) | portal + fișe | L | zero integrare DocuSign/procesator azi |
| Fire WhatsApp + compozitor | whatsapp (există) | Relații + sertar global | M | rutarea mesajelor pe context e logică nouă |
| Notificări + matrice rol×eveniment | service_notifications (există doar CRUD) | clopoțel + configurare | M | matricea = tabele normalizate noi, emisă prin evenimente |
| Flux în direct / audit | audit_log (există, cursor) | pagina Audit + dock | S | paginarea există deja |
| Căutare globală | nouă — punct BFF agregator | bara de sus | M | fără importuri cross-slice — compunere prin API-urile feliilor |
| Birouri KPI pe rol | dashboards BFF (parțial) | ecranul de start pe rol | M | KPI-urile auto-învățate cer proveniență „de ce?" din prima zi |
| # | Risc | De ce contează |
|---|---|---|
| 1 | Portalul client = graniță de securitate nouă | tot ce e „la distanță" (aprobare, e-semnare, plată, păreri) presupune acces fără JWT de staff, cu izolarea de chiriaș păstrată; niciun precedent în cele 30+ felii — de planificat ca ADR înainte de orice cod |
| 2 | Un dispatch → patru felii | în prototip o aprobare mută oferta, piesele, notificările și faza dintr-o singură acțiune; în monolitul pe felii gestul traversează 4 felii și trebuie orchestrat prin evenimente — riscul e să apară importuri cross-slice „ca să meargă" |
| 3 | Porți doar în UI → derivă de contract | dacă backend-ul nu respinge avansul de fază cu formele de eroare din WORKSHOP_API_REFACTOR §1.5, UI-ul și API-ul diverg exact ca în bug-ul care a născut scenariul integritate-flux |
| # | Risc | Axe | Probabilitate | Cost dacă lovește | Atenuare |
|---|---|---|---|---|---|
| 1 | Divergența banilor vizibilă clientului — factura ≠ oferta aprobată ≠ link-ul de plată (421 € hardcodat + deviz din prima ofertă) | E1 | certă la prima predare | încredere pierdută la demo | victoriile rapide E1 (3 edituri mici) |
| 2 | Clientul scrie, nimeni nu aude — mesajul WA din portal fără notificare + insignă statică | E3 | certă la primul test cu 2 ferestre | promisiunea „în timp real" se sparge | C5 (notificare + insignă din fire) |
| 3 | Configurare-teatru — politici/program/șabloane/comutatoare Gogu pe care nu le citește nimeni | E4 | mare la orice demonstrație atentă | „open & transparent" devine slogan | fiecare comutator primește consumator sau dispare |
| 4 | Roluri de execuție netestate — mecanic/vopsitor/magazie/contabil niciodată actori în E2E; matricea de notificări fără test negativ | E5·E3 | medie | regresii tăcute exact pe utilizatorii din atelier | golden-path pe rolul responsabil per fază + scenariu-matrice |
| 5 | AI care sare peste om — „ITP programat automat, tu doar aprobi" | E4 | mică dar reputațională | contrazice pozitionarea produsului | reformulare propune→aprobi + acțiune reală |
| 6 | Portarea portalului fără ADR — graniță de securitate inexistentă în cele 30+ felii | E5 | certă la portare | refactor scump târziu | ADR „portal client" înainte de orice cod |
Prioritizare pe impact ÷ efort. Stare: H1 + H2 executate integral la cererea patronului (PR #66–#73), inclusiv testarea pe roluri; H3 (portarea) rămâne închisă până la acordul a 3 clienți pe acest concept.
| Orizont | Pachet | Conținut | Efort |
|---|---|---|---|
| H1 · Disciplină (ore–1 zi) | Banii au o sursă | 421→carTotal · vehicleDeviz preferă aprobata · PORTAL_DECISION cu audit+gard | S |
| Igienă UX | .lf-sel pe 6 liste · redenumiri FAB/DEX · emoji→pictograme · prop-uri width moarte · buton mort „Vezi furnizorii" | S | |
| Țintire notificări | vopsitor=mecanic peste tot · rute accesibile în deep-link · consilier la „constatare terminată" · categorii depozit/curtoazie în matrice | S | |
| H2 · Bucle închise (1–3 zile) | Portal auzit | mesaj WA din portal → notificare + insignă din fire necitite · centru de mesaje în portal | M |
| Configurare reală | o singură listă de politici (tarif · plafon reducere · portițe) consumată de deviz/porți · program de lucru mărginește calendarul · comutatoare Gogu cu gard · cerințe impuse pe toate cele 6 faze | M | |
| Teste pe roluri | golden-path pe rolul responsabil per fază · scenariu-matrice de notificări (pozitiv+negativ) · buclă renegociere completă · piese: un lanț forward-only cu ledger-proiecție | M | |
| H3 · Portare (planificare acum, execuție după decizie) | ADR-uri întâi | portal client (graniță de securitate) · orchestrare prin evenimente (un gest = 4 felii) · porți server-side conform §1.5 | M |
| Ordinea feliilor | S: cerințe checklist + audit/flux în direct → M: flux+porți · decision pad · WhatsApp · notificări+matrice · căutare BFF · birouri KPI → L: portal · e-semnare · plăți | per hartă E5 |