Ce billet est écrit pour toi, FG. Tu as avancé très vite au début, tu as traversé une phase de chaos (plusieurs modèles, deux POC, docs qui mentent, pubs qui 401, ports qui trompent), et tu reprends la main. Ici : une seule lecture longue qui regroupe tous les articles publiés sur ce projet jusqu’au 15 septembre 2026 au matin, sans inventer de validation manquante.
Si tu n’as que cinq minutes : lis la carte en trois actes, les invariants qui ne bougent pas, et la checklist ouverte. Le reste est la mémoire détaillée.
Carte en trois actes
| Acte | Quand | Ce qui se passe | Sensation |
|---|---|---|---|
| I — Démarrage rapide | 12 sept. après-midi → soir | Un prompt → un jeu jouable ; Lot 1 hot-path ; session DP1 ; canon produit ; second POC Chromatic River | Accélération, preuves qui s’empilent |
| II — Chaos | Soir 12 → 14 sept. | Deux mondes en parallèle ; docs qui se contredisent ; auth blog ; multi-agents / multi-ports ; Lot 2.G dans un ordre différent du plan ; quotas modèles | Bruit, faux diagnostics, « tout est vert » ≠ « c’est jouable » |
| III — Reprise en main | 13 sept. nuit → 15 sept. matin | Frontière humain/agents ; Lot 2.F puis 2.G réellement câblé ; docs vivantes v2 ; stabilisation piano/fumée ; essai UI 2a ; bench + guide modèles | Tu tranches, tu mesures, tu recentres |
Repo : FGDidou/RainbowJourney. Version applicative citée sur main : 0.1.0. Blog live : blog.vfg.lol (catégorie rainbowjourney).
Acte I — Démarrage rapide
Le produit en une phrase
Rainbow Journey est une app locale (React / TypeScript / Vite / Three.js / Tonal / Zod) : tu joues au piano MIDI, le paysage répond, des suggestions apparaissent, tu peux relire visuellement ce que tu as joué. Pas de compte, pas de serveur applicatif pour les suggestions, pas de modèle distant dans la boucle de jeu. Chrome / Edge + Web MIDI. Mode Demo sans instrument.
Le piano réel utilisé : Bird DP1, 88 touches. Chaîne typique : MIDI OUT DIN → interface USB → PC. Le son local du DP1 n’est pas filtré par le logiciel (trajet OUT piano → IN interface → USB). Le soft est un miroir, pas un moteur audio de remplacement.
Invariants posés dès le premier jalon (et toujours vrais)
- MIDI OUT désarmé par défaut ; armement = choix de port + action explicite ; jamais d’armement auto depuis import / preset / démo / replay.
- Note Off attaché à l’attaque par FIFO : même si la gamme change pendant l’appui, le relâchement suit la décision d’attaque.
- Sources physiques / pointeur / démo distinctes ; Panic + nettoyages (port, onglet, déco, relecture).
- Filtre gamme / masque : sans transposition ; note hors masque bloquée si filtre actif ; hors gamme jouable quand le filtre est off — jamais de punition.
- Suggestions : faits musicaux distincts des évocations subjectives ; aucune émotion universelle promise.
- Relecture : visuelle uniquement (pas d’audio, pas de MIDI OUT) ; journal source préservé.
- Libellés UI en ASCII ; documentation vivante en français accentué.
Runtime : singleton (Web MIDI, horloge logique ~25 ms avec avance sur note MIDI, journal, relecture). React via useSyncExternalStore. Particules / rubans hors de l’état React. Éditeur : dizaines de valeurs numériques + interrupteurs d’effets. Sessions JSON versionnées ; IndexedDB + localStorage ; snapshots ~5 s ; checkpoints manquants ; risque de perte de la dernière tranche.
Premières preuves (12 sept. soir)
Sur le premier jalon documenté : 12 tests unitaires / 4 fichiers ; 4 Playwright ; tsc / lint / build OK. Bugs instructifs déjà nommés : berge miroir (normals), viewport mobile, timestamps liés au rendu (corrigé par horloge logique), ~3 FPS en Chromium software ≠ GPU D3D11.
Non mesuré dès le début (et souvent encore ouvert) : latence touche→son matérielle ; sessions 10–30 min en percentiles CPU/GPU/mémoire ; garantie 1080p60.
Lot 1 — hot-path et robustesse
Après le tag v0-astra-tango, cible : densités MIDI réelles (~30 notes/s), 60 FPS sans GC hoquet, persistance sans perte.
Problèmes trouvés puis traités :
notify()trop agressif → 88 touches qui se mettent à jour ;- allocations
Vector3massives par frame ; filter().slice(-128)coûteux ;- settings Zod / effets lourds dans le journal ;
- IndexedDB open/close +
structuredClonetoutes les 5 s.
Correctifs marquants : boucles / caches 3D ; notify coalescé rAF + notifyNow() pour les actions user ; caches notes / next / harmony sur dataVersion ; Key mémoïsé ; intervalles 13–24 demi-tons en français ; stabilisation d’accords 40 ms ; singleton IDB rainbowjourney ; coalescence settings ; a11y (ARIA, Escape, trap modal, ErrorBoundary ASCII).
Preuves Lot 1 : Vitest 25/4 suites (contre 12) ; Playwright 8 (dont a11y) ; CI OK.
Session collaborative piano réel
Branchement Bird DP1. Frictions produit : MIDI non persisté ; pas de reset global (Panic = notes seulement) ; suggestions trop denses ; « même note » trop présente ; textes peu lisibles.
Choix visuels : pas de cloches / arcs sin(π) ; filaments d’eau comme langage ; note tenue en bas puis coulée ; passerelle pleine largeur. Livré côté produit : AZERTY ; Accords on/off ; DEMO LIVE ; quotas montantes / équiv / descendantes ; emotionCopy + recherche émotions ; bande Safe ; TOP NOTES ; canon GAMEPLAY.md.
Process chaos déjà visible : itérations sans commit, puis rattrapage en 6 lots chronologiques. Clôture citée : 52 unitaires + tsc ; E2E non rejoué sur la tranche visuelle.
Encore ouverts à ce stade : hologramme 3D (stub) ; scores « roguelike » non punitifs ; MIDI persist / reset / courbe vélocité ; DEBUG collab ; seuils silence / répétition.
Canon produit (théorie → paysage)
- Tonique + gammes (majeur / mineur / penta+ / penta− / masque libre).
- Suggestions = directions (rôles), 2–4, diversifiées.
- Trois modes couleur ; faits ≠ évocations.
- Canon spatial : gauche/droite ≈ hauteur ; profondeur ≈ temps ; rayon tenu jusqu’à Note Off puis traînée ; silence = limite de phrase (seuils à trancher).
- Safe = visualisation de style (retour de notes / petits intervalles / stabilité de degré), pas un fail.
- Ambition scores % styles (méta) : non punitive, pas encore un système complet.
- Hologramme rivière : intention documentée, pas livré en 3D.
- Triple signal (intensité / émotion session / émotion motif) : direction, pas produit fini.
Chromatic River — le jumeau de la même nuit
Même prompt, autre chaîne d’agents. Scène vénitienne / gondole. Aucun son produit par le soft. Palette OKLCH à L/C constants sur 12 pitch classes. Octave = 13ᵉ intervalle (≠ unisson). Degrés indexés en demi-tons (corrige un bug pentatonique). Fantômes : ~4 « forts » + filigrane ; 13 glyphes. Presets Aube / Nocturne. Stats d’enchaînements = miroir, pas score.
Décision stratégique du face-à-face (22:45)
Deux POC, un prompt. Rainbow Journey = socle produit (TS, tests, CI, sessions). Chromatic River = scène forte, théorie précise, peu d’outillage.
À l’audit RJ, trois défauts hot-path encore présents malgré 60 tests verts cités :
- notify logique toutes les 25 ms même sans changement ;
- stabilisation 40 ms dans un getter qui mute pendant le rendu (dépend du défaut 1) ;
- rubans : 10 segments × plafond 1024 → au-delà d’environ 102 traces, ce sont les récentes qui perdent le ruban.
Décision : garder RJ comme base ; porter de CR la théorie / glyphes / bouées / fontaine ; canal vénitien = décor optionnel. Ordre : assainir hot-path → théorie → fantômes clavier → suggestions monde → décor → mesurer FPS (aucun des deux n’avait de mesure FPS fiable).
Émotions et catalogue de paramètres
Recherche « science-informed » : consonance / tension / valence ; pas 12 émotions uniques garanties ; contour culturel ; majeur/mineur surtout occidental ; émotion = attente / tension / résolution. UI autorisée à dire souvent / tendance / parfois / contexte (indices ~70 / 60 / 50 / 40). Refuse « tristesse à 87 % ». Expression personnelle du joueur prime.
Catalogue croisé RJ/CR : 7 intentions + Expression 0–5 ; table intervalles ; 3 modes couleur ; réglages musicaux (tonic, scale, mask, radius, phraseGap, quotas…) ; 28 effets registre + 6 interrupteurs ; tables Aube/Nocturne CR ; descente = mélange ~82 % + lueur −15 %. Outil anti-drift, pas une promesse de ressenti.
Orchestration de la première nuit
Chronologie approximative du 12 :
- GPT / Astra : socle RJ
v0-astra-tango; - Copilot : Lot 1 puis finitions / HUD / devblogs ;
- Kimi : Chromatic River
v0-kimi(créatif 3D, néglige tests) ; - Claude Opus : contrats + vagues A/B/C d’audit CR (12 paquets étanches).
Quatre règles tirées : contrats zéro chevauchement de fichiers ; audit croisé ; boucle tsc / vitest / Playwright ; publication = whoami + Admin API (pas git push seul).
Acte II — Chaos
Le chaos n’est pas « les agents sont nuls ». C’est la perte de synchronisation entre : ce qui est écrit, ce qui est mergé, ce qui est joué, ce qui est publié, et quel serveur tu regardes.
Chaos publication
Le blog blog.vfg.lol est dynamique. Un git push ne recharge pas l’index live. Faux diagnostics en chaîne :
- publish vers
127.0.0.1:5220(admin local) au lieu du live ; - clone
RAPPORT-EXPERIENTIELen retard (pas--live/--password) ; - labels d’agents (
idea,kimi…) ≠ secrets API — seulwhoamitranche 401 vs 200.
Leçon : sonde d’identité avant le Markdown. Live et Git ont deux rôles. Ne pas auto-publier tous les handoffs (« tout rapatrier ≠ tout exposer »).
Chaos « vert ≠ vrai »
Les audits le martèlent :
- Suites vertes RJ, mais bugs d’usage (IDB fermée trop tôt ; notify groupé trop lent pour les clics →
notifyNow). - Piège rendu software ~3 FPS.
- Protocole collab DP1 en 14 étapes : MIDI non persisté, pas de reset global, vélocité à revoir, DEBUG manquant — priorités joueur, pas hotfix panique.
- CR : checks navigateur riches ; MIDI physique non vérifié (doublures) ; FPS faussé si la boucle est suspendue.
- Discipline obligatoire : prouvé / observé / intention — ne pas confondre.
Chaos documentaire (~36 h, 56 docs, ~6000 lignes, 6+ modèles)
Constats d’audit :
- 634–850 lignes à lire avant le code ;
- TODO / HANDOFF périmés (G.10 / G.13 / G.16 encore « pas encore » alors qu’intégrés) ;
- HANDOFF qui cite 110 tests alors que
mainen a davantage ; - codes Lot1 / A1 / H1 qui collisionnent ;
- pas d’
AGENTS.mdunifié au début ; src/plat ; settings touchés partout.
Errata connus : « Roland FP-1 » écrit par erreur → Bird DP1 ; prompts « 89 tests » faux. Choix FG pour la sortie : archive par lot ; zones sans déplacer les fichiers tout de suite ; une source multi-outils ; FR accentué hors UI.
Chaos Lot 2.G
Le journal du 13 à 04:30 annonce 2.G en phase 0 : PR draft #6–#9, merge prévu A3 → A4 → A2 → A1, ports worktrees 5178–5181, duo Kimi/Cursor (GLM retiré).
L’ordre réel d’intégration fut A3 → A2 → A1 → A4. A4 avait besoin d’un raccord orchestrateur dans runtime.ts (83c2ebc). Sans ce câblage, l’historique multi-attaques pouvait exister en module sans être consommé par la boucle de jeu — feature « livrée » mais morte.
Contenu réellement sur main :
| Code | Canon | Livré |
|---|---|---|
| A3 | G.13 | Vérification documentaire des axes — pas un nouveau rendu 3D |
| A2 | G.10 | Scores de style / ambiance non punitifs |
| A1 | G.16 | Hot-path partiel (mesures CPU ≠ perception GPU) |
| A4 | G.6 | Historique multi-attaques + cache suggestions, câblé runtime |
Chaos ports et checkouts
Le 14 septembre, 5173 a servi un autre projet (« notes-blocs ») pendant que l’essai Rainbow Journey devait tourner sur http://localhost:5183/. Playwright est passé en serveur isolé 5183. Diagnostiquer le mauvais checkout = chaos silencieux.
Collision Windows : degreeCorridors.ts vs DegreeCorridors.tsx sur FS insensible à la casse → renommage corridorHelpers.ts.
Chaos quotas modèles
Benchmark du soir 14→15 : 5 tâches × modèles ; 10 OK + 5 fails quota « Other Models ». Self-reports LLM_STATS_V1 (chars/4) = boussole, pas facture. Totaux 10 OK cités : ~660 s murales, ~82 k tok in estimés, ~6,7 k tok out, ~110 k chars, 83 outils. Claude lean sur T1/T2 ; Grok lourd sur audits ; paires gpt/claude seulement sur T1–T2 avant bascule forcée.
Acte III — Reprise en main
Frontière humain / agents (nuits du 13)
Tu as écrit la règle claire :
- Ralentir → jouer → trancher → accélérer.
- Agents : ce qui est spécifié et vérifiable (persist MIDI, courbe vélocité, DEBUG SSE, tests, baseline perf, HUD mobile…).
- Toi : oreille, œil, préférences produit, quiz DP1, feeling trail/bloom, hologramme / fusion CR après fondation jouée.
Lot 2.F livré dans la nuit : P1 persist entrée MIDI ; P2 vélocité → taille/opacité ; P3 DEBUG overlay + SSE borné (200 events) ; P4 sauté (déjà couvert mobile) ; P5 baseline CPU. Extras : palette OKLCH + ghostRank ; dés / socles / notice enfant. Chiffres cités à 04:30 : Vitest 110/110, Playwright 10/10.
Ce qui restait volontairement humain : suite quiz DP1 ; périmètre reset (P6) ; retests feeling ; seuils motif / hologramme.
Documentation vivante v2
Le plan d’archive vivante a été exécuté puis mergé : séparation vivant / archive / journal / zones / catalogues ; docs:test 33/0 ; docs:check 0 erreur / 14 warnings d’empreintes d’archives ; index stables ; navigation racine corrigée vers STATUS, CHANGELOG, ARCHITECTURE, TESTS, ROADMAP… Release de la base de travail documentaire — distincte de la publication blog live.
Stabilisation ingame (14 sept.) — crédibilité du doigt
Objectif : ce que tu touches doit être vrai.
| Symptôme | Correction |
|---|---|
| Touches mortes (skin invisible) | Surface cliquable + focus clavier |
| Passerelle non cliquable | Même clavier interactif projeté (3 skins) |
| Double réaction | Eau décorative ; fumée = trace de note |
| Fumée qui saute au Note Off | Continuité géométrique puis déplacement |
| Particules malgré zéro | Zéro = zéro instance |
| MIDI qui « revient » | Numéro de requête ; anciennes ouvertures ignorées |
| Suggestions qui recalculent | Cache hors horloge, lié aux faits musicaux |
Bouton Piano et fumee : profil lisible (pas d’armement MIDI caché).
Écoulement continu : tête qui avance, queue au clavier pendant l’appui ; après Note Off, mêmes distances aux deux extrémités ; vitesse = Vitesse du voyage × Ecoulement ; eau et fumée partagent l’onde GLSL ; plafond 128 traînées ; anciens sliders « hauteur / attaque du jet » morts (nettoyage éditeur encore à faire).
Preuves handoffs : Vitest 154 → 159 ; Playwright 12 → 13 sur 5183 ; docs:test 33 ; pas de validation DP1 revendiquée.
Essai UI in-game 2a — reprendre le visage du jeu
Branche essai/ui-ingame-2a. Cadre design 1280×800. Sans rewrite des axes Three.js « rivière qui monte ».
Livré en deux vagues documentées :
Vague T1–T3
- Topbar
RAINBOW/JOURNEY(Cinzel), chipDO MAJEURE · 7 DEGRES, CSS scopé.topbar, témoin REC. DegreeCorridorsremplace le Piano dansJourney(éditeur intact).SuggestionStripancré surlaneCenterX; panneau DIRECTIONS masqué par défaut pour profils neufs ; une géométrie (corridorHelpers).
Vague design complet (15 sept. 01:30)
PouchRow: pochettes 84×74 ancrées sur les couloirs, respiration du plus rempli.RiverOverlaySVG plein cadre : rubans dey=800ày=150, deux passes halo/courant ;prefers-reduced-motioncoupe le flow ; pas de rewrite 3D.- Panneaux
DERNIERE NOTE/JOURNAL(accents#52d6d1/#7cf59a) branchés surruntime.lastNote/runtime.journal;safePctaffiche—si aucun échantillon. - D-STATE :
pouchCounts/climbers/lastNote/journal+settleClimbersdanstick()sans réécrire le routage MIDI.
Contrôles cités sur cette vague : tsc / lint / build OK ; Vitest 215/215 (30 fichiers) ; Vite :5183 HTTP 200 ; pas Playwright sur cette passe. Hors livré : climbers DOM visibles ; pulse rjFill ; gate FG pixel 1280×800 ; migration layouts persistés ; push main sans ton ordre.
Reprendre aussi l’orchestration des modèles
Le bench + le guide pratique te donnent une recette :
- Claude (si quota) : lecture ciblée, peu de fichiers.
- Inherit / Composer : fallback fiable hors Other Models.
- Grok : audits larges (coût contexte / durée).
- GPT : réflexion large avec budget fichiers imposé.
- Une tâche par agent ; paires A/B ; ≤2 parallèles si tu mesures ; plan de relance quota ; aligné
AGENTS.md(ne pas charger journal / node_modules par défaut).
Fil rouge — ce qui ne doit plus se diluer
- Le piano fait le son ; le soft fait le miroir.
- Pas de punition ; hors gamme autorisé selon filtre ; faits ≠ émotions.
- MIDI OUT conscient ; FIFO Note Off ; relecture visuelle only.
- Vert automatisé ≠ joué ; DP1 et feeling restent ta porte.
- Un serveur d’essai identifié (5183 pour cet essai) ; pas le checkout du voisin.
- Publier = Admin API + mot agent ; Git = miroir.
- Une géométrie de couloirs partagée (suggestions, paquets, rivière SVG).
- Docs vivantes courtes + archives datées ; errata plutôt que réécriture sournoise.
Checklist ouverte (reprendre ici)
Humain (toi)
- Suite quiz DP1 (intervalles → extrêmes → pédale → latence → enregistrement / relecture → accessibilité).
- Feeling : vélocité, bloom, styles Safe / explore, fumée / écoulement.
- Trancher P6 reset (périmètre exact).
- Gates visuels essai UI 2a (1280×800) : topbar, couloirs, suggestions, paquets, rivière SVG, panneaux.
- Décider si / quand merger
essai/ui-ingame-2asurmain.
Technique / produit encore ouvert
- Hologramme 3D (toujours vision / stub selon les billets).
- Climbers DOM + polish
rjFillsur l’essai 2a. - Nettoyage éditeur des paramètres morts (« jets »).
- Checkpoints session / perte dernière tranche.
- Mesures latence matérielle + sessions longues + FPS réel (pas software).
- Fork / portage sélectif Chromatic River (plan existant, hors urgences).
- Rotation / gestion secrets blog (caviardage doc ≠ rotation live attestée).
Orchestration
- Respecter zones + contrats de fichiers.
- Vérifier quota Other Models avant vague gpt/claude.
- Ne pas confondre « PR draft » et « câblé dans runtime ».
Chronologie condensée (aide-mémoire)
| Moment | Événement |
|---|---|
| 12 · 18:00 | Fondation RJ jouable documentée |
| 12 · 19:00 | Chaos auth blog (endpoint / clone / secret) |
| 12 · 20:30 | Lot 1 hot-path |
| 12 · 21:00 | Session DP1 / rivière joueur |
| 12 · 22:00–23:59 | Canon, CR, face-à-face, audits, émotions, catalogue, orchestration |
| 13 · 00:30 | Frontière humain / agents |
| 13 · 04:30 | Lot 2.F livré ; 2.G ouvert en PR |
| 13 · après-midi | Audit docs → plan archive vivante |
| 13 · 18:45 | Docs v2 validées / mergées / releasables |
| 13–14 | Lot 2.G intégré (ordre réel A3→A2→A1→A4, câble 83c2ebc) |
| 14 · journée | Stabilisation piano / fumée / écoulement |
| 14 · soir | Essai UI 2a T1–T3 ; bench modèles |
| 15 · 00:45–01:30 | Guide modèles ; design 2a complet (pouch / river SVG / panels) |
| 15 · 02:15 | Ce mega-récit |
Index des articles sources (tous)
Chaque point ci-dessus s’appuie sur ces billets (catégorie rainbowjourney sur le blog) :
- Du piano MIDI à une vallée qui écoute
- Publier n’est pas un git push
- Lot 1 hot-path
- Session collab rivière / joueur
- Théorie → paysage
- Chromatic River
- Deux POC, un prompt
- Deux rivières, un piano
- Recherches et audits
- Orchestration multi-modèles
- La partie émotions
- Catalogue paramètres
- Humain vs agents
- Journal Lot 2.F / 2.G
- Audit docs archive vivante
- Session finale docs v2
- Lot 2.G vraiment intégré
- Stabilisation piano / fumée / écoulement
- Essai UI 2a T1–T3
- Benchmark tokens / modèles
- Guide modèles Cursor
- Essai UI 2a design complet
Phrase de clôture
Tu n’as pas « raté » la phase chaos : tu as produit trop vite pour que la mémoire tienne sans architecture. La reprise en main, c’est exactement ça : une checklist humaine, un serveur connu, des docs qui ne mentent plus, un UI d’essai aligné sur un design, et des agents remis à leur place — spécifier, mesurer, câbler, puis te laisser jouer.
Miroir local : RainbowPiano/docs/devblog/. Ce billet ne remplace pas STATUS ni le quiz DP1.