# Annexe — Scénario 5 : « Du jazz dans l'herbe », trois cartes pour les réseaux

Scénario complet et documenté pour **Broc** (bible : `annexes/broc/bible.md`). Il illustre la règle
de Récit **« écrire une fois, raconter partout »** : une seule source Markdown, trois cartes
animées, rendues en `stories` (9:16, tap), en vidéo verticale `motion` (MP4) et en PNG pour les
réseaux, sans réécrire une ligne.

**Statut.** Proposition du 25/10/2026, faite sur délégation de l'utilisateur (« je te laisse tout
décider »). Tout ce qui touche la personnalité, la voix, les décors et les personnages secondaires
reste **`inferred`** (bible, en-tête). Le jumeau JSON, les attributs de scène communs et le bloc
`sprite` sont des **formes de travail, en brouillon jusqu'à P16** (plan 14 D3, D4, D12 ; plan 11
D9). Rien ici n'est du code ; les prompts sont des données. Lieux, artiste et événement sont
fictifs.

## 1. Fiche

| Champ            | Valeur                                                                                                                                                                         |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Titre            | **Du jazz dans l'herbe**                                                                                                                                                       |
| Identifiant      | `jeudi-kiosque` (nom de base des fichiers, plan 09 §1)                                                                                                                         |
| Objectif         | annoncer un concert de plein air fictif en trois cartes, et montrer qu'une source unique donne la story, la vidéo et les images, avec les infos tirées des données             |
| Public           | abonnés de lebrocoli.fr sur les réseaux (stories, reels, shorts) : sortants de 20 à 40 ans, habitués comme débutants ; second public : auteurs qui découvrent Récit            |
| Format source    | `stories` (une scène = une carte plein écran 9:16)                                                                                                                             |
| Formats dérivés  | `motion` par le pont stories ⇄ motion (P11) ; PNG `1080×1920` par `recit export --to images` (ST3) ; `toon` par le pont stories → toon (plus tard) ; `docs` par `<StoryEmbed>` |
| Gabarit de beats | `hook-tension-payoff` (livré en P16, plan 14 D2)                                                                                                                               |
| Personnages      | Broc (`cast=broc`) ; le Public (`id=public`) en silhouettes floues, carte 3 seulement                                                                                          |
| Décors           | `set-kiosque-tiges` (cartes 1 et 3), `set-bureau-broc` (carte 2) : décors du §7 de la bible                                                                                    |
| Poses            | `waving`, `review`, `jumping` (planche `codex-pet-v1` existante) ; `idle` image 0 pour `prefers-reduced-motion`                                                                |
| Durée            | 5 s + 6 s + 5 s = **16 s**                                                                                                                                                     |
| Langues          | `fr` (source), `en` (traduction de même structure, §6.1)                                                                                                                       |

**Pourquoi `stories` comme source, et pas `motion` ?** La carte est l'unité naturelle d'une
publication réseau : on la lit au tap, on l'exporte en PNG un par un, et le pont stories ⇄ motion
existe déjà dans le plan 08 (§0, P11). Écrire en `motion` aurait donné la vidéo, mais pas les cartes
tapables ni les PNG sans conversion. Une source `stories` donne les trois sorties : c'est la
démonstration de la règle.

**Pourquoi trois cartes ?** C'est le minimum d'un récit de la bible (§10, règle 1 : 3 à 7 scènes) et
le maximum qu'on regarde jusqu'au bout sur un réseau. Chaque carte doit aussi tenir seule, car elle
sera publiée en PNG isolé (une annonce, une fiche pratique, un appel).

## 2. Pitch

Broc a repéré un trio de jazz qui joue en plein air, au Kiosque des Tiges. Il te salue depuis le
kiosque (carte 1), vérifie dans son carnet la date, l'heure et le lieu (carte 2), puis saute de joie
en annonçant le tarif et t'invite à venir tôt (carte 3). Toutes les infos pratiques viennent du
fichier de données de l'agenda : si une valeur change, les trois sorties changent ensemble.

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

| Carte | `id`        | Beat      | Décor (`set=`)      | Pose      | Texte à l'écran                                                                    | Voix off (réplique de Broc, `:::notes`)                                                 | Durée | Transition vers la suivante                                     |
| ----- | ----------- | --------- | ------------------- | --------- | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | ----- | --------------------------------------------------------------- |
| 1     | `c1-salut`  | `hook`    | `set-kiosque-tiges` | `waving`  | titre « Du jazz dans l'herbe » ; ligne « :value artiste, en plein air »            | « Salut ! Cette semaine, le jazz sort du sous-sol. Je t'ai gardé une place. » (75 car.) | 5 s   | stories : avance au tap ou à la fin ; motion : coupe franche    |
| 2     | `c2-carnet` | `tension` | `set-bureau-broc`   | `review`  | carte de chiffres (`textcard variant=stat`) : date, heure, lieu, tous en `:value`  | « Je vérifie mon carnet… Date, heure, lieu : tout est bien planté. » (66 car.)          | 6 s   | stories : avance ; motion : coupe franche                       |
| 3     | `c3-viens`  | `payoff`  | `set-kiosque-tiges` | `jumping` | grand chiffre : tarif en `:value` ; ligne « Viens tôt » ; bouton « Voir l'agenda » | « C'est confirmé ! Viens à la fraîche, l'herbe se remplit vite. » (63 car.)             | 5 s   | fin : la story se ferme, la vidéo tient la dernière image 0,5 s |

Détail de chaque carte :

1. **`c1-salut` (hook).** Plan moyen sur le kiosque au crépuscule, guirlandes allumées, scène ronde
   vide. Broc entre déjà en place, en bas à gauche du cadre (zone sûre), et joue `waving` une fois
   (4 images, 700 ms) puis tient l'image finale. Le titre apparaît en Unbounded 700 dans le tiers
   haut, la ligne d'artiste en Lexend dessous. Émotion : accueil chaleureux. Pas de jeu de mots.
2. **`c2-carnet` (tension).** Gros plan sur le coin de bureau : agenda ouvert, billets sans texte
   lisible, Tempo le métronome en arrière-plan (accessoire de décor, muet). Broc en bas à droite
   joue `review` en boucle (6 images, 1 180 ms). La tension est douce : « est-ce que tout est
   confirmé ? ». La carte `stat` révèle les trois lignes l'une après l'autre (temps d'apparition du
   bloc). Jeu de mots : « bien planté ».
3. **`c3-viens` (payoff).** Plan large sur le kiosque, le Public en silhouettes floues assis dans
   l'herbe, le trio suggéré sur scène (instruments dans le décor, jamais tenus par Broc). Broc au
   centre bas joue `jumping` une fois (5 images, 840 ms) puis tient. Le tarif s'affiche en grand, «
   Viens tôt » dessous, bouton en bas. Jeu de mots : « à la fraîche ». Un seul `jumping` dans le
   récit, aucun `failed` (bible §9, règle 7).

Contrôles de la bible : Broc ouvre (`waving`) et ferme (bible §10, règle 1) ; une réplique ≤ 140
caractères ; au plus un point d'exclamation par réplique ; un jeu de mots au plus par scène, aucun
répété ; aucune date, heure, aucun lieu ni prix dans la voix off (règle 2 : ils restent à l'écran,
tirés des données) ; aucun texte dans les images générées.

## 4. Fichiers proposés

Emplacement proposé dans le gabarit (plan 14 §4.3, `examples/scenario-lebrocoli`, **après accord**
de l'utilisateur). Ce document ne crée aucun de ces fichiers.

```text
examples/scenario-lebrocoli/
  cast/broc/character.md         # bible de Broc (plan 14 D12, réécrite d'après la bible annexe)
  cast/sets.md                   # décors du §7 de la bible (entrées entry=set), §5.1 ci-dessous
  cast/prompts-jeudi-kiosque.md  # prompts de ce scénario (entrées entry=prompt), §8
  data/agenda.csv                # agenda fictif, §5.2
  stories/jeudi-kiosque.md       # source du récit, §5.3
  stories/jeudi-kiosque.json     # jumeau JSON typé, §7
  stories/jeudi-kiosque.en.md    # traduction anglaise, même structure, §6.1
  assets/plates/*.webp (+ .json) # images générées hors de Récit et leur provenance (kind: asset)
```

## 5. Source Markdown Récit (complète, prête à copier)

Rappel : les sources de récit ne passent **jamais** par oxfmt (bible §10, règle 11 ; CLAUDE.md).

### 5.1 Les deux décors (`cast/sets.md`, extrait)

Les décors existent dans la bible (§7) sous forme de tableau ; ils deviennent ici des entrées typées
(plan 14 D2). Les autres décors du §7 suivent le même modèle.

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

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

## Le Kiosque des Tiges

Un kiosque à musique rond dans un parc fictif, où l'on écoute assis dans l'herbe. {inferred}

:::identity
Round wooden and wrought-iron music bandstand in a quiet fictional park, small circular stage
under a domed roof, strings of warm bulbs hanging from the roof edge, soft lawn around it, a few
trees, no recognizable landmark, no signage, no text.
:::

:::traits
- time: dusk, then early night {inferred}
- light: warm amber bulbs, indigo sky {inferred}
- ambience: distant double bass, crickets, low chatter {inferred}
- palette: sky=#2b2f5c, bulbs=#f2b85b, lawn=#3f5a3a
- props: string lights, music stands, a double bass on its side, picnic blankets
:::

::shot[Medium, bandstand in the upper half, empty lawn in front]{id=medium}
::shot[Wide, bandstand far, blurred seated crowd in the foreground]{id=wide}

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

## Le Carnet de Broc

Le coin de bureau où Broc prépare l'agenda des sorties. {inferred}

:::identity
Cozy corner of a wooden desk at night, a large open planner with blank pages, a few concert
tickets with no readable text, a small warm desk lamp, a wooden metronome in the background,
no text, no logo.
:::

:::traits
- time: night {inferred}
- light: warm desk lamp, soft falloff {inferred}
- palette: wood=#8a5a3b, lamp=#f6d08a, paper=#f2eee5
- props: open planner, tickets, desk lamp, metronome (Tempo, scenery only)
:::

::shot[Close, planner open in the lower half, lamp on the left]{id=close}
```

Les couleurs de palette des décors sont des propositions (`inferred` au niveau du décor) : elles ne
touchent jamais les verts de Broc (bible §7, règles de décor).

### 5.2 Les données (`data/agenda.csv`)

Toutes les valeurs sont fictives. Une seule ligne sert ce récit.

```csv
id,artiste,date,heure,lieu,tarif,acces
evt-lorem-01,Trio Lorem Ipsum,2026-11-12,20:30,Kiosque des Tiges,Entrée libre,Accès de plain-pied
```

### 5.3 Le récit (`stories/jeudi-kiosque.md`)

```md
---
title: Du jazz dans l'herbe
description: Trois cartes pour annoncer un concert de plein air, avec Broc
format: stories
lang: fr
cast:
  - ../cast/broc/character.md
  - ../cast/sets.md
  - ../cast/prompts-jeudi-kiosque.md
data:
  agenda: ../data/agenda.csv
duration: 5s
autoplay: true
aspect: 9:16
---

--- id=c1-salut beat=hook cast=broc set=set-kiosque-tiges shot=medium pose=waving prompt=p-plate-kiosque-medium alt="Un kiosque à musique rond au crépuscule, guirlandes allumées, pelouse vide. Broc, un brocoli souriant, fait signe de la main."

# Du jazz dans l'herbe

:value{data=agenda field=artiste where="id=evt-lorem-01" agg=last}, en plein air

:::notes
Salut ! Cette semaine, le jazz sort du sous-sol. Je t'ai gardé une place.
:::

--- id=c2-carnet beat=tension cast=broc set=set-bureau-broc shot=close pose=review prompt=p-plate-bureau-close duration=6s alt="Un agenda ouvert sur un bureau en bois, sous une lampe chaude. Broc, un brocoli souriant, relit les informations."

:::textcard{variant=stat}
- :value{data=agenda field=date where="id=evt-lorem-01" agg=last format=date}
- :value{data=agenda field=heure where="id=evt-lorem-01" agg=last format=time}
- :value{data=agenda field=lieu where="id=evt-lorem-01" agg=last}
:::

:::notes
Je vérifie mon carnet… Date, heure, lieu : tout est bien planté.
:::

--- id=c3-viens beat=payoff cast=broc set=set-kiosque-tiges shot=wide pose=jumping prompt=p-plate-kiosque-wide alt="Le kiosque de nuit vu de loin, un public flou assis dans l'herbe. Broc, un brocoli souriant, saute de joie."

# :value{data=agenda field=tarif where="id=evt-lorem-01" agg=last}

Viens tôt.

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

:::notes
C'est confirmé ! Viens à la fraîche, l'herbe se remplit vite.
:::
```

Ce que fait chaque élément :

| Élément                                 | Rôle ici                                                                                       | Source                        |
| --------------------------------------- | ---------------------------------------------------------------------------------------------- | ----------------------------- |
| `format: stories`, `duration`, `aspect` | format source, durée par défaut d'une carte, cadre 9:16                                        | plan 08 §6                    |
| `cast:` (liste)                         | bibles chargées : personnage, décors, prompts. Active le plugin des attributs communs          | plan 14 D4                    |
| `data: agenda`                          | source nommée de `@recit/data`, validée au build                                               | plan 08 §1                    |
| `beat=`                                 | temps narratif du gabarit `hook-tension-payoff` ; métadonnée sans effet de rendu               | plan 14 D4                    |
| `cast=broc pose=…`                      | Broc et sa ligne de planche ; rendu par le bloc `sprite` (animé) ou `SpriteImage` (fixe)       | plan 14 D12, plan 11 D9       |
| `set=`, `shot=`                         | décor et cadrage, vérifiés contre `cast/sets.md`                                               | plan 14 D4                    |
| `prompt=`                               | image de fond de la carte : l'asset enregistré pour ce prompt, sinon une image de remplacement | plan 14 D4, D7                |
| `alt=`                                  | texte alternatif de la carte (fond et personnage), traduisible                                 | plan 08 §6 (règle `alt`), §2  |
| `duration=6s`                           | la carte 2 dure plus longtemps (trois lignes à lire)                                           | plan 08 §6                    |
| `:value{… where … agg=last}`            | une valeur de la ligne `evt-lorem-01`, jamais écrite en dur                                    | plan 08 §1, plan 12 (`where`) |
| `:::textcard{variant=stat}`             | carte de chiffres, lignes révélées l'une après l'autre                                         | plan 11 D4                    |
| `::cta[…]{href}`                        | bouton d'action en bas de la carte                                                             | plan 08 §6                    |
| `:::notes`                              | voix off de Broc : sous-titre en stories, `voiceover` en motion                                | plan 02 §4, plan 05 V5        |

## 6. Déclinaison dans les formats

### 6.1 Autre langue (`stories/jeudi-kiosque.en.md`)

Même structure, mêmes `id` de scène et mêmes attributs structurels (`recit i18n check`). Seuls le
texte, `alt` et la voix off changent ; images, prompts et sprite sont partagés (plan 09 §1, plan 14
D5). Le jeu de mots est adapté, pas traduit mot à mot (bible §4 : répliques dans la langue du
récit).

```md
---
title: Jazz on the grass
description: Three cards to announce an open-air concert, with Broc
format: stories
lang: en
cast:
  - ../cast/broc/character.md
  - ../cast/sets.md
  - ../cast/prompts-jeudi-kiosque.md
data:
  agenda: ../data/agenda.csv
duration: 5s
autoplay: true
aspect: 9:16
---

--- id=c1-salut beat=hook cast=broc set=set-kiosque-tiges shot=medium pose=waving prompt=p-plate-kiosque-medium alt="A round bandstand at dusk, string lights on, an empty lawn. Broc, a smiling broccoli, waves hello."

# Jazz on the grass

:value{data=agenda field=artiste where="id=evt-lorem-01" agg=last}, outdoors

:::notes
Hi! This week, jazz leaves the basement. I saved you a seat.
:::

--- id=c2-carnet beat=tension cast=broc set=set-bureau-broc shot=close pose=review prompt=p-plate-bureau-close duration=6s alt="An open planner on a wooden desk under a warm lamp. Broc, a smiling broccoli, reads the details."

:::textcard{variant=stat}
- :value{data=agenda field=date where="id=evt-lorem-01" agg=last format=date}
- :value{data=agenda field=heure where="id=evt-lorem-01" agg=last format=time}
- :value{data=agenda field=lieu where="id=evt-lorem-01" agg=last}
:::

:::notes
Let me check my planner… Date, time, place: all firmly rooted.
:::

--- id=c3-viens beat=payoff cast=broc set=set-kiosque-tiges shot=wide pose=jumping prompt=p-plate-kiosque-wide alt="The bandstand at night seen from afar, a blurred crowd sitting on the grass. Broc, a smiling broccoli, jumps for joy."

# :value{data=agenda field=tarif where="id=evt-lorem-01" agg=last}

Come early.

::cta[See the events]{href=https://lebrocoli.fr}

:::notes
It's on! Come while it's fresh, the lawn fills up fast.
:::
```

Les valeurs texte de `agenda.csv` (« Entrée libre », lieu) sont en français : la version anglaise
demande soit une colonne localisée (`tarif_en`), soit un compagnon `agenda.en.csv`. Point ouvert,
§10.

### 6.2 `stories` (format source)

- Lecteur `StoryPlayer` : trois barres de progression, tap à droite pour avancer, à gauche pour
  revenir, appui long pour mettre en pause. Lecture auto (`autoplay: true`).
- Chaque carte superpose trois couches : le fond (`prompt=`, image du décor sans personnage), le
  sprite de Broc (`cast=broc pose=…`) dans la zone sûre, puis le texte (titre en Unbounded, corps en
  Lexend, bible §12). La voix off s'affiche en sous-titre si le son est coupé (`MuteToggle`).
- `recit export --to images stories/jeudi-kiosque.md` : trois PNG `1080×1920`, un par carte, avec le
  sprite en image fixe (`SpriteImage`, dernière image tenue de la pose) et le dernier état révélé de
  la `textcard`. Ce sont les trois publications réseau autonomes.

### 6.3 `motion` (vidéo verticale, pont stories ⇄ motion)

`recit render stories/jeudi-kiosque.md --as motion` donne un MP4 vertical de 16 s. Correspondance
(plan 08 §0, pont P11 ; plan 11 D6) :

| Stories                     | Motion                                                                                                                 |
| --------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| carte                       | plan 9:16, longueur = `duration` de la carte (5 s, 6 s, 5 s)                                                           |
| `prompt=` (fond)            | image de fond du plan, légère poussée de caméra si le thème le prévoit                                                 |
| `cast=broc pose=…`          | bloc `sprite` : `waving` et `jumping` une fois puis tenus, `review` en boucle (plan 14 D12)                            |
| `# titre` + paragraphe      | bloc `title` (H1 → `text`, paragraphe → `kicker`)                                                                      |
| `:::textcard{variant=stat}` | bloc `textcard`, lignes révélées en temps d'apparition                                                                 |
| `:::notes`                  | `voiceover` du plan (sous-titres brûlés ou piste, selon le rendu)                                                      |
| `::cta`                     | **à trancher** en ST2 : libellé fixe « lebrocoli.fr » en fin de plan, ou erreur explicite (pas de clic dans une vidéo) |

Transitions : aucun attribut `transition=` n'existe dans le registre (plan 02 §3, règle B4). Le
scénario demande des **coupes franches** entre les plans, ce qui est le défaut ; si un fondu devient
nécessaire, il passe par le thème motion, pas par un nouvel attribut de scène.

### 6.4 `toon` (plus tard, pont stories → toon)

Pont prévu par le plan 14 D6 : une carte = une case, `image` → `src`, titre → `:::caption`,
`:::dialogue` → bulle empilée. Pour ce récit, les cases utilisent les **images fixes avec Broc**
(prompts `p-still-*`, §8.3), car un webtoon n'anime pas le sprite. Sortie attendue du pont :

```md
--- id=c1-salut src=../assets/stills/c1-salut.webp alt="Un kiosque à musique rond au crépuscule, guirlandes allumées. Broc, un brocoli souriant, fait signe de la main."

:::caption
Du jazz dans l'herbe.
:::

:::bubble{x=60% y=14% tail=bottom-left} Salut ! Cette semaine, le jazz sort du sous-sol. :::
```

Le pont lit `:::dialogue`, pas `:::notes` : tant que `:::dialogue` n'est pas livré (plan 14 D6, «
plus tard »), la conversion de ce récit en toon reste manuelle.

### 6.5 `docs`, `deck`, `book`

- **`docs`** (a du sens) : la page `docs.recit.dev/scenario/…` qui explique « écrire une fois,
  raconter partout » intègre la story par `<StoryEmbed>`, avec la source dépliable à côté et la
  vidéo issue du même fichier. C'est l'usage pédagogique principal de ce scénario.
- **`deck`** (peu de sens) : il n'existe pas de pont stories → deck et trois cartes réseau ne font
  pas une présentation. Usage acceptable : une slide `layout=cover` d'un deck sur Récit qui intègre
  la story en composant MDX, sans conversion.
- **`book`** (pas de sens) : rien à raconter en chapitre. Broc peut figurer dans l'annexe « Dramatis
  personae » d'un livre via le pont bible → book, indépendamment de ce récit.

## 7. Jumeau JSON typé (`stories/jeudi-kiosque.json`)

**Forme de travail, brouillon jusqu'à P16.** Elle suit `StorySource` (plan 09 §2.2), les champs
typés de `stories` (plan 09 §2.3 : `duration`, `cta`) et les attributs communs du plan 14 D4 rangés
dans `attrs`. Les directives de bloc (`:::textcard`, `:value`) restent dans `body` (règle B2). Les
deux langues sont regroupées dans un seul fichier par valeurs `Localized`, ce qui remplace
`jeudi-kiosque.en.md` si l'on choisit le JSON comme source.

Points non fixés par les plans, à trancher en P16 : l'emplacement de `cast` (champ de premier niveau
ici, ni `settings` ni `meta`) et le `notes` des stories (affiché en sous-titre ; en motion il
devient `voiceover`).

```json
{
  "$schema": "https://recit.dev/schema/v1/stories.json",
  "kind": "story",
  "version": 1,
  "format": "stories",
  "meta": {
    "title": { "fr": "Du jazz dans l'herbe", "en": "Jazz on the grass" },
    "description": {
      "fr": "Trois cartes pour annoncer un concert de plein air, avec Broc",
      "en": "Three cards to announce an open-air concert, with Broc"
    },
    "lang": "fr"
  },
  "settings": { "duration": "5s", "autoplay": true, "aspect": "9:16" },
  "cast": [
    "../cast/broc/character.md",
    "../cast/sets.md",
    "../cast/prompts-jeudi-kiosque.md"
  ],
  "data": { "agenda": "../data/agenda.csv" },
  "scenes": [
    {
      "id": "c1-salut",
      "attrs": {
        "beat": "hook",
        "cast": "broc",
        "set": "set-kiosque-tiges",
        "shot": "medium",
        "pose": "waving",
        "prompt": "p-plate-kiosque-medium",
        "alt": {
          "fr": "Un kiosque à musique rond au crépuscule, guirlandes allumées, pelouse vide. Broc, un brocoli souriant, fait signe de la main.",
          "en": "A round bandstand at dusk, string lights on, an empty lawn. Broc, a smiling broccoli, waves hello."
        }
      },
      "body": {
        "fr": "# Du jazz dans l'herbe\n\n:value{data=agenda field=artiste where=\"id=evt-lorem-01\" agg=last}, en plein air",
        "en": "# Jazz on the grass\n\n:value{data=agenda field=artiste where=\"id=evt-lorem-01\" agg=last}, outdoors"
      },
      "notes": {
        "fr": "Salut ! Cette semaine, le jazz sort du sous-sol. Je t'ai gardé une place.",
        "en": "Hi! This week, jazz leaves the basement. I saved you a seat."
      }
    },
    {
      "id": "c2-carnet",
      "duration": "6s",
      "attrs": {
        "beat": "tension",
        "cast": "broc",
        "set": "set-bureau-broc",
        "shot": "close",
        "pose": "review",
        "prompt": "p-plate-bureau-close",
        "alt": {
          "fr": "Un agenda ouvert sur un bureau en bois, sous une lampe chaude. Broc, un brocoli souriant, relit les informations.",
          "en": "An open planner on a wooden desk under a warm lamp. Broc, a smiling broccoli, reads the details."
        }
      },
      "body": ":::textcard{variant=stat}\n- :value{data=agenda field=date where=\"id=evt-lorem-01\" agg=last format=date}\n- :value{data=agenda field=heure where=\"id=evt-lorem-01\" agg=last format=time}\n- :value{data=agenda field=lieu where=\"id=evt-lorem-01\" agg=last}\n:::",
      "notes": {
        "fr": "Je vérifie mon carnet… Date, heure, lieu : tout est bien planté.",
        "en": "Let me check my planner… Date, time, place: all firmly rooted."
      }
    },
    {
      "id": "c3-viens",
      "attrs": {
        "beat": "payoff",
        "cast": "broc",
        "set": "set-kiosque-tiges",
        "shot": "wide",
        "pose": "jumping",
        "prompt": "p-plate-kiosque-wide",
        "alt": {
          "fr": "Le kiosque de nuit vu de loin, un public flou assis dans l'herbe. Broc, un brocoli souriant, saute de joie.",
          "en": "The bandstand at night seen from afar, a blurred crowd sitting on the grass. Broc, a smiling broccoli, jumps for joy."
        }
      },
      "body": {
        "fr": "# :value{data=agenda field=tarif where=\"id=evt-lorem-01\" agg=last}\n\nViens tôt.",
        "en": "# :value{data=agenda field=tarif where=\"id=evt-lorem-01\" agg=last}\n\nCome early."
      },
      "cta": {
        "label": { "fr": "Voir l'agenda", "en": "See the events" },
        "href": "https://lebrocoli.fr"
      },
      "notes": {
        "fr": "C'est confirmé ! Viens à la fraîche, l'herbe se remplit vite.",
        "en": "It's on! Come while it's fresh, the lawn fills up fast."
      }
    }
  ]
}
```

Remarques sur la forme :

- `attrs` est typé `Record<string, string | number | boolean>` dans le plan 09 §2.2 : un `alt`
  localisé (objet) n'y entre pas. Deux sorties possibles en P16 : un champ typé `alt` des scènes
  `stories` (comme `toon`), ou un compagnon `jeudi-kiosque.en.json` qui remplace `attrs.alt` par
  `id`. La première est recommandée (même règle que `toon`, plan 09 §2.3).
- Le `::cta` du Markdown devient le champ typé `cta` : l'équivalence
  `compile(md) == compile(toJson(md))` doit le prévoir (plan 09 §2.4).

## 8. Prompts d'images (données, sans fournisseur imposé)

Aucune nouvelle pose : les trois poses viennent de la planche `codex-pet-v1` déjà décrite (bible §9,
§11.5). Les images nouvelles sont les **plaques de décor** (fond des cartes, sans personnage) et,
pour le toon, trois **images fixes avec Broc**. Toutes se génèrent **hors de Récit**, avec
`reference.png` joint pour celles qui montrent Broc. Prompts en anglais (`promptLang: en`).

### 8.1 Entrées `entry=prompt` (`cast/prompts-jeudi-kiosque.md`)

```md
---
title: Prompts — Du jazz dans l'herbe
kind: bible
lang: fr
bible:
  promptLang: en
---

--- id=p-plate-kiosque-medium entry=prompt subject=set-kiosque-tiges set=set-kiosque-tiges shot=medium aspect=9:16

Empty bandstand at dusk, string lights just turned on, music stands on the stage, empty lawn in
front, lower left third kept clear for a character overlay.

--- id=p-plate-bureau-close entry=prompt subject=set-bureau-broc set=set-bureau-broc shot=close aspect=9:16

Open planner with blank pages under a warm desk lamp, concert tickets with no readable text,
wooden metronome in soft focus behind, lower right third kept clear for a character overlay,
upper half calm and dark enough for overlaid text.

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

Bandstand at night seen from afar, three blurred musicians suggested on stage, a blurred seated
crowd on the grass in the foreground seen from behind, lower centre kept clear for a character
overlay.

--- id=p-still-c1-salut entry=prompt subject=broc set=set-kiosque-tiges shot=medium pose=waving aspect=9:16

Broc stands on the lawn in front of the empty bandstand and waves hello to the viewer.

--- id=p-still-c2-carnet entry=prompt subject=broc set=set-bureau-broc shot=close pose=review aspect=9:16

Broc leans over the open planner and reads it carefully, then looks satisfied.

--- id=p-still-c3-viens entry=prompt subject=broc set=set-kiosque-tiges shot=wide pose=jumping aspect=9:16

Broc jumps for joy on the lawn, the blurred seated crowd and the bandstand behind him.
```

`subject=` vise ici un décor pour les plaques : le plan 14 D3 rend `subject` obligatoire et pense à
un personnage. Une plaque sans personnage demande soit `subject` facultatif, soit qu'un décor soit
un sujet valide. Point ouvert, §10.

### 8.2 Texte dérivé des plaques (gabarit `generic`)

Le texte suit le gabarit déterministe du plan 14 D7 : identité du style, décor, cadrage, action,
`avoid`. Pas d'identité de Broc dans les plaques (il est ajouté par le sprite).

```text
[p-plate-kiosque-medium]
Soft 3D render in the style of a family animated film, soft diffuse lighting, no outlines.
Setting: Round wooden and wrought-iron music bandstand in a quiet fictional park, small circular
stage under a domed roof, strings of warm bulbs hanging from the roof edge, soft lawn around it,
a few trees, no recognizable landmark, no signage, no text.
Shot: Medium, bandstand in the upper half, empty lawn in front. Vertical 9:16.
Action: Empty bandstand at dusk, string lights just turned on, music stands on the stage, empty
lawn in front, lower left third kept clear for a character overlay.
Light: warm amber bulbs, indigo sky.
Avoid: characters, people in focus, vegetables, text, letters, numbers, logo, watermark,
signature, real landmarks.
```

```text
[p-plate-bureau-close]
Soft 3D render in the style of a family animated film, soft diffuse lighting, no outlines.
Setting: Cozy corner of a wooden desk at night, a large open planner with blank pages, a few
concert tickets with no readable text, a small warm desk lamp, a wooden metronome in the
background, no text, no logo.
Shot: Close, planner open in the lower half, lamp on the left. Vertical 9:16.
Action: Open planner with blank pages under a warm desk lamp, concert tickets with no readable
text, wooden metronome in soft focus behind, lower right third kept clear for a character overlay,
upper half calm and dark enough for overlaid text.
Avoid: characters, hands, handwriting, text, letters, numbers, logo, watermark, signature.
```

```text
[p-plate-kiosque-wide]
Soft 3D render in the style of a family animated film, soft diffuse lighting, no outlines.
Setting: Round wooden and wrought-iron music bandstand in a quiet fictional park, small circular
stage under a domed roof, strings of warm bulbs hanging from the roof edge, soft lawn around it,
a few trees, no recognizable landmark, no signage, no text.
Shot: Wide, bandstand far, blurred seated crowd in the foreground. Vertical 9:16.
Action: Bandstand at night seen from afar, three blurred musicians suggested on stage, a blurred
seated crowd on the grass in the foreground seen from behind, lower centre kept clear for a
character overlay.
Avoid: identifiable faces, vegetables, text, letters, numbers, logo, watermark, signature, real
landmarks.
```

La plaque doit laisser libre la zone où le sprite se pose (« kept clear ») : c'est ce qui permet
d'animer Broc par-dessus sans retoucher l'image.

### 8.3 Texte dérivé des images fixes avec Broc (toon, gabarit de la bible §11.3)

`{identity}` est recopié **mot pour mot** depuis la bible §11.1 ; `{avoid}` est la liste du §11.4.
Référence jointe : `cast/broc/reference.png` (obligatoire).

```text
[p-still-c1-salut]
{identity}
Pose: waving hello with one mitten hand raised, the other arm relaxed, warm smile, looking at the
viewer. Setting: round bandstand in a quiet fictional park at dusk, warm string lights, empty
lawn. Shot: medium, vertical 9:16, character in the lower left third. Warm evening lighting that
keeps the character's greens unchanged. Character is the clear focal point, other figures simpler
and less detailed.
Negative: {avoid}
```

```text
[p-still-c2-carnet]
{identity}
Pose: leaning slightly forward over an open planner on a desk, reading attentively, eyebrows
lightly raised, satisfied closed-mouth smile; the planner lies on the desk, not held. Setting:
cozy wooden desk corner at night, warm desk lamp, tickets with no readable text, wooden metronome
in the background. Shot: close, vertical 9:16, character in the lower right third. Warm evening
lighting that keeps the character's greens unchanged.
Negative: {avoid}
```

```text
[p-still-c3-viens]
{identity}
Pose: joyful jump, both feet off the ground, both arms up, big closed-mouth smile. Setting:
lawn in front of a round bandstand at night, warm string lights, blurred seated crowd seen from
behind, three blurred musicians suggested on stage. Shot: wide, vertical 9:16, character in the
lower centre. Warm evening lighting that keeps the character's greens unchanged. Character is
the clear focal point, other figures simpler and less detailed.
Negative: {avoid}
```

Après génération : `recit assets register <image> --prompt <id>` écrit la provenance (`kind: asset`,
`origin: ai`, `aiGenerated: true`, `references: ["cast/broc/reference.png"]` pour les images avec
Broc, plan 14 D7). Relecture humaine obligatoire : aucun vêtement, aucun accessoire, aucun texte,
verts inchangés (bible §2.5).

## 9. Points d'attention

### 9.1 Accessibilité

- **Textes alternatifs.** Chaque carte porte un `alt` qui décrit le fond **et** Broc (fournis en fr
  et en en, §5.3, §6.1). Ils ne répètent pas le texte à l'écran, qui est déjà du texte HTML. En
  `--strict`, une carte sans `alt` est une erreur (plan 08 §6).
- **Texte réel, jamais dans l'image.** Titres, chiffres et bouton sont du texte rendu par le format
  (lisible par les lecteurs d'écran, traduisible) ; les images ne contiennent aucune lettre.
- **Mouvement réduit.** Avec `prefers-reduced-motion`, le sprite affiche une image fixe (image 0
  d'`idle`, plan 11 D9) et la `textcard` montre ses trois lignes d'un coup ; la lecture auto
  s'arrête, l'avance se fait au tap ou au clavier.
- **Temps de lecture.** 5 s pour un titre et une ligne, 6 s pour trois lignes : à vérifier avec la
  règle de densité de `@recit/core` ; l'utilisateur peut mettre en pause (appui long, espace).
- **Contraste.** Texte clair sur la partie haute sombre des plaques ; `overlay` (dégradé) si une
  plaque est trop claire. Le lint de contraste de `textcard` (WCAG AA) est prévu plus tard (plan
  11).
- **Vidéo.** La voix off (`:::notes`) donne les sous-titres du MP4 ; la vidéo ne dépend jamais du
  son pour transmettre une info pratique, puisque date, heure, lieu et tarif sont à l'écran.

### 9.2 Mention IA et provenance

- Les plaques, les images fixes et la planche de sprite sont générées par IA : chacune a son fichier
  de provenance `kind: asset` avec `aiGenerated: true` (plan 14 D7, D12).
- Mention visible « Généré par IA » dans tous les formats publics (plan 14 §5.1, décision du 24/10)
  : en `stories`, petite mention en bas de chaque carte (`scenario.aiLabel: inline`) car chaque
  carte part seule en PNG ; en `motion`, la même mention en surimpression discrète sur toute la
  durée et dans les métadonnées du MP4. La mention apparaît aussi dans la légende de publication sur
  les réseaux.
- Les manifestes C2PA éventuels des images d'entrée ne sont pas retirés.
- **Publication bloquée** tant que l'auteur et la licence de `reference.png` manquent (bible §1,
  §14) : sans eux, ni la planche ni les images avec Broc ne sortent d'un build local.

### 9.3 Fidélité à la bible

- Broc n'a **ni smoking, ni nœud papillon, ni casquette**, ni aucun vêtement ou accessoire, dans
  aucune image (bible §2.5). Les instruments restent dans le décor, jamais dans ses mains.
- La mascotte plate de lebrocoli.fr n'apparaît pas dans ces cartes (bible §1).
- Pas d'alcool comme argument de sortie, pas de blague sur le fait d'être mangé (bible §6).
- Le seul nom réel est « lebrocoli.fr » (lien du bouton) ; artiste et lieu sont fictifs.

## 10. Points ouverts

| Point                                                                                                                      | Proposition                                                                                       | Propriétaire           |
| -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------- |
| `:value` est défini pour des **nombres** (plan 08 §1) ; ici il lit du texte, une date et une heure (`format=date`, `time`) | étendre `:value` aux champs texte avec `agg=last`, et ajouter `format=date` / `time` (via `Intl`) | plan 08, `@recit/data` |
| `where=` n'est proposé que par le plan 12 (DI5)                                                                            | le réutiliser tel quel pour `:value` dans tous les formats                                        | plan 12                |
| valeur absente dans les données                                                                                            | erreur au build (champ inconnu) ; valeur vide : afficher « Info à venir », jamais une invention   | plan 08                |
| `subject` obligatoire dans `entry=prompt` (plan 14 D3) alors qu'une plaque n'a pas de personnage                           | accepter un décor comme `subject`, ou rendre `subject` facultatif                                 | plan 14 (P16)          |
| `alt` localisé hors de `attrs` en JSON                                                                                     | champ typé `alt` des scènes `stories`, comme `toon`                                               | plan 09 (P16)          |
| place de `cast` dans le JSON                                                                                               | champ de premier niveau `cast`                                                                    | plan 14 (P16)          |
| `::cta` en `motion`                                                                                                        | libellé fixe en fin de plan, ou erreur explicite                                                  | plan 08 (ST2)          |
| données texte en anglais (`Entrée libre`)                                                                                  | compagnon `agenda.en.csv` résolu comme un asset localisé (plan 09 §1)                             | plan 09                |
| syntaxe de réplique : la bible écrit `:::dialogue{who=broc}`, le plan 14 D4 `:::dialogue{cast=broc}`                       | garder `cast=` (plan 14) et corriger le squelette de la bible §10                                 | bible, plan 14         |
| ~~plan 14 D12 et plan 11 §2.4 décrivent encore smoking et casquette~~ — corrigés le 25/10                                  | réécrits d'après la bible §2 et §11 ; plan 14 D13 enregistre la décision                          | fait                   |
