proposal
The proposal skill enables PM Agents to create structured planning documents and task workflows during the AI-DLC planning stage. Use it after idea elaboration is complete to draft product requirements and technical design documents, define task dependencies as a directed acyclic graph, validate completeness, and submit proposals for admin approval before tasks and documents are materialized into the system.
git clone --depth 1 https://github.com/Chorus-AIDLC/Chorus /tmp/proposal && cp -r /tmp/proposal/public/chorus-plugin/skills/proposal ~/.claude/skills/proposalSKILL.md
# Proposal Skill
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.
---
## Overview
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 /review
```
---
## Tools
**Proposal 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`
---
## Workflow
### Step 1: Create an Empty Proposal
**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`.
### Step 1.5: Detect OpenSpec mode
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`.
### Step 2: Add Document Drafts
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`
### Step 3: Add Task Drafts
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`Implement tasks from an OpenSpec change (Experimental)
Archive a completed change in the experimental workflow
Enter explore mode - think through ideas, investigate problems, clarify requirements
Propose a new change - create it and generate all artifacts in one step
Write release blog posts for Chorus — problem-first narrative, bilingual (zh/en), following the project's editorial style.
Implement tasks from an OpenSpec change. Use when the user wants to start implementing, continue implementation, or work through tasks.
Archive a completed change in the experimental workflow. Use when the user wants to finalize and archive a change after implementation is complete.
Enter explore mode - a thinking partner for exploring ideas, investigating problems, and clarifying requirements. Use when the user wants to think through something before or during a change.