Vous n'écrirez jamais ces scripts — Claude s'en charge. Mais savoir les lire, c'est pouvoir vérifier le plan avant le chantier. Et on va lire un script très particulier : celui qui a vraiment rendu vos leçons responsive aujourd'hui.
Voici le vrai script (légèrement abrégé), morceau par morceau. Sous chaque bloc : ce qu'il faut y voir.
export const meta = {
name: 'rendre-lecons-responsive',
description: 'Rendre responsive les leçons theorie-jeux',
phases: [
{ title: 'Adapter' },
{ title: 'Vérifier' },
{ title: 'Corriger' },
],
}
/workflows : le nom du chantier et ses trois phases. Avant même de lire le code, le meta annonce le plan — premier point de contrôle quand Claude vous montre un script.const FILES = [
'web/theorie-jeux/0001-le-dilemme-du-prisonnier.html',
'web/theorie-jeux/0002-l-equilibre-de-nash.html',
'web/theorie-jeux/0003-trouver-les-equilibres...html',
]
const results = await pipeline(
FILES,
// Étage 1 — un agent adapte la leçon
(file) => agent(
`Tu modifies ${file} pour le rendre lisible
sur téléphone... [consignes détaillées]`,
{ label: `adapter:${file}`, phase: 'Adapter' }
),
pipeline(liste, étage1, étage2, ...) fait passer chaque fichier par tous les étages, sans attendre les autres : la leçon 1 peut être en vérification pendant que la 3 est encore en adaptation. Et regardez agent(prompt) : le prompt est tout l'univers du subagent — il ne sait rien de la conversation, il ne connaît que sa mission. // Étage 2 — un sceptique vérifie
(fixSummary, file) => agent(
`Vérification adversariale de ${file}...
Sois sceptique : ne valide que si tout est vérifié.`,
{ phase: 'Vérifier',
schema: { ok: 'boolean', issues: 'string[]' } }
).then(v => ({ file, verdict: v })),
schema force le vérificateur à répondre en données — {ok: true/false, issues: [...]} — et non en prose. Pourquoi ? Parce que la suite du script doit pouvoir tester la réponse. C'est ce issues qui contenait la fameuse coquille « te taire / trahir » de votre leçon sur le dilemme du prisonnier. // Étage 3 — reprise seulement si recalé
async (r) => {
if (r.verdict.ok) return r // rien à faire
const fix = await agent(
`Corrige précisément : ${r.verdict.issues}`,
{ phase: 'Corriger' }
)
return { ...r, repaired: fix }
}
)
return { traitees: results } // ← le rapport final
if décide qu'un correcteur n'est recruté que si le vérificateur a recalé — chez vous, les 3 leçons sont passées du premier coup, donc la phase « Corriger » est restée vide. Le return final devient le compte rendu que vous avez reçu.Le tapis roulant. Chaque élément avance à son rythme à travers les étages, indépendamment des autres.
→ le défaut à préférer : zéro temps mort.
La barrière. Tout le monde part ensemble, et on attend que tous aient fini avant de continuer.
→ seulement quand l'étape suivante a besoin de tous les résultats à la fois (dédupliquer, comparer, compter).
Un script de workflow, c'est quatre primitives — meta (le plan affiché), agent() (recruter, le prompt est tout son univers), pipeline() (tapis roulant) / parallel() (barrière), schema (verdict testable) — reliées par du JavaScript ordinaire. Vous savez maintenant relire le plan avant le chantier.