Curățenie în repo: captură de depanare, ramuri fuzionate, documente de design, dependențe, .env.example
Rădăcina repo-ului ține o captură de ecran rămasă de la reproducerea unui bug, pe server au rămas ramuri prod-* deja fuzionate în main, iar documentele de design la care trimite codul ca la „singura sursă de adevăr" dau o paletă de culori care nu mai există în produs. La astea se adaugă un pachet de tipuri așezat în lista greșită din package.json și o variabilă de mediu nedocumentată în .env.example. Nimic nu afectează site-ul așa cum îl vede un vizitator azi; toate costă timp și induc în eroare pe cine preia proiectul.
Ce am găsit
Captura de depanare users-table-repro.png din rădăcină
$ git ls-files -s users-table-repro.png
100644 f55e3a35237a94a73a37e81e9916e6a88b8bf223 0 users-table-repro.png
Fișierul are 34.013 octeți și e urmărit de git. git grep -n -I 'users-table-repro' -- . întoarce zero rezultate: niciun cod, test sau document nu îl referă. A intrat cu commit-ul 06e9065 (2026-07-20), al cărui --stat arată exact două fișiere: .superpowers/sdd/progress.md și users-table-repro.png. Curățenia din e985838 a scos fișierul pereche, dar pe acesta l-a ratat.
E o poză făcută ca să se reproducă un bug acum o lună, care stă în rădăcina proiectului — primul lucru pe care îl vede cineva care clonează repo-ul.
Șase ramuri prod-* fuzionate complet în main
git rev-list --count origin/main..<ramura> întoarce 0 pentru toate șase ramurile locale: prod-email-template, prod-redirects, prod-runner-tags, prod-seo, prod-smtp-write, prod-ssr-i18n. Vârful lui origin/main este 20c8eee — „Merge branch 'prod-ssr-i18n' into 'main'".
Pe server mai există doar trei dintre ele:
$ git ls-remote --heads origin
refs/heads/develop
refs/heads/main
refs/heads/prod-runner-tags
refs/heads/prod-seo
refs/heads/prod-ssr-i18n
Restul ref-urilor locale sunt învechite; git fetch --prune --dry-run origin le confirmă ca șterse pe server (prod-email-template, prod-smtp-write).
Niciuna nu conține vreo linie care să nu fie deja în main. Rămân doar ca zgomot: cine deschide lista de ramuri pe GitLab vede piste de lucru care par active și nu are cum să știe, fără să verifice, că sunt terminate.
Documentele de design dau o culoare de accent care nu mai există în produs
frontend/tailwind.config.js:1 importă ../design/tailwind-theme.js, iar frontend/tailwind.config.js:7 trimite cititorul mai departe: „Design tokens are the single source of truth (see design/DESIGN_SYSTEM.md)". A doua trimitere e la frontend/src/index.css:64, „per DESIGN_SYSTEM §2".
Fișierul chiar folosit la build, design/tailwind-theme.js, spune la liniile 19-20 că site-ul real e monocrom și că nu există accent portocaliu, iar la linia 47 definește DEFAULT: "#006AF5". Documentul indicat ca sursă de adevăr, design/DESIGN_SYSTEM.md:76, dă --accent | #FF4E00 și construiește pe el la liniile 78 și 230.
$ git grep -in FF4E00 -- .
design/DESIGN_SYSTEM.md:76, :78, :230
design/FIDELITY_GAPS.md:10, :45
design/style-guide.html:13, :56, :261
Culoarea nu apare niciodată în frontend/src. Datele de modificare confirmă înghețarea: DESIGN_SYSTEM.md, style-guide.html și FIDELITY_GAPS.md sunt toate la 01fec11 / 2026-07-06, în timp ce design/tailwind-theme.js a mai fost atins la 6c84695 / 2026-07-15.
O distincție importantă: design/FIDELITY_GAPS.md nu contrazice codul, îl prescrie — linia 45 cere „Remove all orange; focus ring → blue 2px", adică documentează exact schimbarea care s-a făcut. E o listă de sarcini executate, scrisă la imperativ, 163 de linii, zero referințe din cod. Documentele care descriu greșit starea curentă sunt DESIGN_SYSTEM.md și style-guide.html.
Un document care minte e mai periculos decât lipsa lui: cel care îl citește nu are motiv să-l verifice. design/tailwind-theme.js nu se atinge — e viu, îl importă tailwind.config.js.
@types/multer stă în dependencies, nu în devDependencies
În backend/package.json, "@types/multer": "^2.2.0" e în blocul dependencies, între @prisma/client și bcryptjs. Toate celelalte opt pachete @types/* ale proiectului (bcryptjs, cookie-parser, cors, express, jsonwebtoken, node, nodemailer, supertest) sunt în devDependencies.
Pachetul e într-adevăr necesar la compilare, deci se mută, nu se șterge: multer e la 2.2.0 în node_modules, nu declară types/typings în propriul package.json și nu are niciun .d.ts în mapă — tipurile vin exclusiv din @types/multer.
Mutarea nu strică imaginea de producție: în backend/Dockerfile, etapa build face npm ci complet și abia apoi npm run build, iar etapa runtime face npm ci --omit=dev și copiază doar dist. tsx rămâne unde e, în dependencies — joburile din .gitlab-ci.yml (liniile 382-435) rulează docker compose exec -T backend npx tsx prisma/... în containerul de producție, iar Dockerfile documentează deja acest lucru.
FRONTEND_ORIGIN lipsește din backend/.env.example
backend/src/config/env.ts:30 citește process.env.FRONTEND_ORIGIN ?? 'http://frontend'. Variabila e importată și folosită în backend/src/services/app-shell.ts:40, la fetch(`${FRONTEND_ORIGIN}${path}`).
grep -c FRONTEND_ORIGIN backend/.env.example întoarce 0. Fișierul conține DATABASE_URL, PORT, CORS_ORIGIN, JWT_SECRET, JWT_EXPIRES_IN, ADMIN_EMAIL, ADMIN_PASSWORD, blocul SMTP_* comentat și limitele de rată comentate — dar nu și această variabilă. Comparând variabilele citite din backend/src cu cheile din .env.example, singurele care lipsesc sunt FRONTEND_ORIGIN și NODE_ENV (a doua e standard și nu se documentează).
E chiar variabila prin care backend-ul aduce shell-ul de la frontend, adică de care depinde ca vizitatorul să primească HTML adevărat. Are valoare implicită care merge în compose, deci nu strică nimic azi — dar cine ridică proiectul altfel nu are de unde să afle că există.
Limita de 72 de caractere la rezumatul commit-ului nu se aplică
git log origin/develop -40 --format='%s' | awk 'length($0)>72' întoarce 6 rezultate, cu lungimi de 74, 75, 78, 91, 93 și 96 de caractere. Cel mai recent, 4d9d39f, are 78 de caractere: „Render each language from its own url, and tell search engines about all three".
Mai important decât lungimea: cinci din cele șase sunt scrise în română, deși convenția proiectului cere mesaje în engleză. Istoria nu se rescrie pentru asta — costul nu merită — dar regula se aplică de la următorul commit. Pentru un caz ca 4d9d39f, rezumatul corect ar fi fost „Render each language from its own url" (37 de caractere), iar restul ar fi trecut în corpul mesajului.
De făcut
-
git rm users-table-repro.png, într-un commit propriu, cu formulare neutră -
git fetch --prune, care curăță singur ref-urile locale moarte (prod-email-template,prod-smtp-write,prod-redirects) -
git push origin --delete prod-runner-tags prod-seo prod-ssr-i18n -
git branch -dpe cele șase ramuri locale; se folosește-d, nu-D— dacă git refuză, ramura nu e fuzionată și verificarea de mai sus era greșită -
Actualizează design/DESIGN_SYSTEM.mdșidesign/style-guide.htmlla paleta reală (accent#006AF5, fără portocaliu) sau, dacă nu mai sunt folosite ca referință, șterge-le și scoate trimiterile dinfrontend/tailwind.config.js:7șifrontend/src/index.css:64 -
Șterge design/FIDELITY_GAPS.md— e o listă de sarcini terminate -
Mută @types/multerdindependenciesîndevDependenciesînbackend/package.jsonși ruleazănpm installca să se actualizezepackage-lock.json -
Adaugă FRONTEND_ORIGINînbackend/.env.example, lângăCORS_ORIGIN, cu un comentariu scurt (de unde vede backend-ul frontend-ul construit,http://frontendfiind numele serviciului din compose) și valoarea implicită comentată ca opțională -
De la următorul commit: rezumat sub 72 de caractere și în engleză, restul în corpul mesajului
Criteriu de acceptare
-
git ls-files | grep -c users-table-reproîntoarce 0, iargit ls-files | grep -E '\.(png|jpg)$' | grep -v -E '^frontend/(public|src)/|^design/|^backend/'nu mai întoarce nimic. -
git branch -amai listează doarmain/developși ref-urile lor de pe origin;git branch -da reușit pentru toate șase fără-D. -
git grep -in FF4E00 -- .întoarce 0 rezultate, sau documentele au dispărut din repo împreună cu trimiterile către ele;npm run buildînfrontend/trece și nicio culoare randată nu se schimbă, pentru că build-ul citea deja doardesign/tailwind-theme.js. -
node -e "const p=require('./backend/package.json'); console.log(!!p.dependencies['@types/multer'], !!p.devDependencies['@types/multer'])"întoarcefalse true, iarnpm run buildînbackend/trece. - Comparația variabilelor de mediu întoarce doar
NODE_ENV:{ git grep -ohE 'process\.env\.[A-Z0-9_]+' -- backend/src | sed 's/process\.env\.//'; } | sort -u | comm -23 - <(grep -oE '^#? *[A-Z0-9_]+' backend/.env.example | tr -d '# ' | sort -u) -
git log origin/develop -20 --format='%s' | awk 'length($0)>72' | wc -lîntoarce 0, măsurat peste commit-uri făcute după deschiderea acestui issue.
Depinde de
Alegerea între „actualizez" și „șterg" pentru design/DESIGN_SYSTEM.md și design/style-guide.html e o decizie vizuală, deci a lui Vitalie: dacă documentele mai sunt folosite ca referință de design, se aduc la paleta reală; dacă nu, dispar din repo împreună cu trimiterile către ele.