Avancement

06 — Feuille de route

Statut : en cours · Phase : transverse · Mis à jour : 02/11/2026.

Tailles : S = moins d'une journée, M = quelques jours, L = une semaine ou plus.

Code
P0 Fondations ─► P1 Deck ─► P2 Sites www/docs/presentation ─► P3 Story ─► P4 Motion ─► P5 Alpha 0.1 ─► P6 Report ─► P7 Webtoon ─► P8 Book ─► P9 Roadmap ─► P10 Calendar ─► P11 Stories ─► P12 1.0 ▲ ▲ emaki V2–V3 (dans le dossier emaki, avant la copie) ────────────────┘ Accepté le 24/10 (plans 10 à 14) : petits lots avancés en P6, P7, P9, P10, P11, puis après la 1.0 P12 ─► P13 Form ─► P14 Directory ─► P15 Atlas ─► P16 Scenario

Les neuf formats (deck, motion, docs, report, webtoon, book, roadmap, calendar, stories) font partie de la vision dès maintenant. On les livre un par un, et chacun ouvre son sous-domaine (voir 07-domaines.md). Les specs de report, webtoon, book, roadmap, calendar et stories sont dans 08-formats.md. Le multilingue et le JSON typé (09-langues-et-json.md) arrivent dès P3, pour que chaque format soit bilingue et disponible en JSON dès sa sortie.

Les idées de sites/plans/pages/archive/BACKLOG_IDEA.md sont détaillées dans les plans 10 à 14. Elles ajouteraient, après la 1.0, jusqu'à quatre formats (glossary, directory et atlas, retenus ; form multi-étapes en option), des blocs transverses et deux sites d'outil. Leur ordre et leurs options ont été tranchés le 24/10/2026, sans l'utilisateur et à sa demande (décisions réversibles) : voir la section « Backlog : plans 10 à 14 » après P12 et les « Questions ouvertes ». L'export PDF de tous les formats qui s'impriment est détaillé dans 15-export-pdf.md (accepté le 24/10 pour les questions 1 à 6, questions 7 à 9 ouvertes ; phases PDF0 à PDF5, logées dans P6, P7 et P8, puis PDF4 en option après P8 et PDF5, les autres formats, dans leur propre phase).

État : journal.md §2 fait foi. Les cases de P0 à P4-V1 ont été cochées le 24/10 après vérification dans le dépôt ; une case restée vide n'est pas faite ou n'a pas pu être vérifiée (réservations, Vercel, DNS, commits de l'utilisateur).

P0 — Fondations et nettoyage du fork (S/M)

Les règles viennent de presentation-engine/FORK.md. Elles sont fixées dans NOTICE.md et UPSTREAM.md (racine, déjà rédigés).

P0.1 Avant tout

  • Sauver les générateurs de logo du scratchpad dans brand/tools/ (voir 01-assets.md, section 2.3). Ce dossier est temporaire.
  • presentation-engine n'est pas modifié : on copie ses fichiers ici. Sa référence est le commit 4b86797, et les fichiers de marque non commités deviennent versionnés dans brand/. emaki n'a plus de .git : sa référence est le commit 1b86ccd (0.1.0-beta.7).
  • Réserver :
    • le domaine recit.dev ;
    • l'organisation GitHub recit-dev ;
    • sur npm : recit, create-recit, le scope @recit (core, data, time, paged, report, toon, book, roadmap, calendar, stories, docs, puis form, directory, geo, atlas, scenario et pixel des plans 10 à 14), la liste de 03-packaging.md §6.

P0.2 Attribution et upstream

  • git remote add upstream (dépôt d'origine), git config remote.upstream.tagOpt --no-tags, puis git fetch upstream. Les tags upstream vont dans refs/upstream-tags/* (UPSTREAM.md), jamais dans refs/tags.
  • Supprimer les 3 version plans du framework de sites restés dans .nx/version-plans/. Sinon, la première release Récit les consomme (fait le 24/10).
  • LICENSE.md : ajouter uniquement la ligne Modifications Copyright (c) 2026 vguerand (https://github.com/vguerand/recit).
  • Relire NOTICE.md et UPSTREAM.md, et compléter la ligne du journal de synchronisation.
  • Commit chore: add NOTICE and UPSTREAM.

P0.3 Nettoyage (un commit par ligne, chacun doit garder pnpm check et les tests du cœur au vert)

ÉtapeActionVérification
1packages/site/package.json : "private": true (patch n° 1)pnpm -F recit-site build
2Supprimer packages/{create-site,plugin-graphql,plugin-search-algolia} et le plugin de monétisationpnpm install, nx run-many -t build
3Supprimer tous les examples/* sauf with-config, ainsi que e2e/cosmo-cargo.spec.tspnpm -F site test (le test config.test.ts utilise encore with-config)
4git mv docs sites/docs : la doc du framework de sites devient la base de docs.recit.dev (config, vercel.json, lychee.toml, historique). Patch n° 2 (copy:docs retiré de build.dependsOn)nx run site:build, nx run docs:build
5Supprimer .github/workflows/{main.yaml,preview-build.yaml,release-monetization.yaml,release.js}. Réécrire build.yaml (check, build, test, sans canary)CI verte sur une PR
6nx.json : release.projects = liste explicite des packages publiés (audit ST-10, 25/10 ; P5 ne fait que publier). package.json racine : name: "recit-monorepo", suppression de release:pre / release:minorpnpm check
7pnpm-workspace.yaml : globs de 03-packaging.md §1 (retirer scripts, website, docs, examples/**)pnpm install
8playwright.config.ts : retirer le serveur cosmo-cargo (les e2e Récit arrivent en P1)pnpm test:e2e (vide)
9scripts/check-admonitions.mjs : globs sites/**/pages/**pnpm check:other
10assets/github-hero.png, CHANGELOG.md (Le framework de sites) et .cursorrules supprimés. Le CHANGELOG.md racine renaît à la première release Récit, écrit par nx release—
11README.md réécrit (Récit, section « Fork of the site framework » avec la mention obligatoire de NOTICE.md)—

Après le nettoyage, git ls-files | cut -d/ -f1-2 | sort -u ne doit plus montrer que des chemins classés dans 03-packaging.md §3 et dans NOTICE.md.

Sortie :

  • le dépôt ne contient plus que le cœur @recit/site, sa fixture et l'outillage ;
  • pnpm install && pnpm check && nx run-many -t build test passent ;
  • NOTICE.md et UPSTREAM.md sont à jour, les noms sont réservés et les sources taguées.

P1 — Import du format deck et découpage en groupes (M)

Détail dans 04-migration.md. Renommage complet dans 03-packaging.md §7.

  • Créer les groupes packages/formats/, packages/integrations/, packages/tools/, avec les tags nx. Faits le 26/10 : la liste des neuf tags et le sens des arêtes sont dans 03-packaging.md §8, posés dans chaque package.json et vérifiés par scripts/check-package-boundaries.js dans pnpm check (audit ST-6).
  • packages/core, packages/theme, packages/components, packages/formats/deck, packages/cli, packages/recit, packages/integrations/site-stories. Un commit par package : import, renommage, outillage.
  • Squelette de tous les autres packages de 03-packaging.md §6 (package.json privé tant qu'il est vide, src/index.ts, tags nx). Le code arrive à la phase de chaque package.
  • Passage à nx, biome, tsdown et TS 6. Exclure **/*.mdx d'oxfmt.
  • Adapter @recit/site-stories au framework de sites 0.93.
  • examples/deck-*, examples/site-embed, e2e/deck-*.spec.ts, playwright.config.ts sur examples/deck-showcase.
  • grep -rniE "presentation|emaki" packages examples vide, hors alias documentés.
  • AGENTS.md : section « Récit » qui renvoie vers context.md, sites/plans/pages/, NOTICE.md et UPSTREAM.md. Les conventions de code existantes restent.

Sortie : 88 tests unitaires et 7 e2e au vert. recit dev, recit build et recit export --to pdf fonctionnent sur examples/deck-showcase. La règle de dépendances entre groupes est vérifiée.

P2 — Sites : recit.dev, docs.recit.dev, presentation.recit.dev (M)

Détail dans 07-domaines.md.

  • packages/tools/site-kit : en-tête inter-sites, pied (mention NOTICE.md), logos Q07, createSiteConfig(), table SITES.
  • sites/docs (ex-docs/ du framework de sites) : remplacer les pages du framework de sites par la documentation et le theme de presentation-engine/docs, plus l'onglet Formats. Filtres dans la sidebar.
  • sites/components (components.recit.dev) : chaque composant de @recit/components, rendu dans chaque format, avec ses props et sa syntaxe Markdown.
  • sites/presentation : hero en deck, galerie (examples/deck-*), démos de presentation-engine/docs/pages/demos.
  • sites/www : promesse, même source côte à côte en deck et en doc (la vidéo arrive en P4), cartes des neuf formats, avec leur statut (report P6, webtoon P7, book P8, roadmap P9, calendar P10, stories P11).
  • Logo et favicon depuis brand/ (Q07, couleur à figer avant la mise en ligne).
  • Projets Vercel, DNS, redirections www, deck et slides. Prévisualisations par PR via nx affected.
  • Open Graph par site (og-card décliné avec l'icône du format).
  • Corriger le défaut connu : title des blocs de code affiché « Code » (patch prévu dans UPSTREAM.md).

Sortie :

  • recit.dev, docs.recit.dev et presentation.recit.dev sont en ligne, les alias redirigent ;
  • la recherche Pagefind renvoie les sous-résultats par slide ;
  • tous les exemples sont jouables ;
  • aucun lien inter-sites n'est écrit en dur.

P3 — Généraliser en Story, JSON typé et langues (L)

Détail dans 02-architecture.md.

  • Types Story et Scene (id, source, attrs, mdast). compileStory, avec compileDeck en alias.
  • Attribut format: dans le frontmatter. deck par défaut.
  • Alias de directive de scène <!-- type: …, id: … -->, fusionné avec les attributs du séparateur.
  • recit.config.ts validé par zod 4. Fichier unique : options du framework de sites, sections Récit et i18n optionnelle, injection automatique des plugins, patch n° 3 du chargeur (02-architecture.md §5).
  • StoryEmbed et StoryGallery, anciens noms exportés en alias.
  • Tâches L1 à L5 de 09-langues-et-json.md :
    • schémas zod et JSON Schema (@recit/core/schema) ;
    • markdownToSource et sourceToMarkdown ;
    • compagnons example.json et example.fr.json ;
    • variantes example.fr.md et chaîne de repli ;
    • @recit/core/i18n (migration de UI_STRINGS) ;
    • CLI convert, validate et i18n ;
    • routes par langue, hreflang et sélecteur de langue sur les sites.

Sortie : aucun changement visible pour les decks existants (mêmes tests, même rendu). examples/deck-showcase existe en .md, .json et .fr.md, avec une compilation identique en md et en json, et recit i18n check passe. Story est documenté dans sites/docs/pages/documentation/reference/architecture.mdx.

P4 — Format vidéo et motion.recit.dev (L)

Détail dans 05-video.md (phases V1 à V7) et dans 07-domaines.md (§3 : un seul site motion, video en simple redirection).

  • Groupe packages/formats/motion* et packages/mcp, copiés depuis emaki (V1).
  • sites/motion et redirection video.recit.dev → motion.recit.dev/video.
  • sites/www : ajouter la vidéo dans la démo « une source, trois rendus ».

Sortie : motion.recit.dev est en ligne. recit render examples/motion-hello/story.md produit un MP4 identique aux goldens. Le même fichier se joue sur les sites via <StoryEmbed format="motion" />, et le MCP accepte le Markdown.

P5 — Alpha publique (S/M)

  • 0.1.0-alpha.0 pour tous les packages publiés de 03-packaging.md §6 (release.projects de nx.json les liste un par un depuis le 25/10 ; ajouter create-recit quand il devient public).
  • Workflow release.yaml Récit (celui du framework de sites a été supprimé en P0) : manuel, build.yaml rejoué, dry run, environnement npm à relecteur (audit lot 1, 25/10).
  • publint et size-limit au vert.
  • packages/create-recit (modèle : create-site, consulté dans l'historique git ou upstream puisqu'il est supprimé en P0) : npm create recit avec les gabarits deck, motion et docs.
  • Un changelog unique (CHANGELOG.md racine), via les version plans de nx release : tous les packages partagent une version.
  • @emaki/* : npm deprecate vers @recit/motion, par l'auteur d'emaki.
  • Aucune publication npm sans validation explicite.
  • @recit/app et recit app build : un site Récit en application desktop, en prerelease (18-mobile-desktop.md, lots APP0 à APP6) ; le mobile (APP7, APP8) après la 1.0 sauf demande.

P6 — Report : report.recit.dev (L)

Spec et tâches R1 à R6 dans 08-formats.md §1. Nouveaux packages : @recit/data, @recit/paged, @recit/report ; lot : @recit/geo.

  • Question 10 tranchée (24/10) : graphiques sur d3 sans DOM (d3-scale, d3-shape), base partagée avec les cartes (13-cartes.md D9). 03-packaging.md §6 et 08-formats.md §0 et R1 sont mis à jour.
  • Accepté (plan 13, 24/10) : lot avancé « bloc ::map statique » (GE1 à GE8), sans source data= (le tableau accessible est le DataTable de @recit/data).
  • Accepté (plan 15, 24/10) : PDF0 au début de P6 (options du deck typées dans @recit/core, ExportManifestSchema et exports.json, goldens du PDF actuel lus avec pdfjs-dist), puis PDF1 (déplacement du stub packages/formats/paged vers packages/tools/paged avec une description « Node print chain used by the CLI », PDF1.0 ; chaîne dans @recit/paged/runner, contrat @recit/core/print, PDF du report par Chromium avec une table des matières en liens, sans numéros).

Sortie :

  • recit build et recit export --to pdf fonctionnent sur examples/report-quarterly ;
  • chaque chiffre du rapport est calculé (:value), et un champ inconnu produit une erreur avec numéro de ligne ;
  • l'export PDF du deck passe par @recit/paged sans régression ;
  • accepté (plan 15) : le PDF du deck et celui de examples/report-quarterly sont balisés, ont des signets, sont vérifiés en e2e et listés dans exports.json ;
  • report.recit.dev est en ligne, et la version 0.2.0-alpha est publiée.

P7 — Webtoon : webtoon.recit.dev (L)

Spec et tâches W1 à W5 dans 08-formats.md §2. Nouveau package : @recit/toon.

  • Accepté (plan 14, 24/10) : lot avancé IA0 (guide MCP du scénariste, pages docs.recit.dev/ai, examples/scenario-lorem en Markdown simple), sans package nouveau.
  • Accepté (plan 15, 24/10) : PDF2, PDF du webtoon en pages de hauteur fixe coupées entre les cases (une case trop haute sur sa propre page, avec un avertissement), ToonPdfOptionsSchema, spike mesuré de pagination: continuous.

Sortie :

  • examples/toon-episode se lit au scroll, en deux langues ;
  • l'export en tranches respecte les préréglages des plateformes ;
  • recit render --as motion produit une vidéo 9:16 ;
  • accepté (plan 15) : examples/toon-episode produit un PDF par langue, sans case coupée, sous son budget de poids, listé dans exports.json ;
  • webtoon.recit.dev est en ligne (toon.recit.dev redirige), et la version 0.3.0-alpha est publiée.

P8 — Book : book.recit.dev (L)

Spec et tâches B1 à B5 dans 08-formats.md §3. Nouveau package : @recit/book.

  • Accepté (plan 15, 24/10) : PDF3, spike go/no-go Paged.js (PDF3.0), puis moteur pagedjs derrière PrintEngine, réglages du livre à plat (trim → pdf.page.size), table des matières numérotée (aussi en option pour le report), notes, titres courants.
  • Accepté (plan 15, 24/10), optionnel, après P8 : PDF4, PDF des pages et sections de doc (recit export --to pdf --site, bouton piloté par exports.json), après le spike PDF4.0. Ce n'est pas un critère de sortie de P8.

Sortie :

  • examples/book-novella produit un PDF imprimable, un EPUB valide (epubcheck) et une édition web ;
  • accepté (plan 15) : ce PDF est balisé, a des signets, des numéros de table des matières vérifiés, un fichier par langue, et il est listé dans exports.json ;
  • book.recit.dev est en ligne, et la version 0.4.0-alpha est publiée.

P9 — Roadmap : roadmap.recit.dev (M/L)

Spec et tâches RM1 à RM5 dans 08-formats.md §4. Nouveaux packages : @recit/time, @recit/roadmap ; lot : @recit/directory.

  • Accepté (plan 12, 24/10) : lot avancé DI0 (schémas, analyseur {k=v} créé avant RM1 et réutilisé par la roadmap, liste « awesome » lue en annuaire, vue A–Z minimale).

Sortie :

  • examples/roadmap-product s'affiche dans les trois vues, en en et en fr ;
  • les exports ICS, RSS et PDF sont valides ;
  • la roadmap de Récit est publiée sur roadmap.recit.dev depuis ce plan ;
  • la version 0.5.0-alpha est publiée.

P10 — Calendar : calendar.recit.dev (M/L)

Spec et tâches CA1 à CA5 dans 08-formats.md §5. Nouveau package : @recit/calendar ; lot : @recit/form.

  • Accepté (plan 12, 24/10) : le type Place unique, livré avec calendar.
  • Accepté (plan 10, 24/10) : lot avancé FO0 et FO1 (contrat d'API des formulaires, bloc :::form minimal en mode native et mock).

Sortie :

  • examples/calendar-meetups (JSON multilingue) s'affiche dans les quatre vues ;
  • le flux ICS est abonnable, et les récurrences sont correctes aux changements d'heure ;
  • les jalons de la roadmap remontent dans le calendrier ;
  • la version 0.6.0-alpha est publiée.

P11 — Stories : story.recit.dev (M)

Spec et tâches ST1 à ST4 dans 08-formats.md §6. Nouveau package : @recit/stories.

  • Accepté (plan 11, 24/10) : lot avancé IM1 et IM2 (bloc de code ```pixel, textcard en plan motion 9:16 puis en carte stories).

Sortie :

  • examples/stories-launch se lit au tap, au clavier et au swipe ;
  • l'export d'images et le pont vers motion (MP4 vertical) fonctionnent ;
  • la version 0.7.0-alpha est publiée.

P12 — 1.0 (M)

  • Stabiliser l'API publique de Story, recit.config.ts, la CLI et @recit/site-stories. Les alias dépréciés (compileDeck, presentation.config.ts, PresentationEmbed…) sont retirés.
  • Les ponts entre formats de 08-formats.md §0 sont documentés et testés.
  • Les neuf formats de la 1.0 ont leur page sur docs.recit.dev, leur site, au moins deux exemples (dont un bilingue) et un JSON Schema publié (recit.dev/schema/v1).
  • Le schéma JSON v1 est figé, et recit migrate est prêt pour une future v2. Un nouveau format ou un nouveau kind ajouté après la 1.0 reste un ajout compatible en v1 (règle B1 ci-dessous).
  • play.recit.dev (studio en ligne), si @recit/studio est prêt.

Backlog : plans 10 à 14 (ordre accepté le 24/10/2026)

Les cinq idées de sites/plans/pages/archive/BACKLOG_IDEA.md ont chacune leur plan. Cette section fixe un seul ordre et les règles qu'ils partagent. Les questions 14 à 27 ont été tranchées le 24/10/2026, sans l'utilisateur et à sa demande (« réponds tout seul »), sauf celles qui lui restent (« Questions ouvertes », « À l'utilisateur »). Toutes ces décisions sont réversibles.

Idée du backlogPlanNaturePlus petite tranche (lot avancé)Lot avancéPhase complète
form.recit.dev10-formulaires.mdbloc :::form et contrat d'API (fondation @recit/form) ; format multi-étapes en optionFO0 (contrat, « TODO API ») et FO1 (bloc minimal, native et mock)P10P13 Form
motion : Pixel Image, « Text »11-images.mdblocs pixel et textcard, pas de format (tranché)IM1 (```pixel) et IM2 (textcard en plan motion 9:16, puis carte stories)P11aucune ; personnage en P16 une fois débloqué
glossaire / annuaire12-glossaire-annuaire.mdformats glossary et directory (un package), :termDI0 (schémas, {k=v}, liste « awesome », A–Z minimale)P9P14 Directory
cartes13-cartes.mdbloc ::map (fondation @recit/geo) ; format atlas retenu (P15)::map statique (régions, marqueurs), sans source data=P6P15 Atlas
ai / scenario14-ia-scenario.mdoutillage, documentation et site d'outil, pas de formatIA0 (guide MCP, docs, examples/scenario-lorem sans package)P7P16 Scenario

Ordre : P4 et P5 ne reçoivent rien (l'import de motion est en cours, l'alpha passe d'abord). Après P5, seuls les lots avancés ci-dessus s'ajoutent, un par phase, comme petites tâches. Les formats, packages et sites complets viennent après la 1.0, en P13 à P16. Avec toutes les options, le backlog ajouterait quatre formats, quatre sites et cinq packages : à peu près autant que P6 à P11. Le format atlas est retenu (P15). Les options restent hors des lots avancés : format form multi-étapes, worldview, MapLibre, Turnstile et Fountain (import et export) plus tard, chacune en option.

Règles communes

#RègleÀ reporter dans
B1Versionnement : un nouveau format ou un nouveau kind est un ajout compatible en v1. L'union reste ouverte en lecture : un lecteur v1 qui rencontre un format ou un kind inconnu renvoie une erreur claire (« installez @recit/… »), pas une erreur de schéma. Seule une rupture donne une v209 §2.1 (après P3)
B2Blocs transverses en JSON : en v1, :::form, ```pixel, :::textcard, ::map restent des directives dans le body de la scène. SceneSource ne gagne pas de champ blocks. Les schémas FormBlock, PixelBlock, TextCardBlock, MapBlock valident les directives09 §2.2 (après P3)
B3Un seul Place, porté par le plan 12 (adresse structurée, geo facultatif, address libre pour l'affichage seulement), livré avec calendar (P10). location accepte une chaîne libre, un @id d'annuaire ou un Place inline, avec une seule résolution08 §5, 09 §2.3 (à P10)
B4Registre des directives et des attributs de scène : le cœur ne garde que les noms. Le plugin de chaque bloc vit dans la fondation qui le porte (@recit/form, @recit/geo, @recit/scenario) ; ceux qui servent à tous les formats sans fondation dédiée, :term (plan 12) et ```pixel (plan 11), vivent dans @recit/components, jamais dans le cœur. Attributs réservés : type= (blocs motion), entry= (bible), end (écran de fin), prompt= (image d'une scène de scénario), cast=, beat=, set=, shot=, pose=, expression= (scénario, 14-ia-scenario.md IA2.3), camera= (emprise d'atlas), background (un seul nom, jamais bg)02 §3, 03 §8
B5Domaines : le domaine principal porte le nom anglais. Les mots du backlog (glossaire, annuaire, cartes, scenario) et le nom technique deviennent des alias 301. Nouvelle catégorie « site d'outil » (form tant qu'il n'y a pas de format, ai), à côté de www, docs et components07 §1 et §2 (fait)
B6Ports locaux : components 3010, form 3011, directory 3012, maps 3013, ai 301407 §4 (fait), SITES
B7Exemples : examples/<format>-*, ou examples/<bloc ou outil>-* pour un bloc ou un outil sans format (form-*, map-*, scenario-*). lebrocoli.fr n'a qu'un dossier, examples/scenario-lebrocoli (plan 14), avec des sections optionnelles des plans 10 à 13, un seul jeu de lignes NOTICE et une seule exception à la règle Lorem03 §1
B8Doc : tous les blocs transverses sous docs.recit.dev/components/<bloc> (form, pixel, textcard, map, term). Le contrat des formulaires sous la section API07 §2
B9Une commande par besoin : recit validate --strict (contrôles de scénario inclus, pas de recit check ni de scenario check), recit skills export (seul générateur de skills, tous les guides recit://guide/*), recit form check-endpoint (plan 10, test d'une API de formulaire), recit validate --links (plan 12, une option plutôt qu'un verbe), recit prompts build et recit assets register (plan 14), Fountain par recit convert (pas de export fountain), recit geocode (plan 12, écrit dans le compagnon JSON ; pas en v1, où les coordonnées sont écrites par l'auteur). Liste complète, par phase : ligne @recit/cli de 03 §603 §6 (@recit/cli)
B10Identifiants : préfixe + numéro, comme R1 ou ST1 dans 08. Un plan découpé en lots écrit ses sous-tâches lot.n (FO2.3). Statut d'un package : un Pn seulement—
B11Un package peut déclarer plusieurs formats s'ils partagent leur modèle (@recit/directory : glossary et directory)03 §1

P13 — Form : bloc :::form, contrat d'API et form.recit.dev (M)

Spec et tâches FO0 à FO7 dans 10-formulaires.md. Nouveau package : @recit/form (fondation, créé au lot avancé de P10).

  • Lot avancé, en P10 : FO0 (contrat « Récit Form Submission API v1 », checklist « TODO API »), FO1 (bloc :::form minimal, native et mock, honeypot, consentement, accessibilité).
  • FO2 : envoi fetch en urlencoded par défaut (sans preflight), JSON en opt-in, erreurs problem+json, idempotence.
  • FO3 : handler de référence @recit/form/server, examples/form-api-node et recit form check-endpoint (question 15 tranchée : aucun service hébergé par Récit).
  • FO7 : sites/form (site d'outil, port 3011), examples/form-contact (examples/form-api-node vient de FO3).
  • Plus tard : génération depuis OpenAPI (FO4), format multi-étapes (FO5, sur un besoin réel), rendus dans les autres formats (FO6).

Sortie :

  • un :::form dans une page docs envoie ses réponses à une API externe sans preflight, et affiche les erreurs par champ en en et en fr ;
  • le contrat est publié en OpenAPI et rendu sur docs.recit.dev ;
  • form.recit.dev est en ligne en mode mock, et aucune donnée n'en part.

P14 — Directory : glossaire et annuaire, directory.recit.dev (M/L)

Spec et tâches DI0 à DI7 dans 12-glossaire-annuaire.md. Nouveau package : @recit/directory (deux formats, créé au lot avancé de P9).

  • Lot avancé, en P9 : DI0 (schémas, {k=v}, liste « awesome » en entries: links, A–Z minimale).
  • En P10 : Place livré avec calendar.
  • DI1 (:term explicite ; lien automatique désactivé par défaut, mode first en option ensuite), DI2 (glossaire de Récit), DI3, DI4, DI5, DI7 (sites/directory, port 3012).
  • Plus tard : DI6 (validate --links, import CSV ; geocode après la v1 ; pas d'import MkDocs), JSON-LD.

Sortie :

  • examples/glossary-lorem, examples/directory-links et examples/directory-places s'affichent en en et en fr ;
  • docs.recit.dev définit Story et stories à un seul endroit ;
  • directory.recit.dev est en ligne.

P15 — Atlas : cartes et maps.recit.dev (L)

Spec et tâches GE1 à GE14 et AT1 à AT5 dans 13-cartes.md. Nouveaux packages : @recit/geo (fondation, créé au lot avancé de P6), @recit/atlas (retenu, P15).

  • Lot avancé, en P6 : bloc ::map statique (GE1 à GE8), sans worldview ni choroplèthe.
  • GE9 à GE11 : choroplèthe sur @recit/data, tracés et zones, cartes en motion et en stories.
  • AT1 à AT5 : format atlas et ponts (retenu, question 26).
  • sites/maps (port 3013).
  • Options, plus tard : worldview (Natural Earth par défaut), MapLibre, gazetteer. Natural Earth est la seule source de fond en v1.

Sortie :

  • une choroplèthe se calcule depuis les données, et la même carte se rend en web, PDF, MP4 et story sans requête réseau ;
  • maps.recit.dev est en ligne.

P16 — Scenario : bible, MCP et ai.recit.dev (L)

Spec et tâches IA0 à IA5 dans 14-ia-scenario.md. Nouveau package : @recit/scenario (fondation), seulement si l'exemple du lot avancé en montre le besoin.

  • Lot avancé, en P7 : IA0 (guide MCP du scénariste, pages docs.recit.dev/ai et /scenario, examples/scenario-lorem en Markdown simple).
  • IA1 à IA3 : schéma de la bible limité aux champs relevés, @recit/scenario, outils MCP, recit skills export.
  • IA4 : sites/ai (site d'outil, port 3014, alias scenario.recit.dev).
  • IA5 : examples/scenario-lebrocoli, après accord (question 19 : licence de l'image de Broc), avec le kit de Broc (14 D12) et son sprite (11 D9, IM4).
  • Plus tard : :::dialogue et ponts, registre des assets, Fountain (import et export seulement), prompts MCP, Elicitation.

Sortie :

  • examples/scenario-lorem passe recit validate --strict et se rend en stories et en motion, en en et en fr, avec les mêmes images ;
  • ai.recit.dev est en ligne, sans aucune doc propre.

Risques transverses

RisqueParade
L'API des plugins du framework de sites change (0.86 → 0.93 → …)examples/site-embed et e2e en CI. @recit/site-stories déclare une plage @recit/site testée
Confusion de marque avec le framework de sites d'originemarque Q07, sites *.recit.dev
Neuf formats, c'est beaucoup de périmètreun format à la fois (P6, puis P7, puis P8), chacun avec son critère de sortie. Le socle commun (Story, @recit/paged, @recit/data) limite le code propre à chaque format
Le backlog (plans 10 à 14) retarde l'alpha ou la 1.0rien en P4 ni en P5, un seul petit lot par phase de P6 à P11, formats et sites complets après la 1.0 (P13 à P16), options lancées seulement sur réponse explicite
Bundle client lourd (Shiki, Mermaid, motion)entrée browser sans Shiki, Mermaid à la demande, size-limit
Couleur non arrêtée au moment du lancementmarque Q07 choisie. P0 et P1 ne dépendent pas de la couleur, seule la mise en ligne de P2 l'attend
Supprimer des packages du framework de sites casse le cœurune suppression par commit avec vérification (P0.3). examples/with-config est gardé pour les tests du cœur
Sous-domaines qui dupliquent la docrègle : aucune doc hors de docs.recit.dev, liens via la table SITES (07-domaines.md)

Décisions prises

Les décisions sont tenues dans le registre des décisions, une ligne par décision.

Questions ouvertes

  1. Couleur exacte de la teinte unique de Q07 (itérations en cours).
  2. Organisation GitHub : rester sur vguerand/recit, ou transférer vers recit-dev/recit dès P0 ?
  3. Directive de scène : confirmer les attributs du séparateur comme forme canonique, avec le commentaire HTML en alias.
  4. @recit/deck et son runtime : un seul package avec un sous-chemin (proposé), ou deux packages ? Tranché par le code (P1) : un seul package, sous-chemins @recit/deck/runtime et @recit/deck/page-data.
  5. Remotion : la licence est-elle compatible avec l'usage prévu (projet personnel ou société) ?
  6. Faut-il publier un jour une distribution du framework de sites renommée, ou rester un plugin ?
  7. emaki : accord de l'auteur ? Tranché : accord donné, import par copie.
  8. Arborescence : packages/* à plat avec des sous-groupes (03-packaging.md), ou tout sous recit/ (zéro collision avec upstream) ? Tranché par le code (P1) : packages/* à plat avec les sous-groupes formats, integrations et tools.
  9. docs/ ? Tranché : gardé, déplacé dans sites/docs, et devient la doc de Récit.
  10. Graphiques : Observable Plot (proposé) ou Vega-Lite (08-formats.md §0) ? 13-cartes.md (D9, §2.7) propose une troisième voie : d3 sans DOM, que les cartes partageraient. Tranché (24/10) : d3 sans DOM (d3-scale, d3-shape, déjà requis par les cartes), plutôt qu'Observable Plot. 03-packaging.md §6 et 08-formats.md §0 et R1 sont mis à jour.
  11. story.recit.dev : interprété comme des stories web (cartes plein écran à la Instagram). S'il s'agissait plutôt de user stories (backlog produit, lié à la roadmap), le format change complètement (08-formats.md §6).
  12. Langues des sites au lancement : en et fr (proposé). Le multilingue est optionnel, et toutes les langues du monde peuvent être ajoutées ensuite dans recit.config.ts (i18n.locales). La doc (docs.recit.dev) reste en anglais.
  13. Routage des langues : prefix-except-default (proposé, /fr/…, l'anglais sans préfixe) ou prefix-always ? Tranché par le code (P3) : prefix-except-default par défaut (packages/core/src/i18n/locales.ts), prefix-always en option (i18n.routing).

Backlog (plans 10 à 15)

Questions communes, posées une seule fois ici. Les questions propres à chaque idée restent dans son plan (§8). Celles qui suivent ont été tranchées le 24/10/2026 sans l'utilisateur, à sa demande (« réponds tout seul ») : toutes sont réversibles. Celles qui ne peuvent être tranchées que par lui sont regroupées sous « À l'utilisateur ».

Ordre et périmètre

  1. Ordre : rien en P4 ni en P5, un lot avancé par phase (P6 cartes, P7 scénario, P9 annuaire, P10 formulaires, P11 images), puis P13 Form, P14 Directory, P15 Atlas, P16 Scenario après la 1.0 : d'accord ? Le format multi-étapes des formulaires (10 §3.2) est-il voulu ? Tranché (24/10) : ordre accepté, sans changement de P13 à P16. Formulaires : bloc :::form d'abord, le format multi-étapes plus tard.
  2. « Créer un TODO afin de mettre en place une API » : la checklist et un handler de référence suffisent-ils, ou faut-il un service hébergé par Récit ? Tranché (24/10) : checklist et handler de référence, pas de service hébergé par Récit.

Le brocoli et les images (motion, ai/scenario)

  1. → « À l'utilisateur ».
  2. → « À l'utilisateur ».
  3. → « À l'utilisateur ».
  4. → « À l'utilisateur ».
  5. « Format Text » (11-images.md D1) : un nouveau format fait de cartes de texte seules, ou une carte de texte (textcard) dans motion et stories ? Tranché (24/10) : textcard est un bloc de motion et stories, pas un nouveau format ; le nom textcard est retenu.
  6. Mention IA (AI Act, article 50) : dans les crédits, sur chaque image, ou nulle part ? Tranché (24/10) : mention « généré par IA » dans les métadonnées et dans l'attribution visible des images. La génération d'images reste toujours hors de Récit (les prompts sont des données). La relecture juridique demandée n'est pas tranchée.

Domaines

  1. Noms : domaines principaux en anglais avec les mots du backlog en alias 301 ? Les sites d'outil (form, ai) sont-ils acceptés ? Tranché (24/10) : domaines principaux en anglais (form, directory, maps, ai), mots français du backlog en alias 301 ; sites d'outil acceptés.
  2. → « À l'utilisateur ».

Choix techniques transverses

  1. Blocs en JSON (règle B2) : directives dans le body en v1, ou champ typé blocks? dès P3 ? Tranché (24/10) : directives dans le body en v1.
  2. Lien automatique des termes (12 D4) : défaut none en v1, puis first en option ? Tranché (24/10) : désactivé par défaut en v1, mode first en option ensuite.
  3. Format atlas et carte interactive (MapLibre) ? « Sous différents pays » : régions d'un pays, frontières disputées (worldview), ou les deux ? Tranché (24/10) : bloc ::map d'abord (lot P6), format atlas retenu (P15) ; MapLibre plus tard et en option ; « différents pays » = les régions d'un pays, plus l'option worldview (Natural Earth par défaut) ; Natural Earth seule source en v1.
  4. Géocodage : une commande recit geocode, ou seulement des coordonnées écrites par l'auteur ? Tranché (24/10) : coordonnées écrites par l'auteur, pas de commande de géocodage en v1.

Export PDF (plan 15) : les questions 1 à 6 de 15-export-pdf.md §8 sont tranchées le 24/10 (webtoon en pages coupées entre les cases, sans CBZ ; table des matières du report sans numéros en P6, numérotée en P8 ; runner dans @recit/paged/runner ; réglages à plat ; pas de PDF pour stories, PDF des docs optionnel après P8 ; PDF balisé par défaut, alt manquant = avertissement). Les questions 7 à 9 restent dans le plan.

À l'utilisateur

  1. « Pet » (« personna généré via Pet ») : le skill hatch-pet d'OpenAI (openai/skills, Apache-2.0), le /buddy de Claude Code, ou un outil à toi (Base for Music) ? Si c'est un outil à toi : où, et sous quelle licence ? Répondu (25/10, pets.md) : le skill open source hatch-pet d'OpenAI (Apache-2.0, vérifié dans son LICENSE.txt), qui génère les poses avec le skill imagegen et produit une planche au format Codex à 9 lignes. La variante work-pets:create-pet de ChatGPT Work (format v2 à 11 lignes) n'a pas de copie publique. Les deux restent des outils externes, jamais une dépendance (14 §2.2 et D12, 11 D9 et D10).
  2. « Récupération du skill afin de faire le brocoli » : quel skill, où, sous quelle licence ? Rien n'a été trouvé dans emaki, .claude/skills, sites/plans/pages/ ni context.md. Répondu (25/10, pets.md) : c'est hatch-pet, lancé avec l'image de référence du personnage comme source de vérité de son identité. Sa planche s'importe par une étape manuelle documentée, sans commande ni code repris (14 D12).
  3. « Récupération de projet basic afin de créer des images en full JS » : un dépôt existant à importer (où, quelle licence), ou l'idée du bloc pixel (11-images.md) à construire ? Répondu (25/10) : c'est un atelier de création de personnages 2D/pixel en JavaScript, à construire. Recherche et état de l'art dans 16-atelier-personnages.md.
  4. lebrocoli.fr : confirmes-tu que c'est le seul exemple réel autorisé (exception à la règle Lorem Ipsum), dans le dossier unique examples/scenario-lebrocoli ? Le personnage a-t-il déjà un nom ? Répondu (25/10, pets.md puis l'image elle-même) : oui, lebrocoli.fr est le seul nom réel autorisé, mais ses lieux sont fictifs. Le personnage s'appelle Broc ; son image de référence est examples/scenario-lebrocoli/cast/broc/reference.png (1024×1024, fournie par l'utilisateur), © vguerand, tous droits réservés, hors licence MIT du dépôt. Elle montre un brocoli vert souriant au rendu 3D doux en T-pose, sans smoking ni casquette (la description de pets.md est corrigée d'après l'image). La police de titre est Unbounded (SIL OFL 1.1), à la place de Monument Extended. La voix, la personnalité et cinq scénarios ont été délégués à l'assistant et écrits dans sites/plans/pages/annexes/broc/ : ils restent inferred jusqu'à la relecture de l'utilisateur, qui valide aussi les traits inférés. Détail dans 14 D13.

Question 23, doublon dans le backlog : la ligne « cartes.recit.dev | cartes.recit.dev » répète le même nom. Le second devait-il être autre chose (par exemple maps ou atlas) ? Répondu (25/10) : le domaine principal est maps.recit.dev, cartes.recit.dev en est un alias 301 (13 D1, 07 §2).