# Sprint 2 — Simulations + MITRE ATT&CK **Branche** : `sprint/2-simulations` **Statut** : 🟢 SPRINT COMPLET — 32 acceptance tests sprint 2 verts, code-review traité (2 MAJOR + 2 MINOR + 2 NITs fixés), PR prête **Base** : `main` (sprint 1 mergé en `7fc79cc`) **Objectif** : livrer les simulations (CRUD + workflow Pending→In progress→Review required→Done) à l'intérieur d'un engagement, avec autocomplete MITRE ATT&CK alimenté par un bundle STIX local. C'est le cœur métier — l'app remplace enfin le fichier Excel partagé redteam/SOC. --- ## 1. User stories ### US-7 — En tant que redteam, je crée une simulation dans un engagement **Pourquoi** : c'est la feature centrale du sprint 2. **Critères d'acceptation** - [ ] AC-7.1 : `POST /api/engagements//simulations {name}` (admin|redteam) → 201 + simulation `{id, engagement_id, name, status: "pending", ...}`. `name` requis, non vide. - [ ] AC-7.2 : autres rôles (soc) → 403. - [ ] AC-7.3 : engagement inexistant → 404. Engagement existant mais aucune simulation → liste vide. - [ ] AC-7.4 : `GET /api/engagements//simulations` (auth) → liste des simulations de l'engagement, ordonnée `created_at desc`. - [ ] AC-7.5 : page `/engagements/:eid` (EngagementDetailPage) remplace le placeholder Sprint 2 par une section "Simulations" : liste (colonnes: name, MITRE id, status badge, executed_at) + bouton "Nouvelle simulation" pour admin/redteam. - [ ] AC-7.6 : depuis cette liste, click sur une ligne → ouvre `/engagements/:eid/simulations/:sid/edit` (page d'édition role-aware, unique URL pour view+edit). ### US-8 — En tant que redteam, je renseigne les détails techniques d'une simulation **Pourquoi** : c'est la trace de ce que la redteam a exécuté. **Critères d'acceptation** - [ ] AC-8.1 : `PATCH /api/simulations/` (admin|redteam) accepte les champs redteam : `name`, `mitre_technique_id`, `mitre_technique_name`, `description`, `commands` (texte multiligne, une commande par ligne), `prerequisites`, `executed_at` (ISO datetime), `execution_result`. Champs partiels OK. - [ ] AC-8.2 : règle d'auto-transition pending → in_progress. Trigger PRÉCIS : `PATCH /api/simulations/` par admin|redteam où **le payload JSON contient au moins une clé parmi les champs redteam** (`name`, `mitre_technique_id`, `mitre_technique_name`, `description`, `commands`, `prerequisites`, `executed_at`, `execution_result`) **dont la valeur n'est ni `null` ni une string vide ni une liste vide**, ET status courant == `pending`. La comparaison se fait sur le payload entrant — pas sur l'état final de la simulation. Un PATCH qui ne ré-envoie qu'un champ inchangé (ex: même `name`) déclenche quand même la transition, car c'est une action explicite "la redteam saisit". L'auto-transition ne se déclenche jamais sur un PATCH `soc`. - [ ] AC-8.3 : `commands` est stocké en colonne `text` (chaîne multiligne, une commande par ligne). Sérialisation API = texte brut tel que stocké. Le frontend affiche dans un `