[WIP] Update README.md with enhanced French version and assets folder (#108)

🚀 Fusion galactique terminée !
J’ai compressé plus de fichiers que le cerveau d’un MJ sous caféine.
Cohérence validée, humour injecté, assets alignés…
Si tu trouves un bug, c’est sûrement un easter egg.
Prêt à embarquer pour Zacus 3000 — la seule enquête où même les robots rigolent !

(PS : Si tu merges, tu gagnes +10 points de charisme MJ)

* Fusion, nettoyage, docs, humour, style futuriste — PR #108 🚀

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Clément SAILLANT <108685187+electron-rare@users.noreply.github.com>
This commit was merged in pull request #108.
This commit is contained in:
Copilot
2026-02-26 01:39:30 +01:00
committed by GitHub
parent feed1695c6
commit f9827f4587
73 changed files with 908 additions and 1214 deletions
+84
View File
@@ -0,0 +1,84 @@
# Licence du contenu — CC BYNC 4.0
Ce dépôt utilise une **double licence** :
- **Code (logiciels)** : licence **MIT** — voir `LICENSE`
- **Contenu créatif** : licence **Creative Commons Attribution NonCommercial 4.0 International (CC BYNC 4.0)** — le présent fichier
> En cas de conflit, **la mention de licence la plus spécifique** (au niveau dun fichier/dossier) prévaut.
---
## 1) Périmètre : ce que couvre la licence “contenu”
Sauf mention contraire, la licence **CC BYNC 4.0** sapplique à tout ce qui relève du **contenu créatif** du jeu, notamment :
- scénarios et narration (textes, descriptions d’énigmes, dialogues),
- documents MJ, guides, textes et ressources de jeu (`docs/`),
- printables (PDF/PNG), cartes, indices, maquettes (`printables/`),
- manifestes audio et contenus associés (`audio/`),
- images, médias et éléments de communication (`assets/`).
---
## 2) Ce que cette licence ne couvre PAS
La licence **MIT** (voir `LICENSE`) sapplique au **code**, notamment :
- scripts/outils (`tools/`),
- firmware et code embarqué (`hardware/firmware/`),
- fichiers de build/config, CI, etc.
---
## 3) Résumé (non contractuel) de CC BYNC 4.0
Vous pouvez, **uniquement à des fins non commerciales** :
- **Partager** : copier et redistribuer le contenu,
- **Adapter** : remixer, transformer et créer à partir du contenu,
À condition de :
- **Attribuer** : créditer lauteur, citer la source, indiquer la licence,
- **Indiquer les modifications** si vous en faites,
- **Ne pas faire dusage commercial**,
- **Ne pas imposer de restrictions supplémentaires** (DRM, clauses additionnelles, etc.).
---
## 4) “NonCommercial” : interprétation pratique
“NonCommercial” signifie : **pas dutilisation principalement destinée à un avantage commercial ou à une compensation monétaire**.
Exemples **interdits sans accord** :
- vendre un pack / kit “Zacus”,
- monétiser laccès au contenu (paywall, abonnement, bundle),
- intégrer le contenu dans une prestation commerciale avec marge.
Exemples généralement **autorisés** :
- jouer en famille / association,
- organiser une partie à prix coûtant (impressions, matériel) sans marge,
- publier des adaptations gratuitement (avec attribution).
---
## 5) Attribution recommandée
> “Le Mystère du Professeur Zacus” — © electron-rare.
> Contenu sous licence **CC BYNC 4.0**.
> Source : dépôt GitHub du projet.
---
## 6) Contenus tiers
Certains fichiers peuvent provenir de tiers (polices, icônes, sons, images, librairies).
Dans ce cas, **leurs licences sappliquent** et sont indiquées dans les fichiers ou dossiers concernés.
---
## 7) Texte légal
Texte complet (référence officielle) :
https://creativecommons.org/licenses/by-nc/4.0/
+140 -56
View File
@@ -1,70 +1,154 @@
# Le Mystère du Professeur Zacus — kit denquête (printables + guide MJ + audio)
Kit denquête pour anniversaire (614 enfants, 6090 minutes), ambiance laboratoire / campus scientifique. # 🤖🎩 Le Mystère du Professeur Zacus 🎩🤖
## Aperçu visuel ![Couverture](./assets/cover.png)
![Vue d'ensemble du dépôt](docs/assets/repo-map.svg)
## Contenu > **Bienvenue dans lenquête la plus instable du multivers** : indices imprimables, audio, modules électroniques (option), et un guide MJ qui ne bug jamais (sauf si tu limprimes en 3D).
### 1) Kit Maître du jeu > **⚛ L’électron rare — ⚡ unstable by design**
Dossier : `kit-maitre-du-jeu/` > **Auteur : Clément SAILLANT**
- script minute-par-minute (déroulé prêt à jouer)
- solution complète (coupable, mobile, méthode, chronologie)
- checklist matériel + mise en place 4 stations
- distribution des rôles (modulable 614 enfants)
- guide anti-chaos + plan stations
- générer un scénario + validation
### 2) Printables (imprimables) [![Build](https://img.shields.io/badge/build-validate%20%2B%20export-brightgreen)](./.github/workflows/validate.yml)
Dossier : `printables/` [![PlatformIO](https://img.shields.io/badge/PlatformIO-ready-brightgreen)](https://platformio.org/)
- structure `src/` + `export/{pdf,png}/` [![Code: MIT](https://img.shields.io/badge/code-MIT-blue)](./LICENSE)
- prompts graphiques dans `src/prompts/` + `WORKFLOW.md` [![Content: CC%20BY--NC%204.0](https://img.shields.io/badge/content-CC%20BY--NC%204.0-orange)](./LICENSE-CONTENT.md)
- ordres dimpression standardisés
- badges détective, fiches denquête, cartes personnages, zones
### 3) Game & audio
- `game/scenarios/zacus_v1.yaml` (canon, solution unique, timeline + preuves)
- `audio/manifests/zacus_v1_audio.yaml` + `game/prompts/audio/` (intro, incident, accusation, solution)
- scénario validé par `tools/scenario/validate_scenario.py`
- manifestes audio validés par `tools/audio/validate_manifest.py`
### 4) Outils & documentation ## ⚡ Pitch (30 secondes chrono)
- `docs/QUICKSTART.md` (mise en place express, licences)
- `docs/STYLEGUIDE.md` (ton, structure, prompts)
- `docs/index.md` + `docs/repo-status.md` pour la navigation et l’état du dépôt
- `include-humain-IA/` (contenus annexes, renommé pour la portabilité)
- `tools/dev/zacus.sh codex --prompt tools/dev/codex_prompts/zacus_overhaul_one_shot.md` lance le prompt de Codex directement depuis le dépôt.
- `tools/dev/zacus.sh zeroclaw-preflight --require-port` lance le préflight USB ZeroClaw avant actions hardware.
- Les artifacts de résolution de ports sont écrits sous `artifacts/ports/<timestamp>/ports_resolve.json` avec un pointeur `artifacts/ports/latest_ports_resolve.json`. Utilisez `ZACUS_MOCK_PORTS=1` (et `ZACUS_PORTS_FIXTURE=tools/test/fixtures/ports_list_macos.txt`) pour tester la boucle sans matériel.
- `tools/dev/zacus.sh codex --prompt tools/dev/codex_prompts/zacus_overhaul_one_shot.md` lance le prompt de Codex directement depuis le dépôt.
## État du projet Le Professeur Zacus a disparu. Son labo est sous tension : **signaux audio**, **capsules dindices**, **preuves imprimées**… et un dispositif électronique optionnel qui réagit (parfois) à tes découvertes.
- **Kit MJ** : complet (script, plan, antic-chaos, solution, checklists, export PDF).
- **Printables** : prompts prêts, workflow documenté (`printables/WORKFLOW.md`), exports par thème organisés.
- **Game/audio** : scénario canon `zacus_v1`, manifestes, audio narratif et scripts de validation.
- **Outils** : scripts Python ded validation scenario/audio + guide rapide.
## Licence / Contribution Les joueurs fouillent, recoupent, déduisent — comme une vraie équipe denquête, mais avec plus de blagues et moins de panique.
- Contenus créatifs (documents, PDFs, PNG, SVG, assets, prompts) : **CC BY-NC 4.0** (`LICENSES/CC-BY-NC-4.0.txt`). Le MJ déroule une session fluide, avec des checkpoints et une fin satisfaisante (sauf si tu oublies le gâteau).
- Code et scripts (firmware, outils, validation) : **MIT** (`LICENSES/MIT.txt`).
- Voir `CONTRIBUTING.md` pour les règles dajout et dexamen des contributions.
## Disclaimer > *"Si tu trouves une LED qui clignote, cest normal. Si elle te parle, cest probablement un bug... ou le MJ qui sennuie."*
Projet indépendant, non affilié à aucune marque ou éditeur. Voir `DISCLAIMER.md`. ---
## Maintenance du dépôt (hors firmware) ## ✅ Ce que tu obtiens (concret, pas du vent)
- Plan : `docs/maintenance-repo.md`
- Audit : `docs/repo-audit.md`
- Repo status : `docs/repo-status.md`
## Contribuer - **Printables** prêts à imprimer (indices, cartes, accessoires)
Voir `CONTRIBUTING.md`. - **Guide Maître du Jeu** (mise en place, script, solutions)
- **Audio** (timers / ambiance / déclenchements)
- **Scénario YAML** = source de vérité (durée/difficulté modulables)
- **Option électronique** : ESP32/Arduino (UI, effets, interactions)
## Historique > Tout est pensé pour être **rejouable** et **facile à préparer**. Même pour les MJ qui nont jamais touché un oscilloscope.
Voir `CHANGELOG.md`. > *"MJ : Maître du Jeu, mais aussi Maître du Jazz, Maître du Jenga, Maître du Juste Prix... à toi de choisir."*
## Mainteneur ---
L’électron rare
## Exemples transverses ## 🕹️ Pour qui / durée / niveau de fun
- Index exemples: `examples/README.md`
- **Joueurs** : 614 (recommandé), ou équipes de 24
- **Durée** : 6090 min (modulable, sauf si tu actives le mode “slow motion”)
- **Âge** : famille / anniversaire (adaptable, sauf pour les robots)
- **Matériel** : imprimante + (option) modules électroniques (simple si tu achète un kit tout prête genre freenove ou autres esp32 avec un écran)
> *"Le mode slow motion est réservé aux anniversaires avec trop de bonbons."*
---
## 🎬 Démo
![Démo](./assets/demo.gif)
> *"Si tu croises un QR code dans les archives, scanne-le. Si tu croises un QR code sur ton gâteau, scanne-le aussi (on ne sait jamais)."*
---
## 🧠 Comment ça marche (en 1 minute, ou 42 secondes si tu es pressé)
### Source de vérité : le scénario YAML
Le scénario principal est dans `game/scenarios/`. Il pilote :
- les étapes / stations,
- les validations / codes,
- les exports (briefs MJ, docs, manifestes).
### Pipeline du repo
`game/scenarios/*.yaml → tools/ (validate + export) → kit MJ / printables / audio → (option) hardware/firmware/esp32`
![Diagramme](./assets/diagram.png)
---
## 🧩 Démarrage rapide (MJ, version turbo)
> *"Si tu veux une expérience vraiment futuriste, branche un ESP32 sur ton chat. (Non, ne fais pas ça, mais lidée est marrante.)"*
1. Lis le **guide MJ** : `kit-maitre-du-jeu/`
2. Imprime les **printables** : `printables/`
3. Prépare laudio : `audio/`
4. (Option) Achete, cable et Flash l’électronique : `hardware/` (un kit esp32-S3 avec écran est parfait... ou un vieux grille-pain, mais cest moins efficace)
5. Lance la partie 🎩
👉 FAQ / dépannage : `docs/faq.md` (aucune question idiote, sauf “où est le MJ ?”)
---
## 🛠️ Démarrage rapide (dev, version quantum)
> *"Astuce dev : Si tu valides le YAML sans erreur du premier coup, tu gagnes un badge Zacus Quantum (à imprimer toi-même)."*
Installer les validateurs :
```bash
bash tools/setup/install_validators.sh
```
Valider le scénario officiel :
```bash
python3 tools/scenario/validate_scenario.py game/scenarios/zacus_v1.yaml
```
Exporter un brief Markdown :
```bash
python3 tools/scenario/export_md.py game/scenarios/zacus_v1.yaml -o docs/exports/zacus_v1.md
```
---
## 🧾 Contenu du dépôt (repères galactiques)
> *"Ce dépôt est plus organisé que le bureau du Professeur Zacus (et ça, cest pas peu dire)."*
```text
game/scenarios/ Scénarios YAML (source de vérité)
kit-maitre-du-jeu/ Guide MJ + solutions + script
printables/ Cartes/indices + manifestes
audio/ Manifestes audio + ressources
tools/ Validation + export + génération
hardware/ Firmware & accessoires électroniques (option)
docs/ Mini-site / FAQ / ressources
```
---
## 🧷 Visuels
> *"Si tu reconnais le prototype sur la photo, tu es officiellement un expert en électronique de fête."*
![Prototype](./assets/board.jpg)
![Printables](./assets/printables.png)
---
## 🧑‍🎓 Licence
- **Code** : MIT (`LICENSE`)
- **Contenu créatif** (scénarios, docs, printables, assets) : CC BYNC 4.0 (`LICENSE-CONTENT.md`)
> *"Ce jeu est garanti sans IA malveillante, mais avec des enfants qui peuvent hacker le scénario à tout moment."*
---
## 🤝 Crédits
> *"Merci à tous les MJ, enfants, parents, et robots qui ont testé ce scénario. Mention spéciale à ceux qui ont trouvé le twist avant la LED rouge."*
**Auteur : Clément SAILLANT**
Signature : **⚛ L’électron rare** — **⚡ unstable by design**
> *"Ce projet a été validé par un oscilloscope, un grille-pain, et une IA qui adore les énigmes."*
---
OpenGraph : `assets/og.png` (1200×630)
- generation/story-ia : scénarios IA
+134
View File
@@ -0,0 +1,134 @@
# 🎩 Le Mystère du Professeur Zacus
![Couverture](./docs/assets/cover.png)
> **Une enquête scientifique cyberlabo** pour anniversaire : indices imprimables, audio, modules électroniques (option), et un guide MJ ultra clair.
> **⚛ L’électron rare — ⚡ unstable by design**
> **Auteur : Clément SAILLANT**
[![Build](https://img.shields.io/badge/build-validate%20%2B%20export-brightgreen)](./.github/workflows/validate.yml)
[![Code: MIT](https://img.shields.io/badge/code-MIT-blue)](./LICENSES/MIT.txt)
[![Content: CC%20BY--NC%204.0](https://img.shields.io/badge/content-CC%20BY--NC%204.0-orange)](./LICENSES/CC-BY-NC-4.0.txt)
---
## ⚡ Pitch (30 secondes)
Le Professeur Zacus a disparu. Dans son labo, tout est encore “sous tension” : **signaux audio**, **capsules dindices**, **preuves imprimées**… et un dispositif électronique optionnel qui réagit aux découvertes.
Les joueurs fouillent, recoupent, déduisent — comme une vraie équipe denquête.
Le MJ déroule une session fluide, avec des checkpoints et une fin satisfaisante.
---
## ✅ Ce que tu obtiens (concret)
- **Printables** prêts à imprimer (indices, cartes, accessoires)
- **Guide Maître du Jeu** (mise en place, script, solutions)
- **Audio** (timers / ambiance / déclenchements)
- **Scénario YAML** = source de vérité (durée/difficulté modulables)
- **Option électronique** : ESP32/Arduino (UI, effets, interactions)
> Tout est pensé pour être **rejouable** et **facile à préparer**.
---
## 🕹️ Pour qui / durée
- **Joueurs** : 614 (recommandé), ou équipes de 24
- **Durée** : 6090 min (modulable)
- **Âge** : famille / anniversaire (adaptable)
- **Matériel** : imprimante + (option) modules électroniques
---
## 🎬 Démo
![Démo](./docs/assets/demo.gif)
---
## 🧠 Comment ça marche (en 1 minute)
### Source de vérité : le scénario YAML
Le scénario principal est dans `game/scenarios/`. Il pilote :
- les étapes / stations,
- les validations / codes,
- les exports (briefs MJ, docs, manifestes).
### Pipeline du repo
`game/scenarios/*.yaml → tools/ (validate + export) → kit MJ / printables / audio → (option) hardware/firmware/esp32`
![Diagramme](./docs/assets/diagram.png)
---
## 🧩 Démarrage rapide (MJ)
1. Lis le **guide MJ** : `kit-maitre-du-jeu/`
2. Imprime les **printables** : `printables/`
3. Prépare laudio : `audio/`
4. (Option) Achete, cable et Flash l’électronique : `hardware/` (un kit esp32-S3 avec écran est parfait...)
5. Lance la partie 🎩
👉 FAQ / dépannage : `docs/faq.md`
---
## 🛠️ Démarrage rapide (dev)
Installer les validateurs :
```bash
bash tools/setup/install_validators.sh
```
Valider le scénario officiel :
```bash
python3 tools/scenario/validate_scenario.py game/scenarios/zacus_v1.yaml
```
Exporter un brief Markdown :
```bash
python3 tools/scenario/export_md.py game/scenarios/zacus_v1.yaml -o docs/exports/zacus_v1.md
```
---
## 🧾 Contenu du dépôt (repères)
```text
game/scenarios/ Scénarios YAML (source de vérité)
kit-maitre-du-jeu/ Guide MJ + solutions + script
printables/ Cartes/indices + manifestes
audio/ Manifestes audio + ressources
tools/ Validation + export + génération
hardware/ Firmware & accessoires électroniques (option)
docs/ Mini-site / FAQ / ressources
```
---
## 🧷 Visuels
![Prototype](./docs/assets/board.jpg)
![Printables](./docs/assets/printables.png)
---
## 🧑‍🎓 Licence
- **Code** : MIT (`LICENSES/MIT.txt`)
- **Contenu créatif** (scénarios, docs, printables, assets) : CC BYNC 4.0 (`LICENSES/CC-BY-NC-4.0.txt`)
---
## 🤝 Crédits
**Auteur : Clément SAILLANT**
Signature : **⚛ L’électron rare** — **⚡ unstable by design**
---
OpenGraph : `docs/assets/og.png` (1200×630)
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 969 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

+7
View File
@@ -0,0 +1,7 @@
# Zacus — Docs
Ce dossier est conçu pour être publié via **GitHub Pages** (source : `/docs`).
- Accueil : `docs/index.md`
- FAQ : `docs/faq.md`
- Design : `docs/design.md`
+3
View File
@@ -0,0 +1,3 @@
## FAQ & Dépannage
- [FAQ (flash / SD / audio)](./docs/faq.md)
+12
View File
@@ -0,0 +1,12 @@
title: "Le Mystère du Professeur Zacus"
description: "Enquête scientifique immersive — scénarios YAML, printables, audio, modules ESP32/Arduino."
baseurl: ""
url: ""
markdown: kramdown
kramdown:
input: GFM
exclude:
- README.md
- README_FAQ_SNIPPET.md
+45
View File
@@ -0,0 +1,45 @@
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{% if page.title %}{{ page.title }} — {% endif %}{{ site.title }}</title>
<meta name="description" content="{{ page.description | default: site.description }}" />
<meta property="og:title" content="{{ page.title | default: site.title }}" />
<meta property="og:description" content="{{ page.description | default: site.description }}" />
<meta property="og:image" content="{{ '/assets/og.png' | relative_url }}" />
<link rel="stylesheet" href="{{ '/assets/site.css' | relative_url }}" />
<link rel="icon" type="image/png" href="{{ '/assets/favicon.png' | relative_url }}" />
</head>
<body>
<header class="site-header">
<div class="wrap header-inner">
<a class="brand" href="{{ '/' | relative_url }}">
<img class="brand-logo" src="{{ '/assets/logo.png' | relative_url }}" alt="Zacus" />
<div class="brand-text">
<div class="brand-title">{{ site.title }}</div>
<div class="brand-sub">Enquête scientifique immersive</div>
</div>
</a>
<nav class="nav">
<a href="{{ '/' | relative_url }}" {% if page.url == '/' or page.url == '/index.html' %}aria-current="page"{% endif %}>Accueil</a>
<a href="{{ '/faq' | relative_url }}" {% if page.url contains 'faq' %}aria-current="page"{% endif %}>FAQ</a>
<a href="{{ '/design' | relative_url }}" {% if page.url contains 'design' %}aria-current="page"{% endif %}>Design</a>
</nav>
</div>
</header>
<main class="wrap content">
<article class="card">
{{ content }}
</article>
<footer class="site-footer">
<div class="muted">
<div><strong>Code</strong> : MIT • <strong>Contenu</strong> : CC BYNC 4.0</div>
<div>© {{ site.time | date: '%Y' }} electron-rare • Zacus</div>
</div>
</footer>
</main>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1019 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 969 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 KiB

-57
View File
@@ -1,57 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="680" viewBox="0 0 1200 680" role="img" aria-labelledby="title desc">
<title id="title">Le Mystère du Professeur Zacus - Vue d'ensemble du dépôt</title>
<desc id="desc">Schéma des trois piliers du dépôt: Kit Maître du jeu, Printables et Hardware.</desc>
<defs>
<style>
.bg{fill:#f7f7f7}
.panel{fill:#fff;stroke:#222;stroke-width:2}
.h{font:700 32px 'Segoe UI',Arial,sans-serif;fill:#111}
.t{font:600 22px 'Segoe UI',Arial,sans-serif;fill:#111}
.s{font:400 18px 'Segoe UI',Arial,sans-serif;fill:#333}
.cap{font:700 20px 'Segoe UI',Arial,sans-serif;fill:#111}
.line{stroke:#222;stroke-width:2}
</style>
</defs>
<rect class="bg" x="0" y="0" width="1200" height="680"/>
<text class="h" x="600" y="62" text-anchor="middle">Le Mystère du Professeur Zacus</text>
<text class="s" x="600" y="92" text-anchor="middle">Structure actuelle du dépôt</text>
<rect class="panel" x="70" y="150" rx="12" ry="12" width="320" height="430"/>
<text class="t" x="230" y="195" text-anchor="middle">Kit Maître du jeu</text>
<text class="s" x="95" y="240">• script minute-par-minute</text>
<text class="s" x="95" y="272">• solution complète</text>
<text class="s" x="95" y="304">• checklist matériel</text>
<text class="s" x="95" y="336">• distribution des rôles</text>
<text class="s" x="95" y="368">• guide anti-chaos</text>
<text class="s" x="95" y="400">• stations modulaires</text>
<text class="s" x="95" y="446">Path: kit-maitre-du-jeu/</text>
<rect class="panel" x="440" y="150" rx="12" ry="12" width="320" height="430"/>
<text class="t" x="600" y="195" text-anchor="middle">Printables</text>
<text class="s" x="465" y="240">• invitations</text>
<text class="s" x="465" y="272">• cartes / feuille d'enquête</text>
<text class="s" x="465" y="304">• badges / règles 1 page</text>
<text class="s" x="465" y="336">• ordre d'impression</text>
<text class="s" x="465" y="384">Sous-structure:</text>
<text class="s" x="465" y="416"> - src/</text>
<text class="s" x="465" y="448"> - export/pdf/</text>
<text class="s" x="465" y="480"> - export/png/</text>
<text class="s" x="465" y="526">Path: printables/</text>
<rect class="panel" x="810" y="150" rx="12" ry="12" width="320" height="430"/>
<text class="t" x="970" y="195" text-anchor="middle">Hardware (optionnel)</text>
<text class="s" x="835" y="240">• BOM</text>
<text class="s" x="835" y="272">• câblage</text>
<text class="s" x="835" y="304">• firmware Arduino / ESP32</text>
<text class="s" x="835" y="336">• boîtier</text>
<text class="s" x="835" y="384">Firmware ESP32:</text>
<text class="s" x="835" y="416"> U_LOCK → U-SON → MP3</text>
<text class="s" x="835" y="462">Path: hardware/</text>
<line class="line" x1="390" y1="365" x2="440" y2="365"/>
<line class="line" x1="760" y1="365" x2="810" y2="365"/>
<text class="cap" x="600" y="635" text-anchor="middle">Objectif: documentation cohérente, livrables imprimables et firmware stable</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

+165
View File
@@ -0,0 +1,165 @@
/* Zacus mini-site — clean dark UI */
:root{
--bg: #0b1220;
--bg2:#0f1b2f;
--text:#eef5ff;
--muted:#c6d6f0cc;
--line:#ffffff1a;
--accent:#00decd;
--accent2:#78c8ff;
--shadow: 0 18px 50px rgba(0,0,0,.35);
--radius: 18px;
}
*{ box-sizing:border-box; }
html,body{ height:100%; }
body{
margin:0;
font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial;
background: radial-gradient(1200px 800px at 20% 10%, rgba(0,222,205,.14), transparent 55%),
radial-gradient(900px 700px at 80% 30%, rgba(120,200,255,.12), transparent 60%),
linear-gradient(180deg, var(--bg), var(--bg2));
color: var(--text);
}
a{ color: var(--accent2); text-decoration:none; }
a:hover{ text-decoration:underline; }
a[aria-current="page"]{ color: var(--text); }
.wrap{
width: min(980px, calc(100% - 40px));
margin: 0 auto;
}
.site-header{
position: sticky;
top: 0;
backdrop-filter: blur(12px);
background: rgba(8, 14, 26, 0.72);
border-bottom: 1px solid var(--line);
z-index: 10;
}
.header-inner{
display:flex;
align-items:center;
justify-content:space-between;
padding: 12px 0;
gap: 18px;
}
.brand{
display:flex;
align-items:center;
gap:12px;
color: var(--text);
min-width: 240px;
}
.brand-logo{
width: 40px;
height: 40px;
border-radius: 12px;
border: 1px solid var(--line);
}
.brand-title{
font-weight: 780;
letter-spacing: .2px;
line-height: 1.05;
}
.brand-sub{
color: var(--muted);
font-size: 12px;
margin-top: 2px;
}
.nav{
display:flex;
gap: 16px;
font-weight: 650;
opacity: .95;
flex-wrap: wrap;
}
.content{ padding: 26px 0 56px; }
.card{
background: linear-gradient(180deg, rgba(255,255,255,.06), rgba(255,255,255,.03));
border: 1px solid var(--line);
border-radius: var(--radius);
box-shadow: var(--shadow);
padding: 26px 26px 18px;
}
.card img{
max-width: 100%;
height: auto;
border-radius: 14px;
border: 1px solid var(--line);
}
h1,h2,h3{ letter-spacing: .1px; }
h1{ font-size: clamp(28px, 3.4vw, 42px); margin-top: 6px; }
h2{ font-size: clamp(20px, 2.4vw, 28px); margin-top: 26px; }
h3{ font-size: 18px; margin-top: 18px; }
p,li{ line-height: 1.55; color: var(--muted); }
code, pre{
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
}
pre{
background: rgba(0,0,0,.35);
border: 1px solid var(--line);
border-radius: 14px;
padding: 14px 14px;
overflow:auto;
}
blockquote{
border-left: 3px solid rgba(0,222,205,.45);
margin: 18px 0;
padding: 8px 14px;
background: rgba(0,0,0,.22);
border-radius: 12px;
}
table{
width:100%;
border-collapse: collapse;
margin: 16px 0;
overflow:hidden;
border-radius: 14px;
border: 1px solid var(--line);
}
th,td{ padding: 10px 12px; border-bottom: 1px solid var(--line); }
th{ text-align:left; color: var(--text); background: rgba(255,255,255,.04); }
.site-footer{ padding: 18px 4px 0; }
.muted{ color: var(--muted); opacity:.9; font-size: 13px; }
.badges{
display:flex;
flex-wrap:wrap;
gap:10px;
margin: 14px 0;
}
.badge{
display:inline-flex;
align-items:center;
gap:8px;
padding: 10px 12px;
border: 1px solid var(--line);
border-radius: 14px;
background: rgba(0,0,0,.25);
color: var(--text);
}
.badge img{
width: 22px;
height: 22px;
border: none;
border-radius: 0;
}
+52
View File
@@ -0,0 +1,52 @@
---
layout: default
title: Design system
description: Couleurs, typographies, prompts ImageGen et guidelines pour produire des assets cohérents.
---
# Design system (Zacus)
## Direction artistique (proposée)
**Noir / néon labo** : ambiance dossier secret + instruments scientifiques + UI rétro-futuriste.
Mots-clés : *noir, laboratoire, néon teal, blueprint, preuves, enquête*.
### Palette
- Fond : `#0b1220` / `#0f1b2f`
- Accent : `#00decd`
- Accent secondaire : `#78c8ff`
- Texte : `#eef5ff`
- Texte secondaire : `#c6d6f0`
### Typos
- Titres : **Cabin Bold** (ou équivalent sans-serif)
- Texte : **Cabin Regular**
- Code/console : **DejaVu Sans Mono**
---
## Assets inclus (placeholders “design”)
Ces images sont des **assets de base** (style cohérent) générés sans ImageGen :
- `assets/cover.png`
- `assets/og.png`
- `assets/poster.png`
- `assets/logo.png`
- `assets/icons/*.png`
Pour des visuels plus riches (illustrations, personnages, scènes), vois la section **Prompts ImageGen**.
---
## Prompts ImageGen
> ⚠️ Dans cet environnement, je ne peux pas exécuter ImageGen directement.
> Tu peux cependant **copier-coller** ces prompts dans GPT5 (image generation activé) et exporter en PNG aux dimensions recommandées.
- [Pack complet de prompts](../brand/image_gen_prompts.md)
### Conseils de cohérence
- Réutiliser les mêmes mots-clés de style et la même palette.
- Éviter dintégrer du texte dans limage (ajouter le texte dans Figma/Canva ensuite).
- Demander un fond “safe area” pour laisser de la place au titre.
+118
View File
@@ -0,0 +1,118 @@
---
layout: default
title: FAQ & dépannage
description: Flash PlatformIO, SD, audio (ESP32) — symptômes, causes fréquentes, correctifs.
---
# FAQ & Dépannage (ESP32 / SD / Audio)
Cette FAQ est volontairement **pratique** : symptômes → causes fréquentes → correctifs.
---
## Flash / Upload (PlatformIO)
### « Timed out waiting for packet header » / Upload qui échoue
Causes fréquentes :
- câble USB “charge only” (pas de data),
- port série incorrect,
- board en mode bootloader non activé.
Correctifs :
- essaie un autre câble + un autre port USB,
- vérifie le port :
```bash
pio device list
```
- lance un upload puis **maintien BOOT** (si la carte le demande) jusquau démarrage de lupload,
- essaye un effacement complet :
```bash
pio run -t erase
pio run -t upload
```
### Mauvais environnement PlatformIO
Symptôme : ça compile mais pas pour la bonne carte / mauvais pinout.
Correctifs :
- vérifie `platformio.ini` (env, framework, flags),
- compile explicitement :
```bash
pio run -e esp32dev
```
---
## Carte SD
### La SD nest pas détectée
Causes fréquentes :
- formatage incompatible,
- câblage/pins SD différents selon la carte,
- init SD trop tôt (avant montage / alim stable).
Correctifs :
- formate en **FAT32** (recommandé) avec une taille dunité dallocation standard,
- teste une SD plus petite (≤ 32 Go) pour éliminer un souci exFAT,
- loggue le statut au boot (montage OK / erreur).
### Fichiers “introuvables” alors quils sont présents
Causes fréquentes :
- chemins / casse (`/Music` vs `/music`),
- séparation `/` vs `\`,
- caractères spéciaux / noms trop longs.
Correctifs :
- impose une convention : `/music/`, `/audio/`, `/print/`
- évite accents et caractères exotiques dans les noms,
- affiche dans les logs les chemins exacts.
---
## Audio
### Craquements / coupures
Causes fréquentes :
- débit SD insuffisant (ou fragmentation),
- buffer audio trop petit,
- resampling / décodage trop coûteux.
Correctifs :
- copie les fichiers sur une SD correcte (UHSI / A1) et évite la saturation,
- augmente les buffers (si possible) et privilégie la lecture séquentielle,
- teste dabord un WAV PCM simple (44.1 kHz / 16-bit) pour isoler le problème.
### Volume trop faible / saturé
Causes fréquentes :
- gain numérique trop élevé (clip),
- conversion mono/stéréo,
- réglage codec/I2S.
Correctifs :
- démarre avec un gain faible puis augmente,
- vérifie que l’échantillonnage (sample rate) correspond,
- si tu appliques des effets (comp, EQ), désactive-les pour tester.
---
## Affichage / perf (bonus)
### FPS faible / tearing
Correctifs :
- privilégie **double-buffer partiel** + flush DMA,
- évite les redraw complets : utilise des “dirty rect” / mise à jour ciblée,
- limite les alpha/transparences lourdes dans LVGL.
---
## Logs utiles
### Obtenir les logs série
```bash
pio device monitor -b 115200
```
### Lister les devices
```bash
pio device list
```
+116 -17
View File
@@ -1,20 +1,119 @@
# Le Mystère du Professeur Zacus ---
layout: default
title: Le Mystère du Professeur Zacus
description: Une enquête scientifique immersive pour anniversaire (printables, audio, modules électroniques).
---
## Ressources principales # 🎩 Le Mystère du Professeur Zacus
- Kit Maître du jeu : `kit-maitre-du-jeu/`
- Scénario canon : `game/scenarios/zacus_v1.yaml`
- Printables & workflow : `printables/` + `printables/WORKFLOW.md`
- Audio canon : `audio/manifests/zacus_v1_audio.yaml` + `game/prompts/audio/`
- Brief scénarios : `docs/_generated/SCENARIO_BRIEF.md`
- Maintenance : `docs/maintenance-repo.md`, `docs/repo-audit.md`, `docs/repo-status.md`
## Guides à consulter ![Couverture](./assets/cover.png)
- Quickstart (déploiement terrain) : `docs/QUICKSTART.md`
- Styleguide (ton & structure) : `docs/STYLEGUIDE.md`
- Workflows (validate/export) : `docs/WORKFLOWS.md`
- Glossaire des identifiants : `docs/GLOSSARY.md`
- Orchestration ZeroClaw (préflight + agent) : `docs/zeroclaw_orchestration.md`
- Contribuer (workflow & licence) : `CONTRIBUTING.md`
## Astuce Le Mystère du Professeur Zacus : une enquête scientifique immersive pour anniversaire, jouable en famille ou entre ami·e·s.
Active GitHub Pages sur `/docs` pour exposer cette page et offrir un accès direct au jeu.
Scénarios modulaires (YAML), supports imprimables, audio, et accessoires électroniques (ESP32/Arduino).
<div class="badges">
<div class="badge"><img src="./assets/icons/icon_hat.png" alt="hat" />Scénarios modulaires</div>
<div class="badge"><img src="./assets/icons/icon_audio.png" alt="audio" />Audio & checkpoints</div>
<div class="badge"><img src="./assets/icons/icon_chip.png" alt="chip" />Modules électroniques</div>
<div class="badge"><img src="./assets/icons/icon_flask.png" alt="flask" />Thème labo/science</div>
</div>
---
## Structure du projet
```text
├── game/scenarios/*.yaml Scénarios (source de vérité)
├── audio/manifests/*.yaml Manifeste audio + fichiers associés
├── printables/manifests/*.yaml Manifeste printables + PDF/PNG
├── hardware/firmware/esp32/ Firmware (lecture seule sans approbation)
├── tools/ Outils Python (validation, export, génération)
├── docs/ Guides + mini-site GitHub Pages
├── assets/ Images (README / marketing)
```
---
## Démarrage rapide
1. Imprime les printables (cartes, indices).
2. (Option) Flash les modules électroniques.
3. Lis le scénario YAML et place les indices.
4. Lance la partie et suis le guide MJ.
---
## Guides & documentation
- [STRUCTURE.md](STRUCTURE.md) : Architecture détaillée
- [QUICKSTART.md](QUICKSTART.md) : Démarrage express
- [WORKFLOWS.md](WORKFLOWS.md) : Workflows validation/export
- [faq.md](faq.md) : FAQ dépannage
---
## Licences
- Code : MIT — voir [../LICENSE](../LICENSE)
- Contenu créatif : CC BYNC 4.0 — voir [../LICENSE-CONTENT.md](../LICENSE-CONTENT.md)
---
## Assets
- Couverture : assets/cover.png
- OpenGraph : assets/og.png
- Poster : assets/poster.png
- Logo : assets/logo.png
- Diagramme : assets/diagram.png
- Aperçu printables : assets/printables.png
## Démo
![Démo](./assets/demo.gif)
---
## Jouer (MJ)
### Checklist rapide
1. Imprime les **printables** (cartes, indices).
2. (Option) Flash les modules électroniques.
3. Lis le scénario et place les indices.
4. Lance la partie et suis le guide MJ.
👉 Voir aussi : [FAQ (flash / SD / audio)](./faq)
---
## Développer / contribuer
### Structure du dépôt
- `game/scenarios/` — scénarios (source de vérité)
- `audio/` — manifestes et ressources audio
- `printables/` — manifestes + PDF/PNG
- `tools/` — outils Python (validation, export)
- `hardware/firmware/esp32/` — firmware (**lecture seule** sans approbation)
### Démarrage rapide
```bash
python3 -m pip install -r tools/requirements.txt
python3 tools/scenario/validate_scenario.py game/scenarios/mon_scenario.yaml
```
---
## Visuels & matériel
![Prototype](./assets/board.jpg)
![Printables](./assets/printables.png)
![Diagramme](./assets/diagram.png)
---
## Licences
- **Code** : MIT (`LICENSE`)
- **Contenu** : CC BYNC 4.0 (`LICENSE-CONTENT.md`)
+16
View File
@@ -0,0 +1,16 @@
---
layout: default
title: Publier le site
description: Configuration rapide GitHub Pages pour /docs.
---
# Publier le mini-site (GitHub Pages)
1. Sur GitHub : **Settings → Pages**
2. **Build and deployment**
- Source : **Deploy from a branch**
- Branch : `main` (ou `master`)
- Folder : **/docs**
3. GitHub affiche lURL publique (généralement `https://<user>.github.io/<repo>/`).
Si tu utilises un sous-chemin personnalisé, ajuste `baseurl` dans `docs/_config.yml`.
+16 -13
View File
@@ -1,21 +1,24 @@
# Scenario AI Coherence
## Rôle de ce dossier
Ce dossier contient les artefacts de cohérence scénario générés par IA et validés par des humains.
### Structure # Zacus Scenario AI Coherence — Bundle Unifié
- **`version-finale/`** : Contenus finaux validés et approuvés pour utilisation dans le jeu Ce dossier contient tous les artefacts validés, fusionnés et prêts à lintégration :
- *Futurs artefacts* : Versions intermédiaires, logs de génération, et autres documents de travail IA
## Processus - scenario_complet.md : déroulé narratif, synthèse, fiches, supports
- charte_graphique.yaml / charte_graphique.json : charte visuelle
- listing_fichiers.yaml / listing_fichiers.json : listing supports
- scenario_canonical.yaml : scénario canonique YAML
- scenario_promptable_template.yaml : template éditable
- scenario_runtime.json : runtime JSON
- zacus_v2.yaml : narration MJ alignée
- fsm_mermaid.md : diagramme FSM
- CODEX_PROMPT.md : consignes firmware/scénario
- INTRO OFFICIELLE VERSION AVEC HOT-LINE.md : intro alternative
1. **Génération IA** : Création initiale de contenu scénario via outils d'IA Tous les sous-dossiers ont été supprimés. Les fichiers sont fusionnés, cohérents et validés.
2. **Validation humaine** : Révision et approbation par les mainteneurs
3. **Intégration** : Déplacement vers `version-finale/` une fois validé Pour toute intégration, utilisez scenario_complet.md pour le déroulé, scenario_canonical.yaml/scenario_runtime.json pour la technique, et les fichiers charte/listing pour les assets.
4. **Utilisation** : Référencé par les autres composants du kit d'enquête
## Licence ## Licence
Contenus : **CC BY-NC 4.0** (voir LICENSES/CC-BY-NC-4.0.txt)
Contenus de ce dossier : **CC BY-NC 4.0** (voir `LICENSES/CC-BY-NC-4.0.txt`)
@@ -38,12 +38,4 @@ stateDiagram-v2
STEP_QR_DETECTOR --> STEP_RTC_ESP_ETAPE2: event:QR_TIMEOUT STEP_QR_DETECTOR --> STEP_RTC_ESP_ETAPE2: event:QR_TIMEOUT
STEP_QR_DETECTOR --> STEP_FINAL_WIN: serial:BTN_NEXT STEP_QR_DETECTOR --> STEP_FINAL_WIN: serial:BTN_NEXT
STEP_QR_DETECTOR --> STEP_FINAL_WIN: unlock:UNLOCK_QR STEP_QR_DETECTOR --> STEP_FINAL_WIN: unlock:UNLOCK_QR
STEP_QR_DETECTOR --> STEP_FINAL_WIN: action:ACTION_FORCE_ETAPE2
STEP_QR_DETECTOR --> STEP_FINAL_WIN: serial:FORCE_WIN_ETAPE2
STEP_FINAL_WIN --> SCENE_MEDIA_MANAGER: timer:WIN_DUE
STEP_FINAL_WIN --> SCENE_MEDIA_MANAGER: serial:BTN_NEXT
STEP_FINAL_WIN --> SCENE_MEDIA_MANAGER: unlock:UNLOCK
STEP_FINAL_WIN --> SCENE_MEDIA_MANAGER: action:FORCE_WIN_ETAPE2
STEP_FINAL_WIN --> SCENE_MEDIA_MANAGER: serial:FORCE_WIN_ETAPE2
``` ```
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,18 +0,0 @@
# Zacus — Conversation Summary (bundle v3)
This bundle consolidates the key outputs from the conversation:
- Promptable scenario template (user-edited section: prompt_input)
- Canonical scenario YAML (STEP_*/SCENE_* conventions)
- Runtime JSON (DEFAULT.json)
- FSM diagram (Mermaid)
- Codex prompt to update repo targets
- Narrative zacus_v2.yaml aligned with the runtime + real-world gameplay
Key decisions captured:
- Prototype is U-SON.
- Act 1 (~45 min): LA 440 Hz stabilization (STEP_LA_DETECTOR).
- Act 2 (~60 min): Zone 4 piano-alphabet puzzle → play "LEFOU" (letters randomly placed; A anchored on LA 440 Hz).
- QR final payload is "WIN", hidden behind the portrait in the Archives.
- After QR success: Media Hub + persistent boot into media_manager.
Generated: 2026-02-25 (Europe/Paris)
@@ -1,43 +0,0 @@
# Zacus Conversation Bundle (v3)
## Purpose
Bundle de travail conversationnel/IA conservé en dehors de la source canon gameplay (`game/scenarios/*.yaml`).
## Files
- `scenario_promptable_template.yaml`: template éditable (input prompt)
- `scenario_canonical.yaml`: YAML canonique conversation bundle
- `scenario_runtime.json`: JSON runtime dérivé
- `fsm_mermaid.md`: diagramme FSM
- `CODEX_PROMPT.md`: prompt Codex prêt à l'emploi
- `zacus_v2.yaml`: narration MJ alignée bundle
- `CONVERSATION_SUMMARY.md`: synthèse des décisions
## Validation workflow
1. Installer les dépendances validateurs :
- `bash tools/setup/install_validators.sh`
2. Valider la cohérence interne du bundle :
- `python3 tools/scenario/validate_runtime_bundle.py`
3. Lancer les validateurs projet (non-régression canon/audio/printables) :
- `python3 tools/scenario/validate_scenario.py game/scenarios/zacus_v1.yaml`
- `python3 tools/scenario/export_md.py game/scenarios/zacus_v1.yaml`
- `python3 tools/audio/validate_manifest.py audio/manifests/zacus_v1_audio.yaml`
- `python3 tools/printables/validate_manifest.py printables/manifests/zacus_v1_printables.yaml`
## Notes
- Ce bundle n'est pas promu automatiquement dans `game/scenarios/*.yaml`.
- Toute promotion doit passer par une revue fonctionnelle dédiée.
Files:
- scenario_promptable_template.yaml : your editable template (prompt_input)
- scenario_canonical.yaml : canonical YAML (copy into docs/... target)
- scenario_runtime.json : runtime JSON (copy into data/story/scenarios/DEFAULT.json)
- fsm_mermaid.md : FSM diagram
- CODEX_PROMPT.md : ready-to-paste Codex prompt
- zacus_v2.yaml : narrative scenario aligned with runtime + gameplay reality
- CONVERSATION_SUMMARY.md : what changed / key decisions
Typical flow:
1) Update prompt_input in scenario_promptable_template.yaml if needed.
2) Use canonical/runtime files to update repo targets.
3) Use zacus_v2.yaml as the printed narrative / MJ reference for the real game.
Generated: 2026-02-25
@@ -1,291 +0,0 @@
# Zacus Scenario — Canonical YAML (v3)
# Generated: 2026-02-25
#
# Conventions:
# - step_id = STEP_*, screen_scene_id = SCENE_*
# - led_policy is a sibling of transitions (NOT nested inside)
# - QR rule scene_id aligned to SCENE_QR_DETECTOR
# - Final transitions go to SCENE_MEDIA_MANAGER (hub scene)
#
# Narrative anchors (conversation):
# - Prototype: U-SON
# - Acte 1 (~45min): LA 440 Hz (STEP_LA_DETECTOR)
# - Acte 2 (~60min): Zone 4 piano-alphabet → jouer "LEFOU" (STEP_LEFOU_DETECTOR)
# * Lettres collées en ordre aléatoire sur touches blanches
# * A placé sur la touche correspondant au LA 440 Hz (ancre)
# - QR final: payload "WIN", caché derrière le portrait dans la Salle des Archives
prompt_input:
meta:
request_name: "DEFAULT_UNLOCK_WIN_ETAPE2"
owner: "clement"
board_target: "freenove_esp32s3"
objective: "U-SON: Acte1 LA440 (~45min) -> Acte2 piano 'LEFOU' (~60min) -> QR WIN -> Media Manager (persistant)"
boot_policy:
startup_mode: "story" # story | media_manager
persist_after_validation: true
rollback_command_required: true
qr_rule:
enabled: true
scene_id: "SCENE_QR_DETECTOR"
expected_payload: "WIN"
match_mode: "exact" # exact | prefix | contains
case_insensitive: true
success_event: "UNLOCK_QR"
failure_event: "QR_INVALID"
media_hub:
enabled: true
hub_scene_id: "SCENE_MEDIA_MANAGER"
entries:
- "SCENE_PHOTO_MANAGER"
- "SCENE_MP3_PLAYER"
- "SCENE_READY"
led_policy:
strict_rgb: true
defaults:
ws2812: 1
led_auto: 1
rgb: "18/45/95"
scene_overrides:
- scene_id: "SCENE_LA_DETECTOR"
rgb: "dynamic_tuner_or_off"
custom_steps: []
serial_test_plan:
- "SC_LOAD DEFAULT"
- "SCENE_GOTO SCENE_U_SON_PROTO"
- "QR_SIM WIN"
- "SC_EVENT UNLOCK_QR"
- "BOOT_MODE_STATUS"
- "RESET"
acceptance_criteria:
- "Pas de PANIC|ASSERT|ABORT|REBOOT|rst:"
- "Transitions scene avec ACK ... ok=1"
- "Ownership camera/mic/amp coherent"
- "LED WS2812 conformes policy + RGB"
- "Boot mode media_manager persistant apres QR valide"
notes:
- "Prototype: U-SON."
- "Etape1: LA 440 Hz stable (Acte1 ~45min)."
- "Etape2: piano-alphabet → jouer 'LEFOU' (Acte2 ~60min)."
- "QR WIN: caché derrière le portrait (Salle des Archives)."
- "SCENE_QR_DETECTOR a un timeout (QR_TIMEOUT) pour eviter le blocage."
scenario:
id: "DEFAULT"
version: 2
initial_step: "STEP_U_SON_PROTO"
app_bindings:
- "APP_AUDIO"
- "APP_SCREEN"
- "APP_GATE"
- "APP_WIFI"
- "APP_ESPNOW"
- "APP_SONAR"
- "APP_SD"
- "APP_CAMERA"
- "APP_LED"
- "APP_SERIAL"
- "APP_TIMER"
- "APP_UNLOCK"
- "APP_QR"
- "APP_INPUT"
- "APP_LOG"
- "APP_ACTION"
steps_runtime_order:
- step_id: "STEP_U_SON_PROTO"
screen_scene_id: "SCENE_U_SON_PROTO"
audio_pack_id: "PACK_BOOT_RADIO"
actions:
- "ACTION_TRACE_STEP"
- "ACTION_HW_LED_ALERT"
transitions:
- "audio_done:loop->STEP_U_SON_PROTO"
- "BTN:ANY->STEP_LA_DETECTOR"
- "serial:FORCE_ETAPE2->STEP_LA_DETECTOR"
led_policy:
ws2812_1: on
ws2812_2: on
ws2812_3: on
ws2812_4: on
animation: "random_one_blink"
brightness: "random_bright"
rgb: "random_color"
- step_id: "STEP_LA_DETECTOR"
screen_scene_id: "SCENE_LA_DETECTOR"
audio_pack_id: ""
actions:
- "ACTION_TRACE_STEP"
- "ACTION_QUEUE_SONAR"
transitions:
- "timer:ETAPE2_DUE->STEP_U_SON_PROTO"
- "serial:BTN_NEXT->STEP_RTC_ESP_ETAPE1"
- "unlock:UNLOCK->STEP_RTC_ESP_ETAPE1"
- "action:ACTION_FORCE_ETAPE2->STEP_RTC_ESP_ETAPE1"
- "serial:FORCE_WIN_ETAPE1->STEP_RTC_ESP_ETAPE1"
led_policy:
ws2812_1: on
ws2812_2: on
ws2812_3: on
ws2812_4: on
animation: "dynamic_tuner"
brightness: "100%"
rgb: "random_color"
- step_id: "STEP_RTC_ESP_ETAPE1"
screen_scene_id: "SCENE_WIN_ETAPE1"
audio_pack_id: "PACK_CONFIRM_WIN_ETAPE1"
actions:
- "ACTION_TRACE_STEP"
- "ACTION_HW_LED_ALERT"
- "ACTION_ESP_NOW_SEND_ETAPE1"
- "ACTION_QUEUE_SONAR"
transitions:
- "esp_now:ACK_WIN1->STEP_WIN_ETAPE1"
- "serial:FORCE_DONE->STEP_WIN_ETAPE1"
led_policy:
ws2812_1: on
ws2812_2: off
ws2812_3: off
ws2812_4: on
animation: "breathing"
brightness: "random_bright"
rgb: "random_color"
- step_id: "STEP_WIN_ETAPE1"
screen_scene_id: "SCENE_WIN_ETAPE1"
audio_pack_id: "PACK_WIN"
actions:
- "ACTION_TRACE_STEP"
- "ACTION_HW_LED_ALERT"
transitions:
- "serial:BTN_NEXT->STEP_WARNING"
- "serial:FORCE_DONE->STEP_WARNING"
- "esp_now:ACK_WARNING->STEP_WARNING"
led_policy:
ws2812_1: on
ws2812_2: off
ws2812_3: off
ws2812_4: on
animation: "K2000"
brightness: "K2000"
rgb: "red"
- step_id: "STEP_WARNING"
screen_scene_id: "SCENE_WARNING"
audio_pack_id: "PACK_BOOT_RADIO"
actions:
- "ACTION_TRACE_STEP"
- "ACTION_HW_LED_ALERT"
transitions:
- "audio_done:loop->STEP_WARNING"
- "BTN:ANY->STEP_LEFOU_DETECTOR"
- "serial:FORCE_ETAPE2->STEP_LEFOU_DETECTOR"
led_policy:
ws2812_1: on
ws2812_2: on
ws2812_3: on
ws2812_4: on
animation: "blink_all"
brightness: "100%"
rgb: "red"
- step_id: "STEP_LEFOU_DETECTOR"
screen_scene_id: "SCENE_LEFOU_DETECTOR"
audio_pack_id: ""
actions:
- "ACTION_TRACE_STEP"
- "ACTION_QUEUE_SONAR"
transitions:
- "timer:ETAPE2_DUE->STEP_WARNING"
- "serial:BTN_NEXT->STEP_RTC_ESP_ETAPE2"
- "unlock:UNLOCK->STEP_RTC_ESP_ETAPE2"
- "action:ACTION_FORCE_ETAPE2->STEP_RTC_ESP_ETAPE2"
- "serial:FORCE_WIN_ETAPE2->STEP_RTC_ESP_ETAPE2"
led_policy:
ws2812_1: on
ws2812_2: on
ws2812_3: on
ws2812_4: on
animation: "dynamic_tuner"
brightness: "100%"
rgb: "random_color"
- step_id: "STEP_RTC_ESP_ETAPE2"
screen_scene_id: "SCENE_WIN_ETAPE2"
audio_pack_id: "PACK_CONFIRM_WIN_ETAPE2"
actions:
- "ACTION_TRACE_STEP"
- "ACTION_HW_LED_ALERT"
- "ACTION_ESP_NOW_SEND_ETAPE2"
- "ACTION_QUEUE_SONAR"
transitions:
- "esp_now:ACK_WIN2->STEP_QR_DETECTOR"
- "serial:FORCE_DONE->STEP_QR_DETECTOR"
led_policy:
ws2812_1: on
ws2812_2: off
ws2812_3: off
ws2812_4: on
animation: "breathing"
brightness: "random_bright"
rgb: "random_color"
- step_id: "STEP_QR_DETECTOR"
screen_scene_id: "SCENE_QR_DETECTOR"
audio_pack_id: ""
actions:
- "ACTION_TRACE_STEP"
- "ACTION_QR_CODE_SCANNER_START"
- "ACTION_QR_TIMEOUT_30S"
transitions:
- "timer:ETAPE2_DUE->STEP_RTC_ESP_ETAPE2"
- "event:QR_TIMEOUT->STEP_RTC_ESP_ETAPE2"
- "serial:BTN_NEXT->STEP_FINAL_WIN"
- "unlock:UNLOCK_QR->STEP_FINAL_WIN"
- "action:ACTION_FORCE_ETAPE2->STEP_FINAL_WIN"
- "serial:FORCE_WIN_ETAPE2->STEP_FINAL_WIN"
led_policy:
ws2812_1: on
ws2812_2: on
ws2812_3: on
ws2812_4: on
animation: "bargraph_qr_trigger"
brightness: "bargraph"
rgb: "bargraph_red_to_green"
- step_id: "STEP_FINAL_WIN"
screen_scene_id: "SCENE_FINAL_WIN"
audio_pack_id: ""
actions:
- "ACTION_TRACE_STEP"
- "ACTION_WINNER"
transitions:
- "timer:WIN_DUE->SCENE_MEDIA_MANAGER"
- "serial:BTN_NEXT->SCENE_MEDIA_MANAGER"
- "unlock:UNLOCK->SCENE_MEDIA_MANAGER"
- "action:FORCE_WIN_ETAPE2->SCENE_MEDIA_MANAGER"
- "serial:FORCE_WIN_ETAPE2->SCENE_MEDIA_MANAGER"
led_policy:
ws2812_1: on
ws2812_2: on
ws2812_3: on
ws2812_4: on
animation: "blink_all_random"
brightness: "100%"
rgb: "random_color"
current_firmware_snapshot:
source_to_update_files:
- "docs/protocols/story_specs/scenarios/default_unlock_win_etape2.yaml"
- "data/story/scenarios/DEFAULT.json"
@@ -1,105 +0,0 @@
# Scenario reel - template lisible + promptable.
#
# Comment l'utiliser:
# 1) Edite uniquement la section `prompt_input`.
# 2) Laisse `current_firmware_snapshot` comme reference de l'etat actuel code.
# 3) Envoie ce fichier a Codex: je convertis ensuite vers le YAML canonique + JSON runtime.
#
# NOTE (conversation):
# - Prototype: U-SON
# - Etape 1 (LA_DETECTOR): fréquence audio LA 440 Hz
# - Etape 2 (LEFOU_DETECTOR): puzzle piano-alphabet → jouer "LEFOU"
# * Lettres collées en ordre aléatoire sur les touches blanches
# * A est placé sur la touche correspondant au LA 440 Hz (ancre)
# - QR final: payload "WIN", caché derrière le portrait dans la Salle des Archives
prompt_input:
meta:
request_name: "A_COMPLETER"
owner: "A_COMPLETER"
board_target: "freenove_esp32s3"
objective: "U-SON: Acte1 LA440 (~45min) -> Acte2 Zone4 piano 'LEFOU' (~60min) -> QR WIN -> Media Manager"
boot_policy:
startup_mode: "story" # story | media_manager
persist_after_validation: true
rollback_command_required: true
qr_rule:
enabled: true
scene_id: "SCENE_QR_DETECTOR"
expected_payload: "WIN"
match_mode: "exact" # exact | prefix | contains
case_insensitive: true
success_event: "UNLOCK_QR"
failure_event: "QR_INVALID"
media_hub:
enabled: true
hub_scene_id: "SCENE_MEDIA_MANAGER"
entries:
- "SCENE_PHOTO_MANAGER"
- "SCENE_MP3_PLAYER"
- "SCENE_READY"
led_policy:
strict_rgb: true
defaults:
ws2812: 1
led_auto: 1
rgb: "18/45/95"
scene_overrides:
- scene_id: "SCENE_LA_DETECTOR"
rgb: "dynamic_tuner_or_off"
custom_steps:
# Ajoute, retire, ou reordonne des steps ici.
- "A_COMPLETER"
serial_test_plan:
- "SC_LOAD DEFAULT"
- "SCENE_GOTO"
- "QR_SIM WIN"
- "SC_EVENT UNLOCK_QR"
- "BOOT_MODE_STATUS"
- "RESET"
acceptance_criteria:
- "Pas de PANIC|ASSERT|ABORT|REBOOT|rst:"
- "Transitions scene avec ACK ... ok=1"
- "Ownership camera/mic/amp coherent"
- "LED WS2812 conformes policy + RGB"
- "Boot mode media_manager persistant apres QR valide"
notes:
- "Acte 1: LA 440 Hz (stabilité) ~45 minutes."
- "Acte 2: Zone 4 piano-alphabet (LEFOU) + Archives (QR WIN derrière portrait) ~60 minutes."
- "Prototype: U-SON."
- "Ajouter ici les exceptions ou aliases scene."
scenario:
id: "DEFAULT"
version: 2
initial_step: "STEP_U_SON_PROTO"
app_bindings:
- "APP_AUDIO"
- "APP_SCREEN"
- "APP_GATE"
- "APP_WIFI"
- "APP_ESPNOW"
- "APP_SONAR"
- "APP_SD"
- "APP_CAMERA"
- "APP_LED"
- "APP_SERIAL"
- "APP_TIMER"
- "APP_UNLOCK"
- "APP_QR"
- "APP_INPUT"
- "APP_LOG"
- "APP_ACTION"
current_firmware_snapshot:
source_to_update_files:
- "docs/protocols/story_specs/scenarios/default_unlock_win_etape2.yaml"
- "data/story/scenarios/DEFAULT.json"
@@ -1,434 +0,0 @@
{
"scenario": {
"id": "DEFAULT",
"version": 2,
"initial_step": "STEP_U_SON_PROTO",
"app_bindings": [
"APP_AUDIO",
"APP_SCREEN",
"APP_GATE",
"APP_WIFI",
"APP_ESPNOW",
"APP_SONAR",
"APP_SD",
"APP_CAMERA",
"APP_LED",
"APP_SERIAL",
"APP_TIMER",
"APP_UNLOCK",
"APP_QR",
"APP_INPUT",
"APP_LOG",
"APP_ACTION"
]
},
"boot_policy": {
"startup_mode": "story",
"persist_after_validation": true,
"rollback_command_required": true
},
"qr_rule": {
"enabled": true,
"scene_id": "SCENE_QR_DETECTOR",
"expected_payload": "WIN",
"match_mode": "exact",
"case_insensitive": true,
"success_event": "UNLOCK_QR",
"failure_event": "QR_INVALID",
"timeout_seconds": 30,
"timeout_event": "QR_TIMEOUT"
},
"media_hub": {
"enabled": true,
"hub_scene_id": "SCENE_MEDIA_MANAGER",
"entries": [
"SCENE_PHOTO_MANAGER",
"SCENE_MP3_PLAYER",
"SCENE_READY"
]
},
"led_policy": {
"strict_rgb": true,
"defaults": {
"ws2812": 1,
"led_auto": 1,
"rgb": "18/45/95"
},
"scene_overrides": [
{
"scene_id": "SCENE_LA_DETECTOR",
"rgb": "dynamic_tuner_or_off"
}
]
},
"narrative_meta": {
"prototype": "U-SON",
"act_durations_minutes": {
"act_1": 45,
"act_2": 60
},
"zone4_piano": {
"code_word": "LEFOU",
"letters_random_order": true,
"anchor": "A on LA 440 Hz"
},
"qr_location": "Derriere le portrait (Salle des Archives)"
},
"steps_runtime_order": [
{
"step_id": "STEP_U_SON_PROTO",
"screen_scene_id": "SCENE_U_SON_PROTO",
"audio_pack_id": "PACK_BOOT_RADIO",
"actions": [
"ACTION_TRACE_STEP",
"ACTION_HW_LED_ALERT"
],
"transitions": [
{
"channel": "audio_done",
"event": "loop",
"target": "STEP_U_SON_PROTO"
},
{
"channel": "BTN",
"event": "ANY",
"target": "STEP_LA_DETECTOR"
},
{
"channel": "serial",
"event": "FORCE_ETAPE2",
"target": "STEP_LA_DETECTOR"
}
],
"led_policy": {
"ws2812_1": "on",
"ws2812_2": "on",
"ws2812_3": "on",
"ws2812_4": "on",
"animation": "random_one_blink",
"brightness": "random_bright",
"rgb": "random_color"
}
},
{
"step_id": "STEP_LA_DETECTOR",
"screen_scene_id": "SCENE_LA_DETECTOR",
"audio_pack_id": "",
"actions": [
"ACTION_TRACE_STEP",
"ACTION_QUEUE_SONAR"
],
"transitions": [
{
"channel": "timer",
"event": "ETAPE2_DUE",
"target": "STEP_U_SON_PROTO"
},
{
"channel": "serial",
"event": "BTN_NEXT",
"target": "STEP_RTC_ESP_ETAPE1"
},
{
"channel": "unlock",
"event": "UNLOCK",
"target": "STEP_RTC_ESP_ETAPE1"
},
{
"channel": "action",
"event": "ACTION_FORCE_ETAPE2",
"target": "STEP_RTC_ESP_ETAPE1"
},
{
"channel": "serial",
"event": "FORCE_WIN_ETAPE1",
"target": "STEP_RTC_ESP_ETAPE1"
}
],
"led_policy": {
"ws2812_1": "on",
"ws2812_2": "on",
"ws2812_3": "on",
"ws2812_4": "on",
"animation": "dynamic_tuner",
"brightness": "100%",
"rgb": "random_color"
}
},
{
"step_id": "STEP_RTC_ESP_ETAPE1",
"screen_scene_id": "SCENE_WIN_ETAPE1",
"audio_pack_id": "PACK_CONFIRM_WIN_ETAPE1",
"actions": [
"ACTION_TRACE_STEP",
"ACTION_HW_LED_ALERT",
"ACTION_ESP_NOW_SEND_ETAPE1",
"ACTION_QUEUE_SONAR"
],
"transitions": [
{
"channel": "esp_now",
"event": "ACK_WIN1",
"target": "STEP_WIN_ETAPE1"
},
{
"channel": "serial",
"event": "FORCE_DONE",
"target": "STEP_WIN_ETAPE1"
}
],
"led_policy": {
"ws2812_1": "on",
"ws2812_2": "off",
"ws2812_3": "off",
"ws2812_4": "on",
"animation": "breathing",
"brightness": "random_bright",
"rgb": "random_color"
}
},
{
"step_id": "STEP_WIN_ETAPE1",
"screen_scene_id": "SCENE_WIN_ETAPE1",
"audio_pack_id": "PACK_WIN",
"actions": [
"ACTION_TRACE_STEP",
"ACTION_HW_LED_ALERT"
],
"transitions": [
{
"channel": "serial",
"event": "BTN_NEXT",
"target": "STEP_WARNING"
},
{
"channel": "serial",
"event": "FORCE_DONE",
"target": "STEP_WARNING"
},
{
"channel": "esp_now",
"event": "ACK_WARNING",
"target": "STEP_WARNING"
}
],
"led_policy": {
"ws2812_1": "on",
"ws2812_2": "off",
"ws2812_3": "off",
"ws2812_4": "on",
"animation": "K2000",
"brightness": "K2000",
"rgb": "red"
}
},
{
"step_id": "STEP_WARNING",
"screen_scene_id": "SCENE_WARNING",
"audio_pack_id": "PACK_BOOT_RADIO",
"actions": [
"ACTION_TRACE_STEP",
"ACTION_HW_LED_ALERT"
],
"transitions": [
{
"channel": "audio_done",
"event": "loop",
"target": "STEP_WARNING"
},
{
"channel": "BTN",
"event": "ANY",
"target": "STEP_LEFOU_DETECTOR"
},
{
"channel": "serial",
"event": "FORCE_ETAPE2",
"target": "STEP_LEFOU_DETECTOR"
}
],
"led_policy": {
"ws2812_1": "on",
"ws2812_2": "on",
"ws2812_3": "on",
"ws2812_4": "on",
"animation": "blink_all",
"brightness": "100%",
"rgb": "red"
}
},
{
"step_id": "STEP_LEFOU_DETECTOR",
"screen_scene_id": "SCENE_LEFOU_DETECTOR",
"audio_pack_id": "",
"actions": [
"ACTION_TRACE_STEP",
"ACTION_QUEUE_SONAR"
],
"transitions": [
{
"channel": "timer",
"event": "ETAPE2_DUE",
"target": "STEP_WARNING"
},
{
"channel": "serial",
"event": "BTN_NEXT",
"target": "STEP_RTC_ESP_ETAPE2"
},
{
"channel": "unlock",
"event": "UNLOCK",
"target": "STEP_RTC_ESP_ETAPE2"
},
{
"channel": "action",
"event": "ACTION_FORCE_ETAPE2",
"target": "STEP_RTC_ESP_ETAPE2"
},
{
"channel": "serial",
"event": "FORCE_WIN_ETAPE2",
"target": "STEP_RTC_ESP_ETAPE2"
}
],
"led_policy": {
"ws2812_1": "on",
"ws2812_2": "on",
"ws2812_3": "on",
"ws2812_4": "on",
"animation": "dynamic_tuner",
"brightness": "100%",
"rgb": "random_color"
}
},
{
"step_id": "STEP_RTC_ESP_ETAPE2",
"screen_scene_id": "SCENE_WIN_ETAPE2",
"audio_pack_id": "PACK_CONFIRM_WIN_ETAPE2",
"actions": [
"ACTION_TRACE_STEP",
"ACTION_HW_LED_ALERT",
"ACTION_ESP_NOW_SEND_ETAPE2",
"ACTION_QUEUE_SONAR"
],
"transitions": [
{
"channel": "esp_now",
"event": "ACK_WIN2",
"target": "STEP_QR_DETECTOR"
},
{
"channel": "serial",
"event": "FORCE_DONE",
"target": "STEP_QR_DETECTOR"
}
],
"led_policy": {
"ws2812_1": "on",
"ws2812_2": "off",
"ws2812_3": "off",
"ws2812_4": "on",
"animation": "breathing",
"brightness": "random_bright",
"rgb": "random_color"
}
},
{
"step_id": "STEP_QR_DETECTOR",
"screen_scene_id": "SCENE_QR_DETECTOR",
"audio_pack_id": "",
"actions": [
"ACTION_TRACE_STEP",
"ACTION_QR_CODE_SCANNER_START",
"ACTION_QR_TIMEOUT_30S"
],
"transitions": [
{
"channel": "timer",
"event": "ETAPE2_DUE",
"target": "STEP_RTC_ESP_ETAPE2"
},
{
"channel": "event",
"event": "QR_TIMEOUT",
"target": "STEP_RTC_ESP_ETAPE2"
},
{
"channel": "serial",
"event": "BTN_NEXT",
"target": "STEP_FINAL_WIN"
},
{
"channel": "unlock",
"event": "UNLOCK_QR",
"target": "STEP_FINAL_WIN"
},
{
"channel": "action",
"event": "ACTION_FORCE_ETAPE2",
"target": "STEP_FINAL_WIN"
},
{
"channel": "serial",
"event": "FORCE_WIN_ETAPE2",
"target": "STEP_FINAL_WIN"
}
],
"led_policy": {
"ws2812_1": "on",
"ws2812_2": "on",
"ws2812_3": "on",
"ws2812_4": "on",
"animation": "bargraph_qr_trigger",
"brightness": "bargraph",
"rgb": "bargraph_red_to_green"
}
},
{
"step_id": "STEP_FINAL_WIN",
"screen_scene_id": "SCENE_FINAL_WIN",
"audio_pack_id": "",
"actions": [
"ACTION_TRACE_STEP",
"ACTION_WINNER"
],
"transitions": [
{
"channel": "timer",
"event": "WIN_DUE",
"target": "SCENE_MEDIA_MANAGER"
},
{
"channel": "serial",
"event": "BTN_NEXT",
"target": "SCENE_MEDIA_MANAGER"
},
{
"channel": "unlock",
"event": "UNLOCK",
"target": "SCENE_MEDIA_MANAGER"
},
{
"channel": "action",
"event": "FORCE_WIN_ETAPE2",
"target": "SCENE_MEDIA_MANAGER"
},
{
"channel": "serial",
"event": "FORCE_WIN_ETAPE2",
"target": "SCENE_MEDIA_MANAGER"
}
],
"led_policy": {
"ws2812_1": "on",
"ws2812_2": "on",
"ws2812_3": "on",
"ws2812_4": "on",
"animation": "blink_all_random",
"brightness": "100%",
"rgb": "random_color"
}
}
]
}
@@ -1,172 +0,0 @@
id: zacus_v2
version: 3
revision: 1
title: "Le mystère du Professeur Zacus — Version Réelle (U-SON, piano LEFOU, QR WIN)"
theme: "Enquête scientifique + stabilisation audio + épreuve Zone 4 + déverrouillage final"
players:
min: 6
max: 14
ages: "614 ans (911 recommandés)"
duration:
act_1_minutes: 45
act_2_minutes: 60
total_minutes: 105
firmware:
board_target: freenove_esp32s3
engine: story_engine_v2
runtime_scenario_id: "DEFAULT"
boot_policy:
startup_mode: story
persist_after_validation: true
rollback_command_required: true
after_success_boot: media_manager
qr_rule:
enabled: true
scene_id: "SCENE_QR_DETECTOR"
expected_payload: "WIN"
match_mode: exact
case_insensitive: true
success_event: "UNLOCK_QR"
failure_event: "QR_INVALID"
timeout_seconds: 30
timeout_event: "QR_TIMEOUT"
media_hub:
enabled: true
hub_scene_id: "SCENE_MEDIA_MANAGER"
entries:
- "SCENE_PHOTO_MANAGER"
- "SCENE_MP3_PLAYER"
- "SCENE_READY"
canon:
prototype: "U-SON"
introduction: >
Le Professeur Zacus a disparu après avoir déclenché une alerte cryptée.
Le prototype U-SON “dérive”: les signaux deviennent instables.
Pour protéger U-SON, l’équipe doit:
(1) stabiliser une référence scientifique (LA 440 Hz),
(2) passer la règle de Zone 4 (installation de l’Électron Fou) via un code piano-alphabet,
(3) récupérer la clé finale (QR “WIN”) cachée aux Archives.
stakes: >
Le vrai test nest pas la vitesse: cest la coopération, la précision et le calme.
reveal_finale: >
Zacus réapparaît: c’était un test d’éthique.
U-SON ne doit pas devenir un objet de panique.
L’équipe gagne parce quelle a fait juste: stabilité, règle, entraide.
lore_truths:
- "Zone 4 = installation personnelle de l’Électron Fou."
- "Piano-alphabet brouillé: lettres collées en ordre aléatoire sur touches blanches."
- "Ancre: A est placé sur la touche correspondant au LA 440 Hz."
stations:
- id: STATION_ONDES
act: 1
name: "Atelier des Ondes"
focus: "Stabiliser LA 440 Hz pour recaler U-SON."
firmware_anchor_step: "STEP_LA_DETECTOR"
- id: STATION_ZONE4_PIANO
act: 2
name: "Zone 4 — Studio de Résonance (Piano Alphabet brouillé)"
focus: "Trouver et jouer le code LEFOU (L-E-F-O-U) via lettres sur touches blanches."
firmware_anchor_step: "STEP_LEFOU_DETECTOR"
clue_soft: "En Zone 4, les lettres comptent plus que les notes. A est sur le LA 440."
clue_hard: "Le code est le nom du propriétaire: LEFOU."
- id: STATION_ARCHIVES_QR
act: 2
name: "Salle des Archives"
focus: "Trouver et scanner la clé finale."
firmware_anchor_step: "STEP_QR_DETECTOR"
qr_location_real: "Derrière le portrait (cadre) dans la Salle des Archives."
puzzles:
- id: PUZZLE_LA_440
act: 1
type: "audio / stabilisation"
objective: "Produire un LA 440 Hz stable."
firmware_step: "STEP_LA_DETECTOR"
- id: PUZZLE_PIANO_ALPHABET_5
act: 2
type: "piano / code lettres (mapping brouillé)"
objective: "Jouer 5 touches correspondant aux lettres du code."
firmware_step: "STEP_LEFOU_DETECTOR"
mapping_rule_real: >
Les 26 lettres AZ sont collées sur des touches blanches dans un ordre aléatoire.
Une seule ancre est vraie: A est placé sur le LA 440 Hz.
code_word_5_letters: "LEFOU"
sequence_letters: ["L","E","F","O","U"]
hint_progression:
soft: "A est sur le LA. Cherchez les lettres, pas les notes."
medium: "Le mot est un nom (propriétaire Zone 4)."
hard: "Jouez L-E-F-O-U."
- id: PUZZLE_QR_WIN
act: 2
type: "recherche / scan"
objective: "Scanner le QR final WIN."
firmware_step: "STEP_QR_DETECTOR"
qr_payload: "WIN"
location: "Derrière le portrait aux Archives"
acts:
- act: 1
title: "Acte 1 — Stabiliser U-SON (LA 440) (≈45 min)"
goal: "Valider Étape 1 via LA 440 Hz."
- act: 2
title: "Acte 2 — Zone 4 (piano LEFOU) + Archives (QR WIN) (≈60 min)"
goal: "Valider Étape 2, puis scanner QR WIN derrière le portrait."
audio:
packs:
- pack_id: PACK_BOOT_RADIO
tracks:
- track_id: boot_intro
script_fr: >
Équipe Zacus… ici le Professeur Zacus.
Le prototype U-SON dérive. Les capteurs ne sont plus fiables.
Pour stabiliser U-SON, il vous faut une référence : le LA, quatre-cent-quarante hertz.
Rendez-vous à lAtelier des Ondes.
Gardez votre calme.
tts_prompt_excerpt: >
Voix adulte calme, rassurante, scientifique. Phrases courtes.
Effets: bip début + souffle léger + bandpass radio.
- track_id: warning_to_zone4
script_fr: >
Alerte.
Prochaine étape : Zone 4.
Les lettres sont brouillées.
Une seule est sûre : A est sur le LA.
Cinq lettres. Cinq touches.
tts_prompt_excerpt: >
Voix plus urgente mais pas anxiogène.
Effets: bips rapides dalarme, puis radio léger.
- pack_id: PACK_CONFIRM_WIN_ETAPE1
tracks:
- track_id: confirm_win1
script_fr: >
Signal stabilisé.
Étape un validée.
Liaison confirmée.
- pack_id: PACK_CONFIRM_WIN_ETAPE2
tracks:
- track_id: confirm_win2_archives
script_fr: >
Étape deux validée.
Rendez-vous aux Archives.
La clé finale est derrière le portrait.
qr:
payload: "WIN"
location: "Derrière le portrait dans la Salle des Archives"
lead_in_clue: "Regarde là où Zacus surveille toujours."