Project

General

Profile

Actions

Feature #50

closed
RA

Feature #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)

Feature #50: Frontend — classification & complexité éditables dans TicketDraftPanel (prévisualisation)

Added by Redmine Admin about 2 months ago. Updated about 2 months ago.

Status:
Shipped
Priority:
Normal
Assignee:
-
Start date:
06/11/2026
Due date:
% Done:

0%

Estimated time:
spec_ref:

conversation:21#26

build_status:
build_number:
ci_run_url:
scan_status:
scan_report_url:
deploy_status:
preprod_url:
deployed_at:
branch:
feat/50-draft-classification-complexity-editable
pr_url:
https://github.com/omdev-tech/PipeLiner-Client/pull/26
security_key:
severity:
paused:

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

qa-50-proof-gate-and-ac.txt (5.13 KB) qa-50-proof-gate-and-ac.txt Redmine Admin, 06/11/2026 07:52 PM

RA Updated by Redmine Admin about 2 months ago Actions #1

  • Status changed from Submitted to Spec
  • spec_ref updated (diff)

RA Updated by Redmine Admin about 2 months ago Actions #2

  • Status changed from Spec to In development

RA Updated by Redmine Admin about 2 months ago Actions #3

  • 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 Actions #5

**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 Actions #6

  • Status changed from QA to Shipped

Shipped to production (master build #65). Editable classification & complexity in TicketDraftPanel + reusable BfDisagreeTag atom. QA PASS; prod live.

Actions

Also available in: PDF Atom