> ⚠️ **MODE DEV STRICT (pas PROD)**  
> - **Aucune transition**, **aucun fallback**, **aucune rétro-compat**.  
> - Soit on règle un point proprement soit on n'y touche pas. pas de zone de : "transition ou entre deux".  
> - Toute contribution qui introduit une zone grise, un compromis ou un retour au legacy est **refusée**.

# CommandBus, Handlers, Arbitre & Réacteur structurel

## Flux canonique

UI → Commande → Handler (domaine) → Arbitre (Système > Packs > Utilisateur) → Patch → Apply (snapshot) → UI

## Handlers
- Valident l’intention (contrats), émettent des événements métier, produisent un **patch proposé**

## Arbitre (strates)
- **Système > Packs > Utilisateur** — compose les propositions, **accepte / transforme / refuse**
- En cas d’échec d’invariant ⇒ **rollback total** + erreur JSON explicable

## Réacteur structurel (Structure Tag Reactor)
- Écoute `TagAdded/TagRemoved` sur **tags structurants** déclarés par un pack
- Propose `node.setShape("container"|"leaf")` si invariants OK
- **Règles par défaut (“liste”)** :
  - `TagAdded(system:list)` ⇒ `sys.shape = "container"` (**idempotent**)
  - `TagRemoved(system:list)` ⇒ `sys.shape = "leaf"` **si** pas d’enfants, sinon `422 INVARIANT_BROKEN`
- **Feature flag** : `STRUCTURE_TAG_REACTIONS` (**ON** dev/tests, **OFF** prod)
