=================================================================== QA #51 — Frontend : classification, complexite & tag bf-disagree page detaillee + liste (parent epic #26, PR #29 -> dev) Branche : feat/51-classification-display @ 19cd23e Date : 2026-06-11 Agent : QA manuel (#25) =================================================================== RESULTAT GLOBAL : PASS (tous les criteres OK) ------------------- Smoke test : portes de qualite ---------------- npx vitest run (complet) : 458 passed / 86 fichiers -> OK suites ciblees : ticketMeta(12) + BfDisagreeTag(5) + TaskRow(3) + TaskDetailPane(13) = 33 passed npx tsc --noEmit : exit 0 -> OK npx eslint . : exit 0 -> OK npm run build : exit 0 (log /admin ENVIRONMENT_FALLBACK pre-existant, non bloquant) -> OK Backend (api/.venv, PYTHONPATH=src) : test_task_board_use_cases.py : 13 passed dont test_list_project_tasks_flags_bf_disagree_from_description : OK (tests d'integration FastAPI test_tasks_api.py = besoin Postgres, hors smoke ; derivation couverte par le use-case unitaire) ----------------------- Criteres d'acceptation -------------------- [OK] TaskDetailPane affiche classification + note + explication -> carte triage read-only 'Classification & complexity' (TaskDetailPane.tsx:256-257 parseTicketMeta/stripTicketMetaBlock) [OK] Tag bf-disagree (#FF9800 + tooltip) sur la page detaillee -> import @/components/atoms/BfDisagreeTag (TaskDetailPane.tsx:8) [OK] Tag bf-disagree visible dans la liste des tickets -> TaskRow.tsx:6 import + :123 inline sur rangees flaggees flag aliment par bf_disagree (backend) ; rangees ne lisent pas les descriptions -> enabler backend minimal : has_bf_disagree(description) -> TaskSummary.bf_disagree -> TaskSummaryOut.bf_disagree (aucun nouvel appel upstream) [OK] Composant tag partage avec la previsualisation (#50), pas de reimpl. -> meme atome importe par TicketDraftPanel.tsx:6, TaskRow, TaskDetailPane couleur #FF9800 definie UNIQUEMENT dans l'atome (atoms/BfDisagreeTag.tsx:45) [OK] FR/EN : cles ajoutees dans en.ts uniquement, fr.ts reexporte en -> tasks.triage.* + bfDisagreeTooltip (en.ts:435-459) ; fr.ts = typeof en [OK] parseTicketMeta / stripTicketMetaBlock parsent + masquent le bloc meta -> exportes ticketMeta.ts:116/:132 ; 12 tests parser verts [OK] Gate vert (vitest, tsc, eslint, build) + TDD -------------------------- Smoke live UI -------------------------- Prod https://pipeliner.omdev.tech atteignable (200) mais derriere authentification (page 'Sign in'). Pas d'identifiants utilisables sans secret -> fallback sur les tests de rendu (Testing Library) comme preuve visuelle, conformement au plan. Aucun secret manipule. Preuves jointes : - qa-51-rapport.txt (ce fichier) - qa-51-vitest.txt (sortie vitest complete) ===================================================================