Claude Code · /loop & Workflow · Leçon 4 (optionnelle)
Sous le capot

Lire un script de workflow

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.

Rappel express (leçon 2) : un workflow = un script d'orchestration que Claude écrit, qui recrute des subagents en phases (chercher → vérifier → synthétiser). Aujourd'hui : 6 agents, 3 leçons adaptées, 1 erreur préexistante attrapée par un vérificateur. ↩ leçon 2

Le script, en cinq morceaux

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' },
  ],
}
① La carte d'identité. C'est ce que vous avez vu dans /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',
]
② La liste de travail. Le découpage de la leçon 2 (« gros et découpable ») devient concret : une simple liste. Anecdote vécue : la première version recevait cette liste de l'extérieur, elle est arrivée cassée, le script a planté avant le premier agent — on l'a inscrite en dur et relancé. Un workflow, ça se répare et ça reprend.
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' }
  ),
③ Le tapis roulant. 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 })),
④ Le verdict structuré. Le 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
⑤ La logique entre les agents. Voilà le secret le mieux gardé : entre deux agents, c'est du JavaScript ordinaire. Le 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.

Les deux verbes à ne pas confondre

pipeline(liste, étages...)

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.

parallel([tâches])

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

Vérifiez-vous

1. Dans ce script, la leçon 0001 peut-elle être en phase « Vérifier » pendant que la 0003 est encore en « Adapter » ?

✓ C'est toute la différence avec parallel() : dans un pipeline, chaque fichier avance dès qu'il est prêt. Les « phases » de l'affichage regroupent visuellement, mais ne synchronisent pas.

2. Pourquoi imposer un schema {ok, issues} au vérificateur plutôt que le laisser répondre en texte libre ?

✓ Du texte libre, il faudrait le ré-interpréter ; un booléen, ça se teste. La règle : dès qu'une décision du script dépend de la réponse d'un agent, cette réponse doit être structurée.

3. Aujourd'hui, la phase « Corriger » n'a recruté aucun agent. Pourquoi ?

✓ C'est la logique conditionnelle de l'étage 3 : du JavaScript ordinaire entre les agents. Un bon script ne dépense des agents que là où c'est nécessaire.

À retenir

Un script de workflow, c'est quatre primitivesmeta (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.

Le geste à pratiquer : la prochaine fois que vous demandez un workflow, ajoutez « montre-moi d'abord le script ». Vous saurez le lire — repérez le meta, les étages, où sont les schemas, où est le if. C'est le réflexe du client qui lit le devis.
Sources : Orchestrate subagents at scale with dynamic workflows — doc officielle · Create custom subagents · le script réel exécuté sur ce dépôt le 10 juin 2026 (workflow « rendre-lecons-responsive »)