Feature #50
closedFeature #26: Implémenter la classification automatique et l'estimation de complexité des tickets par l'assistant AI
Frontend — classification & complexité éditables dans TicketDraftPanel (prévisualisation)
0%
conversation:21#26
Description
**Parent :** #26 · **Taille :** M · **Dépendances :** #49 (contrat backend) · **Surface :** frontend (`src/`, Next.js 16, Atomic Design, next-intl)
## Objectif
Dans `TicketDraftPanel` (la prévisualisation), afficher et permettre l'édition de la **classification** (bug|évolution) et de la **note de complexité** proposées par l'assistant.
- Modifier la classification → **message d'avertissement** (« Changer la classification nécessitera une revue par l'équipe OmDev avant de démarrer ce ticket. ») + **tag `bf-disagree`** (orange `#FF9800`) + **tooltip** (« L'équipe OmDev examinera cette classification avant de commencer le travail. ») + **champ d'argumentation optionnel** (« Pourquoi pensez-vous que c'est un [Bug/Évolution] ? »).
- Valeurs par défaut conservées si non modifiées. Non-bloquant : le client peut valider même avec un champ d'argumentation vide.
- Le payload de création transmet classification + note + argumentation au backend (#49).
## Acceptance criteria
- [ ] Classification + note affichées dans `TicketDraftPanel` à partir du draft backend.
- [ ] Le client peut éditer classification + note ; les défauts sont conservés sinon.
- [ ] Modifier la classification déclenche : avertissement + tag `bf-disagree` (#FF9800) + tooltip + champ d'argumentation.
- [ ] Champ d'argumentation laissé vide → validation non-bloquante.
- [ ] Le payload de création transmet classification, note et argumentation.
- [ ] FR/EN (clés ajoutées dans `en.ts` uniquement ; `fr.ts` re-exporte).
- [ ] Gate vert : `npx vitest run`, `npx tsc --noEmit`, `npx eslint .`, `npm run build`. TDD.
Files
RA Updated by Redmine Admin about 2 months ago
- Status changed from Submitted to Spec
- spec_ref updated (diff)
RA Updated by Redmine Admin about 2 months ago
- Status changed from Spec to In development
RA Updated by Redmine Admin about 2 months ago
- Status changed from In development to QA
- branch set to feat/50-draft-classification-complexity-editable
- pr_url set to https://github.com/omdev-tech/PipeLiner-Client/pull/26
PR ouverte vers `dev` : https://github.com/omdev-tech/PipeLiner-Client/pull/26
Implémenté dans `TicketDraftPanel` (prévisualisation) :
- Affichage + édition de la **classification** (bug|évolution) et de la **note de complexité** (score /10 + explication) issues du draft backend (#49). Valeurs par défaut conservées si non modifiées.
- Modifier la classification déclenche : message d'avertissement (« Changer la classification nécessitera une revue par l'équipe OmDev avant de démarrer ce ticket. ») + **tag `bf-disagree`** (orange `#FF9800`) + tooltip (« L'équipe OmDev examinera cette classification avant de commencer le travail. ») + champ d'argumentation **optionnel** (« Pourquoi pensez-vous que c'est un [Bug/Évolution] ? »).
- Argumentation vide → validation **non-bloquante**.
- Le payload de création transmet `classification` (issue_type), `complexity` {score, explanation}, `proposed_classification` (uniquement en cas de désaccord → `bf-disagree` côté backend) et `argumentation`.
- Le tag `bf-disagree` est un **atome réutilisable** (`BfDisagreeTag`) — #51 le réutilisera sur la page et la liste, pas de duplication.
- Clés i18n ajoutées dans `en.ts` uniquement (`fr.ts` re-exporte).
Gate vert : `npx vitest run` (439 ✓), `npx tsc --noEmit`, `npx eslint .`, `npm run build`. TDD.
→ passage en QA.
RA Updated by Redmine Admin about 2 months ago
RA Updated by Redmine Admin about 2 months ago
**QA — VERDICT : PASS** ✅ (reste en `QA`)
Smoke test de la fonctionnalité « classification & complexité éditables dans `TicketDraftPanel` » sur la branche `feat/50-draft-classification-complexity-editable` (PR #26 → `dev`), commit `31cde40`.
### Critères d'acceptation
- **AC1 — Classification + note affichées depuis le draft : OK.** Seed `proposedClassification = draft.classification ?? draft.issue_type` et `seededComplexity = draft.complexity ?? {score:0,explanation:""}` dans `TicketDraftForm`.
- **AC2 — Édition classification + note, défauts conservés sinon : OK.** Champs contrôlés seedés sur le draft ; valeurs par défaut transmises si non modifiées.
- **AC3 — Override classification → avertissement + tag `bf-disagree` (#FF9800) + tooltip + champ argumentation : OK.** `classificationChanged` rend un bloc `role="alert"` avec `<BfDisagreeTag tooltip={t("bfDisagreeTooltip")} />` (pill orange exact `bg-[#FF9800]` / border `#E68900`, tooltip §UH.2, `aria-label`), message `classificationChangedWarning` et textarea d'argumentation.
- **AC4 — Argumentation vide non-bloquante : OK.** `handleFile` ne bloque que sur titre vide ; `argumentation` jamais requise.
- **AC5 — Payload de création transmet classification + note + argumentation : OK.** `extra` → `useCreateTicket` POST body (`issue_type`, `complexity`, `proposed_classification` échoué seulement sur override, `argumentation`) — aligné avec le contrat backend **#49** livré.
- **AC6 — FR/EN via `en.ts` uniquement : OK.** Clés `intake.*` ajoutées dans `en.ts` ; `fr.ts` : `export const fr: typeof en = en;`.
- **AC7 — Gate vert : OK.** `vitest` 84 fichiers / **439 tests** passés, `tsc --noEmit` exit 0, `eslint .` exit 0, `npm run build` exit 0 (le log `/admin` `ENVIRONMENT_FALLBACK` est le pré-existant non-fatal documenté). Suites ciblées : `BfDisagreeTag` (5), `TicketDraftPanel` (17), `useCreateTicket` (3).
### Smoke test live
`https://pipeliner.omdev.tech` joignable (HTTP 200) mais gardé par l'écran de connexion ; le flux d'aperçu `TicketDraftPanel` requiert 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, conformément au protocole QA.
### Pièce jointe
- `qa-50-proof-gate-and-ac.txt` — log technique (gate complet + cartographie AC→OK), filtré des secrets.
Tous les critères d'acceptation sont **OK** → le ticket **reste en `QA`** (la promotion preprod relève d'un autre agent).
RA Updated by Redmine Admin about 2 months ago
- Status changed from QA to Shipped
Shipped to production (master build #65). Editable classification & complexity in TicketDraftPanel + reusable BfDisagreeTag atom. QA PASS; prod live.