211 — Pipeline d’agents : comment ce handbook s’écrit
Durée estimée : 60 min · Complexité : ⭐⭐ · Pré-requis : 208 — Workflows, 104 — Agents, 103 — Skills
Le module 208 t’a montré le pattern orchestrateur → sous-agents en théorie. Ce chapitre te montre ce même pattern vivant, sur le pipeline qui a écrit la page que tu es en train de lire.
Pourquoi ce module
Tu lis un handbook. Quelqu’un — quelque chose, plutôt — a placé ce chapitre dans le sommaire, choisi ses prérequis, rédigé son corps, vérifié chacune de ses affirmations contre une source. Ce « quelqu’un », c’est un pipeline de quatre agents Copilot orchestrés. Et l’objet de ce chapitre, c’est de le démonter sous tes yeux.
Le module a un double objectif. D’abord guide contributeur : si tu veux ajouter un module au handbook, tu dois savoir où entre le pipeline, comment il persiste son état, comment relancer ou interrompre, comment interpréter un verdict de rejet. Ensuite étude de cas des patterns vus en 208 — Workflows : outside-in, single-writer interlock, fact-check adversarial à contexte frais, boucle d’alignement bornée. À la fin du module, tu sais :
- nommer le point d’entrée unique et les trois sous-agents qu’il pilote ;
- lire un dossier
.spec-handbook-copilot/runtime/<slug>/et reconstruire l’état d’un pipeline ; - expliquer pourquoi le reviewer démarre en FRESH CONTEXT et ce que ça coûte de violer cette règle ;
- contribuer un module en lançant le pipeline et en interprétant ses verdicts (
CERTIFY,REVISE,REJECT).
Source : docs/learning-path/02-composition/208-workflows.md Citation : « un agent racine pilote le flux et délègue chaque étape à un sous-agent spécialisé via
runSubagent. » Fetched : 2026-05-28
Ce que tu vas apprendre
- La topologie du pipeline : un orchestrateur, trois sous-agents, un dossier d’état.
- Les artefacts persistés à chaque étape et leur rôle dans la reprise.
- La boucle d’alignement bornée writer ↔ reviewer (max 3 rounds).
- Le contrat FRESH CONTEXT du reviewer et l’anti-pattern warm-context.
- Le verdict de sortie :
CERTIFY/REVISE/REJECTet la sortie humaine sur exhaustion. - Comment lancer le pipeline pour proposer un nouveau module.
Concepts clés
Topologie : un point d’entrée, trois rôles
Le pipeline expose un seul agent invocable par un humain : handbook-chapter-orchestrator. C’est l’unique porte d’entrée. Les trois sous-agents — handbook-chapter-architect, handbook-chapter-writer, handbook-chapter-reviewer — ne sont pas invoqués directement par l’utilisateur ; ils sont spawnés par l’orchestrateur en mode forcé.
Source : .github/agents/handbook-chapter-orchestrator.agent.md Citation : « You are the only entry point — the user must not invoke
handbook-chapter-architect,handbook-chapter-writer, orhandbook-chapter-reviewerdirectly. » Fetched : 2026-05-28
Chaque sous-agent a un concern unique et le refuse au-delà.
| Agent | Concern unique | Sortie | Ce qu’il refuse |
|---|---|---|---|
orchestrator |
Séquencer + persister l’état | Artefacts dans runtime/<slug>/ |
Fetcher du corpus, rédiger de la prose, juger des claims |
architect |
Décider la place dans la taxonomie | placement.md |
Écrire dans docs/, rédiger le chapitre |
writer |
Rédiger avec citations | docs/learning-path/<bloc>/<slug>.md |
Décider la place, juger ses propres faits |
reviewer |
Vérifier chaque fait contre la source | review-round-N.md |
Éditer le draft |
Source : .spec-handbook-copilot/2026-05-27-initial-design/plan.md Citation : « orchestrator | Séquencer + persister état | Ne fetch pas, ne rédige pas » Fetched : 2026-05-28
C’est exactement l’application du pattern outside-in du module 208 : l’orchestrateur connaît le quoi (la séquence) ; chaque sous-agent connaît le comment de son étape.
Le single-writer interlock sur l’état persistant
Tous les artefacts d’un chapitre vivent sous .spec-handbook-copilot/runtime/<slug>/. Un seul agent y écrit : l’orchestrateur. Les sous-agents retournent leur sortie comme message final, et c’est l’orchestrateur qui la persiste.
Source : .github/agents/handbook-chapter-orchestrator.agent.md Citation : « You are the only writer under
.spec-handbook-copilot/runtime/<slug>/. Sub-agents return artifacts as their final message; you persist them to disk yourself. » Fetched : 2026-05-28
Cette discipline a un nom : single-writer interlock. Elle élimine deux classes de bugs typiques des pipelines multi-agents : les écritures concurrentes qui se marchent dessus, et la perte de trace d’audit quand on cherche après coup qui a produit quel artefact. Ici, la réponse est toujours la même : l’orchestrateur a persisté X qu’il a reçu de Y.
L’architect et le reviewer sont d’ailleurs explicitement contraints à ne pas écrire de fichiers eux-mêmes.
Source : .github/agents/handbook-chapter-architect.agent.md Citation : « return your placement plan as your final message. The orchestrator persists it … You do not write files yourself. » Fetched : 2026-05-28
Seul le writer, par exception, écrit lui-même dans docs/learning-path/<bloc>/<slug>.md — car le draft n’est pas un artefact d’état mais le produit publié final.
Source : .github/agents/handbook-chapter-writer.agent.md Citation : « Writes allowed:
docs/learning-path/<bloc>/<slug>.md(create or overwrite only). » Fetched : 2026-05-28
Le contrat FRESH CONTEXT du reviewer
Le reviewer est adversarial. Sa règle de démarrage est dure : il doit ignorer les sorties des rounds précédents, les notes du writer, et tout commentaire passé par l’orchestrateur au-delà du slug et du numéro de round.
Source : .github/agents/handbook-chapter-reviewer.agent.md Citation : « You start cold. You MUST NOT read:
review-round-{N-1}.mdor any prior review of this slug. » Fetched : 2026-05-28
Pourquoi ? Parce que la valeur du fact-check vient de l’indépendance. Si le reviewer lit les notes du writer, il hérite des biais du writer : il « voit » la quote dans le contexte voulu par l’auteur au lieu de la chercher dans le contexte réel de la source. Le re-fetch d’une URL devient une formalité au lieu d’un test.
Source : .github/agents/handbook-chapter-reviewer.agent.md Citation : « Warm-context review is the failure mode this agent exists to prevent. » Fetched : 2026-05-28
Concrètement, pour chaque citation du draft, le reviewer re-fetche la source, localise le verbatim, et compare avec ce qu’affirme le draft. Cinq verdicts possibles par claim : VERIFIED, CHERRY-PICKED, UNSUPPORTED, UNFETCHABLE, OUTDATED. C’est cette table qui fonde le verdict global.
Source : .github/agents/handbook-chapter-reviewer.agent.md Citation : « Re-fetch the cited URL or path … Use a fresh tool call; do not trust the writer’s quoted snippet without re-fetching. » Fetched : 2026-05-28
La boucle d’alignement bornée
Writer et reviewer ne dialoguent pas directement. Ils alternent, médiés par l’orchestrateur, dans une boucle bornée à 3 rounds maximum.
Source : .github/agents/handbook-chapter-orchestrator.agent.md Citation : « Writer ↔ Reviewer alignment loop (bounded, max 3 rounds) … For each round N from 1 to 3 » Fetched : 2026-05-28
La sortie dépend du verdict reviewer :
CERTIFY→ sortie immédiate, chapitre prêt pour relecture humaine.REVISEavec N < 3 → nouveau round writer, qui reçoit le review comme entrée.REVISEavec N == 3 → sortie en B10 HUMAN CHECKPOINT : on demande à l’humain quoi faire.REJECT→ sortie immédiate en HUMAN CHECKPOINT.
Source : .github/agents/handbook-chapter-orchestrator.agent.md Citation : «
REJECT-> exit loop immediately. Go to Phase 4 REJECT path. » Fetched : 2026-05-28
La borne N == 3 n’est pas un nombre choisi au hasard. C’est l’expression d’une discipline : toute boucle d’agent doit avoir une sortie déterministe vers l’humain. Une boucle non bornée, c’est un agent qui s’auto-justifie indéfiniment. Avec un plafond, on garantit que soit la qualité converge, soit un humain est convoqué pour trancher.
Source : .spec-handbook-copilot/2026-05-27-initial-design/plan.md Citation : « PROSE Safety Boundaries | OK (S4 entre stages, B10 sortie de boucle) » Fetched : 2026-05-28
Démonstration : le pipeline en action sur ce chapitre
Le chapitre que tu lis a été produit par ce pipeline. Tous les artefacts sont versionnés sous .spec-handbook-copilot/runtime/pipeline-agents-handbook/. Tu peux les inspecter dans le dépôt.
Étape 1 — Le prompt humain crée plan.md
L’utilisateur a écrit (verbatim) : « On va construire dans ressources une explication de comment on se sert des agents pour le site. … c’est à la fois une page ou un ensemble de page permettant a chacun de contribuer mais aussi un vrai exemple de workflow ». L’orchestrateur a dérivé le slug pipeline-agents-handbook et créé plan.md :
+ # Plan — pipeline-agents-handbook
+
+ ## Sujet (verbatim utilisateur)
+ > On va construire dans ressources une explication de comment ...
+
+ ## Identité
+ - Slug : `pipeline-agents-handbook`
+ - Stage courant : `architect`
+ - Round : 0
+ - Créé : 2026-05-28
Source : .spec-handbook-copilot/runtime/pipeline-agents-handbook/plan.md Citation : « Slug :
pipeline-agents-handbook… Stage courant :architect… Round : 0 » Fetched : 2026-05-28
Le prompt initial parle de ressources. Le cadrage humain a corrigé : on reste dans learning-path. Cette correction est elle-même tracée dans le plan, ce qui te permet, en lisant l’artefact aujourd’hui, de comprendre pourquoi le chapitre est dans 02-composition et pas dans docs/ressources/.
Étape 2 — L’architect émet placement.md
L’orchestrateur a spawné l’architect avec pour seule consigne : « plan placement for slug pipeline-agents-handbook ». L’architect a lu le catalogue de modules, scanné docs/learning-path/, et retourné sa décision. Verdict : INSERT, après 210-copilot-cli.md, numéro 211.
+ # Placement — pipeline-agents-handbook
+
+ **Date**: 2026-05-28
+ **Verdict**: INSERT
+
+ ## Position
+ Inséré en fin du bloc `02-composition`, après `210-copilot-cli.md`.
+ ...
+ ## Path du draft
+ `docs/learning-path/02-composition/211-pipeline-agents-handbook.md`
Source : .spec-handbook-copilot/runtime/pipeline-agents-handbook/placement.md Citation : « Verdict: INSERT … Inséré en fin du bloc
02-composition, après210-copilot-cli.md. Slugpipeline-agents-handbook, numéro proposé211. » Fetched : 2026-05-28
Note la discipline de scope : l’architect a refusé d’écrire le moindre paragraphe du chapitre. Il a seulement décidé où et avec quels prérequis. Le slug, le numéro et le chemin sont gelés ; le writer n’a pas le droit de les changer.
Source : .github/agents/handbook-chapter-architect.agent.md Citation : « Any request to edit a module or to draft chapter content -> refusal: “Out of scope. I only emit placement plans. Use
handbook-chapter-writerto draft.” » Fetched : 2026-05-28
Étape 3 — Le writer rédige avec citations
L’orchestrateur a alors spawné le writer en lui disant : « round 1 pour le slug pipeline-agents-handbook ». Le writer a rechargé plan.md et placement.md, listé son corpus (les quatre .agent.md, le design packet, le module 208), fait des read_file pour chaque source, puis écrit la prose. Chaque affirmation factuelle est suivie d’un bloc > Source: / > Citation: / > Fetched:. La page que tu lis est l’output de ce round.
Source : .github/agents/handbook-chapter-writer.agent.md Citation : « No claim ships without a fetched source. Training recall is permitted to suggest what to look up — never to assert a fact. » Fetched : 2026-05-28
Étape 4 — Le reviewer fact-check à froid
Une fois le draft écrit, l’orchestrateur spawne le reviewer dans un contexte vierge. Le reviewer ouvre le draft, extrait chaque citation C1, C2, …, et pour chacune re-fetche la source. Il produit une table d’audit et un verdict.
| ID | Type | Section | Source cited | Status |
|----|----------|------------------|-------------------------|-------------|
| C1 | citation | ## Concepts clés | .../orchestrator.agent | VERIFIED |
| C2 | citation | ## Concepts clés | .../architect.agent | VERIFIED |
| ...| ... | ... | ... | ... |
| U1 | uncited | ## Démo | - | UNCITED |
Source : .github/agents/handbook-chapter-reviewer.agent.md Citation : « 0
UNSUPPORTEDAND 0CHERRY-PICKEDAND 0UNCITEDAND ≤ 2PEDAGOGICAL-GAPAND ≤ 1OUTDATED-> CERTIFY. » Fetched : 2026-05-28
Si le verdict est CERTIFY, l’orchestrateur sort et te dit que le draft est prêt. Sinon il relance un round. Si on a atteint 3 sans converger, ou si le verdict est REJECT, l’orchestrateur sort en HUMAN CHECKPOINT et te demande quoi faire.
Le diagramme de séquence vu de l’orchestrateur
sequenceDiagram
actor U as Auteur humain
participant O as orchestrator
participant FS as runtime/[slug]/
participant A as architect
participant W as writer
participant R as reviewer (FRESH)
U->>O: "construis un chapitre sur X"
O->>FS: write plan.md (slug, round=0)
O->>A: spawn (FORCED)
A->>FS: read plan.md
A-->>O: placement decision
O->>FS: persist placement.md
loop N = 1..3
O->>W: spawn (FORCED, round=N)
W->>FS: read plan + placement (+ review N-1 si N>1)
W->>W: fetch corpus (S7 tool bridge)
W-->>O: draft path
W->>FS: write docs/learning-path/.../slug.md
O->>R: spawn (FRESH CONTEXT, round=N)
R->>FS: read draft + placement UNIQUEMENT
R->>R: re-fetch chaque source
R-->>O: verdict + audit table
O->>FS: persist review-round-N.md
alt verdict == CERTIFY
O-->>U: draft prêt pour relecture
else verdict == REVISE && N < 3
Note over O: nouveau round
else REJECT ou N == 3
O-->>U: B10 HUMAN CHECKPOINT
end
end
La machine à états de la boucle d’alignement
stateDiagram-v2
[*] --> Bootstrap
Bootstrap --> Architect : plan.md écrit
Architect --> Done_Reject : verdict REJECT (hors scope)
Architect --> WriteRound : verdict INSERT/REPLACE/NEW-TRACK
WriteRound --> Review : draft écrit
Review --> Done_Certify : CERTIFY
Review --> WriteRound : REVISE et N < 3
Review --> Human_Checkpoint : REVISE et N == 3
Review --> Human_Checkpoint : REJECT
Done_Certify --> [*]
Done_Reject --> [*]
Human_Checkpoint --> [*]
Deux propriétés à retenir :
- Toutes les transitions terminales sont observables par l’humain :
Done_Certify,Done_Reject,Human_Checkpoint. Pas de sortie silencieuse. - L’unique transition non-terminale (
Review → WriteRound) est bornée par le compteur N. La boucle ne peut pas s’auto-perpétuer.
Exercice ⭐⭐
Énoncé — Lance le pipeline sur un sujet de ton choix et inspecte les artefacts produits.
Étapes guidées :
- Choisis un sujet en scope du handbook (par exemple : « les transports MCP : stdio vs HTTP »).
- Dans le chat Copilot, sélectionne le mode
handbook-chapter-orchestratoret envoie : « construis un chapitre sur les transports MCP ». - Observe l’orchestrateur créer
.spec-handbook-copilot/runtime/mcp-transports/plan.md. Lis-le. - Observe l’architect retourner sa décision. Vérifie que
placement.mdapparaît dans le même dossier et que le verdict est l’un deINSERT/REPLACE/NEW-TRACK/REJECT. - Si le verdict est
REJECT, le pipeline s’arrête — c’est attendu. Lis la justification dansplacement.md. - Sinon, observe le writer écrire
docs/learning-path/<bloc>/mcp-transports.md, puis le reviewer émettrereview-round-1.mddans le dossier runtime. - Si verdict reviewer =
REVISE, observe le writer reprendre en round 2 et lirereview-round-1.mdcomme entrée. Confirme que le reviewer du round 2 démarre cold (il ne lit pasreview-round-1.md).
Critère de réussite : tu peux pointer du doigt, dans le dossier runtime/<slug>/, l’artefact produit à chaque étape, et le draft final dans docs/learning-path/ cite chacune de ses sources avec un bloc verbatim.
Validation
Tu peux passer au module suivant si :
- Tu sais nommer le point d’entrée unique du pipeline et tu sais qu’on n’invoque pas les sous-agents directement.
- Tu peux décrire le rôle isolé de chacun des trois sous-agents et ce que chacun refuse de faire.
- Tu sais expliquer pourquoi le reviewer démarre en FRESH CONTEXT et ce que casse un démarrage warm.
- Tu sais à quoi sert la borne de 3 rounds et où elle débouche en cas d’exhaustion.
- Tu peux ouvrir un dossier
runtime/<slug>/et reconstruire l’historique d’exécution d’un chapitre. - Tu as lancé le pipeline au moins une fois sur un sujet de ton choix.
Pour aller plus loin
- 208 — Workflows — le module conceptuel dont celui-ci est l’incarnation. Relis-le après avoir vu le pipeline en action ; les patterns prennent un autre relief.
- 104 — Agents et 103 — Skills — la base sur laquelle reposent les sous-agents et leurs procédures.
- Inspecte les quatre fichiers du quartet sous
.github/agents/handbook-chapter-*.agent.md. C’est la spec exécutable du pipeline ; tout ce que ce chapitre décrit y est codifié. - Lis le design packet
.spec-handbook-copilot/2026-05-27-initial-design/plan.mdpour comprendre pourquoi l’orchestrateur a été extrait et pas fusionné dans un super-agent — c’est l’application explicite de la méthodologie Genesis.
Module suivant
Suivant : 212 — LSP — le Language Server Protocol avec Copilot
Sources
- .github/agents/handbook-chapter-orchestrator.agent.md
- .github/agents/handbook-chapter-architect.agent.md
- .github/agents/handbook-chapter-writer.agent.md
- .github/agents/handbook-chapter-reviewer.agent.md
- .spec-handbook-copilot/2026-05-27-initial-design/plan.md
- .spec-handbook-copilot/runtime/pipeline-agents-handbook/plan.md
- .spec-handbook-copilot/runtime/pipeline-agents-handbook/placement.md
- docs/learning-path/02-composition/208-workflows.md