@chorus-aidlc/chorus-openclaw-plugin 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +218 -218
- package/dist/commands.d.ts +5 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +147 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/event-router.d.ts +55 -0
- package/dist/event-router.d.ts.map +1 -0
- package/dist/event-router.js +157 -0
- package/dist/event-router.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-client.d.ts +37 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +137 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp-registration.d.ts +25 -0
- package/dist/mcp-registration.d.ts.map +1 -0
- package/dist/mcp-registration.js +93 -0
- package/dist/mcp-registration.js.map +1 -0
- package/dist/sse-listener.d.ts +37 -0
- package/dist/sse-listener.d.ts.map +1 -0
- package/dist/sse-listener.js +152 -0
- package/dist/sse-listener.js.map +1 -0
- package/dist/wake.d.ts +67 -0
- package/dist/wake.d.ts.map +1 -0
- package/dist/wake.js +234 -0
- package/dist/wake.js.map +1 -0
- package/openclaw.plugin.json +14 -12
- package/package.json +24 -5
- package/skills/brainstorm/SKILL.md +163 -0
- package/skills/chorus/SKILL.md +413 -0
- package/skills/develop/SKILL.md +434 -0
- package/skills/idea/SKILL.md +293 -0
- package/skills/openspec-aware/SKILL.md +425 -0
- package/skills/proposal/SKILL.md +397 -0
- package/skills/proposal-reviewer/SKILL.md +117 -0
- package/skills/quick-dev/SKILL.md +198 -0
- package/skills/review/SKILL.md +354 -0
- package/skills/task-reviewer/SKILL.md +113 -0
- package/skills/yolo/SKILL.md +498 -0
- package/src/commands.ts +147 -57
- package/src/config.ts +23 -10
- package/src/event-router.ts +46 -54
- package/src/index.ts +56 -83
- package/src/mcp-client.ts +17 -0
- package/src/mcp-registration.ts +142 -0
- package/src/openclaw-sdk.d.ts +95 -0
- package/src/wake.ts +310 -0
- package/src/tools/admin-tools.ts +0 -117
- package/src/tools/common-tools.ts +0 -546
- package/src/tools/dev-tools.ts +0 -97
- package/src/tools/pm-tools.ts +0 -390
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: proposal
|
|
3
|
+
description: Chorus Proposal workflow — create proposals with document and task drafts, manage dependency DAG, validate and submit for review.
|
|
4
|
+
license: AGPL-3.0
|
|
5
|
+
metadata:
|
|
6
|
+
author: chorus
|
|
7
|
+
version: "0.9.0"
|
|
8
|
+
category: project-management
|
|
9
|
+
mcp_server: chorus
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Proposal Skill
|
|
13
|
+
|
|
14
|
+
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.
|
|
15
|
+
|
|
16
|
+
> **Tool namespace:** Chorus tools are exposed by the connected MCP server under a `chorus__` prefix on OpenClaw (e.g. `chorus__chorus_pm_create_proposal`). Bare names are used below for readability — prepend `chorus__` when invoking. See `/chorus` for the full rule.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Overview
|
|
21
|
+
|
|
22
|
+
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.
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Elaboration resolved --> Create Proposal --> Add drafts --> Validate --> Submit --> Reviewer --> Admin /review
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Tools
|
|
31
|
+
|
|
32
|
+
**Proposal Management:**
|
|
33
|
+
|
|
34
|
+
| Tool | Purpose |
|
|
35
|
+
|------|---------|
|
|
36
|
+
| `chorus_pm_create_proposal` | Create empty proposal container |
|
|
37
|
+
| `chorus_pm_validate_proposal` | Validate proposal completeness (returns errors, warnings, info) |
|
|
38
|
+
| `chorus_pm_submit_proposal` | Submit proposal for Admin approval (draft -> pending) |
|
|
39
|
+
|
|
40
|
+
**Document Drafts:**
|
|
41
|
+
|
|
42
|
+
| Tool | Purpose |
|
|
43
|
+
|------|---------|
|
|
44
|
+
| `chorus_pm_add_document_draft` | Add document draft to proposal |
|
|
45
|
+
| `chorus_pm_update_document_draft` | Update document draft content |
|
|
46
|
+
| `chorus_pm_remove_document_draft` | Remove document draft from proposal |
|
|
47
|
+
|
|
48
|
+
**Task Drafts:**
|
|
49
|
+
|
|
50
|
+
| Tool | Purpose |
|
|
51
|
+
|------|---------|
|
|
52
|
+
| `chorus_pm_add_task_draft` | Add task draft (returns draftUuid for dependency chaining) |
|
|
53
|
+
| `chorus_pm_update_task_draft` | Update task draft |
|
|
54
|
+
| `chorus_pm_remove_task_draft` | Remove task draft from proposal |
|
|
55
|
+
|
|
56
|
+
**Post-Approval (tasks exist):**
|
|
57
|
+
|
|
58
|
+
| Tool | Purpose |
|
|
59
|
+
|------|---------|
|
|
60
|
+
| `chorus_create_tasks` | Batch create tasks (supports intra-batch dependencies via draftUuid) |
|
|
61
|
+
| `chorus_pm_assign_task` | Assign a task to a Developer Agent |
|
|
62
|
+
| `chorus_pm_create_document` | Create standalone document |
|
|
63
|
+
| `chorus_pm_update_document` | Update document content (increments version) |
|
|
64
|
+
| `chorus_update_task` (with `addDependsOn` / `removeDependsOn`) | Add or remove task dependencies (with cycle detection) |
|
|
65
|
+
|
|
66
|
+
**Shared tools** (checkin, query, comment, search, notifications): see `/chorus`
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Workflow
|
|
71
|
+
|
|
72
|
+
### Step 1: Create an Empty Proposal
|
|
73
|
+
|
|
74
|
+
**Recommended approach:** Create the proposal container first without any drafts, then incrementally add document and task drafts one by one.
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
chorus_pm_create_proposal({
|
|
78
|
+
projectUuid: "<project-uuid>",
|
|
79
|
+
title: "Implement <feature name>",
|
|
80
|
+
description: "Analysis and implementation plan for Idea #xxx",
|
|
81
|
+
inputType: "idea",
|
|
82
|
+
inputUuids: ["<idea-uuid>"]
|
|
83
|
+
})
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Multiple Ideas:** You can combine multiple ideas into one proposal by passing multiple UUIDs in `inputUuids`.
|
|
87
|
+
|
|
88
|
+
### Step 1.5: Detect OpenSpec mode
|
|
89
|
+
|
|
90
|
+
Before authoring document drafts, **load the `openspec-aware` skill** and run its **§1 inline detection** (three checks — `CHORUS_OPENSPEC_MODE != "off"`, an `openspec/` directory at the project root, and the `openspec` CLI on `PATH`).
|
|
91
|
+
|
|
92
|
+
> **OpenClaw note:** there is no Claude Code SessionStart hook to precompute `CHORUS_OPENSPEC_ACTIVE`. You must run the three checks yourself, inline, every time you reach this step. See `openspec-aware` §1.
|
|
93
|
+
|
|
94
|
+
Branch on the result:
|
|
95
|
+
|
|
96
|
+
- **OpenSpec active (all three checks pass)** → 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.
|
|
97
|
+
|
|
98
|
+
> **⛔ 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.
|
|
99
|
+
|
|
100
|
+
- **OpenSpec inactive (any check fails, 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`.
|
|
101
|
+
|
|
102
|
+
### Step 2: Add Document Drafts
|
|
103
|
+
|
|
104
|
+
Add document drafts one at a time:
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
# Add PRD
|
|
108
|
+
chorus_pm_add_document_draft({
|
|
109
|
+
proposalUuid: "<proposal-uuid>",
|
|
110
|
+
type: "prd",
|
|
111
|
+
title: "PRD: <Feature Name>",
|
|
112
|
+
content: "# PRD: <Feature Name>\n\n## Background\n...\n## Requirements\n..."
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
# Add Tech Design
|
|
116
|
+
chorus_pm_add_document_draft({
|
|
117
|
+
proposalUuid: "<proposal-uuid>",
|
|
118
|
+
type: "tech_design",
|
|
119
|
+
title: "Tech Design: <Feature Name>",
|
|
120
|
+
content: "# Technical Design\n\n## Architecture\n...\n## Implementation\n..."
|
|
121
|
+
})
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Document types:** `prd`, `tech_design`, `adr`, `spec`, `guide`
|
|
125
|
+
|
|
126
|
+
### Step 3: Add Task Drafts
|
|
127
|
+
|
|
128
|
+
Add task drafts one at a time. The response returns the new draft's `draftUuid` — use it directly for `dependsOnDraftUuids` in subsequent drafts.
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
# First task -> response includes { draftUuid, draftTitle }
|
|
132
|
+
chorus_pm_add_task_draft({
|
|
133
|
+
proposalUuid: "<proposal-uuid>",
|
|
134
|
+
title: "Implement <component>",
|
|
135
|
+
description: "Detailed description of what to build...",
|
|
136
|
+
priority: "high",
|
|
137
|
+
storyPoints: 3,
|
|
138
|
+
acceptanceCriteria: "- [ ] Criteria 1\n- [ ] Criteria 2"
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
# Second task — depends on first
|
|
142
|
+
chorus_pm_add_task_draft({
|
|
143
|
+
proposalUuid: "<proposal-uuid>",
|
|
144
|
+
title: "Write tests for <component>",
|
|
145
|
+
description: "Unit and integration tests...",
|
|
146
|
+
priority: "medium",
|
|
147
|
+
storyPoints: 2,
|
|
148
|
+
acceptanceCriteria: "- [ ] Test coverage > 80%",
|
|
149
|
+
dependsOnDraftUuids: ["<draftUuid-from-first-task>"]
|
|
150
|
+
})
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Task priority:** `low`, `medium`, `high`
|
|
154
|
+
|
|
155
|
+
### Step 4: Review and Refine Drafts
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
# Review current state
|
|
159
|
+
chorus_get_proposal({ proposalUuid: "<proposal-uuid>" })
|
|
160
|
+
|
|
161
|
+
# Update a document draft
|
|
162
|
+
chorus_pm_update_document_draft({
|
|
163
|
+
proposalUuid: "<proposal-uuid>",
|
|
164
|
+
draftUuid: "<draft-uuid>",
|
|
165
|
+
content: "Updated content..."
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
# Update a task draft
|
|
169
|
+
chorus_pm_update_task_draft({
|
|
170
|
+
proposalUuid: "<proposal-uuid>",
|
|
171
|
+
draftUuid: "<draft-uuid>",
|
|
172
|
+
description: "Updated description...",
|
|
173
|
+
dependsOnDraftUuids: ["<other-draft-uuid>"]
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
# Remove a draft
|
|
177
|
+
chorus_pm_remove_task_draft({
|
|
178
|
+
proposalUuid: "<proposal-uuid>",
|
|
179
|
+
draftUuid: "<draft-uuid>"
|
|
180
|
+
})
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Step 5: Validate and Submit
|
|
184
|
+
|
|
185
|
+
Before submitting, validate to preview issues:
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
chorus_pm_validate_proposal({ proposalUuid: "<proposal-uuid>" })
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Returns `{ valid, issues }` with error, warning, and info levels. Fix errors before submitting.
|
|
192
|
+
|
|
193
|
+
When validation passes:
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
chorus_pm_submit_proposal({ proposalUuid: "<proposal-uuid>" })
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
This changes the status from `draft` to `pending`. An Admin will review it (see `/review`).
|
|
200
|
+
|
|
201
|
+
Add a comment explaining your reasoning:
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
chorus_add_comment({
|
|
205
|
+
targetType: "proposal",
|
|
206
|
+
targetUuid: "<proposal-uuid>",
|
|
207
|
+
content: "This proposal covers... Key decisions: ..."
|
|
208
|
+
})
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Step 5.5: Run the Proposal Reviewer (inline — no hook on OpenClaw)
|
|
212
|
+
|
|
213
|
+
> **OpenClaw difference:** the Claude Code plugin relies on a PostToolUse hook to inject a "spawn the reviewer" reminder after `chorus_pm_submit_proposal`. **OpenClaw has no such hook.** Run the reviewer step **inline**, right here, immediately after submitting. Do not wait for an injected reminder — it will never come.
|
|
214
|
+
|
|
215
|
+
Obtain an independent VERDICT before considering the proposal ready for Admin approval:
|
|
216
|
+
|
|
217
|
+
1. **Preferred — spawn a reviewer sub-agent.** Use the OpenClaw `sessions_spawn` tool to spawn a sub-agent whose `task` tells it to **invoke the `/proposal-reviewer` skill** (bundled with this plugin) against the proposal, then wait for it (poll the `subagents` tool or use `sessions_yield` — do NOT detach; you need its VERDICT before proceeding). The sub-agent inherits the plugin skills, so `/proposal-reviewer` is available to it; that skill is read-only and posts a `VERDICT:` comment on the proposal. Example task prompt:
|
|
218
|
+
> `Run the /proposal-reviewer skill to review proposalUuid <uuid>. Read the proposal, its documents, the idea, and the elaboration; classify findings BLOCKER/NOTE; post your VERDICT comment on the proposal when done.`
|
|
219
|
+
|
|
220
|
+
2. **Fallback — review it yourself.** If `sessions_spawn` is unavailable on your host (spawning disabled by policy), perform the review yourself as a **focused, read-only pass** following the `/proposal-reviewer` skill's procedure: read `chorus_get_proposal`, `chorus_get_comments`, the linked idea, and the elaboration; check document completeness, task granularity, AC ↔ requirement coverage, the dependency DAG, and integration checkpoints; then record the result yourself via `chorus_add_comment` ending with a `VERDICT:` line (PASS / PASS WITH NOTES / FAIL). Do NOT modify any drafts during this pass — it is review-only. Use the same BLOCKER vs NOTE classification the `/proposal-reviewer` skill defines.
|
|
221
|
+
|
|
222
|
+
3. **Read the VERDICT and act:**
|
|
223
|
+
```
|
|
224
|
+
chorus_get_comments({ targetType: "proposal", targetUuid: "<proposal-uuid>" })
|
|
225
|
+
```
|
|
226
|
+
Find the most recent comment containing `VERDICT:`:
|
|
227
|
+
- **PASS** / **PASS WITH NOTES** — proceed; an Admin can approve (notes are non-blocking).
|
|
228
|
+
- **FAIL** — go to Step 6 and fix the BLOCKERs before resubmitting.
|
|
229
|
+
|
|
230
|
+
If you spawned a sub-agent and no new `VERDICT:` comment appears after it returns, it likely exhausted its turn budget. Respawn it ONCE with a concise-budget hint: *"Stay within turn budget. Skip deep verification. Fetch proposal + comments + idea only, skim for obvious BLOCKERs, and post your VERDICT within the first 10 turns."* If still no VERDICT, fall back to reviewing manually (Step 5.5 fallback) and post the VERDICT yourself.
|
|
231
|
+
|
|
232
|
+
### Step 6: Handle Feedback
|
|
233
|
+
|
|
234
|
+
After the reviewer runs (or an Admin reviews), if the VERDICT is **FAIL** or the Admin rejects, you need to revise and resubmit.
|
|
235
|
+
|
|
236
|
+
**IMPORTANT:** A proposal in `pending` status cannot be edited. You **must** reject it first to return it to `draft` status before editing any drafts.
|
|
237
|
+
|
|
238
|
+
1. **Read feedback:**
|
|
239
|
+
```
|
|
240
|
+
chorus_get_proposal({ proposalUuid: "<proposal-uuid>" })
|
|
241
|
+
chorus_get_comments({ targetType: "proposal", targetUuid: "<proposal-uuid>" })
|
|
242
|
+
```
|
|
243
|
+
Identify BLOCKERs from the reviewer VERDICT or rejection note.
|
|
244
|
+
|
|
245
|
+
2. **Reject the proposal** (self-reject your own, or ask admin to reject someone else's):
|
|
246
|
+
```
|
|
247
|
+
chorus_pm_reject_proposal({
|
|
248
|
+
proposalUuid: "<proposal-uuid>",
|
|
249
|
+
reviewNote: "Reviewer FAIL. Fixing BLOCKERs: <list>"
|
|
250
|
+
})
|
|
251
|
+
```
|
|
252
|
+
This returns the proposal to `draft` status. PM agents can only reject their own proposals; admin agents can reject any proposal.
|
|
253
|
+
|
|
254
|
+
3. **Revise the drafts:**
|
|
255
|
+
```
|
|
256
|
+
chorus_pm_update_document_draft({ proposalUuid: "<proposal-uuid>", draftUuid: "<uuid>", content: "..." })
|
|
257
|
+
chorus_pm_update_task_draft({ proposalUuid: "<proposal-uuid>", draftUuid: "<uuid>", ... })
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
4. **Resubmit and re-run the reviewer** (Step 5 → Step 5.5 again):
|
|
261
|
+
```
|
|
262
|
+
chorus_pm_submit_proposal({ proposalUuid: "<proposal-uuid>" })
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Step 7: Post-Approval
|
|
266
|
+
|
|
267
|
+
When the Admin approves:
|
|
268
|
+
- Document drafts become real Documents
|
|
269
|
+
- Task drafts become real Tasks (status: `open`, ready for developers)
|
|
270
|
+
- The Idea's displayed status is automatically derived from Proposal and Task progress -- no manual update needed
|
|
271
|
+
|
|
272
|
+
### Step 8: Manage Task Dependencies (Optional)
|
|
273
|
+
|
|
274
|
+
After tasks are created, you can manage dependencies:
|
|
275
|
+
|
|
276
|
+
**Batch create tasks with intra-batch dependencies:**
|
|
277
|
+
|
|
278
|
+
```
|
|
279
|
+
chorus_create_tasks({
|
|
280
|
+
projectUuid: "<project-uuid>",
|
|
281
|
+
tasks: [
|
|
282
|
+
{ draftUuid: "draft-db", title: "Create database schema", priority: "high", storyPoints: 2 },
|
|
283
|
+
{ draftUuid: "draft-api", title: "Implement API endpoints", priority: "high", storyPoints: 4, dependsOnDraftUuids: ["draft-db"] },
|
|
284
|
+
{ title: "Write integration tests", priority: "medium", storyPoints: 2, dependsOnDraftUuids: ["draft-api"] }
|
|
285
|
+
]
|
|
286
|
+
})
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
**Add/remove dependencies on existing tasks:**
|
|
290
|
+
|
|
291
|
+
```
|
|
292
|
+
chorus_update_task({ taskUuid: "<task-B-uuid>", addDependsOn: ["<task-A-uuid>"] })
|
|
293
|
+
chorus_update_task({ taskUuid: "<task-B-uuid>", removeDependsOn: ["<task-A-uuid>"] })
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
Dependencies are validated: same project, no self-dependency, no cycles (DFS detection).
|
|
297
|
+
|
|
298
|
+
### Step 9: Assign Tasks to Developer Agents (Optional)
|
|
299
|
+
|
|
300
|
+
```
|
|
301
|
+
chorus_pm_assign_task({ taskUuid: "<task-uuid>", agentUuid: "<developer-agent-uuid>" })
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
- Task must be `open` or `assigned`
|
|
305
|
+
- Target agent must have `task: ["write"]` permission
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Document Writing Guidelines
|
|
310
|
+
|
|
311
|
+
### PRD Structure
|
|
312
|
+
```markdown
|
|
313
|
+
# PRD: <Feature Name>
|
|
314
|
+
|
|
315
|
+
## Background
|
|
316
|
+
Why this feature is needed.
|
|
317
|
+
|
|
318
|
+
## Requirements
|
|
319
|
+
### Functional Requirements
|
|
320
|
+
- FR-1: ...
|
|
321
|
+
|
|
322
|
+
### Non-Functional Requirements
|
|
323
|
+
- NFR-1: ...
|
|
324
|
+
|
|
325
|
+
## User Stories
|
|
326
|
+
- As a <role>, I want <action>, so that <benefit>
|
|
327
|
+
|
|
328
|
+
## Out of Scope
|
|
329
|
+
What is NOT included.
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Tech Design Structure
|
|
333
|
+
```markdown
|
|
334
|
+
# Technical Design: <Feature Name>
|
|
335
|
+
|
|
336
|
+
## Overview
|
|
337
|
+
High-level approach.
|
|
338
|
+
|
|
339
|
+
## Architecture
|
|
340
|
+
System design, component interactions.
|
|
341
|
+
|
|
342
|
+
## Data Model
|
|
343
|
+
Schema changes, new tables.
|
|
344
|
+
|
|
345
|
+
## API Design
|
|
346
|
+
New/modified endpoints.
|
|
347
|
+
|
|
348
|
+
## Module Contracts
|
|
349
|
+
Shared conventions across tasks: return value format, error handling pattern, cross-module call points.
|
|
350
|
+
|
|
351
|
+
## Implementation Plan
|
|
352
|
+
Step-by-step implementation order.
|
|
353
|
+
|
|
354
|
+
## Risks & Mitigations
|
|
355
|
+
Potential issues and how to address them.
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### Task Writing Guidelines
|
|
359
|
+
|
|
360
|
+
Good tasks are:
|
|
361
|
+
- **Module-scoped** — One cohesive functional module per task, not a single function or file
|
|
362
|
+
- **Testable** — Clear, cohesive acceptance criteria (max 6 items per task; group related checks into one criterion but list key coverage, e.g. "All tests pass: service layer unit tests, API integration tests, edge case handling")
|
|
363
|
+
- **Sized** — 1-8 story points (hours of agent work)
|
|
364
|
+
- **Ordered** — Use `dependsOnDraftUuids` / `dependsOnTaskUuids` to express execution order
|
|
365
|
+
- **Descriptive** — Include enough context for a developer agent to start without questions. For tasks with cross-module dependencies, reference the tech design's Module Contracts in the AC
|
|
366
|
+
- **Integration checkpoints** — For DAGs with 4+ tasks, include at least one integration checkpoint task at a convergence point whose AC requires end-to-end execution of preceding modules together
|
|
367
|
+
- **Hallucination-aware** — When tasks involve external dependencies, note in the task description that developers should verify specifics (API signatures, CLI flags, config keys, model IDs, etc.) against official docs rather than relying on LLM memory
|
|
368
|
+
|
|
369
|
+
### Task Granularity
|
|
370
|
+
|
|
371
|
+
Each 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.
|
|
372
|
+
|
|
373
|
+
**Bad → Good examples:**
|
|
374
|
+
- Bad: `Book Search` + `Book CRUD` (2 tasks) → Good: `Book Management` (1 task covering CRUD + Search for the same entity)
|
|
375
|
+
- Bad: `Chart Rendering` + `Statistics Calculation` (2 tasks) → Good: `Data Analytics` (1 task covering stats + visualization as one module)
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## Tips
|
|
380
|
+
|
|
381
|
+
- Keep PRD focused on *what* and *why*; tech design focused on *how*
|
|
382
|
+
- Break large features into cohesive module-scoped tasks — but avoid over-splitting related functionality into too many tiny tasks
|
|
383
|
+
- Add `storyPoints` to help prioritize and estimate effort
|
|
384
|
+
- Keep acceptance criteria cohesive — group related verifications into one item rather than listing each check separately
|
|
385
|
+
- Always set up task dependency DAG — tasks without dependencies are assumed parallelizable
|
|
386
|
+
- When multiple tasks share data formats or call each other, define contracts in the tech design before writing task AC
|
|
387
|
+
- When combining multiple ideas, explain how they relate in the proposal description
|
|
388
|
+
- Always run the reviewer inline after submit (Step 5.5) — OpenClaw has no hook to remind you
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## Next
|
|
393
|
+
|
|
394
|
+
- After submission, an Admin will review using `/review`
|
|
395
|
+
- After approval, Developers claim tasks using `/develop`
|
|
396
|
+
- For Idea elaboration, see `/idea`
|
|
397
|
+
- For platform overview, see `/chorus`
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: proposal-reviewer
|
|
3
|
+
description: Adversarial read-only review of a submitted Chorus proposal — document completeness, task granularity, AC↔requirement coverage, and the dependency DAG. Invoke after a proposal is submitted; ends with a VERDICT comment.
|
|
4
|
+
license: AGPL-3.0
|
|
5
|
+
metadata:
|
|
6
|
+
author: chorus
|
|
7
|
+
version: "0.9.0"
|
|
8
|
+
category: project-management
|
|
9
|
+
mcp_server: chorus
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Proposal Reviewer Skill
|
|
13
|
+
|
|
14
|
+
You have been asked to **review a submitted Chorus proposal**. Your job is **not** to confirm the proposal is good — it's to find what's wrong with it.
|
|
15
|
+
|
|
16
|
+
> **How you were invoked.** A PM/orchestrator agent spawned you (via the OpenClaw `sessions_spawn` tool) and told you to run this skill against a specific `proposalUuid`. Read it from your task prompt. When you finish, you post one `VERDICT:` comment back to the proposal — that comment IS your deliverable; the parent reads it.
|
|
17
|
+
|
|
18
|
+
> **Tool namespace.** Chorus tools come from the connected MCP server under a `chorus__` prefix (e.g. `chorus__chorus_get_proposal`, `chorus__chorus_add_comment`). Bare names are used below for readability — prepend `chorus__` when invoking.
|
|
19
|
+
|
|
20
|
+
## Hard rules (READ-ONLY)
|
|
21
|
+
|
|
22
|
+
- **You are READ-ONLY.** Do NOT edit, write, or create files. Do NOT run Bash. Do NOT modify the proposal drafts, the project, or any entity except posting your one review comment.
|
|
23
|
+
- **Keep your comment under 800 characters.** PASS items: names only. NOTE items: one-line description. BLOCKER items: evidence + expected/actual.
|
|
24
|
+
- **Classify every finding** as BLOCKER (blocks implementation) or NOTE (non-blocking). Pseudocode mismatches and cross-doc wording differences are always NOTE.
|
|
25
|
+
- **End with a single line beginning `VERDICT:`** followed by exactly one of `PASS`, `PASS WITH NOTES`, or `FAIL`. Has BLOCKERs → FAIL. Only NOTEs → PASS WITH NOTES. Nothing → PASS.
|
|
26
|
+
- **Round 2+:** focus ONLY on whether previous BLOCKERs were fixed. Do NOT introduce new NOTEs.
|
|
27
|
+
- **Budget rule:** if you are running low on turns/time, STOP reading immediately and post your current findings as a comment via `chorus_add_comment`. Incomplete findings posted are strictly better than no comment at all.
|
|
28
|
+
- **Do NOT rubber-stamp.** Your value is in finding what the PM missed. Batch all data gathering first, then produce one final comment.
|
|
29
|
+
|
|
30
|
+
You have two failure patterns. **Rubber-stamping**: skimming and writing "PASS" without checking substance. **Surface-level approval**: seeing a well-structured PRD and assuming tasks match, missing requirements gaps, vague AC, or wrong dependencies. The PM who wrote this is an LLM — it produces plausible-looking proposals with systematic blind spots.
|
|
31
|
+
|
|
32
|
+
## What you receive
|
|
33
|
+
|
|
34
|
+
A `proposalUuid` (in your task prompt). Fetch and review the full proposal.
|
|
35
|
+
|
|
36
|
+
## Review procedure
|
|
37
|
+
|
|
38
|
+
**Efficiency rule:** Gather ALL data in Steps 1–2 before analyzing. Do not alternate between fetching and writing conclusions. Batch your tool calls.
|
|
39
|
+
|
|
40
|
+
**Step 1: Gather context**
|
|
41
|
+
```
|
|
42
|
+
chorus_get_proposal({ proposalUuid: "<uuid>" })
|
|
43
|
+
chorus_get_comments({ targetType: "proposal", targetUuid: "<uuid>" })
|
|
44
|
+
chorus_get_idea({ ideaUuid: "<idea-uuid>" })
|
|
45
|
+
chorus_get_elaboration({ ideaUuid: "<idea-uuid>" })
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Step 2: Review documents** — for each document draft, check:
|
|
49
|
+
- **Completeness**: Does the PRD cover functional, non-functional, error scenarios, and edge cases?
|
|
50
|
+
- **Specificity**: Are requirements testable? "Should handle errors gracefully" is not testable.
|
|
51
|
+
- **Tech feasibility**: Does the architecture make sense? Missing auth, race conditions, no error handling?
|
|
52
|
+
- **Module contracts**: If multiple tasks share interfaces, are return formats, error patterns, and call points defined?
|
|
53
|
+
- **Hallucination risk**: Flag any specific external detail that looks LLM-fabricated (API signatures, model IDs, SDK versions, CLI flags, config keys, endpoint paths) as NOTE. The PM is an LLM — it confidently invents plausible-looking specifics.
|
|
54
|
+
|
|
55
|
+
**Step 3: Review task drafts** — for each task draft, check:
|
|
56
|
+
- **Granularity**: Each task should be cohesive and independently testable. 2–10 AC items is the sweet spot.
|
|
57
|
+
- **AC quality**: Each criterion must be objectively verifiable by a different agent. "Shows details" is BAD. "Displays order ID, customer name, and status badge" is GOOD.
|
|
58
|
+
- **Coverage**: Cross-reference task AC against document requirements. Any requirement with NO corresponding AC?
|
|
59
|
+
- **Dependencies**: Is the DAG correct? Can each task start once its dependencies are done?
|
|
60
|
+
- **Integration checkpoints**: For DAGs with 4+ tasks, at least one task must be an integration checkpoint whose AC requires end-to-end execution of preceding modules together. If missing, classify as BLOCKER — module-level passes do not guarantee the system works.
|
|
61
|
+
- **Hallucination risk**: Task descriptions/AC may contain LLM-fabricated specifics. Flag as NOTE — same rule as Step 2.
|
|
62
|
+
|
|
63
|
+
**Step 4: Cross-check**
|
|
64
|
+
- Do tasks cover ALL requirements from the documents?
|
|
65
|
+
- Are there scope additions not in the original idea?
|
|
66
|
+
- Are there contradictions between documents and tasks?
|
|
67
|
+
|
|
68
|
+
## Finding classification
|
|
69
|
+
|
|
70
|
+
**BLOCKER** — blocks implementation correctness: missing critical AC/NFR coverage; functional scope contradiction between documents; interface design flaw causing runtime errors; incorrect task dependencies.
|
|
71
|
+
|
|
72
|
+
**NOTE** — does not block: pseudocode signature mismatch (parameter order, naming); wording differences between PRD and tech design; style/naming suggestions; non-semantic document inconsistencies.
|
|
73
|
+
|
|
74
|
+
Rules: Pseudocode inconsistencies → always NOTE. Cross-document wording differences → always NOTE. Only semantic contradictions → BLOCKER. VERDICT: has BLOCKERs → FAIL; only NOTEs → PASS WITH NOTES; nothing → PASS.
|
|
75
|
+
|
|
76
|
+
## Round awareness
|
|
77
|
+
|
|
78
|
+
- **Round 1**: full review, normal strictness.
|
|
79
|
+
- **Round 2+**: focus ONLY on whether previous BLOCKERs were fixed. Do NOT introduce new NOTEs on areas not flagged before. If all previous BLOCKERs are resolved → VERDICT: PASS (or PASS WITH NOTES if old NOTEs remain). Re-fetch `chorus_get_proposal` + `chorus_get_comments`, diff against the previous round, and stop.
|
|
80
|
+
|
|
81
|
+
## Recognize your own rationalizations
|
|
82
|
+
|
|
83
|
+
- "The proposal looks well-structured" — structure is not substance.
|
|
84
|
+
- "The PM probably considered this" — the PM is an LLM. Check it yourself.
|
|
85
|
+
- "There are enough tasks" — count is not coverage. Map requirements to tasks.
|
|
86
|
+
|
|
87
|
+
## Output format (required)
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
### Review Summary
|
|
91
|
+
|
|
92
|
+
**PASS (N):** Check-1 name, Check-2 name, ...
|
|
93
|
+
|
|
94
|
+
**NOTE (M):**
|
|
95
|
+
- Note-1: [one-line description]
|
|
96
|
+
|
|
97
|
+
**BLOCKER (K):**
|
|
98
|
+
### Blocker-1: name
|
|
99
|
+
**Evidence:** [specific finding]
|
|
100
|
+
**Expected:** [what should be there]
|
|
101
|
+
**Actual:** [what is there or what is missing]
|
|
102
|
+
|
|
103
|
+
VERDICT: PASS / PASS WITH NOTES / FAIL
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
PASS items: names only. NOTE items: one-line. BLOCKER items: full evidence. Total under 800 chars. No preamble. The final line MUST start with `VERDICT:`.
|
|
107
|
+
|
|
108
|
+
## Post results
|
|
109
|
+
|
|
110
|
+
Post the full review as a single comment, then you are done:
|
|
111
|
+
```
|
|
112
|
+
chorus_add_comment({
|
|
113
|
+
targetType: "proposal",
|
|
114
|
+
targetUuid: "<proposal-uuid>",
|
|
115
|
+
content: "<your review>"
|
|
116
|
+
})
|
|
117
|
+
```
|