# Annexe — Scénario 1 : « Broc t'emmène ce soir »

Premier scénario complet du gabarit lebrocoli.fr. C'est une story de présentation : elle présente
Broc et le site en sept cartes verticales. Ce document est un **plan de travail** : la source
Markdown et son jumeau JSON ci-dessous sont prêts à copier dans `examples/scenario-lebrocoli/` quand
la phase P16 (plan 14, IA5) sera ouverte, **après accord de l'utilisateur**. Rien n'est créé hors de
`sites/plans/pages/` pour l'instant.

Références : bible de Broc (`sites/plans/pages/annexes/broc/bible.md`, notée « bible » ci-dessous),
plan 02 §3 (syntaxe commune), plan 08 §6 (`stories`), plan 09 §2 (JSON typé), plan 11 D4, D6 et D9
(`textcard`, `sprite`), plan 14 D2 à D7 et D12 (bible, attributs de scène, prompts, kit).

**Statut.** Tout ce qui n'est pas visible sur l'image de référence (personnalité, voix, décors,
personnages secondaires) reste `inferred` (bible §3 à §8). L'utilisateur a délégué ces choix le
25/10. Ils sont proposés ici et attendent sa validation.

## 1. Fiche

| Champ             | Valeur                                                                                                                                                                           |
| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Titre             | **Broc t'emmène ce soir** (4 mots, règle de la bible §12)                                                                                                                        |
| `id` du récit     | `broc-presentation` (nom de base du fichier : `broc-presentation.md`)                                                                                                            |
| Objectif          | présenter Broc (qui il est, ce qu'il fait) et lebrocoli.fr (un agenda de sorties fiable), puis envoyer vers le site                                                              |
| Public            | personnes qui découvrent lebrocoli.fr sur un réseau social, sur mobile : sorties, concerts, jazz. Débutants comme habitués (bible §3, « chaleureux et inclusif »)                |
| Format principal  | `stories` en `9:16`, 7 cartes, environ 36 s                                                                                                                                      |
| Formats dérivés   | `motion` (vidéo verticale, pont stories ⇄ motion), `toon` (pont stories → toon), `deck` (version courte en 16:9), `docs` (fiche de personnage). `book` : annexe seulement (§8.5) |
| Langues           | `fr` (langue par défaut), `en` en traduction (`broc-presentation.en.md`) ; prompts en anglais (`promptLang: en`)                                                                 |
| Gabarit de beats  | `presentation` : `hook → context → tension → payoff → call` (entrée `entry=beats` proposée au §6.3)                                                                              |
| Statut des traits | `inferred` pour la voix, les répliques et les décors ; `observed` pour l'apparence (bible §2)                                                                                    |

**Pourquoi `stories` d'abord.** Le public de lebrocoli.fr arrive par Instagram (plan 14 §2.1) : une
carte plein écran `9:16` est sa forme native. Une carte porte une seule idée, comme le veut la règle
« une réplique, une idée » de la bible (§4). Le pont stories ⇄ motion (P11) donne la vidéo verticale
depuis la même source, et le pont stories → toon (plan 14 D6) donne un webtoon court. Il n'y a donc
qu'une seule source à écrire.

## 2. Pitch

Broc, un brocoli souriant au rendu 3D doux, salue le spectateur depuis une petite scène de jardin.
Il se présente : c'est lui qui repère les bonnes sorties de la semaine et remplit l'agenda de
lebrocoli.fr. Il montre combien de sorties il a vérifiées. Puis le seul défaut de Broc apparaît :
sur un toit-terrasse, sa grande couronne cache la scène au rang de derrière. Oups. Il trouve
aussitôt la solution : au kiosque du parc, tout le monde s'assoit dans l'herbe et tout le monde
voit. Il part en courant vers le prochain concert et donne rendez-vous sur lebrocoli.fr.

L'arc tient en une phrase : **l'ami qui connaît les bons plans** (bible §3) montre qu'il est fiable,
rit de lui-même et laisse la place à tout le monde.

## 3. Découpage scène par scène

Durée totale : 5 + 6 + 6 + 5 + 5 + 3 + 6 = **36 s**. Chaque carte a un titre court (Unbounded) et
une réplique de Broc (Lexend, au plus 140 caractères, bible §10 règle 3). La voix off (`:::notes`)
est la voix de Broc. Elle sert de piste audio en `motion` et de sous-titres. En `stories`, elle
n'est pas affichée.

| #   | `id` | Beat      | Décor (`set=`)      | Pose (ligne)        | Durée | Texte à l'écran (titre)      | Réplique de Broc (bulle)                                                                   | Transition vers la suivante                |
| --- | ---- | --------- | ------------------- | ------------------- | ----- | ---------------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------ |
| 1   | `s1` | `hook`    | `set-potager-scene` | `waving` (3)        | 5 s   | Salut, moi c'est Broc        | « Salut ! Moi, c'est Broc. Je repère les bonnes sorties pour toi. »                        | coupe franche, Broc reste au même endroit  |
| 2   | `s2` | `context` | `set-bureau-broc`   | `running` (7)       | 6 s   | Ton agenda de sorties        | « Concerts, jazz, soirées : chaque semaine, je remplis l'agenda de lebrocoli.fr. »         | fondu court du décor                       |
| 3   | `s3` | `context` | `set-cave-bouquet`  | `review` (8)        | 6 s   | (chiffre : carte `stat`)     | « Heure, lieu, prix : je vérifie tout avant de te le dire. »                               | coupe franche                              |
| 4   | `s4` | `tension` | `set-toit-rosee`    | `failed` (5)        | 5 s   | Petit souci…                 | « Oups. Ma couronne cache la scène au rang de derrière. Je ne peux pas enlever ma tête. »  | coupe franche, la solution arrive aussitôt |
| 5   | `s5` | `payoff`  | `set-kiosque-tiges` | `jumping` (4)       | 5 s   | Une place pour tous          | « Au kiosque, on s'assoit dans l'herbe et tout le monde voit. Moi, je suis bien planté ! » | Broc sort par la droite                    |
| 6   | `s6` | `call`    | `set-rue-serre`     | `running-right` (1) | 3 s   | On y va ?                    | « Le prochain concert commence bientôt. Suis-moi. »                                        | Broc entre par la gauche de la carte 7     |
| 7   | `s7` | `call`    | `set-potager-scene` | `waving` (3)        | 6 s   | Rendez-vous sur lebrocoli.fr | « Toutes les dates sont sur lebrocoli.fr. Bonne soirée, et garde la tête verte ! »         | fin ; bouton d'action                      |

Contrôle des règles de la bible :

- Broc ouvre (`hook`, `waving`) et ferme (`waving`) : §10 règle 1.
- 7 scènes, la limite haute de §10 règle 1. `failed` et `jumping` une seule fois chacun : §10
  règle 7.
- `failed` (s4) est suivi de `jumping` (s5) : Broc rebondit tout de suite (§9, règle de cohérence).
- Jeux de mots végétaux : « bien planté » (s5) et « garde la tête verte » (s7), un seul par scène,
  aucun répété (§4). Le titre de s7 n'en contient pas (§12).
- Un seul point d'exclamation par réplique au plus. Pas d'émoji (§4).
- Aucune date, heure, aucun lieu ni prix écrit en dur : le seul chiffre (s3) vient des données
  (`:value`), §10 règle 2.
- Le comique de s4 porte sur Broc lui-même, pas sur le public (§3, « un peu maladroit »). Il ne
  pleure pas, sa déception reste légère (§6).
- Seul nom réel : « lebrocoli.fr » (§10 règle 5). Les lieux sont ceux du §7 de la bible, tous
  fictifs.

### 3.1 Détail par scène

**s1 — Accueil (`hook`).** Le Potager-Scène au crépuscule : guirlandes d'ampoules allumées, bancs en
bois vides, petite scène en bois au fond. Broc est au premier plan, au centre du tiers bas, et fait
un salut (`waving`, une fois, puis il tient la pose). Le titre apparaît en haut. Intention : un
visage ami dès la première seconde, pour arrêter le défilement.

**s2 — Ce qu'il fait (`context`).** Le Carnet de Broc : un coin de bureau, un grand agenda ouvert,
des billets sans texte lisible. Tempo, le métronome de bois, balance à côté de l'agenda (muet, moins
détaillé que Broc, bible §8). Broc est en `running` (concentration, travail en cours, et non une
course). Intention : lebrocoli.fr est un travail suivi, chaque semaine.

**s3 — La preuve (`context`).** La Cave du Bouquet : voûte de briques, lampes basses, piano droit.
Mila, la régisseuse, est floue au fond, près de la console (bible §8). La carte est une `textcard`
`variant=stat` : le nombre de sorties de l'agenda, compté depuis les données. Broc est en `review`
(il examine, puis il est satisfait). Intention : la fiabilité (bible §5, « Honnêteté »).

**s4 — Le contretemps (`tension`).** Le Toit de la Rosée, ciel indigo, toits fictifs. Une petite
scène au loin, des silhouettes floues de public (`public`). Broc, debout devant les chaises, joue
`failed` (un « oups » bref). Intention : rendre Broc attachant par sa maladresse (bible §3).

**s5 — La solution (`payoff`).** Le Kiosque des Tiges : kiosque rond dans un parc, public assis dans
l'herbe, vue dégagée. Broc saute de joie (`jumping`, une fois). Intention : la valeur d'inclusion
(bible §5) devient une solution concrète.

**s6 — Le départ (`call`).** La Rue de la Serre : rue piétonne de nuit, pavés, affiches sans texte
lisible. Broc court vers la droite (`running-right`, en boucle). Carte courte, de rythme.

**s7 — Le rendez-vous (`call`).** Retour au Potager-Scène, qui ferme la boucle avec s1. Broc salue
(`waving`). Le bouton d'action « Voir l'agenda » mène à `https://lebrocoli.fr`.

## 4. Source Markdown Récit complète

Fichier prévu : `examples/scenario-lebrocoli/stories/broc-presentation.md`. Comme toute source de
story, il est **exclu d'oxfmt** (CLAUDE.md, « Story sources ») : re-formater la prose casse les
directives `:::notes … :::`.

Choix de syntaxe, tous pris dans les plans :

- frontmatter **à plat** (plan 08) : `format`, `lang`, `duration`, `aspect`, `autoplay`, `data:`
  (plan 08 §1) et `cast:` (plan 14 D4) ;
- séparateurs `--- id=… beat=… cast=broc set=… pose=… prompt=…` (plan 14 D4, D12) ; `pose=` et
  `set=` sont des `id` de la bible ; `prompt=` désigne l'image de fond de la carte (décor seul,
  §6.2) ;
- `alt=` sur le séparateur décrit le fond. Les stories exigent un `alt` en mode strict (plan 08 §6).
  Le fond vient ici de `prompt=` et non de `background=` : c'est un **ajout à valider** (§9.2) ;
- `:::dialogue{cast=broc}` suit la forme du plan 14 D4. L'exemple de la bible §10 écrit `who=` : la
  forme `cast=` du plan 14 fait foi, et la bible est à aligner ;
- `:::textcard{variant=stat}` et `:value` (plan 11 D4, plan 08 §1) ; `::cta[…]{href}` (plan 08 §6) ;
- `:::notes` = voix off (plan 05, plan 02 §4).

```md
---
title: Broc t'emmène ce soir
description: Broc, le guide de sortie de lebrocoli.fr, se présente en sept cartes.
format: stories
lang: fr
duration: 5s
autoplay: true
aspect: 9:16
cast:
  - ../cast/broc/character.md
  - ../cast/decors.md
data:
  agenda: ../data/agenda.csv
---

--- id=s1 beat=hook cast=broc set=set-potager-scene pose=waving prompt=p-set-potager-scene alt="Petite scène en bois dans un jardin au crépuscule, guirlandes d'ampoules allumées, bancs vides."

# Salut, moi c'est Broc

:::dialogue{cast=broc}
Salut ! Moi, c'est Broc. Je repère les bonnes sorties pour toi.
:::

:::notes
Salut ! Moi, c'est Broc. Je repère les bonnes sorties pour toi.
:::

--- id=s2 beat=context cast=broc set=set-bureau-broc pose=running prompt=p-set-bureau-broc duration=6s alt="Coin de bureau éclairé par une lampe, grand agenda ouvert, billets de concert et petit métronome en bois."

# Ton agenda de sorties

:::dialogue{cast=broc}
Concerts, jazz, soirées : chaque semaine, je remplis l'agenda de lebrocoli.fr.
:::

:::notes
Concerts, jazz, soirées : chaque semaine, je remplis l'agenda de lebrocoli.fr.
:::

--- id=s3 beat=context cast=broc set=set-cave-bouquet pose=review prompt=p-set-cave-bouquet duration=6s alt="Club de jazz en sous-sol, voûte de briques, lampes basses, piano droit, régisseuse floue au fond."

:::textcard{variant=stat}
:value{data=agenda field=id agg=count}

sorties repérées cette semaine
:::

:::dialogue{cast=broc}
Heure, lieu, prix : je vérifie tout avant de te le dire.
:::

:::notes
Cette semaine, j'ai repéré toutes ces sorties. Heure, lieu, prix : je vérifie tout avant de te le dire.
:::

--- id=s4 beat=tension cast=broc set=set-toit-rosee pose=failed prompt=p-set-toit-rosee alt="Toit-terrasse au crépuscule sous un ciel indigo, chaises pliantes, petite scène au loin, public flou."

# Petit souci…

:::dialogue{cast=broc}
Oups. Ma couronne cache la scène au rang de derrière. Je ne peux pas enlever ma tête.
:::

:::notes
Oups. Ma couronne cache la scène au rang de derrière. Désolé ! Je ne peux pas enlever ma tête.
:::

--- id=s5 beat=payoff cast=broc set=set-kiosque-tiges pose=jumping prompt=p-set-kiosque-tiges alt="Kiosque à musique rond dans un parc le soir, public assis dans l'herbe, vue dégagée sur la scène."

# Une place pour tous

:::dialogue{cast=broc}
Au kiosque, on s'assoit dans l'herbe et tout le monde voit. Moi, je suis bien planté !
:::

:::notes
La solution ? Le kiosque. On s'assoit dans l'herbe et tout le monde voit. Moi, je suis bien planté !
:::

--- id=s6 beat=call cast=broc set=set-rue-serre pose=running-right prompt=p-set-rue-serre duration=3s alt="Rue piétonne pavée la nuit, affiches de concerts colorées sans texte lisible, lumière ambrée."

# On y va ?

:::dialogue{cast=broc}
Le prochain concert commence bientôt. Suis-moi.
:::

:::notes
Le prochain concert commence bientôt. Suis-moi.
:::

--- id=s7 beat=call cast=broc set=set-potager-scene pose=waving prompt=p-set-potager-scene duration=6s alt="La petite scène du jardin, guirlandes allumées, la nuit est tombée."

# Rendez-vous sur lebrocoli.fr

:::dialogue{cast=broc}
Toutes les dates sont sur lebrocoli.fr. Bonne soirée, et garde la tête verte !
:::

::cta[Voir l'agenda]{href=https://lebrocoli.fr}

:::notes
Toutes les dates sont sur lebrocoli.fr. Bonne soirée, et garde la tête verte !
:::
```

### 4.1 Données (`agenda.csv`, fictives)

Le chiffre de s3 se calcule à partir de ce fichier. Les noms sont en Lorem Ipsum et les lieux sont
les décors fictifs de la bible (§10 règle 5). Aucune vraie date ni aucun vrai artiste.

```csv
id,titre,date,heure,lieu,prix,acces
lorem-trio,Lorem Trio,2026-11-06,21:00,set-cave-bouquet,entrée libre,pmr
ipsum-quartet,Ipsum Quartet,2026-11-07,19:30,set-kiosque-tiges,entrée libre,pmr
dolor-duo,Dolor Duo,2026-11-08,20:00,set-toit-rosee,12 €,
```

Avec ces données, s3 affiche « 3 sorties repérées cette semaine ». Le filtre « cette semaine »
n'existe pas dans `:value` (plan 08 §1 : `agg` seulement). Le CSV ne contient donc que la semaine
publiée. Un filtre par période est une question pour `@recit/data`, pas pour ce scénario.

## 5. Jumeau JSON typé

> **Brouillon jusqu'à P16.** Le schéma `StoriesSource` (plan 09 §2.1) et les champs du scénario
> (`cast`, attributs de scène, `:::dialogue`) ne seront figés qu'en IA1 et IA2 (plan 14 §6). Cette
> forme de travail suit plan 09 §2.2 et §2.3 et plan 11 D5. Les attributs du séparateur vont dans
> `attrs`. Les champs typés de `stories` (`duration`, `cta`) sont sortis des attributs. Les blocs
> transverses restent des directives dans `body` (règle B2). **Point ouvert** : `cast` n'a pas
> encore de champ dans `StorySource`. Il est placé dans `settings` (réglages à plat du frontmatter)
> en attendant IA1.

Fichier prévu : `examples/scenario-lebrocoli/stories/broc-presentation.json` en `kind: "story"`,
pour le test `compile(md) == compile(toJson(md))` (plan 09 §2.4). En pratique,
`recit convert --to json` le produit à partir du `.md` : on n'en garde pas deux à la main.

```json
{
  "$schema": "https://recit.dev/schema/v1/stories.json",
  "kind": "story",
  "version": 1,
  "format": "stories",
  "meta": {
    "title": "Broc t'emmène ce soir",
    "description": "Broc, le guide de sortie de lebrocoli.fr, se présente en sept cartes.",
    "lang": "fr"
  },
  "settings": {
    "duration": "5s",
    "autoplay": true,
    "aspect": "9:16",
    "cast": ["../cast/broc/character.md", "../cast/decors.md"]
  },
  "data": { "agenda": "../data/agenda.csv" },
  "scenes": [
    {
      "id": "s1",
      "attrs": {
        "beat": "hook",
        "cast": "broc",
        "set": "set-potager-scene",
        "pose": "waving",
        "prompt": "p-set-potager-scene",
        "alt": "Petite scène en bois dans un jardin au crépuscule, guirlandes d'ampoules allumées, bancs vides."
      },
      "body": "# Salut, moi c'est Broc\n\n:::dialogue{cast=broc}\nSalut ! Moi, c'est Broc. Je repère les bonnes sorties pour toi.\n:::",
      "notes": "Salut ! Moi, c'est Broc. Je repère les bonnes sorties pour toi."
    },
    {
      "id": "s2",
      "duration": "6s",
      "attrs": {
        "beat": "context",
        "cast": "broc",
        "set": "set-bureau-broc",
        "pose": "running",
        "prompt": "p-set-bureau-broc",
        "alt": "Coin de bureau éclairé par une lampe, grand agenda ouvert, billets de concert et petit métronome en bois."
      },
      "body": "# Ton agenda de sorties\n\n:::dialogue{cast=broc}\nConcerts, jazz, soirées : chaque semaine, je remplis l'agenda de lebrocoli.fr.\n:::",
      "notes": "Concerts, jazz, soirées : chaque semaine, je remplis l'agenda de lebrocoli.fr."
    },
    {
      "id": "s3",
      "duration": "6s",
      "attrs": {
        "beat": "context",
        "cast": "broc",
        "set": "set-cave-bouquet",
        "pose": "review",
        "prompt": "p-set-cave-bouquet",
        "alt": "Club de jazz en sous-sol, voûte de briques, lampes basses, piano droit, régisseuse floue au fond."
      },
      "body": ":::textcard{variant=stat}\n:value{data=agenda field=id agg=count}\n\nsorties repérées cette semaine\n:::\n\n:::dialogue{cast=broc}\nHeure, lieu, prix : je vérifie tout avant de te le dire.\n:::",
      "notes": "Cette semaine, j'ai repéré toutes ces sorties. Heure, lieu, prix : je vérifie tout avant de te le dire."
    },
    {
      "id": "s4",
      "attrs": {
        "beat": "tension",
        "cast": "broc",
        "set": "set-toit-rosee",
        "pose": "failed",
        "prompt": "p-set-toit-rosee",
        "alt": "Toit-terrasse au crépuscule sous un ciel indigo, chaises pliantes, petite scène au loin, public flou."
      },
      "body": "# Petit souci…\n\n:::dialogue{cast=broc}\nOups. Ma couronne cache la scène au rang de derrière. Je ne peux pas enlever ma tête.\n:::",
      "notes": "Oups. Ma couronne cache la scène au rang de derrière. Désolé ! Je ne peux pas enlever ma tête."
    },
    {
      "id": "s5",
      "attrs": {
        "beat": "payoff",
        "cast": "broc",
        "set": "set-kiosque-tiges",
        "pose": "jumping",
        "prompt": "p-set-kiosque-tiges",
        "alt": "Kiosque à musique rond dans un parc le soir, public assis dans l'herbe, vue dégagée sur la scène."
      },
      "body": "# Une place pour tous\n\n:::dialogue{cast=broc}\nAu kiosque, on s'assoit dans l'herbe et tout le monde voit. Moi, je suis bien planté !\n:::",
      "notes": "La solution ? Le kiosque. On s'assoit dans l'herbe et tout le monde voit. Moi, je suis bien planté !"
    },
    {
      "id": "s6",
      "duration": "3s",
      "attrs": {
        "beat": "call",
        "cast": "broc",
        "set": "set-rue-serre",
        "pose": "running-right",
        "prompt": "p-set-rue-serre",
        "alt": "Rue piétonne pavée la nuit, affiches de concerts colorées sans texte lisible, lumière ambrée."
      },
      "body": "# On y va ?\n\n:::dialogue{cast=broc}\nLe prochain concert commence bientôt. Suis-moi.\n:::",
      "notes": "Le prochain concert commence bientôt. Suis-moi."
    },
    {
      "id": "s7",
      "duration": "6s",
      "cta": { "label": "Voir l'agenda", "href": "https://lebrocoli.fr" },
      "attrs": {
        "beat": "call",
        "cast": "broc",
        "set": "set-potager-scene",
        "pose": "waving",
        "prompt": "p-set-potager-scene",
        "alt": "La petite scène du jardin, guirlandes allumées, la nuit est tombée."
      },
      "body": "# Rendez-vous sur lebrocoli.fr\n\n:::dialogue{cast=broc}\nToutes les dates sont sur lebrocoli.fr. Bonne soirée, et garde la tête verte !\n:::",
      "notes": "Toutes les dates sont sur lebrocoli.fr. Bonne soirée, et garde la tête verte !"
    }
  ]
}
```

Remarques sur le jumeau :

- `body`, `notes`, `alt` et `cta.label` sont localisables (plan 09 §2.3). La version anglaise passe
  par `broc-presentation.en.md` ou par un compagnon `broc-presentation.en.json` (`kind: "sidecar"`)
  qui ne contient que ces champs, par `id` de scène.
- `beat`, `cast`, `set`, `pose`, `prompt`, `duration` et `href` ne se traduisent jamais. Les images
  sont partagées entre les langues (plan 14 D5).
- `alt` reste dans `attrs` faute d'un champ typé. S'il est retenu (§9.2), il deviendra un champ
  `alt` localisable de la scène `stories`, comme pour `toon`.

## 6. Données d'images : décors, beats, prompts

### 6.1 Principe de composition

**Aucune pose nouvelle n'est à générer.** Les six poses utilisées (`waving`, `running`, `review`,
`failed`, `jumping`, `running-right`) sont des lignes de la planche `codex-pet-v1` déjà prévue par
D12. Broc est rendu **par-dessus** le fond, par le bloc `sprite` en animation ou par `SpriteImage`
en image fixe (plan 11 D9). Il ne reste donc à générer que **les six décors, vides de Broc**. Ce
choix garantit que Broc a exactement la même apparence sur toutes les cartes, sans dérive d'un
modèle d'image à l'autre.

Chaque fond laisse **le tiers bas central libre** (Broc s'y place) et **le tiers haut calme** (titre
et bulle). Lumière de soirée chaude, mais sans dominante verte, pour que le vert de Broc reste
intact (bible §7).

Les deux visuels composés du §6.5 (couverture et cases de toon) sont les seuls à inclure Broc. Ils
passent toujours `reference.png` comme image de référence.

### 6.2 Entrées de décor (`cast/decors.md`, extrait)

Une bible à plusieurs entrées `entry=set` (plan 14 D2). Les textes sont en français (localisables),
le `:::identity` d'un décor est en anglais (langue des prompts). Tout est `inferred`.

```md
---
title: Décors de lebrocoli.fr
kind: bible
lang: fr
bible:
  promptLang: en
  beats: presentation
---

--- id=set-potager-scene entry=set

## Le Potager-Scène

Petite scène en plein air dans un jardin, guirlandes d'ampoules, bancs en bois.

:::traits
- time: crépuscule puis nuit {inferred}
- light: guirlandes d'ampoules chaudes, ciel bleu profond {inferred}
- palette: sky=#1b2440, lights=#f4c46b, wood=#8a5a3b {inferred}
- props: petite scène en bois, bancs, guirlandes, plates-bandes {inferred}
:::

::shot[Large, la scène au fond, premier plan dégagé]{id=wide}

--- id=set-bureau-broc entry=set

## Le Carnet de Broc

Coin de bureau avec un grand agenda ouvert et des billets sans texte lisible.

:::traits
- time: soir {inferred}
- light: lampe de bureau ambrée {inferred}
- props: agenda ouvert, billets vierges, crayon, métronome en bois {inferred}
:::

::shot[Moyen, plongée douce sur le bureau]{id=medium}

--- id=set-cave-bouquet entry=set

## La Cave du Bouquet

Club de jazz en sous-sol voûté, briques, lampes basses, piano droit.

:::traits
- time: nuit {inferred}
- light: lampes basses ambrées, halos doux {inferred}
- palette: brick=#7a3e2b, lamp=#f2b45a, shadow=#1d1414 {inferred}
- props: piano droit, console de régie, tabourets {inferred}
:::

::shot[Moyen, piano à gauche, voûte au-dessus]{id=medium}

--- id=set-toit-rosee entry=set

## Le Toit de la Rosée

Toit-terrasse au crépuscule, vue sur des toits fictifs, ciel indigo.

:::traits
- time: crépuscule {inferred}
- light: ciel indigo, petites lampes {inferred}
- palette: sky=#2b2a5c, glow=#e9a86a {inferred}
- props: chaises pliantes, petite scène au loin, toits sans monument {inferred}
:::

::shot[Large, rangées de chaises vers la scène]{id=wide}

--- id=set-kiosque-tiges entry=set

## Le Kiosque des Tiges

Kiosque à musique dans un parc, scène ronde, public assis dans l'herbe.

:::traits
- time: soir {inferred}
- light: ampoules du kiosque, dernière lueur du jour {inferred}
- props: kiosque rond, pelouse, public en silhouettes {inferred}
:::

::shot[Large, kiosque au centre, pelouse au premier plan]{id=wide}

--- id=set-rue-serre entry=set

## La Rue de la Serre

Rue piétonne de nuit, affiches de concerts sans texte lisible, pavés.

:::traits
- time: nuit {inferred}
- light: réverbères ambrés, reflets sur les pavés {inferred}
- props: affiches colorées sans texte, pavés, vitrines éteintes {inferred}
:::

::shot[Large, la rue fuit vers la droite]{id=wide}
```

### 6.3 Gabarit de beats `presentation`

Les deux gabarits livrés en P16 (`three-act`, `hook-tension-payoff`) n'ont ni `context` ni `call`.
Ce gabarit reprend le squelette de la bible §10. C'est une donnée, à placer dans `cast/decors.md` ou
dans une bible `cast/beats.md` :

```md
--- id=presentation entry=beats

1. hook — Broc salue et se présente
2. context — ce que fait lebrocoli.fr, avec une preuve tirée des données
3. tension — un petit contretemps, toujours aux dépens de Broc
4. payoff — la solution, joyeuse
5. call — le rendez-vous et le bouton d'action
```

### 6.4 Prompts des décors (`entry=prompt`)

Ce sont des prompts **décrits en données** (plan 14 D2, D7). Le texte final est dérivé par Récit
(gabarit `generic`), sans fournisseur imposé. Chacun se génère en `1080×1920` ou plus, au format
`9:16`.

**Point de schéma à trancher en IA1.** Dans D3, `subject` est obligatoire pour `entry=prompt`. Une «
plaque » de décor n'a pas de sujet. Proposition : rendre `subject` facultatif quand
`output.background` vaut `scene`, ce qui est noté ci-dessous par l'absence de `subject=`. L'autre
solution serait `subject=set-…`, mais elle mélange deux types d'entrées.

```md
--- id=p-set-potager-scene entry=prompt set=set-potager-scene shot=wide aspect=9:16

Empty small wooden open-air stage in a garden at dusk, warm string lights glowing, empty wooden
benches, flower beds. Lower center third left clear and uncluttered for a character to be added
later. Calm upper third of sky for overlaid titles.

--- id=p-set-bureau-broc entry=prompt set=set-bureau-broc shot=medium aspect=9:16

Cozy desk corner in the evening under an amber desk lamp, a large open planner with blank pages,
a few blank concert tickets, a small wooden metronome with a gentle, friendly look. Lower center
third clear. No writing on any page or ticket.

--- id=p-set-cave-bouquet entry=prompt set=set-cave-bouquet shot=medium aspect=9:16

Underground jazz club with a vaulted brick ceiling, low amber lamps, an upright piano on the left,
a sound desk in the far background with one simplified out-of-focus stage manager in plain dark
grey clothes and headphones around her neck. Lower center third clear. Upper third dark and calm.

--- id=p-set-toit-rosee entry=prompt set=set-toit-rosee shot=wide aspect=9:16

Rooftop terrace at dusk under an indigo sky, rows of folding chairs facing a small distant stage,
a blurred faceless audience, fictional rooftops with no recognizable landmark. Lower center third
clear, in front of the first row of chairs.

--- id=p-set-kiosque-tiges entry=prompt set=set-kiosque-tiges shot=wide aspect=9:16

Round music bandstand in a park in the evening, warm bulbs on the bandstand, an audience of
blurred faceless silhouettes sitting on the grass with an open view of the stage. Lower center
third of lawn clear.

--- id=p-set-rue-serre entry=prompt set=set-rue-serre shot=wide aspect=9:16

Pedestrian cobblestone street at night, amber street lamps reflecting on the cobbles, colorful
concert posters with abstract shapes only, no readable text, the street receding to the right.
Lower center third clear.
```

Bloc de style commun, ajouté en tête de chaque prompt de décor (entrée `entry=style`, proposée sous
l'`id` `soft-3d-evening`) :

```text
Soft expressive 3D render in the style of a family animated film, soft diffuse lighting, warm
evening palette of amber and indigo, gentle depth of field, no forced perspective.
```

Négatif commun des décors (`avoid`), dérivé de la bible §2.5 et §7 :

```text
text, letters, numbers, logo, watermark, signature, readable signs, real landmarks, real
buildings, recognizable real places, humanized vegetables or fruits, broccoli, green color cast,
detailed faces in the crowd, alcohol bottles in focus
```

« broccoli » est exclu des décors pour qu'aucun second brocoli n'apparaisse avant que Broc ne soit
posé par-dessus. Pour la même raison, la mascotte plate du site est absente (bible §2.5).

### 6.5 Visuels composés avec Broc (couverture et toon)

Ces images incluent Broc. Elles suivent le gabarit de scène de la bible §11.3 et le négatif §11.4
(sans smoking, sans casquette, sans nœud papillon, sans accessoire), avec **`reference.png` toujours
jointe**.

```md
--- id=p-cover-potager entry=prompt subject=broc set=set-potager-scene shot=wide pose=waving aspect=9:16

Broc stands in the foreground of the garden stage at dusk and waves at the viewer with one mitten
hand, friendly closed-mouth smile.

--- id=p-toon-toit-oups entry=prompt subject=broc set=set-toit-rosee shot=medium pose=failed aspect=4:5

Broc stands in front of a row of folding chairs, his large floret crown blocking the view of the
blurred audience behind him; he looks back over his shoulder with a light, sheepish "oops"
expression, eyebrows slightly raised, no teeth.

--- id=p-toon-kiosque-joie entry=prompt subject=broc set=set-kiosque-tiges shot=wide pose=jumping aspect=4:5

Broc jumps with joy on the lawn in front of the bandstand, both mitten hands up, the seated
audience behind him with a clear view of the stage.
```

Texte complet dérivé pour `p-cover-potager` (donné pour la relecture ; Récit le produit à l'octet
près par `recit prompts build`) :

```text
Friendly smiling broccoli character, soft expressive 3D render in the style of a family
animated film. Large rounded broccoli crown of dense green florets growing from the top of
the head, about one third of total height, wider than the shoulders, with branching stems
visible under it. Pear-shaped light leaf-green face, small rounded ears, big round eyes with
cream whites, nearly black irises and a white highlight, thick dark green sculpted eyebrows,
small round button nose, gentle closed-mouth smile with dimples. Slim tubular stem-like body,
thin arms with rounded four-fingered mitten hands, short thick legs with rounded feet. Matte
velvety soft-vinyl skin, single green palette (skin #7aac3d, crown #508132, brows #2a4a18).
No clothing, no accessories. Same face, proportions, crown, colors, materials and 3D style as
the canonical reference image.
Pose: waving at the viewer with one mitten hand. Setting: small wooden open-air garden stage at
dusk, warm string lights, empty wooden benches. Warm evening lighting that keeps the
character's greens unchanged. Character is the clear focal point, other figures simpler and
less detailed. Vertical 9:16, wide shot.
Negative: tuxedo, bow tie, cap, hat, glasses, headphones, clothing, shoes, gloves, jewelry,
accessories, held objects, musical instrument in hand, black outline, flat 2D, cel shading,
pixel art, changed face, changed eye color, teeth, angry expression, extra limbs, extra fingers,
other humanized vegetables, text, letters, numbers, logo, watermark, signature
Reference image: cast/broc/reference.png (canonical)
```

### 6.6 Enregistrement et provenance

Pour chaque image générée hors de Récit :
`recit assets register stories/img/<fichier> --prompt <id>` écrit `<fichier>.json` (`kind: "asset"`,
`origin: "ai"`, `tool` et `model` tels que l'auteur les déclare, `references` :
`["cast/broc/reference.png"]` pour les visuels composés, `aiGenerated: true`). Tant qu'une image
manque, Récit affiche une **image de remplacement** (plan 14 D7) : le scénario se lit de bout en
bout sans aucune image générée, et un build `--strict` le refuse.

## 7. Rendu de Broc sur les cartes

| Carte | Pose            | Lecture (D12)   | En image fixe (export PNG, `prefers-reduced-motion`) |
| ----- | --------------- | --------------- | ---------------------------------------------------- |
| s1    | `waving`        | une fois, tenue | dernière image de la ligne 3 (main levée)            |
| s2    | `running`       | boucle          | image 0 de la ligne 7                                |
| s3    | `review`        | boucle          | image 0 de la ligne 8                                |
| s4    | `failed`        | une fois, tenue | dernière image de la ligne 5                         |
| s5    | `jumping`       | une fois, tenue | image du sommet du saut (à choisir sur la planche)   |
| s6    | `running-right` | boucle          | image 0 de la ligne 1                                |
| s7    | `waving`        | une fois, tenue | dernière image de la ligne 3                         |

Le plan 11 D9 prévoit l'image 0 d'`idle` par défaut pour l'image fixe. Pour `waving`, `failed` et
`jumping`, l'image 0 ne montre pas l'émotion. Ce scénario demande donc un attribut `still=` (indice
d'image) sur `SpriteImage`, à valider avec IM4. Sans lui, la carte fixe montre l'image 0.

## 8. Déclinaisons dans les autres formats

### 8.1 `motion` (vidéo verticale) : oui, sans réécriture

`recit render stories/broc-presentation.md --as motion --aspect 9:16` (pont stories ⇄ motion, P11).

- `:::notes` devient la **voix off** (`voiceover`, plan 05) et les sous-titres. La voix de Broc est
  enregistrée par une personne, ou synthétisée hors de Récit avec sa provenance. Une voix de
  synthèse prend la mention IA, comme les images.
- Le sprite est animé selon les durées de D12. s1 et s7 jouent `waving` une fois puis tiennent ; s6
  boucle `running-right` pendant 3 s.
- s3 : la `textcard` `stat` devient le bloc `stat` d'emaki, avec son compteur animé de 0 au résultat
  de `:value` (plan 11 D4).
- Les titres deviennent des blocs `title`. Les bulles `:::dialogue` deviennent un bloc `statement`
  ou un sous-titre (plan 14 D6).
- Transitions : celles du tableau du §3, prises dans les transitions existantes du moteur motion.
  Aucune nouvelle transition n'est demandée. La sortie de s5 par la droite et l'entrée de s7 par la
  gauche se font par un déplacement du sprite, pas par un effet de montage.

### 8.2 `toon` (webtoon court) : oui, 4 cases

Pont stories → toon (plan 14 D6, plus tard) : une carte = une case. Pour un webtoon, on garde
seulement les quatre cartes qui racontent quelque chose (s1, s4, s5, s7). Les cases utilisent des
**visuels composés** (§6.5), car `toon` affiche une image par case et n'a pas de calque de sprite.

```md
---
title: Broc t'emmène ce soir
format: toon
lang: fr
width: 800
cast:
  - ../cast/broc/character.md
  - ../cast/decors.md
---

--- id=p1 cast=broc set=set-potager-scene pose=waving prompt=p-cover-potager alt="Broc, un brocoli souriant, salue depuis une petite scène de jardin au crépuscule."

:::bubble{x=50% y=12% tail=bottom}
Salut ! Moi, c'est Broc. Je repère les bonnes sorties pour toi.
:::

--- id=p2 cast=broc set=set-toit-rosee pose=failed prompt=p-toon-toit-oups alt="Sur un toit-terrasse, la grande couronne de Broc cache la scène au public assis derrière lui."

:::caption
Un soir, sur le Toit de la Rosée…
:::

:::bubble{x=40% y=10% tail=bottom-right}
Oups. Je ne peux pas enlever ma tête.
:::

--- id=p3 cast=broc set=set-kiosque-tiges pose=jumping prompt=p-toon-kiosque-joie alt="Broc saute de joie devant un kiosque à musique, le public assis dans l'herbe voit la scène."

:::bubble{x=55% y=10% tail=bottom-left shape=shout}
Au kiosque, tout le monde voit !
:::

--- id=p4 cast=broc set=set-potager-scene pose=waving prompt=p-cover-potager alt="Broc salue de nouveau depuis la scène du jardin, la nuit tombée."

:::caption
Toutes les dates sont sur lebrocoli.fr.
:::
```

`prompt=` remplace ici `src=` : l'asset enregistré pour ce prompt devient l'image de la case (plan
14 D4). En attendant, `src=` peut pointer vers le fichier généré.

### 8.3 `deck` (version courte, 16:9) : oui, pour une présentation en public

Utile pour présenter lebrocoli.fr en réunion ou à un partenaire. La même histoire tient en quatre
slides, et `:::notes` devient les notes de l'orateur. Broc y apparaît en image fixe (`SpriteImage`,
plus tard hors v1 dans le deck selon plan 11 D6) ou par le visuel composé `p-cover-potager`.

```md
---
title: Broc t'emmène ce soir
format: deck
aspectRatio: 16:9
lang: fr
---

--- layout=cover id=d1

# Broc t'emmène ce soir

### Le guide de sortie de lebrocoli.fr

::image{src=./img/cover-potager.webp alt="Broc, un brocoli souriant au rendu 3D doux, salue depuis une petite scène de jardin." fit=contain}

:::notes
Broc est le guide de sortie de lebrocoli.fr : il repère les concerts, le jazz et les soirées.
:::

--- id=d2

## Ce que fait Broc

- Il repère les sorties de la semaine
- Il vérifie heure, lieu et prix
- Il signale l'entrée libre et l'accès PMR

--- type=stat id=d3

# :value{data=agenda field=id agg=count}

sorties repérées cette semaine

--- layout=section id=d4

# Rendez-vous sur lebrocoli.fr
```

Le frontmatter du deck doit aussi déclarer `data: agenda: ../data/agenda.csv` pour `d3`.

### 8.4 `docs` : la fiche de Broc

Ce n'est pas une déclinaison du récit, mais son complément naturel : la page « bible » de
`examples/scenario-lebrocoli` montre `CharacterSheet` (Broc), `SetCard` pour les six décors et
`PromptCard` pour les prompts du §6, et intègre la story par `<StoryEmbed>` (plan 14 D6).

### 8.5 `book` : non, sauf l'annexe

Une story de 36 s n'a pas la matière d'un chapitre. Le seul usage utile est l'annexe `back: [cast]`
(« Dramatis personae ») d'un futur livre de lebrocoli.fr, tirée de la bible et non de ce récit.
Aucune source `book` n'est donc proposée.

## 9. Points d'attention

### 9.1 Accessibilité

- **Textes alternatifs** : un `alt` par fond (dans la source, §4), un `alt` par case de toon (§8.2),
  un `alt` pour la couverture du deck. Le sprite de Broc reçoit un `alt` dérivé de la bible : «
  Broc, un brocoli souriant » suivi du texte de la `::pose` (par exemple « Broc, un brocoli
  souriant, salue de la main »). Un fond purement décoratif garde quand même son `alt` : le mode
  strict des stories l'exige.
- **Le texte reste du texte** : titres, bulles et chiffres sont rendus en HTML par le format, jamais
  dans l'image (bible §10 règle 8). Ils sont lisibles par un lecteur d'écran, traduisibles et
  indexés par la recherche.
- **Lecture** : `autoplay: true` avec pause au tap et au clavier (`TapZones`, plan 08 §6). En
  `prefers-reduced-motion`, les sprites restent fixes (§7) et la lecture automatique se met en pause
  sur chaque carte.
- **Contraste** : les fonds sont sombres en haut (consigne des prompts) pour un titre clair. Le lint
  de contraste de `textcard` (plan 11 D8, plus tard) vérifiera le seuil WCAG AA. D'ici là, on ajoute
  `overlay` (plan 08 §6) sur une carte si la relecture le demande.
- **Sous-titres** : en `motion`, la voix off est toujours sous-titrée (texte de `:::notes`).
- **Durées** : 5 à 6 s par carte, environ 80 caractères de réplique, soit une lecture confortable.
  s6 (3 s) n'a que 46 caractères.

### 9.2 Ajouts à la syntaxe que ce scénario suppose

À trancher en IA1 et IA2. Aucun n'est utilisé en silence : sans décision, `recit validate` doit
lever une erreur explicite.

1. `alt=` sur le séparateur d'une scène `stories` qui tire son fond de `prompt=` (le plan 08 ne
   prévoit `alt` que pour `background=` image).
2. `cast` dans le JSON : champ de `settings` ou champ de haut niveau de `StorySource`.
3. `subject` facultatif pour une plaque de décor (`entry=prompt` sans personnage).
4. `still=` sur `SpriteImage` pour choisir l'image d'une pose en image fixe.
5. `:::dialogue{cast=…}` est marqué « plus tard » dans le plan 14 D6. Tant qu'il n'existe pas, une
   variante livrable en P16 remplace chaque bulle par `:::textcard{variant=quote}` suivi de la ligne
   `— Broc` (plan 11 D4). La bible §10 écrit `{who=broc}` : à aligner sur `cast=`.

### 9.3 Mention IA et provenance

- Chaque fond et chaque visuel composé est `aiGenerated: true` avec son fichier de provenance
  (§6.6). La planche de Broc l'est aussi (D12).
- La mention « généré par IA » apparaît dans les métadonnées publiées **et** dans l'attribution
  visible (plan 14 §5.1). Pour les stories, réglage proposé : `scenario.aiLabel: inline`, une petite
  mention en bas de chaque carte dont l'image est générée. Le mode `credits` (mention sur la seule
  dernière carte) ne suffit pas pour une story qu'on partage carte par carte.
- Une voix de synthèse éventuelle en `motion` suit la même règle.
- La conformité à l'article 50 de l'AI Act reste à faire relire (plan 14 §5.1).

### 9.4 Fidélité au personnage

- Ni smoking, ni nœud papillon, ni casquette, ni aucun accessoire, ni objet tenu, sur aucune image
  (bible §1 et §2.5). Le négatif du §6.5 les exclut explicitement.
- Broc n'est jamais un aliment : pas de blague de cuisine (bible §6). Le seul ressort comique est sa
  couronne (s4).
- La mascotte plate de lebrocoli.fr n'apparaît dans aucune image avec Broc (bible §2.5).
- La lumière des décors ne doit pas teinter le vert de Broc. Comme Broc est posé en sprite, ses
  couleurs sont celles de la planche. Si la relecture le juge trop « collé », on ajoute une ombre de
  contact sous ses pieds (`#e6e2cc` adoucie, bible §2.3), et non une recoloration.

### 9.5 Risques et dépendances

- **Netteté du sprite** : une case de `192×208` affichée sur une carte `1080×1920` sera floue
  au-delà d'environ deux fois sa taille (plan 11 D9). La taille réelle se mesurera sur les goldens.
  Si elle ne suffit pas, les cartes passent aux visuels composés (§6.5), avec un prompt par carte.
- **Bloqué par la licence** : `reference.png` et la planche n'entrent dans l'exemple public qu'une
  fois leur auteur et leur licence donnés par l'utilisateur (bible §14). D'ici là : images de
  remplacement.
- **Polices** : Unbounded (titres) et Lexend (texte), OFL, servies localement avec leur `OFL.txt` et
  une ligne NOTICE (bible §12). Monument Extended n'entre jamais dans le dépôt.
- **Phase** : `stories` arrive en P11, le scénario (`cast:`, `pose=`, `prompt=`) en P16. Avant P16,
  ce document se lit comme une spécification, pas comme un exemple compilable.

## 10. Checklist de mise en œuvre (P16, après accord)

1. Copier la source (§4) dans `examples/scenario-lebrocoli/stories/broc-presentation.md`, les
   données (§4.1) dans `data/agenda.csv`, et les décors et les beats (§6.2, §6.3) dans
   `cast/decors.md`.
2. `recit convert stories/broc-presentation.md --to json` et comparer avec le §5.
3. `recit prompts build stories/broc-presentation.md` : relire les six prompts de décor et les trois
   visuels composés.
4. Générer hors de Récit, puis `recit assets register` pour chaque image.
5. `recit validate --strict` : aucune référence inconnue, aucun `alt` manquant, aucune image sans
   provenance, aucun trait `inferred` restant (à valider par l'utilisateur d'abord).
6. Traduire en `broc-presentation.en.md` (mêmes `id`, mêmes images) et lancer `recit i18n check`.
7. `recit export --to images` (7 PNG `1080×1920`) et `recit render --as motion` : relecture par
   l'utilisateur.
