Copilot PR Autopilot
Pilotez n'importe quel pull request GitHub à travers plusieurs rounds successifs de révision de code Copilot jusqu'à ce que l'agent ait terminé son travail — chaque constatation de Copilot reçoit une réponse de l'agent (acceptation-avec-correction, refus-avec-justification, ou transfert explicite à l'utilisateur). Les threads ouverts restants, s'il y en a, sont des transferts délibérés au propriétaire de fusion humain — il ne s'agit pas d'échecs de boucle. Agnostique au référentiel — fonctionne sur n'importe quel dépôt ayant la révision de code Copilot activée, exécuté à partir d'une machine avec la CLI gh installée et authentifiée (voir Conditions préalables).
Quand utiliser cette skill
- L'utilisateur demande « demander une révision Copilot » ou « exécuter une boucle de révision Copilot » sur un PR.
- Un PR est fonctionnellement complet et l'utilisateur souhaite une vérification de justesse finale via plusieurs rounds de révision automatisés.
- Une révision Copilot antérieure sur le PR a laissé des threads ouverts qui nécessitent un triage, des corrections, des réponses et une résolution.
Quand NE PAS utiliser cette skill
- Le PR est toujours en cours de conception active — attendez que la structure soit stable ; sinon les constatations varient d'un round à l'autre.
- L'utilisateur souhaite des retours de relecteurs humains, pas ceux de Copilot.
Conditions préalables
- CLI
ghinstallée et authentifiée contre le référentiel cible. - PowerShell sur PATH — Windows PowerShell 5.1+ (
powershell.exe) ou PowerShell 7+ (pwsh). Les deux sont testés. - La révision de code Copilot est le cas d'usage principal (
01-request-review.ps1utilise GraphQLrequestReviewsByLoginpour déclencher Copilot). Ce n'est PAS une exigence stricte — si01-request-review.ps1échoue parce que Copilot n'est pas activé sur le dépôt / compte, l'agent peut toujours piloter les threads de révision existants (humains, advanced-security, etc.) à la conclusion en exécutant les étapes 3–8 une seule fois comme une seule itération ; il suffit de sauter le déclenchement + attente. Il n'y a pas de détection automatique pour « Copilot indisponible » — l'agent prend cette décision après l'échec du déclenchement (le script ne peut pas distinguer de manière fiable « Copilot désactivé » de « Copilot activé mais pas encore déclenché » à partir de l'état de l'API seul).
Permissions : qui peut exécuter la boucle complète
L'autopilot multi-round complet (étapes 1 → 9 → 1) nécessite une permission Triage ou Write sur le dépôt cible, car l'API publique GitHub pour ajouter le bot Copilot en tant que relecteur (requestReviewsByLogin) est protégée par cette permission. Vérifié par rapport à la surface REST + GraphQL publique dans l'historique des commits de ce PR — il n'existe pas de chemin API public pour les relecteurs bot sans permission d'écriture.
| Vous êtes… | Ce qui fonctionne |
|---|---|
| Collaborateur du dépôt avec Triage / Write | Boucle complète : 01 déclenche Copilot, 02 attend, 04–08 trient / corrigent / répondent, boucle retour à 01. Sans intervention. |
| Auteur de PR externe (pas de permission d'écriture) | 01 lèvera une erreur claire et exploitable. Utilisez le mode -SingleIteration : adressez tous les constatations actuelles en une seule passe, puis soit cliquez sur l'UI 🔄 à côté de Copilot, soit poussez un commit substantiel (l'événement synchronize déclenche automatiquement Copilot sur la plupart des dépôts). Ensuite ré-exécutez 02 pour vérifier. |
En mode itération unique, le booléen de convergence de la boucle est Converged: true ssi OpenThreadsAwaitingReply == 0 (le côté agent est terminé). Le redéclenchement côté mainteneur pilote alors tout round supplémentaire.
Chaque script dot-source scripts/_lib.ps1 qui
exécute Assert-GhReady au chargement : si gh est manquant OU gh auth status
échoue, le script s'arrête avant tout travail avec un seul message d'erreur exploitable nommant la commande d'installation et gh auth login. L'agent doit transmettre ce message à l'utilisateur textuellement et arrêter la boucle — ne pas réessayer ou contourner.
Flux de travail étape par étape
La boucle : étapes 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9, puis retour à l'étape 1 si
Converged: false. Répétez le round 1→9 jusqu'à ce que l'étape 9 retourneConverged: true; ce n'est qu'alors qu'il faut exécuter l'étape 10 une seule fois et appelertask_complete. À chaque 10e round, le parent exécute la porte de récapitulatif du cap de round avant de boucler — récapitulez tous les rounds antérieurs et arrêtez si la boucle a dévié du scope original du PR.
Chaque round exécute les étapes 1–9 ; l'étape 10 est un nettoyage unique après convergence. L'agent parent coordonne ; chaque étape de sous-agent s'exécute dans un contexte frais avec un budget borné. Protocole transversal (délai limite, extension, fallback itération unique) : orchestration.md.
- Demander révision (parent) — voir 01-request-review.md
- Attendre la révision (sous-agent, cap 20 min) — voir 02-wait.md
- Lister + catégoriser les threads ouverts (sous-agent, 5 min) — voir 03-list-threads.md
- Triage (sous-agent, 5 min par ≤5 threads) — voir 04-triage.md
- Corriger (sous-agents, max 5 parallèles, 5 min chacun) — voir 05-fix.md
- Construire + tester selon les conventions du dépôt (sous-agent, 10 min) — voir 06-build-test.md
- Commiter + pousser (parent) — voir 07-commit-push.md
- Répondre (toujours) + résoudre (conditionnel) (sous-agent brouille, parent poste) — voir 08-reply-resolve.md
- Vérifier convergence (sous-agent, 3 min) — voir 09-convergence.md
Converged: false→ boucler retour à l'étape 1 pour un autre round (redéclenchement, attente, liste, triage, correction, push, réponse, revérification). Chaque round adresse les constatations de Copilot du HEAD du round antérieur ; la boucle se termine dès que Copilot n'a rien de nouveau à dire ET que chaque thread ouvert a une réponse de l'agent.Converged: true→ sortir de la boucle, exécuter l'étape 10 une seule fois, appelertask_completeavec la preuve.- Chaque 10e round (10, 20, 30…) → exécuter la porte de récapitulatif du cap de round avant de boucler. Récapitulez TOUS les rounds antérieurs par rapport au scope original du PR et choisissez un verdict : CONTINUE, REVERT-AND-SHIP (supprimer les commits dérivés, livrer ceux du scope), ou HAND-OFF (escalader vers l'utilisateur). C'est le disjoncteur qui arrête une boucle de révision bot qui s'emballe.
- Nettoyer les éléments obsolètes (parent, post-convergence, une fois) — voir 10-cleanup.md
La convergence est calculée par scripts/02-check-review-status.ps1 comme un seul booléen Converged: true. N'appelez pas task_complete tant qu'il ne retourne pas true ; imprimez la preuve (HeadOid, LatestCopilotReview.commitOid, submittedAt) dans le message de fin.
Pièges
Les scripts fournis appliquent les invariants de justesse stricte (déclenchement arrivée via l'ID d'événement copilot_work_started, Converged nécessitant correspondance HEAD + zéro-en-attente + révision at-HEAD, sémantique fallback itération unique, garde d'état PR). Fiez-vous à eux — ne réduisez pas. Les notes ci-dessous couvrent les décisions que les scripts ne peuvent pas prendre pour vous :
- Répondre à chaque thread ouvert ; résoudre uniquement quand la boucle détient la disposition. Pour les threads
fixetdecline, répondre + résoudre. Pour les threadsescalate-to-user, répondre avec l'analyse mais laisser le thread OUVERT (08-reply-and-resolve.ps1 -NoResolve) pour que le propriétaire de fusion humain puisse agir. Voir 08-reply-resolve.md. - Les threads Copilot sont contrôlés par la boucle ; les threads humains / advanced-security / autre-bot font défaut à
escalate-to-user. La résolution automatique d'un thread de révision humain peut cacher des préoccupations non adressées. Voir 04-triage.md pour la rubrique. - Un commit focalisé par round, pas un par PR. Regrouper les rounds détruit la piste d'audit de quelle constatation a piloté quel changement et casse
git bisect. Voir 07-commit-push.md. - Construire/tester/linter avec les commandes propres du dépôt (selon son
CONTRIBUTING/AGENTS/README/package.json/Makefile) avant de pousser une correction. Procédure de découverte : 06-build-test.md. - Repousser avec justification écrite quand une constatation de Copilot sur-ingenierait la conception pour un cas limite hypothétique. Accepter chaque suggestion automatiquement érode la conception — voir le chemin
declinedans 04-triage.md. - Pièges de script (type-coercion
gh api graphql -F, analyse positionnellegit stash push -m, les trois pièges GraphQL pour la mutation relecteur) sont documentés dans references/api-quirks.md. Lisez avant de modifier n'importe quel script.
Dépannage
| Problème | Solution |
|---|---|
Le script lève prerequisite missing — gh CLI is not on PATH |
Installer gh (winget install GitHub.cli sur Windows ; brew install gh sur macOS ; gestionnaire de paquets sur Linux ; ou télécharger depuis https://cli.github.com). Puis gh auth login. Transmettez le message à l'utilisateur et ARRÊTEZ la boucle — ne réessayez pas. |
Le script lève prerequisite missing — gh CLI is not authenticated |
Exécutez gh auth login. ARRÊTEZ la boucle jusqu'à ce que l'utilisateur complète l'authentification. |
Le déclenchement échoue ou aucun événement copilot_work_started ne se pose |
Poussez un commit substantiel (non-whitespace) — l'attribution automatique sur synchronize est le déclenchement le plus fiable. L'échec persistant indique que la révision de code Copilot peut ne pas être activée sur le dépôt / compte (vérifier dépôt Paramètres → Code & automation → Copilot, ou Copilot Pro/Pro+ au niveau du compte). |
| Aucune nouvelle révision après attente ~10 min | Période calme après rejet récent ou suppression diff-trivial. Poussez un commit substantiel et réessayez. Ne pas aveuglément ré-exécuter 01-request-review.ps1 — il rapporte InFlight tandis que Copilot est toujours un relecteur demandé. |
| Threads obsolètes mais non résolus dans la liste ouverte | Attendu : l'état non résolu est la source de vérité. Répondez + résolvez-les comme n'importe quel autre thread ouvert. 10-cleanup-outdated.ps1 n'est qu'un filet de sécurité final. |
| Incertain si corriger ou refuser une constatation | Voir references/04-triage.md. |
| Besoin d'une formulation de réponse pour « corrigé », « refusé » ou « dérive » | Voir les modèles sous templates/ — reply-fix.md, reply-decline.md, reply-drift.md, reply-partial.md. |
Références
- references/orchestration.md — contrôle de boucle transversal : protocole délai limite & extension, carte délégation sous-agent, fallback itération unique, et notes boucle-large.
- Contrats par étape (un
NN-*.mdpar étape) : references/01-request-review.md (parent), references/02-wait.md, references/03-list-threads.md, references/04-triage.md (inclut la rubrique fix-vs-decline), references/05-fix.md, references/06-build-test.md, references/07-commit-push.md (parent), references/08-reply-resolve.md, references/09-convergence.md (inclut la porte de récapitulatif du cap de round), references/10-cleanup.md (parent). - references/api-quirks.md — comportement GitHub API vérifié, impasses, et les pièges GraphQL pour la mutation relecteur.
- Modèles (un par type de réponse) : templates/reply-fix.md — modèle correction-acceptée ; templates/reply-decline.md — modèle refusé-avec-justification ; templates/reply-drift.md — dérive description-PR / commentaire / plan-test ; templates/reply-partial.md — correction partielle avec suivi différé. Les conseils de réponse transversaux et les anti-modèles vivent dans references/08-reply-resolve.md.
- scripts/_lib.ps1 — aides partagées (
Invoke-Gh,Invoke-GhGraphQL,Resolve-RepoCoords) ; dot-sourcées par chaque script. - scripts/01-request-review.ps1 —
déclencher révision Copilot et vérifier pickup via l'événement
copilot_work_started. - scripts/02-check-review-status.ps1 —
cliché unique de l'état de révision Copilot du PR ; émet
Converged: trueuniquement quand les trois conditions tiennent. - scripts/03-list-open-threads.ps1 — chaque thread de révision PR non résolu de tous les relecteurs (Copilot, humains, github-advanced-security, etc.).
- scripts/08-reply-and-resolve.ps1 — poster une réponse et résoudre en un appel.
- scripts/10-cleanup-outdated.ps1 — filet de sécurité pour les threads Copilot obsolètes.