# Annexe — Scénario 4 : « Premières notes », Broc présente un atelier (deck)

Scénario complet d'un **deck de 9 slides** où Broc présente un atelier fictif organisé par
lebrocoli.fr. Il applique strictement la bible (`annexes/broc/bible.md`) : Broc n'a **ni smoking, ni
casquette, ni aucun vêtement ou accessoire**, les lieux et les personnes sont fictifs, et les infos
pratiques viennent des données. Ce document est une source de travail : rien n'est encore dans
`examples/`. Le schéma de la bible et les attributs de scène (`cast=`, `pose=`…) arrivent en P16
(plan 14, IA2) ; d'ici là, tout ce qui en dépend est marqué **brouillon jusqu'à P16**.

**Statut.** Le scénario, le texte et l'atelier sont des propositions `inferred` (l'utilisateur a
délégué ces choix le 25/10). Seul « lebrocoli.fr » est un nom réel ; « Premières notes », le Trio
Lorem, Mila, Tempo et les décors sont fictifs (bible §5 à §8).

## 1. Fiche

| Champ            | Valeur                                                                                                                                                                                                                                           |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Titre            | **Premières notes** (≤ 5 mots, bible §12)                                                                                                                                                                                                        |
| Événement        | atelier d'écoute jazz pour débutants, organisé par lebrocoli.fr, suivi d'un mini-concert du Trio Lorem. Au Kiosque des Tiges, repli à la Cave du Bouquet en cas de pluie                                                                         |
| Objectif         | donner envie de venir à quelqu'un qui n'ose pas « le jazz », lui donner toutes les infos pratiques, obtenir une inscription                                                                                                                      |
| Public           | adultes curieux de musique live, débutants ; présenté en salle (projection) ou partagé en ligne ; lecteurs de lebrocoli.fr                                                                                                                       |
| Format principal | **`deck`** (`16:9`) : c'est le seul format livré aujourd'hui (P1), il a des notes de présentation (`:::notes` = voix de Broc), un jumeau JSON déjà typé (`DeckSourceSchema`) et un export PDF. Il sert aussi d'annonce projetée avant un concert |
| Formats dérivés  | `stories` (6 cartes `9:16` pour les réseaux), `motion` (film court avec la voix off), `toon` (4 cases, la séquence de la pluie). `calendar` porte l'événement lui-même. `book` : pas de déclinaison utile (§8)                                   |
| Beats            | `hook → context → tension → payoff → call` (gabarit `hook-tension-payoff` étendu de la bible §10)                                                                                                                                                |
| Poses            | 8 des 9 lignes de `codex-pet-v1` : `waving`, `waiting`, `running`, `idle`, `review`, `failed`, `jumping`, `running-right`. `running-left` n'est pas utilisée                                                                                     |
| Durée            | environ 6 minutes en présentation orale ; environ 75 s en film (§8.2)                                                                                                                                                                            |

## 2. Pitch

Le jazz intimide : on ne sait pas quoi écouter ni quand applaudir. Broc, le guide de sortie de
lebrocoli.fr, propose une réponse simple : un samedi après-midi au Kiosque des Tiges, on écoute
trois morceaux courts, on apprend à reconnaître la contrebasse, la batterie et le piano, puis le
Trio Lorem joue pour de vrai. Un seul suspense : la pluie. Broc a un plan B, la Cave du Bouquet, et
l'atelier est maintenu quoi qu'il arrive. Il finit par donner les infos pratiques (y compris celle
qu'il n'a pas encore) et donne rendez-vous.

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

Une slide = une scène. Les répliques de Broc sont dans `:::notes` (voix off en motion, sous-titre en
stories). Durées en présentation orale ; transition `fade` par défaut (réglage du deck), `slide`
seulement pour l'élan de la slide 8. Les jeux de mots végétaux (au plus un par scène, jamais deux
fois le même, bible §4) sont soulignés dans la colonne « Réplique ».

| #   | `id`          | Beat      | Texte à l'écran                                                                   | Réplique de Broc (`:::notes`)                                                                   | Pose            | Décor (`set=`)      | Layout                 | Durée | Transition |
| --- | ------------- | --------- | --------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | --------------- | ------------------- | ---------------------- | ----- | ---------- |
| 1   | `ouverture`   | `hook`    | « Premières notes » / « Un atelier d'écoute jazz, ouvert à tous »                 | Salut ! Samedi, on apprend à écouter le jazz ensemble. Je t'ai gardé une place.                 | `waving`        | `set-kiosque-tiges` | `image` (plein cadre)  | 30 s  | `fade`     |
| 2   | `question`    | `hook`    | « Le jazz t'intimide ? » + une phrase                                             | Toi aussi, tu as déjà applaudi au mauvais moment ? Moi oui. Personne ne m'en a voulu.           | `waiting`       | `set-toit-rosee`    | `image-right`          | 45 s  | `fade`     |
| 3   | `programme`   | `context` | « Le programme » + 3 puces (écouter, reconnaître, vivre)                          | Je prépare le programme depuis des semaines, <u>ça pousse</u> bien. Tempo garde le rythme.      | `running`       | `set-bureau-broc`   | `image-left`           | 60 s  | `fade`     |
| 4   | `equipe`      | `context` | « Avec qui ? » + 3 puces (Broc, Mila, Trio Lorem)                                 | Mila s'occupe du son, le Trio Lorem joue. Moi, je t'explique tout, sans jargon.                 | `idle`          | `set-cave-bouquet`  | `image-right`          | 45 s  | `fade`     |
| 5   | `places`      | `context` | chiffre : nombre de places (donnée), « places, inscription gratuite », source     | Les places sont comptées. Inscris-toi tôt, c'est gratuit.                                       | `review`        | `set-bureau-broc`   | `center` + `type=stat` | 30 s  | `fade`     |
| 6   | `pluie`       | `tension` | « Et s'il pleut ? » + une phrase                                                  | Oups. Ma couronne adore la pluie, les contrebasses beaucoup moins.                              | `failed`        | `set-kiosque-tiges` | `image-left`           | 30 s  | `fade`     |
| 7   | `plan-b`      | `payoff`  | « Plan B : à l'abri » + lieu de repli (donnée) + « même heure, même programme »   | On passe à l'abri et l'atelier est maintenu ! On reste <u>bien planté</u> sur la date.          | `jumping`       | `set-cave-bouquet`  | `image-right`          | 30 s  | `fade`     |
| 8   | `infos`       | `call`    | « Infos pratiques » + 5 puces, toutes en données (quand, où, prix, accès, retour) | Tout est là. Pour le dernier métro, je n'ai pas encore l'info : je te la donne dès que je l'ai. | `running-right` | `set-rue-serre`     | `image-left`           | 60 s  | `slide`    |
| 9   | `rendez-vous` | `call`    | « On s'y retrouve ? » / « Inscription gratuite sur lebrocoli.fr » + mention IA    | À samedi. Et <u>garde la tête verte</u> !                                                       | `waving`        | `set-kiosque-tiges` | `image` (plein cadre)  | 30 s  | `fade`     |

Contrôles de la bible appliqués :

- Broc ouvre et ferme en `waving` (§10.1) ; `failed` (slide 6) est suivi de `jumping` (slide 7) :
  Broc rebondit (§9) ; `jumping` et `failed` une seule fois chacun (§10.7).
- Chaque réplique fait moins de 140 caractères (la plus longue, slide 8, en fait 95) et contient au
  plus un point d'exclamation (§4). Aucun émoji.
- Aucune date, heure, adresse ni prix dans le texte libre : tout passe par `:value` (§10.2). La
  donnée manquante (dernier métro) est dite comme manquante, pas inventée (§5, « Honnêteté »).
- Le lieu de repli n'est jamais nommé par Broc : il dit « à l'abri », le nom vient de la donnée
  `lieuRepli`.
- Pas d'alcool comme argument, aucun artiste réel, aucune blague sur le fait d'être mangé (§6).
- **Écart assumé** avec §10.1 (« 3 à 7 scènes ») : la règle vise les récits narratifs (stories,
  toon, motion). Un deck d'annonce a besoin de 9 slides ; ses déclinaisons narratives restent dans
  la règle (6 cartes en stories, 4 cases en toon). À trancher dans la bible si l'on veut une règle
  propre au deck.
- **Slide 5 sans Broc à l'image en deck** : `layout=center type=stat` n'a pas d'image (c'est ce qui
  permet le pont deck → motion, plan 02 §4). La pose `review` sert en motion et en stories, où Broc
  est un sprite. Un sprite dans une slide (`SpriteImage` en deck) est « plus tard » (plan 11 D6).

## 4. Arborescence proposée

Dans le dossier unique `examples/scenario-lebrocoli` (plan 14 §4.3), **après accord de l'utilisateur
et licence de `reference.png`** :

```text
examples/scenario-lebrocoli/
  recit.config.ts                    # thème lebrocoli (§5.3), partagé par les récits
  cast/broc/…                        # kit de Broc (plan 14 D12)
  cast/univers.md                    # bible : décors, Mila, Tempo, prompts (§7), kind: bible
  recits/premieres-notes/
    deck.md                          # source Markdown (§5.1)
    deck.json                        # jumeau JSON typé (§6)
    stories.md  motion.md  toon.md   # déclinaisons (§8)
    data/atelier.json                # données pratiques (§5.2)
    img/*.webp                       # images de scènes, générées hors de Récit
    img/*.webp.json                  # provenance kind: asset (§7.5)
```

Les déclinaisons sont dans des fichiers séparés et non en `deck.stories.md` : un suffixe après le
nom est lu comme une langue (`deck.fr.md`, plan 09 §1).

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

### 5.1 `recits/premieres-notes/deck.md`

À copier tel quel. Ne jamais passer oxfmt sur ce fichier (directives `:::notes`, règle du dépôt).
Les attributs `beat=`, `cast=`, `set=`, `shot=`, `pose=` et `prompt=` sont réservés par le cœur
(plan 02 §3) mais ne sont **vérifiés qu'en P16** par le plugin de `@recit/scenario` ; avant P16, le
deck se compile et ils restent des attributs libres (`attrs`). `image=` porte le fichier de l'image,
`prompt=` dit de quel prompt elle vient (plan 14 D4) ; `recit validate` vérifiera en P16 que les
deux correspondent à la provenance enregistrée.

```md
---
title: Premières notes
description: "Broc présente l'atelier d'écoute jazz de lebrocoli.fr."
author: lebrocoli.fr
format: deck
lang: fr
aspectRatio: 16:9
transition: fade
cast:
  - ../../cast/broc/character.md
  - ../../cast/univers.md
data:
  atelier: ./data/atelier.json
---

--- id=ouverture layout=image image=./img/ouverture.webp alt="Broc, un brocoli souriant au rendu 3D doux, salue de la main devant un kiosque à musique dans un parc, en fin d'après-midi." overlay=0.35 beat=hook cast=broc set=set-kiosque-tiges shot=wide pose=waving prompt=p-pn-ouverture

# Premières notes

### Un atelier d'écoute jazz, ouvert à tous

:::notes
Salut ! Samedi, on apprend à écouter le jazz ensemble. Je t'ai gardé une place.
:::

--- id=question layout=image-right image=./img/question.webp alt="Broc attend, curieux, sur un toit-terrasse au crépuscule, sous un ciel indigo." beat=hook cast=broc set=set-toit-rosee shot=medium pose=waiting prompt=p-pn-question

# Le jazz t'intimide ?

Tu ne sais pas quoi écouter, ni quand applaudir. Cet atelier est fait pour toi.

:::notes
Toi aussi, tu as déjà applaudi au mauvais moment ? Moi oui. Personne ne m'en a voulu.
:::

--- id=programme layout=image-left image=./img/programme.webp alt="Broc, concentré, prépare un grand agenda ouvert sur un bureau ; un petit métronome en bois balance à côté de lui." beat=context cast=broc set=set-bureau-broc shot=medium pose=running prompt=p-pn-programme

# Le programme

- **Écouter** : trois morceaux courts, expliqués
- **Reconnaître** : la contrebasse, la batterie, le piano
- **Vivre** : un mini-concert du :value{data=atelier field=artistes}

:::notes
Je prépare le programme depuis des semaines, ça pousse bien. Tempo garde le rythme.
:::

--- id=equipe layout=image-right image=./img/equipe.webp alt="Dans une cave voûtée en briques, Broc se tient calmement à côté d'une régisseuse en tenue gris anthracite, un piano droit au fond." beat=context cast=broc set=set-cave-bouquet shot=medium pose=idle prompt=p-pn-equipe

# Avec qui ?

- **Broc**, ton guide de sortie
- **Mila**, régisseuse de la Cave du Bouquet
- **:value{data=atelier field=artistes}**, contrebasse, batterie et piano

:::notes
Mila s'occupe du son, le Trio Lorem joue. Moi, je t'explique tout, sans jargon.
:::

--- id=places layout=center type=stat beat=context cast=broc set=set-bureau-broc pose=review

# :value{data=atelier field=places agg=last}

places, inscription gratuite

_Source : données de l'atelier, lebrocoli.fr_

:::notes
Les places sont comptées. Inscris-toi tôt, c'est gratuit.
:::

--- id=pluie layout=image-left image=./img/pluie.webp alt="Une pluie fine tombe sur le kiosque vide ; Broc lève les yeux, légèrement déçu." beat=tension cast=broc set=set-kiosque-tiges shot=medium pose=failed prompt=p-pn-pluie

# Et s'il pleut ?

Le kiosque est en plein air, et la météo peut changer d'avis.

:::notes
Oups. Ma couronne adore la pluie, les contrebasses beaucoup moins.
:::

--- id=plan-b layout=image-right image=./img/plan-b.webp alt="Broc saute de joie dans une cave de jazz chaleureuse, lampes basses et piano droit derrière lui." beat=payoff cast=broc set=set-cave-bouquet shot=wide pose=jumping prompt=p-pn-plan-b

# Plan B : à l'abri

En cas de pluie, l'atelier descend à :value{data=atelier field=lieuRepli}.

Même heure, même programme.

:::notes
On passe à l'abri et l'atelier est maintenu ! On reste bien planté sur la date.
:::

--- id=infos layout=image-left image=./img/infos.webp alt="Broc court vers la droite dans une rue piétonne pavée, le soir, entre des affiches de concerts sans texte." transition=slide beat=call cast=broc set=set-rue-serre shot=wide pose=running-right prompt=p-pn-infos

# Infos pratiques

- **Quand** : :value{data=atelier field=date format=date}, :value{data=atelier field=debut format=time}
- **Où** : :value{data=atelier field=lieu}
- **Prix** : :value{data=atelier field=prix}
- **Accès** : :value{data=atelier field=acces}
- **Retour** : :value{data=atelier field=dernierMetro}

:::notes
Tout est là. Pour le dernier métro, je n'ai pas encore l'info : je te la donne dès que je l'ai.
:::

--- id=rendez-vous layout=image image=./img/rendez-vous.webp alt="Broc salue de la main devant le kiosque à musique, public assis dans l'herbe en silhouettes floues, lumière dorée." overlay=0.35 beat=call cast=broc set=set-kiosque-tiges shot=wide pose=waving prompt=p-pn-rendez-vous

# On s'y retrouve ?

### Inscription gratuite sur [lebrocoli.fr](https://lebrocoli.fr)

_Illustrations générées par IA d'après l'image de référence de Broc._

:::notes
À samedi. Et garde la tête verte !
:::
```

Points à vérifier au moment de l'implémentation (et non des inventions de syntaxe à figer ici) :

- `:value` est défini pour des **nombres** (`08` §1). Les champs texte (`lieu`, `prix`, `artistes`),
  `format=date` et `format=time`, et le rendu d'une valeur `null` (`dernierMetro`) par un libellé «
  pas encore l'info » sont à demander à `@recit/data` (P6). Sans cet ajout, ces cinq valeurs passent
  par des chaînes du compagnon (`strings`, `:t[key]`, plan 09 §2.2), jamais en dur.
- `:value` dans `:::notes` : aucune réplique ci-dessus n'en a besoin, exprès. Broc ne lit pas de
  chiffre à voix haute ; les chiffres restent à l'écran.
- `cast:` en liste, `beat=`… : plan 14 D4, P16.

### 5.2 `recits/premieres-notes/data/atelier.json`

Valeurs **fictives** de l'exemple. Ce sont les seules sources des infos pratiques.

```json
{
  "id": "premieres-notes",
  "titre": "Premières notes",
  "date": "2026-11-14",
  "debut": "15:00",
  "duree": "PT1H30M",
  "lieu": "Le Kiosque des Tiges",
  "lieuRepli": "La Cave du Bouquet",
  "prix": "entrée libre, sur inscription",
  "places": 40,
  "acces": "de plain-pied, accessible en fauteuil (kiosque et cave)",
  "artistes": "Trio Lorem",
  "dernierMetro": null
}
```

### 5.3 Thème et pied de page (`examples/scenario-lebrocoli/recit.config.ts`)

Thème de la **thématique lebrocoli** : un seul vert dominant, pris dans la palette mesurée de Broc
(bible §2.3, encore à valider), sur le crème de la référence. Contrastes WCAG calculés : `#447340`
sur `#f2eee5` = 4,81 (AA texte normal) ; `#1f2a14` sur `#f2eee5` = 12,96 ; en sombre, `#f2eee5` sur
`#16200f` = 14,54 et `#9fd067` sur `#16200f` = 9,37. Le vert peau `#7aac3d` (2,33 sur crème) ne sert
**jamais** au texte. À aligner avec les planches de couleurs de `brand/boards/colors/` (une teinte
par thématique, le site racine en noir et blanc) par le propriétaire de la marque.

```ts
import { defineConfig } from "@recit/core";

export default defineConfig({
  metadata: { author: "lebrocoli.fr", lang: "fr" },
  slides: { aspectRatio: "16:9", transition: "fade" },
  theme: {
    defaultMode: "light",
    colors: {
      primary: "#447340",
      primaryForeground: "#f2eee5",
      accent: "#2a4a18",
      background: "#f2eee5",
      foreground: "#1f2a14",
      card: "#fbf9f4",
      muted: "#e6e2cc",
    },
    dark: {
      primary: "#9fd067",
      primaryForeground: "#16200f",
      background: "#16200f",
      foreground: "#f2eee5",
      card: "#1f2a14",
    },
    // Unbounded and Lexend are SIL OFL 1.1, served locally with their OFL.txt (bible §12)
    fonts: { heading: "Unbounded, sans-serif", sans: "Lexend, sans-serif" },
    radius: "16px",
  },
  footer: {
    left: "lebrocoli.fr",
    right: "{slide} / {total}",
    hideOn: ["image"],
  },
});
```

## 6. Jumeau JSON typé (`deck.json`) — brouillon jusqu'à P16

Forme de travail. La partie deck suit le schéma **réel** `DeckSourceSchema`
(`packages/core/src/schema/source.ts`) : champs typés `layout`, `image {src, alt}`, `transition`,
puis `attrs`, `body`, `notes`, dans l'ordre canonique du convertisseur. Ce qui reste brouillon :

- les attributs de scénario (`beat`, `cast`, `set`, `shot`, `pose`, `prompt`) restent dans `attrs`
  jusqu'à P16 ; le plan 14 ne prévoit pas de les typer en champs propres, à confirmer en IA1 ;
- `data` est au niveau du récit (plan 09 §2.2). **Le convertisseur actuel** range toute clé de
  frontmatter hors `meta` dans `settings` : avec lui, `data` et `cast` iraient dans `settings`.
  L'équivalence `compile(md) == compile(toJson(md))` (plan 09 §2.4) tranchera la place de `data` en
  P6 ; `cast` reste dans `settings` (réglage du récit lu par le plugin de scénario) ;
- `overlay` et `type` sont des attributs libres du deck (pas de champ typé), donc dans `attrs`.

```json
{
  "$schema": "https://recit.dev/schema/v1/deck.json",
  "kind": "story",
  "version": 1,
  "format": "deck",
  "meta": {
    "title": "Premières notes",
    "description": "Broc présente l'atelier d'écoute jazz de lebrocoli.fr.",
    "author": "lebrocoli.fr",
    "lang": "fr"
  },
  "settings": {
    "aspectRatio": "16:9",
    "transition": "fade",
    "cast": ["../../cast/broc/character.md", "../../cast/univers.md"]
  },
  "data": { "atelier": "./data/atelier.json" },
  "scenes": [
    {
      "id": "ouverture",
      "layout": "image",
      "image": {
        "src": "./img/ouverture.webp",
        "alt": "Broc, un brocoli souriant au rendu 3D doux, salue de la main devant un kiosque à musique dans un parc, en fin d'après-midi."
      },
      "attrs": {
        "overlay": 0.35,
        "beat": "hook",
        "cast": "broc",
        "set": "set-kiosque-tiges",
        "shot": "wide",
        "pose": "waving",
        "prompt": "p-pn-ouverture"
      },
      "body": "# Premières notes\n\n### Un atelier d'écoute jazz, ouvert à tous",
      "notes": "Salut ! Samedi, on apprend à écouter le jazz ensemble. Je t'ai gardé une place."
    },
    {
      "id": "question",
      "layout": "image-right",
      "image": {
        "src": "./img/question.webp",
        "alt": "Broc attend, curieux, sur un toit-terrasse au crépuscule, sous un ciel indigo."
      },
      "attrs": {
        "beat": "hook",
        "cast": "broc",
        "set": "set-toit-rosee",
        "shot": "medium",
        "pose": "waiting",
        "prompt": "p-pn-question"
      },
      "body": "# Le jazz t'intimide ?\n\nTu ne sais pas quoi écouter, ni quand applaudir. Cet atelier est fait pour toi.",
      "notes": "Toi aussi, tu as déjà applaudi au mauvais moment ? Moi oui. Personne ne m'en a voulu."
    },
    {
      "id": "programme",
      "layout": "image-left",
      "image": {
        "src": "./img/programme.webp",
        "alt": "Broc, concentré, prépare un grand agenda ouvert sur un bureau ; un petit métronome en bois balance à côté de lui."
      },
      "attrs": {
        "beat": "context",
        "cast": "broc",
        "set": "set-bureau-broc",
        "shot": "medium",
        "pose": "running",
        "prompt": "p-pn-programme"
      },
      "body": "# Le programme\n\n- **Écouter** : trois morceaux courts, expliqués\n- **Reconnaître** : la contrebasse, la batterie, le piano\n- **Vivre** : un mini-concert du :value{data=atelier field=artistes}",
      "notes": "Je prépare le programme depuis des semaines, ça pousse bien. Tempo garde le rythme."
    },
    {
      "id": "equipe",
      "layout": "image-right",
      "image": {
        "src": "./img/equipe.webp",
        "alt": "Dans une cave voûtée en briques, Broc se tient calmement à côté d'une régisseuse en tenue gris anthracite, un piano droit au fond."
      },
      "attrs": {
        "beat": "context",
        "cast": "broc",
        "set": "set-cave-bouquet",
        "shot": "medium",
        "pose": "idle",
        "prompt": "p-pn-equipe"
      },
      "body": "# Avec qui ?\n\n- **Broc**, ton guide de sortie\n- **Mila**, régisseuse de la Cave du Bouquet\n- **:value{data=atelier field=artistes}**, contrebasse, batterie et piano",
      "notes": "Mila s'occupe du son, le Trio Lorem joue. Moi, je t'explique tout, sans jargon."
    },
    {
      "id": "places",
      "layout": "center",
      "attrs": {
        "type": "stat",
        "beat": "context",
        "cast": "broc",
        "set": "set-bureau-broc",
        "pose": "review"
      },
      "body": "# :value{data=atelier field=places agg=last}\n\nplaces, inscription gratuite\n\n_Source : données de l'atelier, lebrocoli.fr_",
      "notes": "Les places sont comptées. Inscris-toi tôt, c'est gratuit."
    },
    {
      "id": "pluie",
      "layout": "image-left",
      "image": {
        "src": "./img/pluie.webp",
        "alt": "Une pluie fine tombe sur le kiosque vide ; Broc lève les yeux, légèrement déçu."
      },
      "attrs": {
        "beat": "tension",
        "cast": "broc",
        "set": "set-kiosque-tiges",
        "shot": "medium",
        "pose": "failed",
        "prompt": "p-pn-pluie"
      },
      "body": "# Et s'il pleut ?\n\nLe kiosque est en plein air, et la météo peut changer d'avis.",
      "notes": "Oups. Ma couronne adore la pluie, les contrebasses beaucoup moins."
    },
    {
      "id": "plan-b",
      "layout": "image-right",
      "image": {
        "src": "./img/plan-b.webp",
        "alt": "Broc saute de joie dans une cave de jazz chaleureuse, lampes basses et piano droit derrière lui."
      },
      "attrs": {
        "beat": "payoff",
        "cast": "broc",
        "set": "set-cave-bouquet",
        "shot": "wide",
        "pose": "jumping",
        "prompt": "p-pn-plan-b"
      },
      "body": "# Plan B : à l'abri\n\nEn cas de pluie, l'atelier descend à :value{data=atelier field=lieuRepli}.\n\nMême heure, même programme.",
      "notes": "On passe à l'abri et l'atelier est maintenu ! On reste bien planté sur la date."
    },
    {
      "id": "infos",
      "layout": "image-left",
      "image": {
        "src": "./img/infos.webp",
        "alt": "Broc court vers la droite dans une rue piétonne pavée, le soir, entre des affiches de concerts sans texte."
      },
      "transition": "slide",
      "attrs": {
        "beat": "call",
        "cast": "broc",
        "set": "set-rue-serre",
        "shot": "wide",
        "pose": "running-right",
        "prompt": "p-pn-infos"
      },
      "body": "# Infos pratiques\n\n- **Quand** : :value{data=atelier field=date format=date}, :value{data=atelier field=debut format=time}\n- **Où** : :value{data=atelier field=lieu}\n- **Prix** : :value{data=atelier field=prix}\n- **Accès** : :value{data=atelier field=acces}\n- **Retour** : :value{data=atelier field=dernierMetro}",
      "notes": "Tout est là. Pour le dernier métro, je n'ai pas encore l'info : je te la donne dès que je l'ai."
    },
    {
      "id": "rendez-vous",
      "layout": "image",
      "image": {
        "src": "./img/rendez-vous.webp",
        "alt": "Broc salue de la main devant le kiosque à musique, public assis dans l'herbe en silhouettes floues, lumière dorée."
      },
      "attrs": {
        "overlay": 0.35,
        "beat": "call",
        "cast": "broc",
        "set": "set-kiosque-tiges",
        "shot": "wide",
        "pose": "waving",
        "prompt": "p-pn-rendez-vous"
      },
      "body": "# On s'y retrouve ?\n\n### Inscription gratuite sur [lebrocoli.fr](https://lebrocoli.fr)\n\n_Illustrations générées par IA d'après l'image de référence de Broc._",
      "notes": "À samedi. Et garde la tête verte !"
    }
  ]
}
```

Traduction (`deck.en.md` ou compagnon `deck.en.json`, plan 09 §1) : seuls `meta`, `body`, `notes` et
`image.alt` changent ; `id`, attributs, données et images sont partagés. Les répliques se traduisent
dans la même voix (tutoiement → « you », un jeu de mots équivalent ou aucun, jamais un jeu de mots
forcé).

## 7. Images : prompts comme données

Récit ne génère rien (plan 14 D7). Les prompts ci-dessous sont des **données** à ajouter à la bible
`cast/univers.md` (`kind: bible`, `promptLang: en`) ; le texte final de chaque prompt est **dérivé**
par le gabarit de la bible §11.3 : identité (§11.1, mot pour mot) + décor + cadrage + pose + action

- négatif (§11.4). Aucun fournisseur n'est imposé ; `hatch-pet`, `imagegen` ou tout autre outil se
  lance hors de Récit, avec `cast/broc/reference.png` **toujours** joint comme image de référence.

### 7.1 Décors utilisés (nouvelles entrées `entry=set`)

Les cinq décors existent dans la bible §7 mais n'ont pas encore d'identité de prompt. Proposition
(`inferred`) :

```md
--- id=set-kiosque-tiges entry=set

## Le Kiosque des Tiges

Un kiosque à musique rond dans un parc, le public assis dans l'herbe.

:::identity
Round open-air wooden bandstand with a domed roof in a small leafy park, string of warm bulbs
along the roof edge, lawn in front with a few blurred seated silhouettes, no recognizable
landmark, no readable sign.
:::

:::traits
- time: late afternoon to golden hour
- light: warm low sun, soft amber {inferred}
- palette: wood=#8a5a3b, lawn=#6f8f4a, sky=#f3d9a4
:::

::shot[Wide, bandstand centered, character in the foreground left]{id=wide}
::shot[Medium, character under the bandstand roof edge]{id=medium}

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

## Le Toit de la Rosée

Un toit-terrasse au crépuscule, au-dessus de toits fictifs.

:::identity
Flat rooftop terrace at dusk above fictional zinc rooftops, deep indigo sky with the first
stars, a few potted plants and a low wooden bench, no recognizable landmark, no readable sign.
:::

:::traits
- time: dusk
- palette: sky=#2b2f5c, glow=#f1b765
:::

::shot[Medium, character at the railing, rooftops behind]{id=medium}

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

## Le Carnet de Broc

Un coin de bureau avec un grand agenda ouvert et des billets.

:::identity
Cozy wooden desk corner, a large open paper planner with blank pages, a few blank tickets and
paper slips, a warm desk lamp, no readable text anywhere.
:::

::shot[Medium, character behind the desk, planner in front]{id=medium}

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

## La Cave du Bouquet

Un club de jazz en sous-sol voûté.

:::identity
Vaulted underground brick jazz club, low warm lamps on small round tables, an upright piano
against the wall, a double bass resting on its stand on a small stage, no readable sign.
:::

::shot[Wide, whole vaulted room, stage at the back]{id=wide}
::shot[Medium, character in front of the upright piano]{id=medium}

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

## La Rue de la Serre

Une rue piétonne de nuit, des affiches de concerts sans texte lisible.

:::identity
Narrow pedestrian street at night, wet cobblestones reflecting warm shop lights, concert posters
on the walls showing only abstract shapes and colors with no readable text, no recognizable
landmark.
:::

::shot[Wide, street receding to the right, character mid-left]{id=wide}
```

### 7.2 Personnage secondaire visible : Mila

Mila apparaît sur une seule image (slide 4). Entrée proposée (`inferred`, bible §8), toujours moins
détaillée que Broc :

```md
--- id=mila entry=character

## Mila

La régisseuse de la Cave du Bouquet, calme et précise.

:::identity
Stylized adult human stage manager, same soft 3D family-film render as the main character but
simpler and less detailed, plain charcoal grey clothes, a sound engineer headset resting around
the neck, calm neutral expression.
:::

:::avoid
- vegetable or plant features
- logos, text, brand names on clothes
:::
```

Tempo (le métronome, slide 3) reste un **accessoire du décor** dans l'action du prompt : il est muet
et n'a pas besoin d'entrée tant qu'il n'a pas de pose propre.

### 7.3 Descriptions de poses pour `{pose_description}`

Anglais, dérivées de la bible §9 ; à reporter dans les `::pose[…]` de `character.md` (qui n'en
déclare aujourd'hui que trois). L'image générée est une **scène**, pas une case de la planche : elle
montre la pose, elle ne la remplace pas.

| Pose            | `pose_description`                                                                  |
| --------------- | ----------------------------------------------------------------------------------- |
| `idle`          | standing relaxed, arms loose at the sides, calm attentive look                      |
| `waving`        | standing, one mitten hand raised and waving, warm welcoming smile                   |
| `waiting`       | standing, head slightly tilted, hands joined in front, curious expectant look       |
| `running`       | focused, leaning over the work in front of him, both hands busy, concentrated brows |
| `review`        | looking closely at something, one hand near the chin, then a satisfied small smile  |
| `failed`        | shoulders slightly dropped, looking up, mild disappointed "oops" face, no tears     |
| `jumping`       | small joyful jump, both arms up, feet off the ground, big closed-mouth smile        |
| `running-right` | running toward the right of the frame, light energetic stride, body leaning forward |

### 7.4 Prompts de scènes (`entry=prompt`)

Huit images (la slide 5 n'en a pas). Aspect : `16:9` pour les slides plein cadre, `4:5` pour les
moitiés d'image. Le corps est l'action, en anglais, sans texte dans l'image.

```md
--- id=p-pn-ouverture entry=prompt subject=broc set=set-kiosque-tiges shot=wide pose=waving aspect=16:9

Broc greets the viewer in front of the empty bandstand before the workshop, late afternoon,
generous empty space on the right for the title.

--- id=p-pn-question entry=prompt subject=broc set=set-toit-rosee shot=medium pose=waiting aspect=4:5

Broc waits at the railing at dusk, looking at the viewer as if asking a gentle question.

--- id=p-pn-programme entry=prompt subject=broc set=set-bureau-broc shot=medium pose=running aspect=4:5

Broc prepares the workshop on the open planner; a small wooden metronome with a swinging arm and
no face stands on the desk next to him.

--- id=p-pn-equipe entry=prompt subject=broc set=set-cave-bouquet shot=medium pose=idle aspect=4:5

Broc stands calmly next to Mila the stage manager in front of the upright piano; Mila is simpler
and less detailed than Broc.

--- id=p-pn-pluie entry=prompt subject=broc set=set-kiosque-tiges shot=medium pose=failed aspect=4:5

Light rain starts falling on the empty bandstand; Broc stands under the roof edge looking up at
the grey sky, mildly disappointed.

--- id=p-pn-plan-b entry=prompt subject=broc set=set-cave-bouquet shot=wide pose=jumping aspect=4:5

Broc jumps for joy in the warm vaulted jazz club, ready for the workshop indoors.

--- id=p-pn-infos entry=prompt subject=broc set=set-rue-serre shot=wide pose=running-right aspect=4:5

Broc runs to the right along the cobbled street toward the venue, posters on the walls show no
readable text.

--- id=p-pn-rendez-vous entry=prompt subject=broc set=set-kiosque-tiges shot=wide pose=waving aspect=16:9

Broc waves goodbye in front of the bandstand at golden hour, a few blurred seated silhouettes on
the lawn, generous empty space on the right for the title.
```

Exemple de prompt **dérivé** (ce que `recit prompts build` écrira en P16 pour `p-pn-pluie`) :

```text
{identité de la bible §11.1, mot pour mot}
Pose: shoulders slightly dropped, looking up, mild disappointed "oops" face, no tears.
Setting: Round open-air wooden bandstand with a domed roof in a small leafy park, string of warm
bulbs along the roof edge, lawn in front with a few blurred seated silhouettes, no recognizable
landmark, no readable sign. Shot: medium, character under the bandstand roof edge. Action: Light
rain starts falling on the empty bandstand; Broc stands under the roof edge looking up at the
grey sky, mildly disappointed. Warm evening lighting that keeps the character's greens unchanged.
Character is the clear focal point, other figures simpler and less detailed. Aspect 4:5.
Negative: {liste de la bible §11.4}
```

La pluie et la lumière grise ne doivent pas désaturer les verts de Broc (bible §7) : à vérifier à la
relecture de l'image.

### 7.5 Provenance (une par image)

`recit assets register img/pluie.webp --prompt p-pn-pluie` (P16) écrit :

```json
{
  "$schema": "https://recit.dev/schema/v1/asset.json",
  "kind": "asset",
  "version": 1,
  "asset": "pluie.webp",
  "prompt": "p-pn-pluie",
  "origin": "ai",
  "tool": "à remplir par l'auteur",
  "model": "à remplir par l'auteur",
  "date": "AAAA-MM-JJ",
  "references": ["../../../cast/broc/reference.png"],
  "author": "à confirmer",
  "license": "à confirmer",
  "aiGenerated": true
}
```

Tant que la licence de `reference.png` manque (bible §14), **aucune** de ces huit images n'entre
dans le dépôt : les `img/*.webp` sont des images de remplacement neutres (aplat crème, nom du
prompt), et `recit validate --strict` doit refuser le build de publication.

## 8. Déclinaisons dans les autres formats

### 8.1 `stories` (6 cartes, `9:16`) — brouillon jusqu'à P11 (lecteur) et P16 (attributs)

Pas de nouvelle image : Broc est un **sprite** de la planche (`::sprite`, plan 11 D9) posé sur le
fond du thème, et le texte est une `textcard`. Six cartes, donc dans la règle des 3 à 7 scènes. La
case de `192×208` est petite : la taille d'affichage maximale se mesure sur les goldens (plan 11
D9).

```md
---
title: Premières notes
format: stories
lang: fr
duration: 5s
aspect: 9:16
cast:
  - ../../cast/broc/character.md
  - ../../cast/univers.md
data:
  atelier: ./data/atelier.json
---

--- id=ouverture beat=hook cast=broc set=set-kiosque-tiges pose=waving background=theme

:::textcard{variant=title background=theme}
# Premières notes

Un atelier d'écoute jazz, ouvert à tous
:::

::sprite{character=broc pose=waving}

--- id=question beat=hook cast=broc pose=waiting background=theme

:::textcard{variant=quote background=theme}
Toi aussi, tu as déjà applaudi au mauvais moment ? Moi oui.

— Broc
:::

::sprite{character=broc pose=waiting}

--- id=places beat=context cast=broc pose=review background=theme duration=6s

:::textcard{variant=stat}
:value{data=atelier field=places agg=last}

places, inscription gratuite
:::

::sprite{character=broc pose=review}

--- id=pluie beat=tension cast=broc pose=failed background=theme

:::textcard{variant=caption background=theme}
Et s'il pleut ? Oups.
:::

::sprite{character=broc pose=failed}

--- id=plan-b beat=payoff cast=broc pose=jumping background=theme

:::textcard{variant=caption background=theme}
Plan B : on passe à l'abri. L'atelier est maintenu !
:::

::sprite{character=broc pose=jumping}

--- id=rendez-vous beat=call cast=broc pose=waving background=theme duration=7s

:::textcard{variant=list background=theme}
- :value{data=atelier field=date format=date}, :value{data=atelier field=debut format=time}
- :value{data=atelier field=lieu}
- :value{data=atelier field=prix}
:::

::sprite{character=broc pose=waving}

::cta[Je m'inscris]{href=https://lebrocoli.fr}
```

Mention IA : la planche de Broc est générée ; la mention « généré par IA » apparaît dans
l'attribution visible du lecteur (réglage `scenario.aiLabel`, `credits` par défaut, plan 14 §5.1),
pas dans le texte de Broc. Export : `recit export --to images` donne six PNG `1080×1920`.

### 8.2 `motion` (film `16:9` ou `9:16`)

Le pont deck → motion (plan 02 §4) **refuse** les layouts `image`, `image-left` et `image-right` en
v1 : `recit render deck.md` échouerait dès la slide 1, avec un numéro de ligne. Le film a donc sa
propre source, courte, avec les blocs que le pont connaît et la voix off reprise des `:::notes` du
deck (≈ 75 s à la vitesse de lecture par défaut ; la voix allonge la scène si besoin). Broc y entre
en P16 par le bloc `sprite` (plan 11 D9, lot IM4) ; avant, le film se rend sans lui.

```md
---
title: Premières notes, le film
format: motion
lang: fr
aspectRatio: 9:16
cast:
  - ../../cast/broc/character.md
data:
  atelier: ./data/atelier.json
---

--- id=ouverture cast=broc pose=waving beat=hook

Atelier d'écoute jazz

# Premières notes

::sprite{character=broc pose=waving}

:::notes
Salut ! Samedi, on apprend à écouter le jazz ensemble. Je t'ai gardé une place.
:::

--- id=question cast=broc pose=waiting beat=hook

Le jazz **t'intimide** ?

::sprite{character=broc pose=waiting}

:::notes
Toi aussi, tu as déjà applaudi au mauvais moment ? Moi oui. Personne ne m'en a voulu.
:::

--- id=programme cast=broc pose=running beat=context

## Le programme

- Écouter trois morceaux
- Reconnaître les instruments
- Vivre un mini-concert

:::notes
Je prépare le programme depuis des semaines, ça pousse bien. Tempo garde le rythme.
:::

--- type=stat id=places hold=1 cast=broc pose=review beat=context

# :value{data=atelier field=places agg=last}

places, inscription gratuite

:::notes
Les places sont comptées. Inscris-toi tôt, c'est gratuit.
:::

--- id=plan-b cast=broc pose=jumping beat=payoff

S'il pleut, l'atelier est **maintenu** à l'abri.

::sprite{character=broc pose=jumping}

:::notes
On passe à l'abri et l'atelier est maintenu ! On reste bien planté sur la date.
:::

--- id=rendez-vous cast=broc pose=waving beat=call

## On s'y retrouve ?

:::notes
À samedi. Et garde la tête verte !
:::
```

Le film saute la slide « pluie » seule (`failed`) pour rester court : la tension tient dans la
phrase de `plan-b`, et Broc ne passe jamais par `failed` sans rebond. `prefers-reduced-motion` :
image 0 de chaque pose, sans boucle (plan 14 D12). Où placer le sprite dans un bloc `statement` ou
`list` est une question de mise en page du lot IM4, non tranchée ici.

### 8.3 `toon` (4 cases, la séquence de la pluie) — brouillon jusqu'à P7 et P16

Réutilise quatre des images du deck, recadrées en `4:5` (mêmes prompts, mêmes fichiers : aucune
nouvelle génération). Les bulles portent le texte, traduisible ; `:::dialogue` est « plus tard »
(plan 14 D6), donc les bulles sont écrites directement.

```md
---
title: Premières notes — la pluie
format: toon
lang: fr
width: 800
gutter: 120
cast:
  - ../../cast/broc/character.md
  - ../../cast/univers.md
---

--- id=c1 src=./img/question.webp alt="Broc attend, curieux, sur un toit-terrasse au crépuscule." cast=broc set=set-toit-rosee pose=waiting prompt=p-pn-question beat=hook

:::bubble{x=60% y=12% tail=bottom-left} Samedi, atelier jazz au kiosque. Tu viens ? :::

--- id=c2 src=./img/pluie.webp alt="Une pluie fine tombe sur le kiosque vide ; Broc lève les yeux, déçu." cast=broc set=set-kiosque-tiges pose=failed prompt=p-pn-pluie beat=tension

:::bubble{x=55% y=10% tail=bottom-left} Oups. Ma couronne adore la pluie, les contrebasses beaucoup moins. :::

--- id=c3 src=./img/plan-b.webp alt="Broc saute de joie dans une cave de jazz chaleureuse." cast=broc set=set-cave-bouquet pose=jumping prompt=p-pn-plan-b beat=payoff

:::bubble{x=50% y=10% shape=shout tail=bottom-right} On passe à l'abri ! :::

:::caption
L'atelier est maintenu. Même heure, même programme.
:::

--- id=c4 src=./img/rendez-vous.webp alt="Broc salue devant le kiosque à musique, lumière dorée." cast=broc set=set-kiosque-tiges pose=waving prompt=p-pn-rendez-vous beat=call

:::bubble{x=60% y=12% tail=bottom-left} À samedi. Et garde la tête verte ! :::

:::caption
Illustrations générées par IA d'après l'image de référence de Broc.
:::
```

### 8.4 `calendar`, `book`, `docs`

- **`calendar`** : l'événement lui-même (date, lieu, `location`, `url` vers lebrocoli.fr) est une
  scène de calendrier, lue depuis la même `data/atelier.json` quand `@recit/time` le permettra ; le
  pont `calendar → stories` (P11) pourra alors générer la carte « rendez-vous ».
- **`book`** : pas de déclinaison utile pour une annonce. Broc n'y entre que par l'annexe « Dramatis
  personae » (plan 14 D6) d'un futur recueil de récits.
- **`docs`** : le deck s'intègre dans une page par `<StoryEmbed format="deck">` ; la page « bible »
  (fiches `CharacterSheet`, `SetCard`, `PromptCard`) est en P16.

## 9. Points d'attention

### Accessibilité

- **Textes alternatifs** : chaque image a un `alt` en français, qui décrit Broc, sa pose et le
  décor, jamais le texte de la slide (déjà lisible). Ils se traduisent avec le récit. En `toon`,
  `alt` est obligatoire (PDF balisé, plan 15).
- **L'image ne porte aucune information** : date, lieu, prix et accès sont toujours en texte. Un
  lecteur d'écran a tout sans les images.
- **Contraste** : texte en `#1f2a14` ou `#447340` sur crème (≥ 4,5:1) ; jamais de texte en vert peau
  `#7aac3d`. Sur les slides plein cadre, `overlay=0.35` assure la lisibilité du titre : à mesurer
  sur l'image finale (lint de contraste prévu plus tard, plan 11 D8).
- **Notes = transcription** : les `:::notes` donnent le texte complet de ce que dit Broc, réutilisé
  comme sous-titres en motion et comme `voiceover`.
- **Mouvement** : `prefers-reduced-motion` fige les sprites sur l'image 0 et remplace la transition
  `slide` par `fade`.
- **Langue** : `lang: fr` ; les espaces insécables françaises avant `?`, `!` et `:` sont gérées par
  la typographie du format, pas tapées à la main.
- **Accès PMR** affiché (valeur `acces`), comme le veut la bible §5.

### Mention IA et droits

- Toute image générée a sa provenance `kind: asset`, `origin: ai`, `aiGenerated: true`,
  `references: [reference.png]` (§7.5) et la mention visible « Illustrations générées par IA »
  (slide 9, dernière case du toon, attribution des stories). La conformité à l'article 50 de l'AI
  Act reste à relire (plan 14 §5.1).
- **Bloquant** : auteur et licence de `reference.png` (bible §14). Sans eux, ni la planche ni les
  images de scènes n'entrent dans le dépôt ; le scénario se joue avec des images de remplacement.
- Polices : Unbounded et Lexend (OFL, servies localement, `OFL.txt` et ligne NOTICE) ; jamais
  Monument Extended.

### Cohérence avec la bible

- Relecture de chaque image avant enregistrement : ni vêtement, ni accessoire, ni instrument tenu
  (la contrebasse reste sur son support), ni texte lisible, verts non teintés par la lumière, pas la
  mascotte plate du site dans la même image (bible §2.5).
- Mila reste moins détaillée que Broc et n'apparaît qu'une fois ; pas plus de deux personnages à
  l'image (bible §8).
- ~~Plans à corriger par leur propriétaire : plan 14 D12 et plan 11 §2.4 décrivent encore le smoking
  et la casquette.~~ Corrigés le 25/10 d'après l'image de référence : les deux plans décrivent
  maintenant un brocoli vert sans vêtement ni accessoire (plan 14 D13).

### Dépendances et ce qui reste ouvert

| Élément                                        | Dépend de                                         | En attendant                                    |
| ---------------------------------------------- | ------------------------------------------------- | ----------------------------------------------- |
| `beat=`, `cast=`, `set=`, `pose=`, `prompt=`   | `@recit/scenario`, P16 (IA2)                      | attributs libres, non vérifiés                  |
| `:value` sur texte, `format=date/time`, `null` | `@recit/data`, P6 (à demander)                    | chaînes du compagnon (`:t[key]`)                |
| Sprite de Broc (`::sprite`)                    | planche `hatch-pet` importée, IM4 (P16)           | stories et film sans Broc, ou remplaçant neutre |
| Images de scènes                               | licence de `reference.png`, génération hors Récit | images de remplacement                          |
| Lecteur stories, toon                          | P11, P7                                           | deck seul                                       |
| Règle « 3 à 7 scènes » pour un deck            | décision dans la bible                            | écart documenté au §3                           |
