Scénario : de l’idée au backlog de réalisation
Un utilisateur métier soumet une idée à un agent Copilot Studio. La squad product mène les recherches, élabore un plan, produit les livrables destinés aux parties prenantes et restitue un backlog structuré. L’agent crée ensuite les epics, user stories et tâches correspondants dans Azure DevOps, Jira ou GitHub. Cette page décrit l’ensemble du parcours pour vous permettre de le reproduire.
Deux limites à bien comprendre. Le serveur n’écrit jamais dans Azure DevOps, Jira ou GitHub : c’est l’agent qui s’en charge, au moyen du connecteur natif certifié et de la connexion propre à l’utilisateur. Par ailleurs, les résultats de la squad restent consultatifs : des textes finalisés et un plan validé, pas du code exécuté.
Ce que vous obtiendrez#
- Un serveur MCP déployé dans votre propre locataire Azure, avec le profil product et les outils métier activés.
- Un agent Copilot Studio doté de deux connecteurs : celui de ce serveur et le connecteur natif de votre outil de suivi du travail.
- Un échange reproductible : « transforme ce PRD en backlog » → confirmation → création des éléments de travail, avec les bons liens parent-enfant et l’intégralité des critères d’acceptation.
- Une trace durable sous
.copilot-tracking/dans votre propre stockage, relue automatiquement à l’exécution suivante.
Partie 0 — Prérequis#
- Un abonnement Azure dans lequel vous pouvez déployer des ressources et l’autorisation de créer une inscription d’application Entra.
- Un déploiement Azure OpenAI. C’est là que se situe le coût.
- Une licence Copilot Studio et la possibilité d’ajouter un connecteur personnalisé.
- Azure DevOps, Jira ou GitHub, avec une licence permettant l’utilisation du connecteur natif.
- Le dépôt cloné et la commande
npm ci && npm run buildexécutée une fois.
Partie 1 — Déployer en activant le parcours produit#
Suivez les étapes 1 à 7 de host/RUNBOOK.md
pour le déploiement de base. Ce scénario nécessite davantage de fonctionnalités que le mode consultatif par défaut.
Configurez donc les paramètres suivants avant l’étape 6 : ils sont disponibles à la fois dans
main.bicepparam et sous forme de variables d’environnement.
| Paramètre | Valeur | Utilité pour ce scénario |
|---|---|---|
SQUAD_MCP_REMOTE_PIPELINE_ENABLED | true | Expose squad_run et squad_status. Désactivé par défaut. |
SQUAD_MCP_RUN_STATE_BACKEND | table | Une exécution du profil product est longue. Le stockage de l’état dans Table permet de le conserver après une réduction à zéro du nombre de réplicas et de partager l’approbation entre les réplicas. |
SQUAD_MCP_STORAGE_ACCOUNT | votre compte de stockage | Stocke l’état des exécutions, la mémoire et les données dépassant le seuil de taille. |
SQUAD_MCP_WORKER_ENABLED | true | Une exécution du profil product en 10 étapes dépasse la durée prise en charge dans le traitement d’une requête. Le worker la pilote en dehors de ce traitement. |
SQUAD_MCP_ENABLE_BUSINESS_TOOLS | true | Expose squad_backlog, dont le contrat JSON est au cœur de ce scénario. |
SQUAD_MCP_ENABLE_MEMORY | true | Conserve l’arborescence .copilot-tracking/ de manière persistante. |
SQUAD_MCP_MEMORY_BACKEND | table ou graph | Définit la destination de cette arborescence. Faites ce choix dans la partie 2 avant le déploiement. |
SQUAD_MCP_MEMORY_AUTO_ENABLED | true | Réintègre automatiquement l’état antérieur dans context, afin que l’appel de création du backlog dispose déjà des décisions prises pendant l’exécution. |
SQUAD_MCP_ENABLE_ARTIFACTS | true | Écrit le registre — team.md, routing.md, state.json — pour permettre l’examen du fonctionnement de la squad. |
SQUAD_MCP_ADVISORY_AUTOPILOT_ENABLED | true | Facultatif, mais recommandé ici. Voir la remarque ci-dessous. |
SQUAD_MCP_RUN_ENCRYPTION_KEY_B64 | une clé encodée en base64 | Chiffre au repos les artefacts des étapes et les données fournies par l’appelant. Les documents d’exigences sont généralement confidentiels. |
À propos du mode autopilot. Normalement, squad_run se met en attente à un point de
validation humain et nécessite l’intervention d’un opérateur pour reprendre. Ce fonctionnement vous convient
peut-être, mais il peut dérouter un utilisateur métier qui souhaite simplement obtenir un backlog. Le profil
product ne comporte aucun rôle susceptible d’effectuer des actions à impact : ni agent de déploiement,
ni auteur IaC, ni agent d’exécution du backlog. Il est donc considéré comme purement consultatif, et
SQUAD_MCP_ADVISORY_AUTOPILOT_ENABLED=true lui permet d’aller jusqu’au bout sans intervention.
Cette option restreint le champ du point de validation ; elle ne le supprime pas. Toute demande dont le routage mobilise un rôle susceptible d’effectuer des actions à impact reste mise en attente. Si vous préférez soumettre chaque exécution à une validation, laissez cette option désactivée et utilisez l’approbation par un opérateur décrite dans la partie 6.
Partie 2 — Choisir où conserver l’historique#
Ce choix est souvent négligé. Après une première utilisation réelle, on découvre alors qu’un mois de résultats de la squad se trouve dans un emplacement que personne ne peut consulter. Décidez maintenant : un seul paramètre suffit, et il s’applique à tout ce que la squad écrit.
Ce qui est effectivement écrit#
Avec SQUAD_MCP_ENABLE_ARTIFACTS=true, chaque exécution écrit une arborescence
.copilot-tracking/ consultable, identique à celle que la squad produit lorsqu’elle s’exécute localement
dans VS Code :
squad/team.md the 13 seeded roles
squad/routing.md the rows those roles can serve
squad/state.json the ledger
squad/decisions.md append-only — incl. the Intake Readiness Verdict
squad/notifications.md append-only
squad/history/<agent>.md per agent, with a measured Consumption block
squad/history/autopilot-run-<id>.md per run
squad/consumption.md rebuilt from those blocks, so earlier turns are never dropped
plans/ · docs/ · outputs/ · ppt/<date>/<slug>/ the deliverables themselves
Sans SQUAD_MCP_ENABLE_ARTIFACTS, la mémoire automatique ne conserve que trois clés sans
arborescence. Cela suffit à assurer la continuité entre deux échanges, mais ne permet aucun audit :
vous ne pouvez ni ouvrir le PRD produit par une exécution, ni voir quel agent a écrit quoi. Pour ce scénario,
activez cette option.
Choisir une destination#
Un seul paramètre, SQUAD_MCP_MEMORY_BACKEND, définit simultanément la destination de la mémoire,
du registre et des livrables.
| Backend de stockage | Destination | Quand le choisir | Configuration requise |
|---|---|---|---|
tablepar défaut |
Azure Table Storage dans votre compte, table squadmemory |
Vous souhaitez un stockage durable, économique et fiable avec plusieurs réplicas, et vous consultez les données au moyen des outils plutôt que manuellement. | Définissez SQUAD_MCP_STORAGE_ACCOUNT. Rien d’autre :
main.bicep attribue pour vous le rôle Storage Table Data Contributor à l’identité
de l’application et du worker. |
graph |
Une bibliothèque de documents SharePoint ou OneDrive, avec un fichier .md lisible par entrée |
Les utilisateurs métier doivent pouvoir ouvrir eux-mêmes les résultats. C’est généralement le bon choix pour un scénario utilisant le profil product. | Définissez SQUAD_MCP_MEMORY_GRAPH_DRIVE_ID et effectuez un déploiement
distinct, avec des privilèges d’administration ; voir ci-dessous. |
file |
Un répertoire local dans le conteneur | Un essai avec un seul réplica. Les données ne sont pas conservées après un redémarrage consécutif à une réduction à zéro du nombre de réplicas. | Définissez SQUAD_MCP_MEMORY_DIR. Ne l’utilisez pas conjointement avec le worker. |
L’état d’exécution et la mémoire sont deux stockages distincts.
SQUAD_MCP_RUN_STATE_BACKEND conserve l’exécution en cours afin qu’elle puisse survivre à un
redémarrage ; SQUAD_MCP_MEMORY_BACKEND conserve l’historique. Leurs valeurs peuvent différer :
l’association d’un état d’exécution dans table et d’une mémoire dans graph est courante.
Tous deux lisent SQUAD_MCP_STORAGE_ACCOUNT, ce qui explique la confusion fréquente.
Si vous avez choisi SharePoint#
Chaque entrée devient un fichier Markdown à l’emplacement suivant :
<rootPath>/<tenantId>/<project>/<path>.md
SharePoint en gère les versions et lui applique vos politiques existantes de conservation, de recherche et de
prévention de la perte de données (DLP). La gestion des accès concurrents utilise l’eTag natif de Graph
avec If-Match : une écriture fondée sur une version obsolète est donc refusée au lieu d’écraser les données.
Vous devez effectuer vous-même deux étapes :
-
Récupérez l’identifiant du lecteur de la bibliothèque qui accueillera l’historique :
SITE_ID=$(az rest --method GET \ --url "https://graph.microsoft.com/v1.0/sites/<TENANT>.sharepoint.com:/sites/<SITE_PATH>" \ --query id --output tsv) az rest --method GET \ --url "https://graph.microsoft.com/v1.0/sites/$SITE_ID/drives" \ --query "value[].{name:name,id:id}" --output table -
Accordez à l’identité de l’application l’accès à cette seule bibliothèque, en tant qu’administrateur :
Ce déploiement attribue
az deployment group create \ --resource-group "$RG" \ --template-file host/infra/graph-memory-permissions.bicep \ --parameters host/infra/graph-memory-permissions.bicepparamSites.Selected, qui, à lui seul, ne donne accès à aucun site, puis accorde un droit d’écriture uniquement sur le site que vous avez indiqué. Il est volontairement distinct : il nécessiteAppRoleAssignment.ReadWrite.AlletSites.FullControl.All, des autorisations bien plus étendues que celles requises pour déployer la Container App. Vos déploiements courants n’exigent donc jamais de droits d’administration Graph. Le relancer n’entraîne aucune modification supplémentaire.
Laissez SQUAD_MCP_MEMORY_GRAPH_ENCRYPT désactivé, sauf si une politique l’impose.
L’intérêt même de SharePoint est de permettre à une personne d’ouvrir le fichier ; chiffrer son contenu supprime
cet avantage. Si vous activez cette option, configurez également runEncryptionKeyBase64.
Si sharePointSiteId reste vide, seul Sites.Selected est attribué. Cet état partiel est
volontairement sûr : l’identité peut recevoir un accès, mais n’accède encore à rien. Une configuration inachevée
n’expose donc jamais une bibliothèque à votre insu.
Artefacts volumineux#
Une entité Table est soumise à une limite de taille, qu’un PRD ou un backlog complet dépassera. Activez le stockage des données excédentaires pour éviter l’échec de l’écriture :
| Variable | Valeur |
|---|---|
SQUAD_MCP_MEMORY_OVERFLOW_ENABLED | true |
SQUAD_MCP_MEMORY_OVERFLOW_CONTAINER | le nom d’un conteneur de blobs |
SQUAD_MCP_MEMORY_OVERFLOW_THRESHOLD_BYTES | 32768 par défaut |
Tout contenu dépassant le seuil est stocké dans un blob, avec un pointeur conservé dans l’entité. La lecture reste transparente.
Proposer plusieurs destinations aux équipes#
Si un même déploiement dessert plusieurs équipes qui ne doivent pas partager la même destination, déclarez une liste de destinations autorisées plutôt qu’un backend unique :
SQUAD_MCP_MEMORY_TARGETS=[
{ "name": "azure", "backend": "table", "tableName": "squadmemory" },
{ "name": "sharepoint", "backend": "graph", "driveId": "<DRIVE_ID>", "rootPath": "squad-memory" }
]
SQUAD_MCP_MEMORY_DEFAULT_TARGET=azure
L’appelant transmet alors un nom target opaque. Vous gardez la maîtrise de tous les
champs contenant des informations d’authentification ; un nom non déclaré est refusé avant toute entrée-sortie,
sans jamais utiliser la destination par défaut comme solution de repli.
Relire l’historique#
Deux modes sont possibles ; dans ce scénario, c’est le premier qui importe :
-
Automatiquement. Avec
SQUAD_MCP_MEMORY_AUTO_ENABLED=true, le serveur lit les entréesstateetdecisionsdu projet avant chaque délégation et les injecte comme des données explicitement délimitées, jamais comme des instructions faisant autorité. Personne n’a besoin de penser à le demander. C’est pourquoi l’appel àsquad_backlogdans la partie 7 ne nécessite pas de recoller l’artefact de l’exécution. -
À la demande.
squad_historypermet de parcourir l’arborescence :op=indexpour en obtenir une synthèse,op=listpour en lister le contenu etop=readpour ouvrir un fichier. Il nécessite l’étendue d’autorisationSquad.Memory.
Désactivez les outils de mémoire dans l’agent. Lorsque la mémoire automatique est activée,
vous devez supprimer la section consacrée à la mémoire dans les instructions générées. Si vous la conservez,
l’agent appelle lui aussi ces outils, invente un nom project différent à chaque session et rompt
silencieusement la continuité. Le résultat ressemble alors en tout point à une fonctionnalité défaillante.
Garanties communes à toutes les destinations#
- Le
tenantIddu jeton validé constitue toujours le premier segment du chemin : l’isolation par locataire est donc assurée dans Azure Table, SharePoint et sur disque. - La partition est déterminée à partir d’une sous-squad épinglée ou de
SQUAD_MCP_MEMORY_DEFAULT_PROJECT, et jamais à partir d’un texte libre fourni par l’appelant. - Lorsque
SQUAD_MCP_RUN_ENCRYPTION_KEY_B64est défini, les artefacts des étapes, le verdict du conseil et les champsrequest/contextde l’appelant sont chiffrés au repos avec AES-256-GCM. - Les écritures utilisent une comparaison suivie d’un échange atomique : deux exécutions simultanées dans un même projet ne peuvent donc pas écraser leurs données respectives.
Partie 3 — Exposer les étendues d’autorisation utilisées par ce scénario#
Dans l’inscription d’application Entra créée à l’étape 2 du guide d’exploitation, exposez les étendues suivantes et accordez les consentements correspondants :
| Étendue d’autorisation | Bénéficiaire | Usage |
|---|---|---|
Squad.Run | la connexion Copilot Studio | Démarrer l’exécution du profil product et interroger son état avec squad_status. |
Squad.Backlog | la connexion Copilot Studio | Appeler squad_backlog. Distincte de Squad.Business afin de pouvoir être révoquée indépendamment. |
Squad.Memory | la connexion Copilot Studio | Facultative : uniquement si vous souhaitez que l’agent consulte l’historique avec squad_history. |
Squad.Operate | vous, sous forme de rôle d’application | Autoriser la reprise d’une exécution en attente. Ne l’accordez jamais à l’agent. |
Le contrôle d’accès refuse toute opération sans l’étendue requise : si elle manque, le serveur renvoie une réponse 403, sans effectuer de travail ni générer de facturation.
Partie 4 — Importer le connecteur dans Copilot Studio#
-
Régénérez le connecteur pour qu’il corresponde à votre build, puis remplacez les valeurs provisoires dans
generated/copilot-studio-connector/apiDefinition.swagger.jsonetapiProperties.json:npm run generate:connectorValeur provisoire Valeur de remplacement <SQUAD_MCP_HOST>le nom de domaine complet (FQDN) de votre Container App, uniquement le nom d’hôte, sans schéma <ENTRA_TENANT_ID>l’identifiant de votre locataire <ENTRA_CLIENT_ID>l’identifiant de l’application obtenu à l’étape 2 <SQUAD_MCP_AUDIENCE>api://<ENTRA_CLIENT_ID> - Ajoutez un connecteur personnalisé dans Copilot Studio à partir du fichier OpenAPI. Il déclare
l’opération
x-ms-agentic-protocol: mcp-streamable-1.0/mcp. - Finalisez la connexion Entra OAuth 2.0 en accordant le consentement aux étendues de la partie 3.
- Activez l’orchestration générative sur l’agent. Sans elle, l’agent ne peut appeler aucun outil MCP : c’est de loin la raison la plus fréquente lorsqu’« il ne se passe rien ».
- Ajoutez le connecteur de votre outil de suivi au même agent : le connecteur certifié Azure DevOps, Jira ou GitHub, authentifié avec l’identité de l’utilisateur final.
- Collez les instructions générées pour l’agent depuis
generated/copilot-studio-connector/agent-instructions.mddans le champ Instructions de l’agent. Elles contiennent déjà le protocole de création des éléments de travail, l’exigence de confirmation et les règles de rattachement parent-enfant. Supprimez la section consacrée à la mémoire : vous avez activé la mémoire automatique dans la partie 1, l’agent ne doit donc pas appeler les outils de mémoire.
Partie 5 — Ce que le profil product exécute réellement#
profile: "product" initialise 13 rôles. C’est cette initialisation qui distingue ce scénario d’un
appel générique à squad_run. Une fois les rôles associés aux agents disponibles dans le package,
l’exécution du profil product enchaîne les étapes suivantes :
| Nº | Étape | Rôle | Agent sélectionné |
|---|---|---|---|
| 0 | Point de validation des données d’entrée | intake-validator | PRD Quality Reviewer |
| 1 | Recherche | researcher | Squad Researcher |
| 2 | Planification | lead | Squad Lead |
| — | Conseil | Intervient à ce stade uniquement si la demande le sollicite. Ce n’est généralement pas le cas d’une demande de backlog. | |
| 3 | Production des livrables par les spécialistes | analyst | PRD Builder |
| 4 | product-owner | Functional Planner | |
| 5 | designer | UX UI Designer | |
| 6 | experimenter | Experiment Designer | |
| 7 | presenter | PowerPoint Subagent | |
| 8 | technical-writer | Squad Technical Writer | |
| 9 | data-scientist | DS Gen Data Spec | |
| 10 | Revue | tester | Squad Reviewer |
Deux comportements méritent d’être compris avant de lancer l’exécution :
-
Le point de validation des données d’entrée peut arrêter l’exécution. Comme le profil product
initialise le rôle
intake-validator, toute exécution fondée sur un document d’exigences fait d’abord l’objet d’une validation. Le validateur consigne le verdictReady,Ready-With-GapsouNot-Ready. Dans le cas deNot-Ready, le pipeline s’arrête avecreason: "intake_not_ready", plutôt que de laisser sept spécialistes travailler à partir de données qu’il vient de rejeter. C’est le fonctionnement attendu du point de validation : corrigez le document et relancez l’exécution. -
Il n’existe pas d’étape distincte de transmission du backlog. Le profil product inclut
product-ownerparmi les spécialistes chargés des livrables : la transmission correspond donc à l’étape 4. Pour un profil qui ne contient pas ce rôle, une étape consacrée au backlog est ajoutée à la fin.
Chaque spécialiste écrit dans son propre répertoire racine, où vous retrouverez ensuite ses livrables :
| Rôle | Racine des livrables |
|---|---|
| analyst, product-owner, designer, experimenter | .copilot-tracking/plans |
| presenter | .copilot-tracking/ppt/<date>/deck |
| technical-writer | docs |
| data-scientist | outputs |
Partie 6 — Lancer l’exécution#
Dans l’agent Copilot Studio, l’utilisateur formule par exemple la demande suivante :
Run the full product squad on our customer onboarding PRD and turn it into a delivery backlog.L’agent appelle squad_run. Assurez-vous que vos instructions transmettent bien le profil :
{
"name": "squad_run",
"arguments": {
"request": "Turn our customer onboarding PRD into a delivery backlog",
"profile": "product",
"mode": "autopilot",
"squad": "onboarding",
"context": "<the PRD text, or the constraints the user gave>"
}
}
squad désigne la partition du projet. Utilisez un nom stable par initiative : il délimite la mémoire,
le registre et l’historique que l’exécution suivante relira. La valeur default fonctionne,
mais tout partage alors une seule arborescence.
Le résultat dépend du choix effectué dans la partie 1 :
| Mode autopilot | Comportement |
|---|---|
| activé | L’exécution se poursuit sans intervention. L’agent reçoit un identifiant d’exécution ; l’utilisateur
interroge régulièrement squad_status jusqu’à réception de l’artefact consolidé. |
| désactivé | L’exécution reste en attente. L’agent communique l’identifiant d’exécution et indique qu’une approbation
est attendue ; il ne doit pas prétendre que le travail est terminé. Vous autorisez la reprise par un canal distinct :
squad_status conduit ensuite l’exécution à son terme. L’autorisation
de reprise est limitée au locataire concerné et fait l’objet d’un audit indiquant l’approbateur et l’horodatage. |
Partie 7 — Transformer le résultat en éléments de travail#
L’artefact consolidé est rédigé en prose : il convient à une personne, mais pas à un connecteur.
squad_backlog assure la conversion :
{
"name": "squad_backlog",
"arguments": {
"request": "Break the approved onboarding plan into epics, stories, and tasks",
"squad": "onboarding"
}
}
Lorsque la mémoire automatique est activée, vous n’avez pas à recoller les résultats de l’exécution : la lecture
préalable intègre l’état antérieur du projet à context en tant que données. Il suffit donc de transmettre
la même valeur squad. Ne fournissez explicitement context que pour ajouter des informations
absentes de l’exécution, comme un backlog existant ou une définition de « terminé ».
Le contrat renvoyé#
{
"summary": "Plain-language summary for the business user.",
"epics": [ { "title": "...", "description": "...",
"acceptanceCriteria": ["..."],
"stories": [ { "title": "...", "tasks": [ ... ] } ] } ],
"workItems": [
{ "ref": "E1", "type": "Epic", "title": "...", "acceptanceCriteria": ["..."] },
{ "ref": "E1-S1", "type": "User Story", "parentRef": "E1", "estimate": "M", "...": "..." },
{ "ref": "E1-S1-T1", "type": "Task", "parentRef": "E1-S1", "...": "..." }
]
}
workItems est une liste aplatie obtenue par parcours en profondeur de epics :
les parents précèdent donc toujours leurs enfants. En parcourant cette liste dans l’ordre et en
créant les éléments au fur et à mesure, l’identifiant du parent existe toujours au moment où un enfant en a besoin.
Les valeurs ref et parentRef sont attribuées par le serveur, et non par le modèle.
C’est essentiel : l’agent établit les liens à partir des identifiants qu’il a enregistrés, jamais en rapprochant
les titres, car ceux-ci ne sont pas uniques et le modèle peut les reformuler.
Le serveur valide et normalise le JSON du modèle. S’il n’y parvient pas, il signale proprement l’échec : l’agent ne reçoit donc jamais de résultat partiellement analysé. Des limites strictes s’appliquent : 30 epics, 30 user stories par epic, 30 tâches par user story, 20 critères d’acceptation et 4 000 caractères par champ texte. Un appel ne peut donc jamais produire un backlog de taille illimitée.
La boucle de création de l’agent#
Cette procédure figure déjà dans les instructions générées ; elle est rappelée ici pour vous permettre de vérifier le comportement observé :
- Présentez à l’utilisateur le contenu de
summaryet la liste des epics et des user stories. Demandez une confirmation. Ne lancez jamais de création en masse sans confirmation. - Après confirmation, parcourez
workItemsdans l’ordre, avec un appel au connecteur par élément : le type provient detype, le titre detitle, la description dedescription, et les lignes deacceptanceCriteriasont réunies en une liste. - Enregistrez l’identifiant créé en l’associant à la valeur
refde l’élément. Lorsqu’un élément possède unparentRef, rattachez-le à l’identifiant enregistré pour cette référence. - En cas d’échec, indiquez la
refconcernée, poursuivez avec les autres éléments, puis proposez de ne réessayer que les créations en échec. - Espacez les appels. Les connecteurs imposent des limites de débit par connexion : créez un epic et ses user stories à la fois, plutôt que d’envoyer tout le tableau d’un seul coup.
Partie 8 — Adapter le contrat à votre outil de suivi#
Le contrat utilise les noms de types d’Azure DevOps. Il s’agit d’un choix de nomenclature, pas d’une dépendance imposée : la correspondance est définie dans les instructions de votre agent, et le serveur ne sait pas quel outil de suivi vous utilisez.
type du contrat | Azure DevOps | Jira | GitHub |
|---|---|---|---|
Epic | Epic | Epic | Issue portant l’étiquette epic |
User Story | User Story (Product Backlog Item avec Scrum) | Story | Issue portant l’étiquette story, rattachée à l’epic comme sous-issue |
Task | Task | Sub-task | Sous-issue ou élément de liste de tâches dans la user story |
| rattachement parent-enfant | Add link, parent/enfant | lien entre issues / champ parent | sous-issues |
Vérifiez votre modèle de processus ADO. User Story existe dans Agile ; Scrum utilise
Product Backlog Item et CMMI utilise Requirement. Si les créations échouent en raison d’un type
d’élément de travail inconnu, ajoutez la substitution aux instructions de votre agent : le serveur continuera
à renvoyer User Story.
GitHub ne possède pas de type epic natif. La hiérarchie à trois niveaux repose sur des issues et des sous-issues. Choisissez donc la convention à l’avance et inscrivez-la dans les instructions. Sinon, l’agent en inventera une, différente à chaque fois.
Partie 9 — Vérifier le résultat#
| Point à vérifier | Résultat attendu |
|---|---|
| Le registre de l’exécution | team.md répertorie les 13 rôles du profil product ; routing.md ne contient que les lignes de routage que ces rôles peuvent prendre en charge. |
| Le journal des décisions | Un bloc ## Intake Readiness Verdict, si l’exécution s’appuyait sur un document. |
| Les racines des livrables | Des artefacts sous .copilot-tracking/plans, docs et outputs. |
| L’outil de suivi | Chaque ref est créée une seule fois, les enfants sont rattachés à leurs parents et les critères d’acceptation figurent dans les user stories. |
| L’exécution suivante | Formulez une demande complémentaire avec la même valeur squad. Les décisions précédentes doivent déjà être connues. |
Dépannage#
| Symptôme | Cause | Solution |
|---|---|---|
| L’agent répond à partir de ses propres connaissances et n’appelle jamais d’outil | L’orchestration générative est désactivée ou les instructions n’ont pas été collées | Activez-la et collez le bloc d’instructions généré |
squad_run ne figure pas dans la liste des outils | Le pipeline est désactivé | Définissez SQUAD_MCP_REMOTE_PIPELINE_ENABLED=true et configurez un backend persistant pour l’état des exécutions |
squad_backlog ne figure pas dans la liste des outils | Les outils métier sont désactivés | Définissez SQUAD_MCP_ENABLE_BUSINESS_TOOLS=true et configurez un point de terminaison de modèle |
| Réponse 403 lors de l’appel d’un outil | Le consentement à l’étendue d’autorisation n’a jamais été accordé | Accordez l’étendue de la partie 2 et autorisez à nouveau la connexion |
| Réponse 401 à chaque appel | L’audience ou l’émetteur du jeton n’est pas accepté | Vérifiez que <SQUAD_MCP_AUDIENCE> correspond à api://<client-id> |
Réponse 403 origin_not_allowed | La liste des origines autorisées bloque l’appel | Ajoutez l’origine de l’appelant à SQUAD_MCP_ALLOWED_ORIGINS. La valeur * est refusée au démarrage |
| L’exécution ne se termine jamais | Elle attend au point de validation ou dépasse la durée prise en charge dans le traitement d’une requête | Approuvez-la ou activez le mode autopilot ; activez également le worker pour les exécutions longues |
L’exécution s’arrête prématurément avec intake_not_ready | Le point de validation a rejeté les données d’entrée | Lisez le verdict, corrigez le document d’exigences, puis relancez l’exécution. Ce comportement est normal |
| La squad n’a pas les bons rôles | Le projet disposait déjà d’une squad | La composition initialisée prévaut sur l’indication profile. Utilisez un nouveau nom squad |
| Un seul élément de travail démesuré a été créé | L’agent a analysé le texte en prose au lieu d’appeler squad_backlog | Vérifiez que l’outil est accessible et que les instructions lui adressent les demandes de backlog |
| Les enfants sont rattachés au mauvais parent | L’agent a établi les correspondances à partir du titre | Il doit utiliser ref. Collez à nouveau les instructions générées |
| Les créations échouent en cours de route à cause d’une limitation de débit | Tout le tableau a été envoyé d’un seul coup | Procédez par lots : un epic et ses user stories à chaque passage |
| L’exécution suivante ne se souvient de rien | L’agent appelle encore les outils de mémoire et invente un nouveau nom de projet à chaque session | Supprimez la section mémoire des instructions de l’agent et transmettez une valeur squad stable |
| L’enregistrement d’un artefact volumineux échoue | La limite de taille des entités Table est atteinte | Activez SQUAD_MCP_MEMORY_OVERFLOW_ENABLED avec un conteneur de blobs |
| Rien n’apparaît dans la bibliothèque SharePoint | Sites.Selected a été attribué, mais aucun accès à un site n’a été accordé | Relancez graph-memory-permissions.bicep en renseignant sharePointSiteId |
| L’historique disparaît après un redémarrage | Le backend de mémoire file est utilisé sur une application dont le nombre de réplicas peut être réduit à zéro | Passez à table ou graph |
Ce que ce scénario ne fait volontairement pas#
- Il n’écrit pas dans Azure DevOps, Jira ou GitHub depuis le serveur. Chaque écriture est effectuée par l’agent au moyen de la connexion propre à l’utilisateur, avec l’authentification, les règles DLP et les limites de débit du connecteur.
- Il n’exécute pas de code, n’ouvre pas de pull request et ne déploie rien.
- Il ne permet ni au modèle ni à l’appelant d’autoriser la reprise à un point de validation humain.
Seul
Squad.Operatele permet, par un canal distinct. - Il ne traite pas le PRD comme des instructions. Le contenu de l’appelant constitue des données ; seule la charte d’un persona fait autorité.