Développer une compétence
Cette compétence couvre l'étape de Développement du workflow AI-DLC : réclamer des tâches, écrire du code, signaler la progression, soumettre pour vérification et gérer les sessions pour l'observabilité des sous-agents.
Aperçu
Les Agents Développeur prennent les Tâches créées par les Agents PM (via /proposal) et les transforment en code fonctionnel. Chaque tâche suit :
claim --> in_progress --> report work --> self-check AC --> submit for verify --> Admin /review
Pour l'exécution parallèle multi-agents, Chorus s'intègre avec les sous-agents Pi (travailleurs parallèles) avec une observabilité complète basée sur les sessions.
Outils
Cycle de vie de la tâche :
| Outil | Objectif |
|---|---|
chorus_claim_task |
Réclamer une tâche ouverte (open → assigned) |
chorus_release_task |
Libérer une tâche réclamée (assigned → open) |
chorus_update_task |
Mettre à jour le statut de la tâche (in_progress / to_verify) |
chorus_submit_for_verify |
Soumettre la tâche pour vérification admin avec résumé |
Signalement de travail :
| Outil | Objectif |
|---|---|
chorus_report_work |
Signaler la progression ou l'achèvement (écrit un commentaire + enregistre l'activité, avec mise à jour de statut optionnelle) |
Critères d'acceptation :
| Outil | Objectif |
|---|---|
chorus_report_criteria_self_check |
Signaler les résultats d'auto-vérification (réussi/échoué + preuve optionnelle) sur les critères d'acceptation structurés |
Session (sous-agents uniquement — l'agent principal saute ces outils) :
| Outil | Objectif |
|---|---|
chorus_session_checkin_task |
S'enregistrer auprès d'une tâche avant de commencer le travail |
chorus_session_checkout_task |
Se désenregistrer d'une tâche quand le travail est terminé |
Sous-agents : toujours passer sessionUuid à chorus_update_task et chorus_report_work pour l'attribution.
Agent principal / Chef d'équipe : appeler ces outils sans sessionUuid — aucune session requise.
Outils partagés (checkin, query, comment, search, notifications) : voir /chorus
Workflow
Étape 1 : S'enregistrer
chorus_checkin()
Vérifiez votre persona, les affectations actuelles et le nombre de travaux en attente.
Étape 1.5 : Obtenir votre session (sous-agents uniquement)
Ignorez cette étape si vous êtes l'agent principal ou Chef d'équipe.
Si vous êtes un sous-agent (généré via subagent_spawn), l'extension Chorus crée automatiquement votre session et l'injecte dans la demande de votre tâche — recherchez une section --- Chorus session (auto-injected) --- contenant votre Session UUID. Conservez-le pour toutes les opérations de tâche.
Étape 2 : Trouver du travail
chorus_get_available_tasks({ projectUuid: "<project-uuid>" })
Ou vérifiez les affectations existantes :
chorus_get_my_assignments()
Étape 3 : Réclamer une tâche
chorus_get_task({ taskUuid: "<task-uuid>" }) # Vérifier d'abord
chorus_claim_task({ taskUuid: "<task-uuid>" })
Vérifiez : description, critères d'acceptation, priorité, story points, proposition/documents associés.
Étape 4 : Rassembler le contexte
Chaque tâche et proposition inclut un champ commentCount — utilisez-le pour décider quelles entités ont des discussions qui valent la peine d'être lues.
-
Lire la tâche et identifier les dépendances :
chorus_get_task({ taskUuid: "<task-uuid>" })Faites attention à
dependsOn(tâches amont) etcommentCount. -
Lire les commentaires de la tâche (contient les rapports de travail précédents, la progression, les retours) :
chorus_get_comments({ targetType: "task", targetUuid: "<task-uuid>" }) -
Examiner les tâches de dépendance amont — votre travail s'en inspire probablement :
chorus_get_task({ taskUuid: "<dependency-task-uuid>" }) chorus_get_comments({ targetType: "task", targetUuid: "<dependency-task-uuid>" })Recherchez : fichiers créés, contrats API, interfaces, compromis.
-
Lire la proposition d'origine pour l'intention de conception :
chorus_get_proposal({ proposalUuid: "<proposal-uuid>", section: "documents" })(
chorus_get_proposalpar défaut àsection: "basic"— juste les métadonnées + un index de brouillon. Passezsection: "documents"pour les documents de conception, ousection: "full"pour les documents + brouillons de tâches.) -
Lire les documents du projet (PRD, conception technique, ADR) :
chorus_get_documents({ projectUuid: "<project-uuid>" })
Flux de mise à jour de document (mode OpenSpec) : si la
descriptionde la proposition d'origine contient une ligneOpenSpec change slug: <slug>, les Documents PRD / tech_design / spec du projet sont des miroirs de fichiers sousopenspec/changes/<slug>/. Pour mettre à jour un tel Document (par ex. clarifier un AC, corriger un scénario de spec avant de soumettre à nouveau), chargez la compétenceopenspec-awareàskills/openspec-aware/SKILL.mdet suivez §3.8 : modifiez d'abord le fichier.mdlocal, puis miroitez via le wrapperchorus-mcp-call.shavecjson_encode_fileetchorus_check_response.⛔ Ne pas appeler
chorus_pm_update_documentdirectement depuis le harnais MCP avec un champcontenttapé à la main en mode OpenSpec. Le fichier local est la source de vérité ; le contenu typé par l'agent dérive et consomme des tokens (openspec-aware§2 Rule 1).Quand la DERNIÈRE tâche d'une idée OpenSpec est vérifiée, l'extension injecte un rappel d'archive (
openspec-aware§3.9) — exécutezopenspec archive <slug> --yes, puis miroitez chaqueopenspec/specs/<capability>/spec.mdémis via §3.8.Dans le fallback sans-OpenSpec (pas de ligne slug, ou pas de CLI
openspec), modifiez le contenu du Document directement via l'outil MCP existant sans wrapper, sans étape de fichier local.
Étape 5 : Commencer le travail
Sous-agent : s'enregistrer d'abord auprès de la tâche :
chorus_session_checkin_task({ sessionUuid: "<session-uuid>", taskUuid: "<task-uuid>" })
Puis marquer comme en cours :
# Sous-agent :
chorus_update_task({ taskUuid: "<task-uuid>", status: "in_progress", sessionUuid: "<session-uuid>" })
# Agent principal :
chorus_update_task({ taskUuid: "<task-uuid>", status: "in_progress" })
Application des dépendances : Si cette tâche a des dépendances non résolues (les tâches dependsOn ne sont pas en
doneouclosed), l'appel sera rejeté avec des informations détaillées sur les blocages. Utilisezchorus_get_unblocked_taskspour trouver les tâches que vous pouvez commencer maintenant.
Étape 6 : Signaler la progression
Signalez périodiquement avec chorus_report_work. Incluez :
- Ce qui a été complété
- Fichiers créés ou modifiés
- Commits Git et PR
- Statut actuel / travail restant
- Blocages ou questions
chorus_report_work({
taskUuid: "<task-uuid>",
report: "Progression :\n- Créé src/services/auth.service.ts\n- Commit : abc1234\n- Restant : tests unitaires",
sessionUuid: "<session-uuid>"
})
Signalez avec mise à jour de statut quand c'est terminé :
chorus_report_work({
taskUuid: "<task-uuid>",
report: "Implémentation entièrement terminée :\n- Fichiers : ...\n- PR : https://github.com/org/repo/pull/42\n- Tous les tests réussis",
status: "to_verify",
sessionUuid: "<session-uuid>"
})
Étape 7 : Auto-vérification des critères d'acceptation
Avant de soumettre, vérifiez les critères d'acceptation structurés :
task = chorus_get_task({ taskUuid: "<task-uuid>" })
# Si task.acceptanceCriteriaItems est non-vide :
chorus_report_criteria_self_check({
taskUuid: "<task-uuid>",
criteria: [
{ uuid: "<criterion-uuid>", devStatus: "passed", devEvidence: "Les tests unitaires couvrent ceci" },
{ uuid: "<criterion-uuid>", devStatus: "passed", devEvidence: "Vérifié manuellement" }
]
})
Pour les critères obligatoires, continuez le travail jusqu'à pouvoir vous auto-vérifier comme
passed. N'utilisezfailedque pour les critères optionnels qui sont hors de portée.
Étape 8 : Soumettre pour vérification
Sous-agents — se désenregistrer d'abord :
chorus_session_checkout_task({ sessionUuid: "<session-uuid>", taskUuid: "<task-uuid>" })
Puis soumettre :
chorus_submit_for_verify({
taskUuid: "<task-uuid>",
summary: "Fonctionnalité d'authentification implémentée :\n- Ajouté endpoints login/logout\n- Middleware JWT\n- Couverture de tests 95%\n- Tous les AC auto-vérifiés (3/3 réussis)"
})
to_verifyne déverrouille PAS les tâches aval — seuldone(après vérification admin) le fait.
Agent Review : Après
chorus_submit_for_verify, l'extension Chorus vous pousse à générerchorus-task-reviewer— un agent d'examen indépendant en lecture seule. Vous DEVEZ le générer vous-même (il n'est PAS auto-lancé). Utilisez l'outilsubagentbloquant (il attend le VERDICT et le retourne) — attendez le VERDICT avant de procéder. L'examinateur publie un commentaire VERDICT sur la tâche.
Après l'examen, lisez son VERDICT :
chorus_get_comments({ targetType: "task", targetUuid: "<task-uuid>" })
Trouvez le commentaire le plus récent contenant VERDICT: et agissez en conséquence :
- VERDICT: PASS — Tous les AC vérifiés, pas de problèmes. Procédez à la vérification admin.
- VERDICT: PASS WITH NOTES — Tous les AC vérifiés, notes mineures. Procédez à la vérification admin (les notes ne bloquent pas).
- VERDICT: FAIL — BLOCKERs trouvés. NE PAS vérifier. Corrigez les BLOCKERs listés dans le commentaire de l'examinateur, puis resoumettez.
Si aucun nouveau commentaire VERDICT: n'apparaît après le retour de l'examinateur, il a épuisé son budget de tours avant de publier. Relancez-le UNE FOIS avec un indice de budget concis dans la demande : "Restez dans le budget de tours. Ignorez la vérification profonde. Récupérez la tâche/la proposition/les commentaires, exécutez uniquement les tests principaux, et publiez votre commentaire VERDICT dans les 12 premiers tours." Si la deuxième tentative ne produit toujours pas de VERDICT, examinez manuellement à l'aide de la checklist et procédez.
Passerelle d'examen de code final (après vérification de la DERNIÈRE tâche de l'Idée) : quand la tâche que vous venez de vérifier est la dernière tâche de sa proposition enracinée dans l'idée, la fonctionnalité est sur le point d'être livrée — l'extension vous pousse à générer
chorus-code-reviewer(contrôlé parCHORUS_ENABLE_CODE_REVIEWER, activé par défaut). Générez-le vous-même via l'outilsubagentbloquant, en passantideaUuid+ numéro de round ; il examine le changement de code agrégé de l'Idée sur toutes ses tâches (intégration inter-tâches, architecture, sécurité, régression, couverture au niveau des fonctionnalités) et publie un commentaireVERDICTsur l'idée.PASS/PASS WITH NOTES→ livrer ;FAIL→ corriger via/skill:quick-dev(chorus_create_tasksavecproposalUuiddéfini à la proposition approuvée actuelle pour que les tâches de correction s'y attachent — NE PAS rouvrir les tâches vérifiées), puis relancer la passerelle, limitée parCHORUS_MAX_CODE_REVIEW_ROUNDS(env, défaut 3 ; 0 = illimité). Consultatif/comportemental, comme les autres examinateurs. Exécutez-le avant tout rapport d'achèvement d'idée.
Étape 9 : Gérer les retours d'examen
Si l'examinateur retourne FAIL, ou si la tâche est rouverte après vérification :
Tous les critères d'acceptation sont réinitialisés à en attente quand une tâche est rouverte.
- Vérifiez les retours :
chorus_get_task({ taskUuid: "<task-uuid>" }) chorus_get_comments({ targetType: "task", targetUuid: "<task-uuid>" }) - Corrigez chaque BLOCKER listé dans le commentaire FAIL de l'examinateur.
- Ré-enregistrez-vous, corrigez les problèmes, signalez les corrections, resoumettez.
Étape 10 : Tâche terminée
Une fois qu'Admin vérifie (statut : done), passez à la prochaine tâche disponible (retour à l'Étape 2).
Étape 11 : Rapport d'achèvement d'idée (consultatif)
Si la tâche que vous venez d'auto-vérifier était la DERNIÈRE de son Idée (chaque Tâche sur chaque Proposition approuvée est maintenant done/closed) et vous avez document:write, proposez d'appeler chorus_create_report via AskUserQuestion. La description du paramètre content porte le modèle de section. Ignorez en cas de refus — l'extension vous rappellera à la prochaine exécution.
Session (sous-agents uniquement)
L'extension Chorus automatise complètement le cycle de vie des sessions — la création (sur subagent_spawn, via injection de tâche tool_call) et le nettoyage (sur subagent_manage close) sont gérés par l'extension. Les sous-agents font manuellement seulement 3 choses :
chorus_session_checkin_task({ sessionUuid, taskUuid })— avant de commencer le travailchorus_session_checkout_task({ sessionUuid, taskUuid })— quand c'est terminé (recommandé ; le plugin se désenregistre aussi automatiquement à la sortie)- Passer
sessionUuidàchorus_update_tasketchorus_report_workpour l'attribution
Agent principal / Chef d'équipe : aucune session requise — appelez les outils sans sessionUuid.
Intégration des sous-agents parallèles
Quand vous utilisez les sous-agents Pi (pi-subagents) pour exécuter plusieurs sous-agents en parallèle, Chorus fournit une observabilité complète du travail. L'extension chorus-pi automatise le cycle de vie des sessions : quand vous subagent_spawn un travailleur, elle crée une session Chorus et injecte l'UUID de session + le workflow dans la tâche du travailleur ; quand vous subagent_manage close l'agent, elle ferme la session.
Architecture à deux niveaux
| Couche | Système | Objectif |
|---|---|---|
| Orchestration | Sous-agents Pi (subagent_spawn / subagent_send / subagent_mailbox) |
Générer des sous-agents, tâches de suivi, messagerie inter-agents |
| Suivi du travail | Chorus | Cycle de vie de la tâche, observabilité des sessions, flux d'activité |
Workflow du Chef d'équipe
# 1. S'enregistrer et planifier
chorus_checkin()
chorus_list_tasks({ projectUuid: "<project-uuid>" })
# 2. Générer des sous-agents (async — retourne immédiatement avec un agentId)
# Passez uniquement les UUID de tâches — l'extension chorus-pi injecte automatiquement l'UUID
# de session + le workflow dans la tâche du travailleur.
subagent_spawn({
agent: "worker",
task: "Votre UUID de tâche Chorus : <task-uuid>\nUUID du projet : <project-uuid>\n\nImplémentez..."
})
# → retourne agentId (sa_<uuid>) ; conservez-le pour fermer l'agent plus tard.
Ce que la demande du Chef d'équipe doit contenir :
- UUID(s) de tâche
- PAS d'UUID de session, PAS de boilerplate de workflow — l'extension injecte tout automatiquement
- L'
agentIdretourné parsubagent_spawn(nécessaire poursubagent_manage closeplus tard)
Workflow du sous-agent
L'extension injecte automatiquement l'UUID de session + le workflow dans la tâche du sous-agent (au moment tool_call, avant le démarrage du sous-processus). Le sous-agent lit le Session UUID: de la demande de sa tâche et suit les étapes injectées :
# 1. S'enregistrer auprès de la tâche (sessionUuid vient de la tâche auto-injectée)
chorus_session_checkin_task({ sessionUuid: "<my-session-uuid>", taskUuid: "<my-task-uuid>" })
# 2. Passer à in_progress
chorus_update_task({ taskUuid: "<my-task-uuid>", status: "in_progress", sessionUuid: "<my-session-uuid>" })
# 3. Faire le travail... code, test, commit...
# 4. Signaler la progression
chorus_report_work({ taskUuid: "<my-task-uuid>", report: "...", sessionUuid: "<my-session-uuid>" })
# 5. Se désenregistrer et soumettre
chorus_session_checkout_task({ sessionUuid: "<my-session-uuid>", taskUuid: "<my-task-uuid>" })
chorus_submit_for_verify({ taskUuid: "<my-task-uuid>", summary: "..." })
# 6. (Optionnel) notifier le chef d'équipe via mailbox — vous avez besoin de son agentId
subagent_mailbox({ action: "send", agentId: "<team-lead-agentId>", message: "Tâche terminée" })
# NE PAS appeler chorus_close_session — l'extension la ferme quand le
# chef d'équipe exécute subagent_manage({ action: "close", agentId: "<my-agentId>" })
Gestion des dépendances de tâches (DAG)
Application côté serveur :
chorus_update_task(status: "in_progress")rejette si une tâchedependsOnn'est pasdoneouclosed.
Exécution par vague (recommandée) :
chorus_get_unblocked_tasks— trouver les tâches prêtessubagent_spawndes travailleurs pour Wave 1 (async ; conservez les agentIds)- Attendre
to_verify(sondezchorus_list_tasksou lisez les messages d'achèvement async), puis vérifiez chaque tâche (chorus_admin_verify_task→done) subagent_manage closechaque travailleur terminé (libère son slot + ferme sa session Chorus)chorus_get_unblocked_tasks— trouver les tâches nouvellement déverrouillées (Wave 2)- Répétez jusqu'à ce que toutes les tâches soient terminées
Critique :
to_verifyne résout PAS les dépendances — seuldoneouclosedle fait. Le Chef d'équipe doit vérifier les tâches entre les vagues. Souvenez-vous aussi desubagent_manage closeles travailleurs terminés — Pi limite les sous-agents concurrents etcompletedne libère pas le slot.
Plusieurs tâches par sous-agent
Un single sous-agent peut travailler sur plusieurs tâches séquentiellement :
subagent_spawn({
agent: "worker",
task: "Vos tâches Chorus (travaillez dans l'ordre) :\n1. task-schema-uuid\n2. task-api-uuid (dépend de #1)\n\nPour CHAQUE tâche : checkin -> in_progress -> work -> report -> checkout -> submit_for_verify"
})
Accès MCP pour les sous-agents
Les sous-agents ont besoin de MCP configuré au niveau du projet (.mcp.json) ou niveau utilisateur (~/.pi/agent/mcp.json). L'injection de session de l'extension chorus-pi fonctionne quand même, car elle appelle chorus sur sa propre extraction MCP-over-HTTP (pas la passerelle du sous-agent).
Dépannage
| Problème | Solution |
|---|---|
| Le sous-agent ne peut pas accéder aux outils MCP Chorus | Vérifiez que MCP est configuré au niveau du projet, la clé API a le rôle développeur |
| L'interface utilisateur n'affiche pas les travailleurs actifs | Le sous-agent a oublié chorus_session_checkin_task. Vérifiez : chorus_get_session |
| La session disparaît des Paramètres | Aucune activité pendant 1h (les listes par défaut masquent les sessions obsolètes). La ligne de session existe toujours — elle est accessible via MCP chorus_list_sessions / chorus_get_session. Envoyez un signal de cœur (ou n'importe quel outil touchant une session) pour la rendre visible à nouveau, ou vérifiez si l'agent a crashé |
| Tâche bloquée dans un mauvais statut | Générez un nouveau sous-agent avec le même nom (le plugin réouvre automatiquement la session), ou utilisez chorus_update_task pour réinitialiser |
| Sessions dupliquées | N'appelez jamais chorus_create_session — le plugin gère toute la création de session. Fermez les extras via la page Paramètres |
| Le sous-agent n'a pas reçu la session | Vérifiez que le plugin est chargé (/plugin list) et que CHORUS_URL est défini. Assurez-vous que le paramètre name est défini |
Bonnes pratiques de rapport de travail
Bon rapport (permet la continuité des sessions) :
Flux de réinitialisation de mot de passe implémenté :
Fichiers créés/modifiés :
- src/services/auth.service.ts (nouveau)
- src/app/api/auth/reset/route.ts (nouveau)
- tests/auth/reset.test.ts (nouveau)
Git :
- Commit : a1b2c3d "feat: password reset flow"
- PR : https://github.com/org/repo/pull/15
Détails d'implémentation :
- POST /api/auth/reset-request : envoie un email avec un jeton
- Le jeton expire après 1 heure, utilisation unique
- Limitation de débit : 3 demandes/heure/email
- 12 nouveaux tests, tous réussis
Critères d'acceptation :
- [x] L'utilisateur peut demander une réinitialisation par email
- [x] Le lien de réinitialisation expire après 1 heure
- [x] La limitation de débit prévient les abus
Mauvais rapport : Terminé.
Conseils
- Lisez d'abord les commentaires de la tâche — ils contiennent les rapports de travail précédents pour la continuité des sessions
- Vérifiez les dépendances amont — lisez les tâches
dependsOnet leurs commentaires pour les interfaces/API - Lisez la proposition d'origine — comprenez la justification de la conception et le DAG des tâches
- Utilisez
commentCount— ignorez la récupération de commentaires sur les entités avec le compte 0 - Signalez la progression fréquemment — incluez les chemins de fichiers, les commits et les PR
- Écrivez des résumés de soumission détaillés — Admin en a besoin pour vérifier
- Si vous êtes bloqué, ajoutez un commentaire et envisagez de libérer la tâche
- Une tâche à la fois : terminez ou libérez avant d'en réclamer une autre
- Utilisez des noms significatifs pour les sous-agents — ils deviennent des noms de session Chorus
Quand libérer une tâche
Libérez si :
- Vous ne pouvez pas la terminer (connaissances manquantes, bloquée)
- Une tâche plus prioritaire a besoin d'attention
- Vous ne la terminerez pas dans un délai raisonnable
chorus_release_task({ taskUuid: "<task-uuid>" })
chorus_add_comment({ targetType: "task", targetUuid: "<task-uuid>", content: "Libération : raison..." })
Suivant
- Après la soumission pour vérification, un Admin examine en utilisant
/review - Wake "Start Development" humain : un wake
start_development(l'humain a cliqué sur Start Development sur le panneau détail d'idée) signifie : réclamer et exécuter TOUTES les tâches restantes de la proposition approuvée de l'idée dans l'ordre de dépendance — bouclez ce workflow jusqu'à ce qu'aucune tâche réclamable ne reste, laissantto_verifyet les tâches d'autres sessions intactes. - Wake "Yolo" humain : un wake
yolo_requested(l'humain a cliqué sur Yolo sur le panneau détail d'idée) signifie : conduire l'ENTIÈRE idée à done via la compétence yolo (le pipeline AI-DLC entièrement automatique), pas seulement l'étape d'exécution — lisez l'état actuel de l'idée et reprenez à partir de la phase où elle se trouve. Contrairement àstart_development, il est adaptatif aux étapes, et il ne doit jamais fusionner ou pousser une PR sans approbation humaine explicite. - Pour la vue d'ensemble de la plateforme et les outils partagés, voir
/chorus