Feature #23
closedImplémenter l'agent Scrum Master / Dev Spec pour la décomposition des tickets Redmine
100%
Spec + plan : infra/docs/superpowers/specs/2026-06-11-scrum-master-dev-spec-agent-design.md. Livré comme un ensemble de 3 artefacts (2 sous-agents + 1 skill orchestrateur), installés globalement depuis infra/, vérifiés par dry-run de bout en bout. Commit infra main 3086524.
Description
### Problème
Actuellement, les développeurs et les product owners doivent manuellement décider si un ticket Redmine doit être découpé en sous-tâches et spécifier ces sous-tâches. Ce processus est chronophage et sujet à des oublis, surtout pour les tickets complexes (ex. : applications mobiles).
### Contexte
Dans le cadre du projet **pipeliner**, nous souhaitons automatiser cette décision en créant un **agent Scrum Master / Dev Spec** invocable par d'autres agents. Cet agent analysera les tickets soumis (`status = "Submitted"`) pour :
- Déterminer si un découpage est nécessaire.
- Proposer une décomposition détaillée en sous-tâches si applicable.
- Faire avancer le ticket dans le pipeline (`Submitted → Spec → In development`).
- Mettre à jour le tableau de bord **Pipeliner** et l'**Aggregator** pour refléter ces changements.
> **⚠️ MISE À JOUR (gouvernance des statuts, 2026-06-11)** — le statut `ready_for_dev` initialement demandé est **abandonné** : c'est une *frontière* entre `Spec` et `In development`, pas une étape où le travail se trouve. On réutilise le workflow canonique existant (8 statuts, ids 7–14) — voir `docs/superpowers/specs/2026-06-11-redmine-status-governance.md` §5.2. **Aucun nouveau statut.** Les transitions sont pilotées par `allowed_statuses` (jamais d'ids ni de noms codés en dur).
### Comportement proposé
1. **Déclenchement** : l'agent reçoit un ticket Redmine avec `status = "Submitted"`.
2. **Passage en Spec** : le ticket passe en `status = "Spec"` (via la transition autorisée) pour indiquer qu'il est en cours de spécification.
3. **Analyse** : l'agent applique les règles de découpage (ne pas découper bugfix / petites améliorations ; découper applications mobiles / tâches complexes).
4. **Proposition** : si un découpage est nécessaire, l'agent génère une proposition de sous-tâches (JSON) ajoutée en commentaire Redmine, et crée les sous-tâches (issues enfants, `parent_issue_id`).
5. **Spec terminée** : la complétude de la spec est signalée **sans nouveau statut** — `spec_ref` renseigné + `done_ratio` à 100 % sur le statut `Spec`. La colonne « Prêt pour le développement » du board = la colonne **Spec** à ce moment-là.
6. **Démarrage du dev** : au moment où le développement est pris en charge, l'agent (ou le Senior Dev) fait la transition `Spec → In development`.
### Contraintes
- **Aucun nouveau statut Redmine** : on n'utilise que les statuts canoniques `Submitted` / `Spec` / `In development`.
- Les sous-tâches conservent la **langue originale** du ticket.
- Les mutations respectent les règles de verrouillage : un ticket est éditable uniquement en `Submitted` / `Spec` ; une fois en `In development` il est verrouillé (`TicketLocked` → 403).
- Toute transition de statut est décidée à partir de `allowed_statuses` retourné par Redmine.
## Acceptance criteria
- [ ] **Passage en Spec** : l'agent passe systématiquement le ticket de `Submitted` à `Spec` (transition issue de `allowed_statuses`) avant l'analyse.
- [ ] **Règles de découpage** : l'agent ne découpe pas `bugfix` / `content_update` / petite amélioration, mais découpe applications mobiles / tâches complexes.
- [ ] **Proposition de sous-tâches** : si `should_split = true`, un JSON structuré (titres, descriptions, critères d'acceptation, dépendances, estimation répartie) est ajouté en commentaire Redmine et les sous-tâches sont créées comme issues enfants.
- [ ] **Spec terminée sans nouveau statut** : la complétude est signalée par `spec_ref` renseigné + `done_ratio = 100` sur le statut `Spec` (PAS de statut `ready_for_dev`).
- [ ] **Démarrage du dev** : la transition `Spec → In development` est effectuée au moment de la prise en charge du développement (automatique si `should_split = false`, après validation PO si `should_split = true`).
- [ ] **Tableau de bord Pipeliner** : les tickets en `Spec` apparaissent dans la colonne **Spec** (la notion « prêt pour le développement » = Spec complète) ; ceux en `In development` dans la colonne **In development**.
- [ ] **Aggregator** : aucune modification du mapping des statuts nécessaire (workflow inchangé) ; les comptes `by_stage` restent corrects.
- [ ] **Pilotage par allowed_statuses** : l'agent ne code en dur aucun id ni nom de statut ; il lit les transitions légales sur l'issue.
- [ ] **Sécurité / verrouillage** : toute tentative de mutation d'un ticket au-delà de `Spec` renvoie `TicketLocked` (403).
- [ ] **Tests** : suite backend (intégration incluse) verte deux fois sur une même base ; mypy, ruff, et frontend (tsc, vitest, eslint) verts.
- [ ] **Déploiement** : vérification manuelle sur la production via `/browse` (tickets correctement positionnés dans Pipeliner et Redmine).
RA Updated by Redmine Admin about 2 months ago
**Décision — statut `ready_for_dev` : NON retenu (redondant).**
Suite à l'analyse de gouvernance des statuts (cf. `docs/superpowers/specs/2026-06-11-redmine-status-governance.md`), principe fondateur : **un statut Redmine = une étape du pipeline visible par le client, rien de plus fin.**
`ready_for_dev` n'est pas une étape où le travail *se trouve*, c'est la *frontière* entre `Spec` et `In development` (spec finie, dev pas commencé). À modéliser sans nouveau statut :
- l'agent fait la transition `Spec → In development` au moment où il prend le ticket en main ;
- « spec terminée » = `spec_ref` renseigné + `done_ratio` à 100% sur le statut `Spec`.
La colonne « Prêt pour le développement » demandée = la colonne `Spec` au moment de la transition. Le flux `submitted → spec → ready_for_dev` devient `Submitted → Spec → In development`.
➡️ Action sur ce ticket : retirer le statut `ready_for_dev` des critères d'acceptation ; piloter les transitions via `allowed_statuses` (jamais d'ids ni de statuts codés en dur). Voir §5.2 du spec.
RA Updated by Redmine Admin about 2 months ago
- Description updated (diff)
Critères d'acceptation réécrits suite à la décision de gouvernance : `ready_for_dev` retiré, remplacé par le workflow canonique `Submitted → Spec → In development` (transitions via `allowed_statuses`) + signal de complétude via `spec_ref`/`done_ratio`. Réf. `docs/superpowers/specs/2026-06-11-redmine-status-governance.md` §5.2.
RA Updated by Redmine Admin about 2 months ago
- Status changed from Submitted to Spec
Passage en **Spec** : la spécification / les critères d'acceptation ont été réécrits (gouvernance des statuts, 2026-06-11). Implémentation de l'agent à faire.
RA Updated by Redmine Admin about 2 months ago
- Status changed from Spec to Shipped
- % Done changed from 0 to 100
- spec_ref updated (diff)
**Shipped** — l'agent Scrum-Master / Dev-Spec est livré comme un **ensemble de 3 artefacts** (déployés globalement depuis `infra/`, mergés sur `infra` main, commit `3086524`) :
- **`scrum-master-dev-spec`** (sous-agent) : décompose un ticket `Submitted` en spec + sous-tâches, retourne du JSON, sans effet de bord.
- **`po-validator`** (sous-agent) : valide la décomposition (rôle PO agent — pas de gate humain), retourne approuvé/à-réviser.
- **`/spec-ticket`** (skill orchestrateur) : enchaîne les deux via le **MCP Redmine omdev** (champs custom) — transition `Submitted → Spec`, création des sous-tâches enfants, `spec_ref` rempli ; `done_ratio=100` uniquement pour les tickets non découpés (une épopée découpée dérive son done_ratio de ses enfants).
**Vérifié par dry-run E2E** sur un ticket jetable FR : `Submitted → Spec`, décomposition en 5 enfants correctement rattachés, validation PO « approuvé », `spec_ref` rempli, langue d'origine préservée ; ticket jetable + enfants supprimés. Le dry-run a aussi révélé et corrigé le point `done_ratio` (dérivé des enfants pour une épopée découpée).
**Dépendances réutilisées** : MCP Redmine omdev (#30, custom fields) ; le statut `Design` (#30) pour le pipeline. Reste à faire (hors #23) : les autres rôles d'agents du #27, et l'usage en production sur le vrai backlog.