+82
−0
+13
−0
Loading
Arbitrage tranché : les variables sont résolues AU MOMENT DE LA LIVRAISON de
l'inject, et l'installation de kit cesse de figer le contenu. C'était la seule
option qui rende la page utile — figer à l'installation ferait qu'éditer une valeur
ensuite n'aurait aucun effet sur les injects déjà planifiés.
Le partage est explicite : les libellés STRUCTURELS lus dans la console (nom
d'exercice, personnages, canaux, documents, titre d'inject) restent résolus à
l'installation ; le CONTENU délivré aux joueurs garde ses jetons et n'est résolu
qu'à l'envoi. Sujet et corps d'e-mail, chat, réseaux sociaux, presse et consignes
d'appel passent tous par la résolution.
Le mode d'échec est délibéré : un jeton dont la variable n'est pas définie reste
visible tel quel. Mieux vaut un `{{intranet}}` repérable à l'écran qu'une
disparition silencieuse.
Le moteur accepte maintenant des clefs libres. Toute clef du contexte devient une
variable, donc l'animation peut en définir de nouvelles sans qu'on touche au code.
Les clefs historiques restent nommées parce qu'elles portent des valeurs par défaut.
Le stockage réutilise `Exercise.context` : aucun modèle supplémentaire, aucune
migration.
Page dans l'onglet Préparation : tableau clef/valeur, suggestions des clefs
attendues par les kits fournis, validation du format de clef, et refus d'écraser
`startAt` qui n'est pas une variable de texte.
Une spec couvre le moteur, qui n'en avait aucune alors que je viens d'en changer la
sémantique — dont l'idempotence et le maintien des jetons inconnus.
RESTE À FAIRE, signalé plutôt que masqué : les kits ANSSI contiennent encore des
marqueurs littéraux entre crochets ([votre entité] ×21, [société partenaire] ×30,
[intranet] ×12 et une dizaine d'autres) qui ne sont pas des jetons `{{...}}` et ne
seront donc pas substitués. Les convertir est un travail de données sur 12 fichiers
JSON, à faire dans un lot dédié.
Non compilé ni exécuté (pas de toolchain Node dans l'environnement utilisé).
Co-Authored-By: Claude (RCA)