Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Chorus Proposal workflow — create proposals with document and task drafts, manage dependency DAG, validate and submit for review.
.claude/skills/chorus-aidlc-proposal/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 371% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 694% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 114% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 348% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 162% | 0% |
This skill covers the Planning stage of the AI-DLC workflow: creating Proposals that contain document drafts (PRD, tech design) and task drafts with dependency DAGs, then submitting them for Admin review.
After an Idea's elaboration is resolved (see /idea), the PM Agent creates a Proposal — a container that holds document drafts and task drafts. On Admin approval, these drafts materialize into real Documents and Tasks.
Elaboration resolved --> Create Proposal --> Add drafts --> Validate --> Submit --> Admin /reviewProposal Management:
| Tool | Purpose | |------|---------| | chorus_pm_create_proposal | Create empty proposal container | | chorus_pm_validate_proposal | Validate proposal completeness (returns errors, warnings, info) | | chorus_pm_submit_proposal | Submit proposal for Admin approval (draft -> pending) |
Document Drafts:
| Tool | Purpose | |------|---------| | chorus_pm_add_document_draft | Add document draft to proposal | | chorus_pm_update_document_draft | Update document draft content | | chorus_pm_remove_document_draft | Remove document draft from proposal |
Task Drafts:
| Tool | Purpose | |------|---------| | chorus_pm_add_task_draft | Add task draft (returns draftUuid for dependency chaining) | | chorus_pm_update_task_draft | Update task draft | | chorus_pm_remove_task_draft | Remove task draft from proposal |
Post-Approval (tasks exist):
| Tool | Purpose | |------|---------| | chorus_create_tasks | Batch create tasks (supports intra-batch dependencies via draftUuid) | | chorus_pm_assign_task | Assign a task to a Developer Agent | | chorus_pm_create_document | Create standalone document | | chorus_pm_update_document | Update document content (increments version) | | chorus_update_task (with addDependsOn / removeDependsOn) | Add or remove task dependencies (with cycle detection) |
Shared tools (checkin, query, comment, search, notifications): see /chorus
Recommended approach: Create the proposal container first without any drafts, then incrementally add document and task drafts one by one.
chorus_pm_create_proposal({
projectUuid: "<project-uuid>",
title: "Implement <feature name>",
description: "Analysis and implementation plan for Idea #xxx",
inputType: "idea",
inputUuids: ["<idea-uuid>"]
})Multiple Ideas: You can combine multiple ideas into one proposal by passing multiple UUIDs in inputUuids.
> A theme cannot be a proposal input — chorus_pm_create_proposal rejects any input idea with isContainer = true. Derive a child idea from the theme and write the proposal on the child instead. (See the theme-ideas section of the /idea skill.)
Before authoring document drafts, load the openspec-aware skill at .claude/skills/openspec-aware/SKILL.md and run its §1 detection contract. Branch on the result:
CHORUS_OPENSPEC_ACTIVE=1 → follow openspec-aware §3. Pick $SLUG, scaffold openspec/changes/<slug>/, author proposal.md / design.md / specs/<capability>/spec.md locally, then create the proposal container (Step 1 above) with the literal line OpenSpec change slug: <slug> in description, and mirror each local file into a document draft.> ⛔ Mandatory in OpenSpec mode: mirror calls go through the chorus-api.sh wrapper with content produced by json_encode_file — see openspec-aware §3.6. Do not call chorus_pm_add_document_draft directly from the MCP harness with a hand-typed content field. Re-typing thousands of lines through the LLM burns 20k+ content tokens per proposal and breaks byte-equality with the local source of truth (openspec-aware §2 Rule 1 explains the full reasoning). Skip Step 2 below when in OpenSpec mode — the wrapper-based flow in openspec-aware §3.6 replaces it for documents.
CHORUS_OPENSPEC_ACTIVE=0 (CLI absent or CHORUS_OPENSPEC_MODE=off) → proceed with Step 2 unchanged. Author drafts inline as free-form Markdown via direct MCP chorus_pm_add_document_draft.Add document drafts one at a time:
# 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..."
})Document types: prd, tech_design, adr, spec, guide
Add task drafts one at a time. The response returns the new draft's draftUuid — use it directly for dependsOnDraftUuids in subsequent drafts.
acceptanceCriteriaItems is required — every task draft must include at least one item with a non-blank description, or the call is rejected. Use the structured acceptanceCriteriaItems array (the legacy acceptanceCriteria Markdown string does not satisfy the requirement).
# 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>"]
})> To edit a draft's criteria later via chorus_pm_update_task_draft, pass a non-empty acceptanceCriteriaItems to replace them; omit the field to leave them unchanged. The field cannot be used to clear criteria.
Task priority: low, medium, high
# 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>"
})Before submitting, validate to preview issues:
chorus_pm_validate_proposal({ proposalUuid: "<proposal-uuid>" })Returns { valid, issues } with error, warning, and info levels. Fix errors before submitting.
When validation passes:
chorus_pm_submit_proposal({ proposalUuid: "<proposal-uuid>" })This changes the status from draft to pending. An Admin will review it (see /review).
Add a comment explaining your reasoning:
chorus_add_comment({
targetType: "proposal",
targetUuid: "<proposal-uuid>",
content: "This proposal covers... Key decisions: ..."
})After submission, a chorus:proposal-reviewer may run and post a VERDICT comment. If the VERDICT is FAIL, or an Admin rejects the proposal, you need to revise and resubmit.
IMPORTANT: A proposal in pending status cannot be edited. You must reject it first to return it to draft status before editing any drafts.
chorus_get_proposal({ proposalUuid: "<proposal-uuid>", section: "full" }) chorus_get_comments({ targetType: "proposal", targetUuid: "<proposal-uuid>" }) Identify BLOCKERs from the reviewer VERDICT or rejection note.
chorus_pm_reject_proposal({ proposalUuid: "<proposal-uuid>", reviewNote: "Reviewer FAIL. Fixing BLOCKERs: <list>" }) This returns the proposal to draft status. PM agents can only reject their own proposals; admin agents can reject any proposal.
chorus_pm_update_document_draft({ proposalUuid: "<proposal-uuid>", draftUuid: "<uuid>", content: "..." }) chorus_pm_update_task_draft({ proposalUuid: "<proposal-uuid>", draftUuid: "<uuid>", ... })
chorus_pm_submit_proposal({ proposalUuid: "<proposal-uuid>" })
When the Admin approves:
open, ready for developers)After tasks are created, you can manage dependencies:
Batch create tasks with intra-batch dependencies:
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"] }
]
})Add/remove dependencies on existing tasks:
chorus_update_task({ taskUuid: "<task-B-uuid>", addDependsOn: ["<task-A-uuid>"] })
chorus_update_task({ taskUuid: "<task-B-uuid>", removeDependsOn: ["<task-A-uuid>"] })Dependencies are validated: same project, no self-dependency, no cycles (DFS detection).
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>" })open or assignedtask: ["write"] permissioninstanceUuid to pin the task to a specific online instance (assigns as agent_instance); omit it for a plain agent assignment that inherits the root idea's pinned instance at wake timemarkdown# 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.
markdown# 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.
Good tasks are:
dependsOnDraftUuids / dependsOnTaskUuids to express execution orderEach task should correspond to an independently runnable and testable functional module — not a single function, file, or API endpoint. Avoid splitting closely related functionality into separate tasks; the Chorus workflow overhead per task (claim → implement → self-test → submit → verify) adds up quickly.
Bad → Good examples:
Book Search + Book CRUD (2 tasks) → Good: Book Management (1 task covering CRUD + Search for the same entity)Chart Rendering + Statistics Calculation (2 tasks) → Good: Data Analytics (1 task covering stats + visualization as one module)storyPoints to help prioritize and estimate effort/review/develop/idea/chorusOther measured skills in the registry, with their headline benchmark lift.