@chorus-aidlc/chorus-openclaw-plugin 0.5.0 → 0.10.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/package.json +1 -1
- package/skills/brainstorm/SKILL.md +5 -5
- package/skills/chorus/SKILL.md +3 -3
- package/skills/develop/SKILL.md +3 -2
- package/skills/idea/SKILL.md +47 -33
- package/skills/openspec-aware/SKILL.md +1 -1
- package/skills/proposal/SKILL.md +18 -7
- package/skills/proposal-reviewer/SKILL.md +4 -3
- package/skills/quick-dev/SKILL.md +4 -4
- package/skills/review/SKILL.md +5 -3
- package/skills/task-reviewer/SKILL.md +2 -2
- package/skills/yolo/SKILL.md +9 -6
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@ description: Optional divergent-then-convergent dialogue for fuzzy ideas. Invoke
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.10.0"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -36,7 +36,7 @@ Only as a sub-step of the idea skill, only after the user has explicitly opted i
|
|
|
36
36
|
5. **No files written.** Do NOT write any markdown, design doc, scratch file, or any other file to disk. The conversation produces an `ElaborationRound` and nothing else on disk.
|
|
37
37
|
6. **No comments posted.** Do NOT call `chorus_add_comment` from this skill. Comments belong to the idea skill or the user, not to the brainstorm step.
|
|
38
38
|
7. **No design-doc handoff.** Do NOT invoke `writing-plans`, `writing-skills`, or any skill whose purpose is to produce a design document. The brainstorm output is the synthesized round — there is no separate doc.
|
|
39
|
-
8. **No `validate_elaboration` call.** Do NOT call `chorus_pm_validate_elaboration` from this skill. Whether to
|
|
39
|
+
8. **No `validate_elaboration` call.** Do NOT call `chorus_pm_validate_elaboration` from this skill. Whether to resolve the elaboration or open a follow-up round (`chorus_pm_start_elaboration` again) is the calling idea skill's decision, not this skill's.
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
@@ -123,8 +123,8 @@ chorus_answer_elaboration({
|
|
|
123
123
|
|
|
124
124
|
Stop here. Do **NOT** call `chorus_pm_validate_elaboration`. The idea skill's caller now decides:
|
|
125
125
|
|
|
126
|
-
- If the synthesized round answers cover everything → caller
|
|
127
|
-
- If gaps remain → caller
|
|
126
|
+
- If the synthesized round answers cover everything → caller obtains human confirmation, then resolves with `chorus_pm_validate_elaboration`.
|
|
127
|
+
- If gaps remain → caller opens a structured Round 2 with `chorus_pm_start_elaboration`.
|
|
128
128
|
|
|
129
129
|
The depth of any follow-up round is the caller's call, not yours.
|
|
130
130
|
|
|
@@ -157,7 +157,7 @@ Do not do any of the following. Each has a specific failure mode that this skill
|
|
|
157
157
|
- **Single-summary `customText` blob.** Compressing the entire conversation into one ElaborationQuestion with a long markdown summary in `customText`. The schema is multi-question for a reason — preserve the decision granularity.
|
|
158
158
|
- **Transcript-as-comment.** Posting the raw conversation log as a comment on the idea (or anywhere). The synthesized round IS the artifact. Raw transcripts pollute the audit trail with noise.
|
|
159
159
|
- **File writes.** Writing any markdown, design doc, plan, or scratch file to disk. There is no design doc in this flow. This is a deliberate divergence from the upstream `superpowers/brainstorming` cadence.
|
|
160
|
-
- **`validate_elaboration` calls.** Closing the elaboration phase from this skill. The lifecycle decision belongs to the idea skill. Calling
|
|
160
|
+
- **`validate_elaboration` calls.** Closing the elaboration phase from this skill. The lifecycle decision belongs to the idea skill. Calling it here strips the caller of its scheduler role.
|
|
161
161
|
- **`writing-plans` / design-doc handoff.** Invoking any skill that produces an implementation plan or design document. The Chorus pipeline already has Proposal → Document Drafts → Task Drafts for that — the brainstorm output feeds them through ElaborationRound, not through external doc skills.
|
|
162
162
|
- **Length-2 binary "yes / no" framings.** Reducing every decision to "do this thing — yes / no". Almost always the genuine alternatives are 3+ approaches with meaningfully different tradeoffs. Length-2 framings often mean the divergent phase ended too early.
|
|
163
163
|
- **Asking multiple questions in one prompt.** The cadence is one question per turn during divergence, then one final convergence prompt with 2-3 options. Combining unrelated questions is a sign you are rushing.
|
package/skills/chorus/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: Chorus AI Agent collaboration platform — overview, common tools,
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.10.0"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -137,7 +137,7 @@ A **report** is a short idea-completion summary persisted as a `type="report"` D
|
|
|
137
137
|
| Tool | Purpose |
|
|
138
138
|
|------|---------|
|
|
139
139
|
| `chorus_get_proposals` | List project Proposals (filterable by status: pending, approved, rejected) |
|
|
140
|
-
| `chorus_get_proposal` | Get a single Proposal
|
|
140
|
+
| `chorus_get_proposal` | Get a single Proposal, sliced by `section` (default `basic`: metadata + lightweight draft index; `documents`/`tasks`/`full` for the draft bodies) |
|
|
141
141
|
|
|
142
142
|
### Tasks
|
|
143
143
|
|
|
@@ -295,7 +295,7 @@ The table below shows default tool availability for each preset (no custom permi
|
|
|
295
295
|
| `chorus_add_comment` / `chorus_get_comments` | (public) | Yes | Yes | Yes |
|
|
296
296
|
| `chorus_update_task` (field edits + status) | (public; assignee required for status) | Yes | Yes | Yes |
|
|
297
297
|
| `chorus_claim_task` / `chorus_release_task` / `chorus_submit_for_verify` / `chorus_report_work` / `chorus_report_criteria_self_check` | `task:write` | Yes | **Yes** (0.7.0+) | Yes |
|
|
298
|
-
| `chorus_claim_idea` / `chorus_release_idea` / `chorus_move_idea` / `chorus_pm_create_idea` / `chorus_pm_*_elaboration` | `idea:write` | No | Yes | Yes |
|
|
298
|
+
| `chorus_claim_idea` / `chorus_release_idea` / `chorus_move_idea` / `chorus_pm_create_idea` / `chorus_edit_idea` / `chorus_pm_*_elaboration` | `idea:write` | No | Yes | Yes |
|
|
299
299
|
| `chorus_pm_create_proposal` / `chorus_pm_*_proposal` / `chorus_pm_*_draft` / `chorus_create_tasks` / `chorus_pm_assign_task` / `chorus_update_task` (dependency edits via `addDependsOn`/`removeDependsOn`) | `proposal:write` | No | Yes | Yes |
|
|
300
300
|
| `chorus_pm_create_document` / `chorus_pm_update_document` / `chorus_create_report` | `document:write` | No | Yes | Yes |
|
|
301
301
|
| `chorus_admin_create_project` / `chorus_admin_*_project_group` / `chorus_admin_move_project_to_group` | `project:write` | No | **Yes** (0.7.0+) | Yes |
|
package/skills/develop/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: Chorus Development workflow — claim tasks, report work, manage se
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.10.0"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -137,8 +137,9 @@ Each task and proposal includes a `commentCount` field — use it to decide whic
|
|
|
137
137
|
|
|
138
138
|
4. **Read the originating proposal** for design intent:
|
|
139
139
|
```
|
|
140
|
-
chorus_get_proposal({ proposalUuid: "<proposal-uuid>" })
|
|
140
|
+
chorus_get_proposal({ proposalUuid: "<proposal-uuid>", section: "documents" })
|
|
141
141
|
```
|
|
142
|
+
(`chorus_get_proposal` defaults to `section: "basic"` — just metadata + a draft index. Pass `section: "documents"` for the design docs, or `section: "full"` for docs + task drafts.)
|
|
142
143
|
|
|
143
144
|
5. **Read project documents** (PRD, tech design, ADR):
|
|
144
145
|
```
|
package/skills/idea/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: Chorus Idea workflow — claim ideas, run elaboration rounds, and p
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.10.0"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -37,19 +37,20 @@ All post-elaboration progress (planning, building, verifying, done) is **derived
|
|
|
37
37
|
|
|
38
38
|
| Tool | Purpose |
|
|
39
39
|
|------|---------|
|
|
40
|
-
| `chorus_pm_create_idea` | Create a new idea in a project (on behalf of humans) |
|
|
40
|
+
| `chorus_pm_create_idea` | Create a new idea in a project (on behalf of humans). Optional `parentUuid` derives a child idea from an existing same-project idea (single-parent lineage). |
|
|
41
|
+
| `chorus_edit_idea` | Edit an existing idea's title, description, and/or lineage parent. `parentUuid`: another same-project idea to reparent under, `null` to detach to top-level, omit to leave unchanged (cycle-checked + same-project). Single-parent **weak** lineage — a parent shows a read-only `+N derived` rollup but never blocks either idea's flow. Records an "edited" activity and signals presence. |
|
|
41
42
|
| `chorus_claim_idea` | Claim an open idea (open -> elaborating) |
|
|
42
43
|
| `chorus_release_idea` | Release a claimed idea (elaborating -> open) |
|
|
43
|
-
| `chorus_move_idea` | Move an Idea to a different Project. Cascade-migrates the Idea, all linked Proposals (any status), all materialized Documents and Tasks, and all related Activities atomically. Comments, TaskDependency, AcceptanceCriterion, AgentSession, SessionTaskCheckin, Notification history, and Task assignees are NOT modified. Returns `moved: { proposals, documents, tasks, activities }` counts. Requires `idea:write` only — no project-level checks. |
|
|
44
|
+
| `chorus_move_idea` | Move an Idea to a different Project. Cascade-migrates the Idea **and its full lineage subtree** (all descendant Ideas; the moved root is detached from any parent left behind), all linked Proposals (any status), all materialized Documents and Tasks, and all related Activities atomically. Comments, TaskDependency, AcceptanceCriterion, AgentSession, SessionTaskCheckin, Notification history, and Task assignees are NOT modified. Returns `moved: { ideas, proposals, documents, tasks, activities }` counts. Requires `idea:write` only — no project-level checks. |
|
|
44
45
|
|
|
45
46
|
**Requirements Elaboration:**
|
|
46
47
|
|
|
47
48
|
| Tool | Purpose |
|
|
48
49
|
|------|---------|
|
|
49
|
-
| `chorus_pm_start_elaboration` |
|
|
50
|
-
| `chorus_pm_validate_elaboration` |
|
|
50
|
+
| `chorus_pm_start_elaboration` | Generate an elaboration round (first, follow-up, or appended-after-resolution) |
|
|
51
|
+
| `chorus_pm_validate_elaboration` | Mark the whole elaboration complete (requires `idea:admin`; requires human confirmation first) |
|
|
51
52
|
| `chorus_pm_skip_elaboration` | Skip elaboration for trivially clear Ideas |
|
|
52
|
-
| `chorus_answer_elaboration` | Submit answers for an elaboration round |
|
|
53
|
+
| `chorus_answer_elaboration` | Submit answers for an elaboration round (`roundUuid` optional — auto-locates the active round) |
|
|
53
54
|
| `chorus_get_elaboration` | Get full elaboration state (rounds, questions, answers) |
|
|
54
55
|
|
|
55
56
|
**Shared tools** (checkin, query, comment, search, notifications): see `/chorus`
|
|
@@ -129,8 +130,8 @@ If the Idea is fuzzy and you'd struggle to enumerate concrete multi-choice quest
|
|
|
129
130
|
|
|
130
131
|
When `/brainstorm` returns, you own the lifecycle decision (the brainstorm skill deliberately leaves it to you):
|
|
131
132
|
|
|
132
|
-
- If the synthesized round answers cover everything → call `chorus_pm_validate_elaboration`
|
|
133
|
-
- If gaps remain → call `
|
|
133
|
+
- If the synthesized round answers cover everything → obtain human confirmation, then call `chorus_pm_validate_elaboration` to mark the elaboration complete. (Requires `idea:admin` — see Step 5.6 if your key is `pm_agent`-preset.)
|
|
134
|
+
- If gaps remain → call `chorus_pm_start_elaboration` again to open a structured Round 2. Pick the depth yourself — do NOT re-prompt the user.
|
|
134
135
|
|
|
135
136
|
Either outcome ends Step 4.5; skip Step 5.
|
|
136
137
|
|
|
@@ -151,6 +152,12 @@ chorus_pm_skip_elaboration({
|
|
|
151
152
|
|
|
152
153
|
#### Standard/Complex Ideas (run elaboration)
|
|
153
154
|
|
|
155
|
+
> **Elaboration is a loop, not a straight line.** Steps 2–5 below are **one round**. Keep looping back to `chorus_pm_start_elaboration` (a new round) until every open question is settled, then resolve **once** in Step 6. You re-enter the loop whenever:
|
|
156
|
+
> - the answers to a round **derive new questions** or surface a contradiction/gap, **or**
|
|
157
|
+
> - at the resolve gate (Step 5d / Step 6) the **human raises a new concern or correction** (a plain-text reply on OpenClaw).
|
|
158
|
+
>
|
|
159
|
+
> Each new round is just another `chorus_pm_start_elaboration` call — there is no separate "follow-up" flag, and you do not resolve until the loop is genuinely done. Round cap is 10.
|
|
160
|
+
|
|
154
161
|
1. **Determine depth** based on idea complexity:
|
|
155
162
|
- `"minimal"` — 2-4 questions (small features, minor enhancements)
|
|
156
163
|
- `"standard"` — 5-10 questions (typical new features)
|
|
@@ -211,6 +218,8 @@ chorus_pm_skip_elaboration({
|
|
|
211
218
|
- **Select an option + add a note**: `selectedOptionId: "a", customText: "additional context"`
|
|
212
219
|
- **Free text (no option matched)**: `selectedOptionId: null, customText: "your answer"` — customText is required when no option is selected
|
|
213
220
|
|
|
221
|
+
> `roundUuid` is **optional** on `chorus_answer_elaboration`. Omit it and the service auto-locates the Idea's single active (`pending_answers`) round. Pass it explicitly only when you need to target a specific round.
|
|
222
|
+
|
|
214
223
|
5. **Review answers and confirm with the owner (@mention flow):**
|
|
215
224
|
|
|
216
225
|
After answers are submitted, **@mention the answerer** (typically the agent's owner) with a summary of your understanding. This prevents misinterpretation before you validate.
|
|
@@ -231,39 +240,32 @@ chorus_pm_skip_elaboration({
|
|
|
231
240
|
|
|
232
241
|
c. **Wait for confirmation** via comments.
|
|
233
242
|
|
|
234
|
-
d. **Based on the response:**
|
|
235
|
-
- **Confirmed** —
|
|
236
|
-
- **
|
|
237
|
-
- **
|
|
243
|
+
d. **Based on the response — this is the loop decision point:**
|
|
244
|
+
- **Confirmed, nothing left to discuss** — Treat this as the human confirmation required to resolve; proceed to Step 6 and call `chorus_pm_validate_elaboration`.
|
|
245
|
+
- **Human raises a new concern / correction / question** — Do **NOT** resolve. Loop back: open a **new round** with `chorus_pm_start_elaboration` capturing the new questions, collect answers (Steps 2–5 again), and re-confirm. Repeat until the human has no remaining concerns.
|
|
246
|
+
- **The answers themselves derived new questions or a contradiction** — Same as above: loop back to `chorus_pm_start_elaboration` for another round before resolving.
|
|
247
|
+
- **Unclear** — Ask clarifying questions via another comment, then continue the loop.
|
|
238
248
|
|
|
239
|
-
6. **
|
|
249
|
+
6. **Resolve the elaboration (the single commit gate — only when the loop is done):**
|
|
240
250
|
|
|
241
|
-
|
|
251
|
+
Resolving marks the **whole elaboration phase** complete — it sets `idea.elaborationStatus = "resolved"` (Idea → `elaborated`), which is the gating signal that lets a downstream Proposal be submitted. It is an **Idea-level** action (takes only `ideaUuid`, does not target a round). Resolve **once**, only after the Step 5d loop has fully settled — every derived question answered and the human has no remaining concerns. If anything is still open, go back to `chorus_pm_start_elaboration` instead of resolving.
|
|
242
252
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
followUpQuestions: []
|
|
249
|
-
})
|
|
250
|
-
```
|
|
253
|
+
> **Precondition:** resolve requires the Idea to have at least one round and **every** round to be fully answered (none left in `pending_answers`). If a round still has open questions, answer it (or it'll be rejected).
|
|
254
|
+
|
|
255
|
+
> **⚠️ Human confirmation required.** Outside YOLO automation you MUST obtain explicit human confirmation before resolving (a plain-text yes/no prompt is fine on OpenClaw). The "Confirmed" reply in step 5d above counts as that confirmation. Never resolve on your own judgment alone.
|
|
256
|
+
|
|
257
|
+
> **Permission (N1): `chorus_pm_validate_elaboration` requires `idea:admin`.** The `pm_agent` preset only grants `idea:write`, so a PM-preset agent **cannot** resolve — it must hand off to an `admin_agent`-preset agent (or an admin-preset API key) to perform the resolve. If your key lacks `idea:admin`, surface this to the human and request the handoff instead of failing silently.
|
|
251
258
|
|
|
252
|
-
|
|
259
|
+
> **Assignee precondition (N2):** the resolving actor must be the Idea's **assignee**. A separate human reviewer resolving a PM-owned Idea therefore needs **both** `idea:admin` **and** to be assigned the Idea (claim/reassign it first). Admin permission alone is not enough.
|
|
253
260
|
|
|
254
261
|
```
|
|
255
262
|
chorus_pm_validate_elaboration({
|
|
256
|
-
ideaUuid: "<idea-uuid>"
|
|
257
|
-
roundUuid: "<round-uuid>",
|
|
258
|
-
issues: [
|
|
259
|
-
{ questionId: "q1", type: "ambiguity", description: "Role-based access selected but no roles defined" }
|
|
260
|
-
],
|
|
261
|
-
followUpQuestions: [
|
|
262
|
-
{ id: "fq1", text: "Which specific roles should have access?", category: "functional", options: [...] }
|
|
263
|
-
]
|
|
263
|
+
ideaUuid: "<idea-uuid>"
|
|
264
264
|
})
|
|
265
265
|
```
|
|
266
266
|
|
|
267
|
+
**Want a follow-up round instead of resolving?** Just call `chorus_pm_start_elaboration` again — there is no separate "open a round" flag. It works while still `elaborating` (a normal follow-up round) and, after you've already resolved, as an **appended round** (`isAppended: true`) that keeps the Idea `elaborated` and never blocks an in-flight Proposal. Per-question issue tagging no longer exists.
|
|
268
|
+
|
|
267
269
|
7. **Check elaboration status** at any time:
|
|
268
270
|
```
|
|
269
271
|
chorus_get_elaboration({ ideaUuid: "<idea-uuid>" })
|
|
@@ -273,7 +275,19 @@ chorus_pm_skip_elaboration({
|
|
|
273
275
|
|
|
274
276
|
**Question categories:** `functional`, `non_functional`, `business_context`, `technical_context`, `user_scenario`, `scope`
|
|
275
277
|
|
|
276
|
-
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Idea Lineage (derive vs. task)
|
|
281
|
+
|
|
282
|
+
Ideas can form a **single-parent forest**: an idea may have one parent (`parentUuid`), establishing a weak lineage. "Weak" means the parent only shows a read-only `+N derived` rollup of its **direct** children — it never blocks or alters either idea's elaboration/proposal/task flow, and a parent is always a full first-class idea (it can have its own content, proposals, and tasks).
|
|
283
|
+
|
|
284
|
+
When a new direction surfaces (during elaboration, brainstorm, or review), decide where it belongs:
|
|
285
|
+
|
|
286
|
+
- **Derive a child idea** (`chorus_pm_create_idea` with `parentUuid`, or `chorus_edit_idea` with `parentUuid` to reparent an existing idea) when the new direction needs **its own elaboration/proposal lifecycle** — it is an independent AI-DLC pass.
|
|
287
|
+
- **Add a task** to the current idea's proposal when the new work is just *how to implement the current idea*.
|
|
288
|
+
- **Create a plain top-level idea** (no `parentUuid`) when there is no lineage to the current idea.
|
|
289
|
+
|
|
290
|
+
This is a soft heuristic, not a rule — use judgment. Cycle prevention is automatic: you cannot set a parent that is the idea itself or one of its descendants. Parent and child must be in the same project (cross-project lineage is not supported yet). Deleting a parent re-parents its children to top-level (it never cascades). (Reminder: invoke these as `chorus__chorus_pm_create_idea` / `chorus__chorus_edit_idea` — see the namespace note at the top of the `chorus` skill.)
|
|
277
291
|
|
|
278
292
|
---
|
|
279
293
|
|
|
@@ -283,7 +297,7 @@ chorus_pm_skip_elaboration({
|
|
|
283
297
|
- Elaboration improves Proposal quality — don't skip it unless the requirements are trivially clear
|
|
284
298
|
- Present interactive questions as plain text and collect free-text replies — OpenClaw has no `AskUserQuestion` primitive
|
|
285
299
|
- Record decisions made in conversation as elaboration rounds for auditability
|
|
286
|
-
- Always @mention the owner to confirm understanding before
|
|
300
|
+
- Always @mention the owner to confirm understanding before resolving
|
|
287
301
|
|
|
288
302
|
---
|
|
289
303
|
|
package/skills/proposal/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: Chorus Proposal workflow — create proposals with document and tas
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.10.0"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -127,6 +127,8 @@ chorus_pm_add_document_draft({
|
|
|
127
127
|
|
|
128
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
129
|
|
|
130
|
+
**`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).
|
|
131
|
+
|
|
130
132
|
```
|
|
131
133
|
# First task -> response includes { draftUuid, draftTitle }
|
|
132
134
|
chorus_pm_add_task_draft({
|
|
@@ -135,7 +137,10 @@ chorus_pm_add_task_draft({
|
|
|
135
137
|
description: "Detailed description of what to build...",
|
|
136
138
|
priority: "high",
|
|
137
139
|
storyPoints: 3,
|
|
138
|
-
|
|
140
|
+
acceptanceCriteriaItems: [
|
|
141
|
+
{ description: "Criteria 1", required: true },
|
|
142
|
+
{ description: "Criteria 2", required: true }
|
|
143
|
+
]
|
|
139
144
|
})
|
|
140
145
|
|
|
141
146
|
# Second task — depends on first
|
|
@@ -145,18 +150,24 @@ chorus_pm_add_task_draft({
|
|
|
145
150
|
description: "Unit and integration tests...",
|
|
146
151
|
priority: "medium",
|
|
147
152
|
storyPoints: 2,
|
|
148
|
-
|
|
153
|
+
acceptanceCriteriaItems: [
|
|
154
|
+
{ description: "Test coverage > 80%", required: true }
|
|
155
|
+
],
|
|
149
156
|
dependsOnDraftUuids: ["<draftUuid-from-first-task>"]
|
|
150
157
|
})
|
|
151
158
|
```
|
|
152
159
|
|
|
160
|
+
> 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.
|
|
161
|
+
|
|
153
162
|
**Task priority:** `low`, `medium`, `high`
|
|
154
163
|
|
|
155
164
|
### Step 4: Review and Refine Drafts
|
|
156
165
|
|
|
157
166
|
```
|
|
158
|
-
# Review current state
|
|
159
|
-
|
|
167
|
+
# Review current state. chorus_get_proposal defaults to section:"basic"
|
|
168
|
+
# (metadata + a lightweight draft index, no bodies). Use section:"full" to
|
|
169
|
+
# see every draft's content, or section:"documents"/"tasks" for one kind.
|
|
170
|
+
chorus_get_proposal({ proposalUuid: "<proposal-uuid>", section: "full" })
|
|
160
171
|
|
|
161
172
|
# Update a document draft
|
|
162
173
|
chorus_pm_update_document_draft({
|
|
@@ -237,7 +248,7 @@ After the reviewer runs (or an Admin reviews), if the VERDICT is **FAIL** or the
|
|
|
237
248
|
|
|
238
249
|
1. **Read feedback:**
|
|
239
250
|
```
|
|
240
|
-
chorus_get_proposal({ proposalUuid: "<proposal-uuid>" })
|
|
251
|
+
chorus_get_proposal({ proposalUuid: "<proposal-uuid>", section: "full" })
|
|
241
252
|
chorus_get_comments({ targetType: "proposal", targetUuid: "<proposal-uuid>" })
|
|
242
253
|
```
|
|
243
254
|
Identify BLOCKERs from the reviewer VERDICT or rejection note.
|
|
@@ -359,7 +370,7 @@ Potential issues and how to address them.
|
|
|
359
370
|
|
|
360
371
|
Good tasks are:
|
|
361
372
|
- **Module-scoped** — One cohesive functional module per task, not a single function or file
|
|
362
|
-
- **Testable** — Clear, cohesive acceptance criteria (
|
|
373
|
+
- **Testable** — Clear, cohesive acceptance criteria are **required** on every task (at least one non-blank item; max 6; 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
374
|
- **Sized** — 1-8 story points (hours of agent work)
|
|
364
375
|
- **Ordered** — Use `dependsOnDraftUuids` / `dependsOnTaskUuids` to express execution order
|
|
365
376
|
- **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
|
|
@@ -4,7 +4,7 @@ description: Adversarial read-only review of a submitted Chorus proposal — doc
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.10.0"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -39,11 +39,12 @@ A `proposalUuid` (in your task prompt). Fetch and review the full proposal.
|
|
|
39
39
|
|
|
40
40
|
**Step 1: Gather context**
|
|
41
41
|
```
|
|
42
|
-
chorus_get_proposal({ proposalUuid: "<uuid>" })
|
|
42
|
+
chorus_get_proposal({ proposalUuid: "<uuid>", section: "full" })
|
|
43
43
|
chorus_get_comments({ targetType: "proposal", targetUuid: "<uuid>" })
|
|
44
44
|
chorus_get_idea({ ideaUuid: "<idea-uuid>" })
|
|
45
45
|
chorus_get_elaboration({ ideaUuid: "<idea-uuid>" })
|
|
46
46
|
```
|
|
47
|
+
> `chorus_get_proposal` defaults to `section: "basic"` (metadata + a lightweight draft index, no bodies). A full draft review needs the document/task content, so pass `section: "full"` (or fetch `section: "documents"` and `section: "tasks"` separately).
|
|
47
48
|
|
|
48
49
|
**Step 2: Review documents** — for each document draft, check:
|
|
49
50
|
- **Completeness**: Does the PRD cover functional, non-functional, error scenarios, and edge cases?
|
|
@@ -76,7 +77,7 @@ Rules: Pseudocode inconsistencies → always NOTE. Cross-document wording differ
|
|
|
76
77
|
## Round awareness
|
|
77
78
|
|
|
78
79
|
- **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
|
+
- **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({ proposalUuid, section: "full" })` + `chorus_get_comments`, diff against the previous round, and stop.
|
|
80
81
|
|
|
81
82
|
## Recognize your own rationalizations
|
|
82
83
|
|
|
@@ -4,7 +4,7 @@ description: Quick Task workflow — skip Idea→Proposal, create tasks directly
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.10.0"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -70,7 +70,7 @@ This matters because admin agents can call `chorus_admin_verify_task` to close t
|
|
|
70
70
|
|
|
71
71
|
### Step 1: Create a Quick Task
|
|
72
72
|
|
|
73
|
-
**
|
|
73
|
+
**`acceptanceCriteriaItems` is required** — `chorus_create_tasks` rejects any task without at least one non-blank criterion (and rejects the whole batch if any task is missing them). These are also the foundation for self-checking in Step 6. Write specific, testable criteria that you can objectively verify after development. Vague AC like "works correctly" defeats the purpose; prefer "returns 200 on GET /api/foo with valid token".
|
|
74
74
|
|
|
75
75
|
```
|
|
76
76
|
chorus_create_tasks({
|
|
@@ -100,7 +100,7 @@ chorus_claim_task({ taskUuid: "<task-uuid>" })
|
|
|
100
100
|
|
|
101
101
|
### Step 3: Edit Details (if needed)
|
|
102
102
|
|
|
103
|
-
Use `chorus_update_task` to refine the task after creation.
|
|
103
|
+
Use `chorus_update_task` to refine the task after creation. Tasks always have AC (creation requires them), but **update them when your understanding changes during development**. Passing `acceptanceCriteriaItems` **replaces** the task's criteria with the provided non-empty set; omit the field to leave them unchanged (it cannot be used to clear AC).
|
|
104
104
|
|
|
105
105
|
```
|
|
106
106
|
chorus_update_task({
|
|
@@ -182,7 +182,7 @@ Quick Tasks support sub-agent execution just like proposal-based tasks. **Sessio
|
|
|
182
182
|
## Tips
|
|
183
183
|
|
|
184
184
|
- Keep Quick Tasks small — if you need more than 2-3 tasks, consider using `/proposal`
|
|
185
|
-
- **
|
|
185
|
+
- **Acceptance criteria are required at creation time** — `chorus_create_tasks` rejects tasks without them. They are your self-check contract; specific, testable AC enables autonomous verification and makes the entire workflow self-contained
|
|
186
186
|
- Use `chorus_update_task` to refine tasks (including AC) after creation rather than deleting and recreating
|
|
187
187
|
- Pass `proposalUuid` to attach follow-up or gap-filling tasks to an existing proposal — this keeps related work grouped in the same project context and DAG
|
|
188
188
|
- Quick Tasks show up in the same project task list and DAG as proposal-based tasks
|
package/skills/review/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: Chorus Review workflow — approve/reject proposals, verify tasks,
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.10.0"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -112,10 +112,12 @@ Prioritize: **Proposals first** (they unblock PM and Developer work), then task
|
|
|
112
112
|
#### A1: Read the Proposal
|
|
113
113
|
|
|
114
114
|
```
|
|
115
|
-
chorus_get_proposal({ proposalUuid: "<proposal-uuid>" })
|
|
115
|
+
chorus_get_proposal({ proposalUuid: "<proposal-uuid>", section: "full" })
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
`chorus_get_proposal` defaults to `section: "basic"` — proposal metadata plus a lightweight index of the drafts (uuid, type/title, contentLength, AC count, dependency edges) with **no** document content or full task descriptions. For a review you need the bodies, so pass `section: "full"` to get everything at once (or `section: "documents"` / `section: "tasks"` to read one kind at a time).
|
|
119
|
+
|
|
120
|
+
The `full` view returns: title, description, input ideas, **document drafts** (PRD, tech design), **task drafts** (with descriptions and acceptance criteria).
|
|
119
121
|
|
|
120
122
|
#### A2: Quality Checklist
|
|
121
123
|
|
|
@@ -4,7 +4,7 @@ description: Adversarial verification of a submitted Chorus task against its AC
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.10.0"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -42,7 +42,7 @@ A `taskUuid` (in your task prompt). Fetch the task, its AC, and the proposal doc
|
|
|
42
42
|
```
|
|
43
43
|
chorus_get_task({ taskUuid: "<uuid>" })
|
|
44
44
|
chorus_get_comments({ targetType: "task", targetUuid: "<uuid>" })
|
|
45
|
-
chorus_get_proposal({ proposalUuid: "<from-task>" })
|
|
45
|
+
chorus_get_proposal({ proposalUuid: "<from-task>", section: "documents" })
|
|
46
46
|
chorus_get_document({ documentUuid: "<doc-uuid>" })
|
|
47
47
|
```
|
|
48
48
|
|
package/skills/yolo/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: Full-auto AI-DLC pipeline — from prompt to done. Automates the en
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.10.0"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -142,6 +142,8 @@ chorus_claim_idea({ ideaUuid: "<idea-uuid>" })
|
|
|
142
142
|
|
|
143
143
|
In /yolo mode, the agent generates elaboration questions and answers them itself -- **no user interaction at all**. There is no `AskUserQuestion` primitive on OpenClaw, and yolo deliberately does not prompt the user; it self-answers to preserve an audit trail without interrupting the run.
|
|
144
144
|
|
|
145
|
+
> **Self-elaboration is still a loop.** If answering your own questions surfaces a **new question, contradiction, or gap**, loop back to `chorus_pm_start_elaboration` for another self-answered round before resolving — don't force a resolve over unresolved ambiguity. There is no human gate in YOLO, so the loop exits on **your** judgment that nothing material is left open (round cap 10). Steps 1–2 are one round; repeat them as needed, then resolve once in Step 3.
|
|
146
|
+
|
|
145
147
|
1. **Generate and submit questions:**
|
|
146
148
|
```
|
|
147
149
|
chorus_pm_start_elaboration({
|
|
@@ -174,15 +176,16 @@ In /yolo mode, the agent generates elaboration questions and answers them itself
|
|
|
174
176
|
})
|
|
175
177
|
```
|
|
176
178
|
|
|
177
|
-
3. **
|
|
179
|
+
3. **Resolve** — in YOLO mode the agent resolves elaboration **autonomously, with no human-confirmation gate** (the human-confirmation requirement that applies to the interactive `/idea` flow is explicitly waived under `/yolo` automation):
|
|
180
|
+
|
|
178
181
|
```
|
|
179
182
|
chorus_pm_validate_elaboration({
|
|
180
|
-
ideaUuid: "<idea-uuid>"
|
|
181
|
-
roundUuid: "<round-uuid>",
|
|
182
|
-
issues: []
|
|
183
|
+
ideaUuid: "<idea-uuid>"
|
|
183
184
|
})
|
|
184
185
|
```
|
|
185
186
|
|
|
187
|
+
> `chorus_pm_validate_elaboration` requires `idea:admin`. `/yolo` already mandates an Admin-preset key in Prerequisites, so this is satisfied. To open another self-elaboration round instead of resolving, just call `chorus_pm_start_elaboration` again.
|
|
188
|
+
|
|
186
189
|
#### Step 1.4: Create Proposal
|
|
187
190
|
|
|
188
191
|
1. **Detect OpenSpec mode (inline).** Load the `openspec-aware` skill and run its **§1 inline three-check detection** (`CHORUS_OPENSPEC_MODE != "off"`, an `openspec/` directory at the project root, and the `openspec` CLI on `PATH`).
|
|
@@ -228,7 +231,7 @@ In /yolo mode, the agent generates elaboration questions and answers them itself
|
|
|
228
231
|
})
|
|
229
232
|
```
|
|
230
233
|
|
|
231
|
-
3. **Add task drafts incrementally** (use returned `draftUuid` for dependency chaining):
|
|
234
|
+
3. **Add task drafts incrementally** (use returned `draftUuid` for dependency chaining). `acceptanceCriteriaItems` is **required** on every draft — at least one non-blank criterion, or the call is rejected:
|
|
232
235
|
```
|
|
233
236
|
# First task
|
|
234
237
|
result1 = chorus_pm_add_task_draft({
|