# Fil rouge — interprétation alternative de l’atelier narratif

30 septembre 2026. Version utilisable en parallèle de `narrative/`.

## Intention

Le retour déterminant de l’auteur était : « semble référer les événements du jeu de manière non intuitive ». Fil rouge se concentre donc sur les moments vécus : recevoir une visite, parler à un personnage, servir un plat, terminer une salle, affronter une vague.

Chaque événement rassemble sa scène et ses effets. Les compteurs ne deviennent pas des cartes, les conditions ne sont pas masquées par une chronologie déduite. Les colonnes regroupent les lieux et les conversations ; elles ne prétendent pas donner l’ordre de la quête.

L’interface utilise un thème sombre, des titres de cartes lisibles, un inspecteur et deux vues : **Carte** et **Lecture**. Les suites écrites par l’auteur restent visibles ; les dépendances calculées apparaissent autour du moment choisi, sauf réglage contraire.

## Ouvrir

Dans le gestionnaire, le bouton **Fil rouge ↗** ouvre `fil-rouge/` sur le même serveur PHP.

Le dossier à servir reste `tools/game-data-manager/`. Exemple depuis ce dossier :

```powershell
& 'C:\wamp64\bin\php\php8.4.0\php.exe' -n -S 127.0.0.1:8790
```

Puis ouvrir <http://127.0.0.1:8790/fil-rouge/>. Si ce serveur est déjà démarré, il suffit d’ouvrir le lien. Un fichier PHP ne s’ouvre pas directement par `file://`.

## Ce qu’on peut faire

- Lire les moments d’une quête publiée ou parcourir tous les moments déclarés.
- Cliquer une carte : conditions, contexte, texte de scène, effets, disponibilités concernées, références vers les fiches originales.
- Créer, renommer et supprimer une intrigue personnelle.
- Ajouter un moment d’idée ; écrire son intention, ses conditions, ses acteurs, lieux, conséquences et récompenses.
- Sélectionner de vrais éléments dans les catalogues. Une référence conserve son identifiant et affiche le nom actuel de sa fiche ; une référence disparue est signalée.
- Utiliser **Depuis le jeu** pour ajouter un événement publié à une intrigue personnelle sans copier ni modifier sa définition.
- Utiliser **Imaginer la suite** pour créer une idée déjà reliée à la carte choisie, ou **En faire une proposition** pour préparer une variante d’un événement.
- Relier deux cartes avec le bouton rond **＋**, puis nommer la transition. Cliquer le lien ou son crayon dans l’inspecteur pour le modifier ou le supprimer.
- Ajouter des notes aux événements publiés.
- Déplacer les cartes, glisser le fond, zoomer à la molette ; cadrer ou ranger la vue. Gestion des pointeurs tactiles et du pincement également présente.
- Chercher, filtrer, annuler/rétablir, exporter le cahier JSON et le réimporter, exporter l’histoire courante en Markdown.

La sélection d’un acteur ou d’une récompense ajoute une référence à l’idée : elle ne crée pas une condition ni un effet exécutable. Le texte libre exprime l’intention à réaliser.

## Rapport aux données

Le jeu est lu uniquement par `GET ../api.php?action=load_master`. Le brouillon n’est pas consulté.

L’ancien `narrative_index.js` est réutilisé pour retrouver les fiches associées à une quête et nommer les adresses. **La construction des moments, leur représentation, les relations, le cahier et les interactions sont propres à Fil rouge.** Le calcul `buildStory()` et ses heuristiques d’ordre, de masquage et de regroupement ne sont pas utilisés.

Une dépendance relie un effet à une condition qui lit exactement la même adresse. Elle indique une influence, pas une succession garantie : les opérateurs, les autres conditions et le contexte du jeu restent déterminants. Les réponses d’une conversation gardent leur priorité dans le détail.

Les effets d’un déclencheur et ceux de sa scène sont distingués par leur moment d’application. Pour une scène contenant des choix ou des sauts reconnus, les effets de scène sont présentés comme possibles, et ne créent pas de dépendances supposées certaines.

Les dialogues ont une clé dérivée du personnage, de la scène et des conditions : insérer une réplique avant une autre ne déplace pas ses notes. Les vagues conditionnelles ont une empreinte de définition. Modifier une définition peut donc rendre une référence ancienne absente ; elle est conservée dans le cahier et signalée au lieu d’être affectée silencieusement à un autre événement.

## Enregistrement et coexistence

Seul `tools/game-data-manager/data/fil_rouge_plan.json` est écrit par cette version. Il est créé à la première modification du cahier. L’atelier existant et son `narrative_plan.json` restent indépendants. Les deux formats de cahier ne sont pas interchangeables ; aucun import automatique de l’ancien n’est effectué.

L’enregistrement utilise une empreinte de version, un verrou, un fichier temporaire et un remplacement atomique. La version précédente est gardée dans `.previous`. Un conflit conserve les modifications dans la page et dans une copie locale de récupération ; l’export reste accessible. Le cahier lui-même n’est pas ignoré par Git, contrairement au verrou et aux fichiers transitoires.

L’auteur conserve la publication dans le gestionnaire. Fil rouge ne publie pas, ne crée pas de fiches dans le jeu et ne modifie aucune sauvegarde de joueur.

## Limites de cette version

- Elle montre les règles déclarées, pas l’état d’une partie en cours. Elle ne simule ni Godot ni les branches de scène.
- Le regroupement d’une quête utilise l’index de références existant, avec ses limites de taille et de rattachement. La vue **Tous les moments du jeu** et l’ajout explicite à une intrigue offrent une autre entrée.
- Les textes sont issus des fiches publiées ; une formulation peu claire dans la source peut encore demander une proposition d’auteur.
- Une condition de disponibilité d’un client ou d’une salle est montrée comme contexte. Elle n’est pas assimilée à une condition réévaluée à chaque action.
- Les conditions des idées sont des intentions libres ; les catalogues complètent ces intentions sans promettre leur exécution.
- Les captures et essais automatisés couvrent la souris, le clavier, une largeur réduite et les parcours d’écriture. Le pincement n’a pas été éprouvé sur un appareil tactile physique.

## Validation

```powershell
python tools/dev/dev.py check --area manager --match fil_rouge
```

Trois contrôles :

- `fil_rouge_model_test.js` : absence de mutation du jeu, dépendances exactes, conversation, identités stables, import invalide, suppression et liens.
- `fil_rouge_store_test.php` : lecture/écriture dans un répertoire temporaire, ancienne empreinte refusée, JSON corrompu protégé, copie précédente.
- `fil_rouge_browser_test.js` : vraie page PHP dans Edge, catalogue, édition, suites, sauvegarde/rechargement, déplacement/zoom, suppression/annulation, export/import, moments publiés dans une intrigue, conflit et récupération, largeur réduite.

Les tests navigateur interceptent les écritures du cahier. Ils comparent les empreintes du maître, du brouillon, de l’ancien plan et du vrai plan Fil rouge avant/après. Les trois tests proposent `--regression`, qui réintroduit une erreur en mémoire pour vérifier leur échec sans toucher aux sources ni aux fichiers d’auteur.

Captures dans `tools/dev/runs/fil-rouge/` : `overview.png`, `moment.png`, `writing.png`, `narrow-clean.png`, `narrow.png`. Le dernier rapport de validation est indiqué dans `docs/current-task.md`.
