Skill Proposal
Ce skill couvre l'étape Planning du workflow AI-DLC : création de Proposals contenant des brouillons de documents (PRD, tech design) et des brouillons de tâches avec DAGs de dépendances, puis soumission pour examen Admin.
Vue d'ensemble
Après que l'élaboration d'une Idea soit résolue (voir /idea), l'Agent PM crée une Proposal — un conteneur qui tient les brouillons de documents et les brouillons de tâches. À l'approbation Admin, ces brouillons se matérialisent en vrais Documents et Tâches.
Elaboration resolved --> Create Proposal --> Add drafts --> Validate --> Submit --> Admin /review
Outils
Gestion de Proposal :
| Outil | Objectif |
|---|---|
chorus_pm_create_proposal |
Créer un conteneur de proposal vide |
chorus_pm_validate_proposal |
Valider la complétude de la proposal (retourne erreurs, avertissements, infos) |
chorus_pm_submit_proposal |
Soumettre la proposal pour approbation Admin (brouillon -> en attente) |
Brouillons de Document :
| Outil | Objectif |
|---|---|
chorus_pm_add_document_draft |
Ajouter un brouillon de document à la proposal |
chorus_pm_update_document_draft |
Mettre à jour le contenu du brouillon de document |
chorus_pm_remove_document_draft |
Supprimer un brouillon de document de la proposal |
Brouillons de Tâche :
| Outil | Objectif |
|---|---|
chorus_pm_add_task_draft |
Ajouter un brouillon de tâche (retourne draftUuid pour chaînage de dépendances) |
chorus_pm_update_task_draft |
Mettre à jour un brouillon de tâche |
chorus_pm_remove_task_draft |
Supprimer un brouillon de tâche de la proposal |
Post-Approbation (tâches existantes) :
| Outil | Objectif |
|---|---|
chorus_create_tasks |
Créer des tâches en lot (supporte dépendances intra-lot via draftUuid) |
chorus_pm_assign_task |
Assigner une tâche à un Agent Developer |
chorus_pm_create_document |
Créer un document autonome |
chorus_pm_update_document |
Mettre à jour le contenu du document (incrémente la version) |
chorus_update_task (avec addDependsOn / removeDependsOn) |
Ajouter ou supprimer des dépendances de tâches (avec détection de cycles) |
Outils partagés (checkin, query, comment, search, notifications) : voir /chorus
Workflow
Étape 1 : Créer une Proposal Vide
Approche recommandée : Créer d'abord le conteneur de proposal sans aucun brouillon, puis ajouter progressivement les brouillons de documents et de tâches un par un.
chorus_pm_create_proposal({
projectUuid: "<project-uuid>",
title: "Implement <feature name>",
description: "Analysis and implementation plan for Idea #xxx",
inputType: "idea",
inputUuids: ["<idea-uuid>"]
})
Idées Multiples : Vous pouvez combiner plusieurs ideas dans une seule proposal en passant plusieurs UUIDs dans inputUuids.
Un thème ne peut pas être une entrée de proposal —
chorus_pm_create_proposalrejette toute idea d'entrée avecisContainer = true. Dérivez une idea enfant du thème et rédigez la proposal sur l'enfant à la place. (Voir la section theme-ideas du skill/idea.)
Étape 1.5 : Détecter le mode OpenSpec
Avant de rédiger les brouillons de documents, charger le skill openspec-aware à skills/openspec-aware/SKILL.md et exécuter son contrat de détection §1. Brancher sur le résultat :
-
CHORUS_OPENSPEC_ACTIVE=1→ suivreopenspec-aware§3. Choisir$SLUG, échafauderopenspec/changes/<slug>/, rédigerproposal.md/design.md/specs/<capability>/spec.mdlocalement, puis créer le conteneur de proposal (Étape 1 ci-dessus) avec la ligne littéraleOpenSpec change slug: <slug>dansdescription, et refléter chaque fichier local dans un brouillon de document.⛔ Obligatoire en mode OpenSpec : les appels miroir passent par le wrapper
chorus-mcp-call.shaveccontentproduit parjson_encode_file— voiropenspec-aware§3.6. Ne pas appelerchorus_pm_add_document_draftdirectement depuis le harness MCP avec un champcontenttapé à la main. Retaper des milliers de lignes par l'LLM consume 20k+ tokens de contenu par proposal et casse l'équivalence d'octets avec la source de vérité locale (openspec-aware§2 Rule 1 explique le raisonnement complet). Ignorer l'Étape 2 ci-dessous quand en mode OpenSpec — le flux basé wrapper dansopenspec-aware§3.6 la remplace pour les documents. -
CHORUS_OPENSPEC_ACTIVE=0(CLI absent ouCHORUS_OPENSPEC_MODE=off) → procéder avec l'Étape 2 inchangée. Rédiger les brouillons en ligne comme du Markdown libre via direct MCPchorus_pm_add_document_draft.
Étape 2 : Ajouter des Brouillons de Document
Ajouter les brouillons de document un à la fois :
# Add PRD
chorus_pm_add_document_draft({
proposalUuid: "<proposal-uuid>",
type: "prd",
title: "PRD: <Feature Name>",
content: "# PRD: <Feature Name>\n\n## Background\n...\n## Requirements\n..."
})
# Add Tech Design
chorus_pm_add_document_draft({
proposalUuid: "<proposal-uuid>",
type: "tech_design",
title: "Tech Design: <Feature Name>",
content: "# Technical Design\n\n## Architecture\n...\n## Implementation\n..."
})
Types de document : prd, tech_design, adr, spec, guide
Étape 3 : Ajouter des Brouillons de Tâche
Ajouter les brouillons de tâche un à la fois. La réponse retourne le draftUuid du nouveau brouillon — l'utiliser directement pour dependsOnDraftUuids dans les brouillons suivants.
acceptanceCriteriaItems est requis — chaque brouillon de tâche doit inclure au moins un élément avec une description non vide, sinon l'appel est rejeté. Utiliser le tableau structuré acceptanceCriteriaItems (la chaîne Markdown héritée acceptanceCriteria ne satisfait pas l'exigence).
# First task -> response includes { draftUuid, draftTitle }
chorus_pm_add_task_draft({
proposalUuid: "<proposal-uuid>",
title: "Implement <component>",
description: "Detailed description of what to build...",
priority: "high",
storyPoints: 3,
acceptanceCriteriaItems: [
{ description: "Criteria 1", required: true },
{ description: "Criteria 2", required: true }
]
})
# Second task — depends on first
chorus_pm_add_task_draft({
proposalUuid: "<proposal-uuid>",
title: "Write tests for <component>",
description: "Unit and integration tests...",
priority: "medium",
storyPoints: 2,
acceptanceCriteriaItems: [
{ description: "Test coverage > 80%", required: true }
],
dependsOnDraftUuids: ["<draftUuid-from-first-task>"]
})
Pour éditer les critères d'un brouillon plus tard via
chorus_pm_update_task_draft, passer unacceptanceCriteriaItemsnon vide pour les remplacer ; omettre le champ pour les laisser inchangés. Le champ ne peut pas être utilisé pour effacer les critères.
Priorité de tâche : low, medium, high
Étape 4 : Réviser et Affiner les Brouillons
# Review current state. chorus_get_proposal defaults to section:"basic"
# (metadata + a lightweight draft index, no bodies). Use section:"full" to
# see every draft's content, or section:"documents"/"tasks" for one kind.
chorus_get_proposal({ proposalUuid: "<proposal-uuid>", section: "full" })
# Update a document draft
chorus_pm_update_document_draft({
proposalUuid: "<proposal-uuid>",
draftUuid: "<draft-uuid>",
content: "Updated content..."
})
# Update a task draft
chorus_pm_update_task_draft({
proposalUuid: "<proposal-uuid>",
draftUuid: "<draft-uuid>",
description: "Updated description...",
dependsOnDraftUuids: ["<other-draft-uuid>"]
})
# Remove a draft
chorus_pm_remove_task_draft({
proposalUuid: "<proposal-uuid>",
draftUuid: "<draft-uuid>"
})
Étape 5 : Valider et Soumettre
Avant de soumettre, valider pour prévisualiser les problèmes :
chorus_pm_validate_proposal({ proposalUuid: "<proposal-uuid>" })
Retourne { valid, issues } avec des niveaux erreur, avertissement et info. Corriger les erreurs avant de soumettre.
Quand la validation passe :
chorus_pm_submit_proposal({ proposalUuid: "<proposal-uuid>" })
Cela change le statut de draft à pending. Un Admin l'examinera (voir /review).
Ajouter un commentaire expliquant votre raisonnement :
chorus_add_comment({
targetType: "proposal",
targetUuid: "<proposal-uuid>",
content: "This proposal covers... Key decisions: ..."
})
Étape 6 : Gérer les Retours
Après soumission, un chorus-proposal-reviewer peut s'exécuter et poster un commentaire VERDICT. Si le VERDICT est FAIL, ou un Admin rejette la proposal, vous devez la réviser et la soumettre à nouveau.
IMPORTANT : Une proposal en statut pending ne peut pas être éditée. Vous devez la rejeter d'abord pour la retourner au statut draft avant d'éditer les brouillons.
-
Lire les retours :
chorus_get_proposal({ proposalUuid: "<proposal-uuid>", section: "full" }) chorus_get_comments({ targetType: "proposal", targetUuid: "<proposal-uuid>" })Identifier les BLOCKERs du VERDICT du reviewer ou de la note de rejet.
-
Rejeter la proposal (auto-rejet du vôtre, ou demander à l'admin de rejeter celui de quelqu'un d'autre) :
chorus_pm_reject_proposal({ proposalUuid: "<proposal-uuid>", reviewNote: "Reviewer FAIL. Fixing BLOCKERs: <list>" })Cela retourne la proposal au statut
draft. Les agents PM ne peuvent rejeter que leurs propres proposals ; les agents admin peuvent rejeter n'importe quelle proposal. -
Réviser les brouillons :
chorus_pm_update_document_draft({ proposalUuid: "<proposal-uuid>", draftUuid: "<uuid>", content: "..." }) chorus_pm_update_task_draft({ proposalUuid: "<proposal-uuid>", draftUuid: "<uuid>", ... }) -
Soumettre à nouveau :
chorus_pm_submit_proposal({ proposalUuid: "<proposal-uuid>" })
Étape 7 : Post-Approbation
Quand l'Admin approuve :
- Les brouillons de document deviennent de vrais Documents
- Les brouillons de tâche deviennent de vraies Tâches (statut :
open, prêtes pour les développeurs) - Le statut affiché de l'Idea est automatiquement dérivé de la progress de Proposal et Tâche — aucune mise à jour manuelle nécessaire
Étape 8 : Gérer les Dépendances de Tâches (Optionnel)
Après la création des tâches, vous pouvez gérer les dépendances :
Créer des tâches en lot avec dépendances intra-lot :
chorus_create_tasks({
projectUuid: "<project-uuid>",
tasks: [
{ draftUuid: "draft-db", title: "Create database schema", priority: "high", storyPoints: 2 },
{ draftUuid: "draft-api", title: "Implement API endpoints", priority: "high", storyPoints: 4, dependsOnDraftUuids: ["draft-db"] },
{ title: "Write integration tests", priority: "medium", storyPoints: 2, dependsOnDraftUuids: ["draft-api"] }
]
})
Ajouter/supprimer des dépendances sur les tâches existantes :
chorus_update_task({ taskUuid: "<task-B-uuid>", addDependsOn: ["<task-A-uuid>"] })
chorus_update_task({ taskUuid: "<task-B-uuid>", removeDependsOn: ["<task-A-uuid>"] })
Les dépendances sont validées : même projet, pas d'auto-dépendance, pas de cycles (détection DFS).
Étape 9 : Assigner des Tâches aux Agents Developer (Optionnel)
chorus_pm_assign_task({ taskUuid: "<task-uuid>", agentUuid: "<developer-agent-uuid>" })
# Optional: pin the task to a specific (agent, host, cwd) AgentInstance
chorus_pm_assign_task({ taskUuid: "<task-uuid>", agentUuid: "<developer-agent-uuid>", instanceUuid: "<agent-instance-uuid>" })
- La tâche doit être
openouassigned - L'agent cible doit avoir la permission
task: ["write"] - Passer
instanceUuidpour épingler la tâche à une instance spécifique en ligne (assigne commeagent_instance) ; l'omettre pour une assignationagentsimple qui hérite de l'instance épinglée de l'idea racine au moment du réveil
Directives de Rédaction de Document
Structure PRD
# PRD: <Feature Name>
## Background
Why this feature is needed.
## Requirements
### Functional Requirements
- FR-1: ...
### Non-Functional Requirements
- NFR-1: ...
## User Stories
- As a <role>, I want <action>, so that <benefit>
## Out of Scope
What is NOT included.
Structure Tech Design
# Technical Design: <Feature Name>
## Overview
High-level approach.
## Architecture
System design, component interactions.
## Data Model
Schema changes, new tables.
## API Design
New/modified endpoints.
## Module Contracts
Shared conventions across tasks: return value format, error handling pattern, cross-module call points.
## Implementation Plan
Step-by-step implementation order.
## Risks & Mitigations
Potential issues and how to address them.
Directives de Rédaction de Tâche
Les bonnes tâches sont :
- Module-scoped — Un module fonctionnel cohérent par tâche, pas une simple fonction ou fichier
- Testables — Des critères d'acceptation clairs et cohérents sont requis sur chaque tâche (au moins un élément non vide ; max 6 ; grouper les vérifications liées en un seul critère mais lister la couverture clé, par ex. « Tous les tests passent : tests unitaires de la couche service, tests d'intégration API, gestion des cas extrêmes »)
- Dimensionnées — 1-8 story points (heures de travail d'agent)
- Ordonnées — Utiliser
dependsOnDraftUuids/dependsOnTaskUuidspour exprimer l'ordre d'exécution - Descriptives — Inclure assez de contexte pour qu'un agent développeur puisse commencer sans questions. Pour les tâches avec dépendances inter-modules, référencer le Module Contracts du tech design dans la CA
- Points de contrôle d'intégration — Pour les DAGs avec 4+ tâches, inclure au moins une tâche de point de contrôle d'intégration à un point de convergence dont la CA exige l'exécution bout en bout des modules précédents ensemble
- Conscientes des hallucinations — Quand les tâches impliquent des dépendances externes, noter dans la description de la tâche que les développeurs doivent vérifier les spécificités (signatures d'API, drapeaux CLI, clés de config, IDs de modèle, etc.) par rapport aux docs officiels plutôt que de se fier à la mémoire de l'LLM
Granularité de Tâche
Chaque tâche doit correspondre à un module fonctionnel indépendamment exécutable et testable — pas une simple fonction, fichier ou endpoint API. Éviter de fractionner les fonctionnalités étroitement liées en tâches séparées ; le coût du workflow Chorus par tâche (claim → implement → self-test → submit → verify) s'accumule rapidement.
Exemples Mauvais → Bon :
- Mauvais :
Book Search+Book CRUD(2 tâches) → Bon :Book Management(1 tâche couvrant CRUD + Search pour la même entité) - Mauvais :
Chart Rendering+Statistics Calculation(2 tâches) → Bon :Data Analytics(1 tâche couvrant stats + visualization comme un module)
Conseils
- Garder la PRD focalisée sur quoi et pourquoi ; tech design focalisé sur comment
- Casser les grandes fonctionnalités en tâches module-scoped cohérentes — mais éviter de sur-fractionner les fonctionnalités liées en trop de petites tâches
- Ajouter
storyPointspour aider à prioriser et estimer l'effort - Garder les critères d'acceptation cohésifs — grouper les vérifications liées en un seul élément plutôt que de lister chaque vérification séparément
- Toujours mettre en place un DAG de dépendance de tâches — les tâches sans dépendances sont supposées parallélisables
- Quand plusieurs tâches partagent des formats de données ou s'appellent mutuellement, définir les contrats dans le tech design avant de rédiger la CA de tâche
- Quand combiner plusieurs ideas, expliquer comment elles se rapportent dans la description de proposal
Suivant
- Après soumission, un Admin examinera en utilisant
/review - Après approbation, les Developers revendiquent les tâches en utilisant
/develop - Pour l'élaboration d'Idea, voir
/idea - Pour la vue d'ensemble de la plateforme, voir
/chorus