Enregistrer et rejouer des scénarios d'événements
Enregistrer et rejouer des scénarios d’événements
Section titled “Enregistrer et rejouer des scénarios d’événements”Un scénario capture une session sous forme rejouable :
{ "version": 1, "name": "create, edit, rename", "initialState": { "notes-tsx": { "documents": [], "activeDocId": null } }, "events": [ { "name": "notes-tsx/document.create", "payload": { "id": "doc-1" }, "source": "notes-tsx", "at": 0 } ], "expectedFinal": { "notes-tsx": { "documents": ["…"], "activeDocId": "doc-1" } }}Seuls les événements primaires (ceux déclenchés par une action UI ou une
macro) sont enregistrés : les cascades sont régénérées par les handlers au
moment du rejeu. L’état initial et l’état final attendu sont des snapshots des
slices du store (hors core et settings par défaut).
Voir Transactions and events pour les événements primaires.
Enregistrer depuis l’application
Section titled “Enregistrer depuis l’application”Panneau Événements (inspecteur d’événements) :
- Bouton enregistrer (rond rouge) — chaque action UI est capturée.
- Bouton arrêter et exporter — télécharge le scénario en JSON (état initial + événements + état final).
- Bouton rejouer (flèche) — ouvre un fichier scénario et le rejoue visuellement dans l’application (150 ms entre étapes) ; le résultat s’affiche dans la barre de statut et les divergences dans la console.
Rejouer en headless (tests unitaires)
Section titled “Rejouer en headless (tests unitaires)”import { createHeadlessKernel } from "../src/kernel/headless";import { replayScenario } from "../src/kernel/replay";
const kernel = await createHeadlessKernel({ plugins: [{ definition: plugin, resources: { "ui.json": uiJson } }],});const result = await replayScenario(kernel, scenario);// result.ok, result.steps (cascades, erreurs), result.divergencesLe noyau headless (createHeadlessKernel) fonctionne sans React ni DOM :
services en mémoire, plugins enregistrés depuis leur définition TypeScript,
ui.json fourni via une base de ressources en mémoire. Voir
tests/notes-scenario.test.ts.
bun test # tous les testsDéterminisme
Section titled “Déterminisme”Les handlers génèrent les identifiants avec crypto.randomUUID(). Pour des
tests déterministes :
- le handler accepte un
idoptionnel dans le payload (le scénario écrit à la main le fournit) — c’est le cas denotes-tsx/document.create; - dans
expectedFinal, la chaîne"*"est un joker qui accepte n’importe quelle valeur (utile pour les scénarios enregistrés depuis l’application, dont les ids sont aléatoires).
Écrire un scénario à la main
Section titled “Écrire un scénario à la main”initialState: les slices des plugins concernés avant le premier événement (souvent leurs valeurs initiales).events: les événements primaires dans l’ordre, avecname,payload,source.expectedFinal: les mêmes slices après exécution ; utilisez"*"pour les valeurs non déterministes.
Déboguer
Section titled “Déboguer”Le rejeu visuel (bouton ▶ de l’inspecteur) réémet chaque événement avec
l’origine macro : les transactions, les cascades et les états intermédiaires
sont visibles en direct dans le journal des événements.
Documentation under CC BY 4.0 · © SCFlow contributors ·Back to supplychainflow.org