Skip to content

feat(ambiance): conduite manuelle depuis /anim, restitution d'état et bout-en-bout #208

Description

@CCoupel

Contexte

Cinquième et dernière issue du milestone v10.0.0 — Éclairage ambiance. Assemble le vocabulaire
d'événements, le pilote Hue Bridge et la configuration en une fonctionnalité réellement utilisable en
soirée, et traite les bouts qui n'appartiennent proprement à aucune des trois.

Portée

  • Restitution de l'éclairage. À l'arrêt de la partie, à l'entracte et à l'arrêt du serveur
    ((*App).stop(), main.go:992-1005, où dnsServer.Stop() / mdnsServer.Stop() sont déjà
    appelés), la pièce revient à un état neutre éclairé.
    ⚠️ Ne jamais laisser la salle dans le noir parce que le serveur s'est arrêté pendant un
    ENTRACTE — sendLEDSetAllEntracteOff (main.go:2819) éteint tout. C'est le défaut le plus
    visible et le plus embarrassant que cette fonctionnalité puisse produire, et il ne se manifeste
    qu'en conditions réelles.
  • Conduite manuelle depuis /anim : l'animateur reprend la main sur l'éclairage sans passer
    par un événement de jeu (noir, plein feu, flash d'applaudissement). Composant Anim* dédié dans
    AnimConductPanel.jsx, sur le modèle de AnimMotionActions / AnimCreditControl. Action
    entrante anim uniquement — type de client déjà autorisé, aucun élargissement de
    internal/server/inbound_allowlist.go.
  • Priorité entre conduite manuelle et scènes automatiques : une commande manuelle tient-elle
    jusqu'à la prochaine transition, ou est-elle écrasée par le premier événement suivant ? À
    trancher et à écrire dans le contrat. Un choix implicite ici produit un comportement que
    personne ne saura expliquer en pleine soirée.
  • Cycle de vie du module calqué sur AckManager, le patron le plus propre du serveur :
    construction dans setup(), Start(ctx) en goroutine dans start(), arrêt par cancelCtx()
    dans stop() (main.go:380, 949, 992). Pas le patron mDNS/DNS (« best-effort, échec
    silencieux, aucune garde de config ») : celui-ci n'a pas d'état à restituer, l'éclairage si.
  • Documentation : docs/ADMIN_GUIDE.md (parcours d'association du pont, à destination de
    l'utilisateur final), docs/SERVER_PARAMETERS.md, renvoi depuis docs/LED_SET_PROTOCOL.md,
    CHANGELOG.md.
  • Procédure de test manuelle dans tests/procedures/ et maquette dans docs/mockups/
    produites au moment du plan d'implémentation.

Hors portée

Toute extension renvoyée au milestone v10.1 (éditeur de scènes, couleurs par équipe, ciblage
ampoule par ampoule, synchronisation sur le minuteur).

Critère de fait

  • Une partie complète se joue avec l'éclairage actif, du démarrage à l'extinction du serveur,
    sans jamais laisser la pièce éteinte à un moment où quelqu'un doit voir quelque chose.
  • L'animateur reprend la main et la rend ; le comportement à la transition suivante est celui
    écrit dans le contrat.
  • Le serveur démarre et s'arrête proprement (/shutdown) avec et sans ampoules joignables.
  • Aucune régression sur les 6 types de question existants (SPEEDY, QCM, MEMORY, MEMOTION,
    ARDOISE, RAFALE) ni sur le comportement LED des buzzers.

Dépendances

Les quatre issues précédentes du milestone — événements normalisés (#205), pilote Hue Bridge (#206),
configuration (#207) et éclairage différencié par équipe (#213) — toutes obligatoires.


Ajustement de périmètre (2026-09-02) — l'équipe fait partie du bout-en-bout

L'éclairage différencié par équipe est remonté dans le cœur (#213). La démonstration
bout-en-bout de cette issue doit donc l'inclure, et pas seulement un éclairage uniforme :

  • une partie complète se joue avec les ampoules affectées aux équipes, et l'équipe qui buzze
    est identifiable à la couleur de la salle ;
  • la restitution d'état en fin de partie et à l'arrêt du serveur remet toutes les ampoules
    en éclairage neutre, y compris celles affectées à une équipe — c'est le cas qui échappe le plus
    facilement, puisqu'il n'y a pas de « pièce » unique à éteindre mais N ampoules à parcourir ;
  • la conduite manuelle depuis /anim (noir, plein feu, flash) s'applique à toutes les
    ampoules, affectations comprises, et la règle de priorité entre conduite manuelle et scènes
    automatiques vaut aussi pour les ampoules d'équipe.

Re-planification du 2026-09-03

La voie BLE est abandonnée (spike #204) au profit du pont Hue en REST local
(contracts/hue-bridge.md). Deux conséquences pour cette issue :

  • La restitution d'état doit parcourir les ampoules du pont — c'est le même impératif
    qu'avant : ne jamais laisser la salle dans le noir parce que le serveur s'est arrêté pendant un
    ENTRACTE (sendLEDSetAllEntracteOff, cmd/server/main.go:2819).
  • La documentation utilisateur décrit désormais l'association du pont par appui sur son bouton,
    pas un appairage Bluetooth par système d'exploitation.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    backendServeur GobacklogItem du backlog BuzzMasterenhancementNew feature or requestfrontendInterface React

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions