Annexes : Broc

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

ChampValeur
TitreBroc t'emmène ce soir (4 mots, règle de la bible §12)
id du récitbroc-presentation (nom de base du fichier : broc-presentation.md)
Objectifprésenter Broc (qui il est, ce qu'il fait) et lebrocoli.fr (un agenda de sorties fiable), puis envoyer vers le site
Publicpersonnes 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 principalstories en 9:16, 7 cartes, environ 36 s
Formats dérivésmotion (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)
Languesfr (langue par défaut), en en traduction (broc-presentation.en.md) ; prompts en anglais (promptLang: en)
Gabarit de beatspresentation : hook → context → tension → payoff → call (entrée entry=beats proposée au §6.3)
Statut des traitsinferred 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.

#idBeatDécor (set=)Pose (ligne)DuréeTexte à l'écran (titre)Réplique de Broc (bulle)Transition vers la suivante
1s1hookset-potager-scenewaving (3)5 sSalut, 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
2s2contextset-bureau-brocrunning (7)6 sTon agenda de sorties« Concerts, jazz, soirées : chaque semaine, je remplis l'agenda de lebrocoli.fr. »fondu court du décor
3s3contextset-cave-bouquetreview (8)6 s(chiffre : carte stat)« Heure, lieu, prix : je vérifie tout avant de te le dire. »coupe franche
4s4tensionset-toit-roseefailed (5)5 sPetit 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
5s5payoffset-kiosque-tigesjumping (4)5 sUne 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
6s6callset-rue-serrerunning-right (1)3 sOn y va ?« Le prochain concert commence bientôt. Suis-moi. »Broc entre par la gauche de la carte 7
7s7callset-potager-scenewaving (3)6 sRendez-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).
MarkdownMarkdown
--- 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.

Code
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.

JSONJSON
{ "$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.

MarkdownMarkdown
--- 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 :

MarkdownMarkdown
--- 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.

MarkdownMarkdown
--- 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) :

Code
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 :

Code
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.

MarkdownMarkdown
--- 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) :

Code
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

CartePoseLecture (D12)En image fixe (export PNG, prefers-reduced-motion)
s1wavingune fois, tenuedernière image de la ligne 3 (main levée)
s2runningboucleimage 0 de la ligne 7
s3reviewboucleimage 0 de la ligne 8
s4failedune fois, tenuedernière image de la ligne 5
s5jumpingune fois, tenueimage du sommet du saut (à choisir sur la planche)
s6running-rightboucleimage 0 de la ligne 1
s7wavingune fois, tenuederniè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.

MarkdownMarkdown
--- 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.

MarkdownMarkdown
--- 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.