# Checkpoint 6B — la phase se voit

22 septembre 2026. Reprise de `cb1c36f`. Deuxième tiers du lot 6 :
**la présentation**. Le bac à sable reste pour 6C.

## Le principe : une seule source

`Enemy.encounter_presentation()` publie ce que la phase montre. Le dessin 2D et
le pont 3D **lisent** cet état et n'en décident rien. Un visuel qui relirait les
PV ou la liste des phases finirait par contredire la règle le jour où l'une des
deux change — c'est l'invariant du projet, appliqué ici.

## Trois états, distingués par la FORME

Le plan l'exige : *ne pas compter uniquement sur une couleur*. Les états se
lisent donc à la silhouette, la teinte ne faisant que confirmer.

| État | 2D | 3D | Badge |
| --- | --- | --- | --- |
| **Imprenable** | anneau plein | volume fermé + anneau | `◈ Nom de phase` |
| **Ininterruptible** | quatre arcs | anneau seul, volume ouvert | `◇ Nom de phase` |
| **Nue** | rien | rien | `Nom de phase` |
| **Rupture** | cercle qui s'écarte et s'efface | anneau qui s'écarte | — |

Imprenable et ininterruptible ne sont pas la même chose : l'un refuse les dégâts,
l'autre refuse l'interruption. Une coque pleine et une garde levée les séparent à
l'œil, de dos comme de face.

## La rupture

`encounter_break_flash` est un compte à rebours d'**affichage**, jamais une
règle : personne ne lui demande la permission de frapper. Il s'arme au moment
précis où une protection tombe, et s'éteint tout seul.

Le contrôle a trouvé un vrai défaut en l'éprouvant : l'éclat **survivait à la
remontée d'une nouvelle carapace**. Le message « frappe maintenant » restait
allumé alors que la coque venait de se refermer — il aurait envoyé le joueur sur
un coup qui ne passe pas. Une protection qui remonte éteint désormais l'annonce.

## Le nom de la phase

Le badge au-dessus de la créature porte le nom **écrit par l'auteur**. Le code
n'en invente aucun : une phase sans nom affiche son identifiant. C'est ce qui
rend une alternance mémorable — le joueur apprend un nom, pas une couleur.

Une créature sans rencontre n'hérite de rien : ni coque, ni symbole. L'appareillage
de boss ne pousse pas sur tout le bestiaire.

Viser un boss ne repeint pas son bouclier : la coque rejoint le badge et le champ
d'attaque parmi les éléments que la surbrillance de ciblage laisse tranquilles.

## Validation

| Contrôle | Résultat |
| --- | --- |
| `--area visuals` | vert, 12 assertions neuves sur la coque et le badge |
| `--area gameplay` | `encounter` vert, y compris la présentation |
| `--area flow` | vert |

Rouge/vert fait une fois sur chacune : coque toujours fermée, taille figée,
symbole unique pour les deux protections.

## Une erreur de méthode, corrigée

Deux assertions du smoke — « Frontal enemy did not begin its telegraphed attack »
et sa conséquence sur le recul — sont apparues **deux runs de suite** après ce
travail. J'ai remis les fichiers à l'état du commit, le run est sorti propre, et
j'en ai conclu que mon chantier en était la cause. J'ai alors bissecté pendant
quatre exécutions un défaut qui n'existait pas : chaque « correction » semblait
marcher parce que la panne ne tombe qu'**une fois sur trois**.

Trois exécutions du code complet ont tranché : 2 erreurs, puis 0, puis 0. Ces
assertions rejoignent la famille instable déjà documentée pour la géométrie des
gros monstres.

**La règle, renforcée :** avant de bissecter, répéter le run fautif trois fois.
Une seule exécution propre ne disculpe rien, une seule sale n'accuse rien. La
fourchette du smoke elle-même bouge avec les publications de l'auteur — 50-52 la
semaine passée, 55-57 aujourd'hui. Comparer les listes nommées, jamais les comptes.

## Reste du lot 6

- **6C — bac à sable** : phase, horloges et priorité en diagnostic dans la
  console, réglage de PV local, reset de rencontre, et la distinction entre
  « forcer la phase pour inspecter » et « jouer l'orchestration ».
- Les situations de référence (boss N1/N2, élite) dans une fixture explicite,
  jamais en remplaçant silencieusement des boss publiés.
