QA #50 — Frontend: classification & complexité éditables dans TicketDraftPanel Branche: feat/50-draft-classification-complexity-editable PR #26 -> dev Commit: 31cde4078eb713749589f1a9008d9aeea9a3c7c5 Date: 2026-06-11T19:49:52Z ================================================================ ### Suites ciblées (preuve composant/hook) RUN v2.1.9 /home/naqued/Development/omdev/Client-Dashboard/.claude/worktrees/agent-a408221ec46905860 ✓ src/components/atoms/BfDisagreeTag.test.tsx (5 tests) 78ms ✓ src/features/chat/useCreateTicket.test.tsx (3 tests) 187ms ✓ src/components/organisms/TicketDraftPanel.test.tsx (17 tests) 590ms Test Files 3 passed (3) Tests 25 passed (25) Start at 21:49:52 Duration 1.55s (transform 180ms, setup 265ms, collect 561ms, tests 855ms, environment 1.01s, prepare 408ms) ### npx vitest run (gate complet) ✓ src/components/providers/IntlProvider.test.tsx (2 tests) 197ms ✓ src/features/auth/useLogout.test.tsx (1 test) 145ms ✓ src/components/molecules/TicketingFirstRun.test.tsx (3 tests) 236ms ✓ src/components/molecules/ProjectTabs.test.tsx (2 tests) 205ms ✓ src/features/usage/ranges.test.ts (3 tests) 12ms ✓ src/components/molecules/KnowledgeStrip.test.tsx (2 tests) 172ms ✓ src/components/atoms/TaskStatusPill.test.tsx (3 tests) 184ms ✓ src/components/atoms/Badge.test.tsx (2 tests) 103ms ✓ src/components/atoms/HealthBadge.test.tsx (2 tests) 52ms Test Files 84 passed (84) Tests 439 passed (439) Start at 21:50:00 Duration 15.36s (transform 5.01s, setup 22.83s, collect 37.50s, tests 51.98s, environment 68.45s, prepare 13.60s) ### npx tsc --noEmit tsc exit=0 ### npx eslint . eslint exit=0 ### npm run build build exit=0 ✓ Compiled successfully in 4.4s Generating static pages using 12 workers (0/6) ... Error: ENVIRONMENT_FALLBACK code: 'ENVIRONMENT_FALLBACK' Generating static pages using 12 workers (1/6) Generating static pages using 12 workers (2/6) Generating static pages using 12 workers (4/6) ✓ Generating static pages using 12 workers (6/6) in 423ms Route (app) ================================================================ ### Cartographie des critères d'acceptation (AC -> OK/KO) [OK] AC1 — Classification + note affichées dans TicketDraftPanel à partir du draft backend. Source: TicketDraftForm seed `proposedClassification = draft.classification ?? draft.issue_type` et `seededComplexity = draft.complexity ?? {score:0,explanation:""}` (TicketDraftPanel.tsx L312-324). Toggle Classification + champs Complexity score/explanation rendus. [OK] AC2 — Le client peut éditer classification + note ; défauts conservés sinon. Champs contrôlés (issueType, complexityScore, complexityExplanation) seedés sur le draft ; non modifiés -> valeurs par défaut transmises telles quelles. Couvert par les tests TicketDraftPanel (17 tests). [OK] AC3 — Modifier la classification déclenche : avertissement + tag bf-disagree (#FF9800) + tooltip + champ argumentation. `classificationChanged = issueType !== proposedClassification` (L328) -> bloc role="alert" avec , message t("classificationChangedWarning"), et textarea d'argumentation (L459-491). Atom BfDisagreeTag: pill orange exact `bg-[#FF9800]` + border `#E68900`, Tooltip §UH.2, aria-label = tooltip (BfDisagreeTag.tsx L44-55). Suite BfDisagreeTag: 5 tests OK. [OK] AC4 — Champ d'argumentation laissé vide -> validation non-bloquante. `handleFile` ne dépend que de `titleEmpty` ; argumentation jamais requise. `argumentation: classificationChanged ? argumentation : ""` (L392). Bouton "File" désactivé uniquement sur titre vide. Couvert par TicketDraftPanel.test.tsx. [OK] AC5 — Le payload de création transmet classification, note et argumentation. extra -> useCreateTicket POST body: issue_type, complexity (complexity ?? draft.complexity), proposed_classification (échoué seulement sur override), argumentation (useCreateTicket.ts L51-62). Contrat aligné avec le backend #49 livré. Suite useCreateTicket: 3 tests OK. [OK] AC6 — FR/EN (clés ajoutées dans en.ts uniquement ; fr.ts re-exporte). Clés intake.* présentes dans en.ts (classification, complexity, complexityScore, complexityExplanation, classificationChangedWarning, bfDisagreeTooltip, argumentationLabel, argumentationHint). fr.ts: `export const fr: typeof en = en;` [OK] AC7 — Gate vert : vitest, tsc --noEmit, eslint, build. vitest: 84 fichiers / 439 tests OK. tsc exit=0. eslint exit=0. build exit=0 (le log /admin ENVIRONMENT_FALLBACK est le pré-existant non-fatal documenté). ================================================================ ### Smoke test live App https://pipeliner.omdev.tech joignable (HTTP 200) mais écran de connexion gardé ; le flux d'aperçu TicketDraftPanel exige un client authentifié + projet lié Redmine + draft généré, non atteignable de façon fiable sans identifiants (non exposés). Repli sur les suites composant/rendu comme preuve (BfDisagreeTag + TicketDraftPanel + useCreateTicket). VERDICT: PASS — tous les critères d'acceptation OK.