@chorus-aidlc/chorus-openclaw-plugin 0.4.0 → 0.5.3
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 +208 -278
- 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 +13 -12
- package/package.json +23 -5
- package/skills/brainstorm/SKILL.md +163 -0
- package/skills/chorus/SKILL.md +114 -97
- package/skills/develop/SKILL.md +197 -52
- package/skills/idea/SKILL.md +136 -150
- package/skills/openspec-aware/SKILL.md +425 -0
- package/skills/proposal/SKILL.md +162 -153
- package/skills/proposal-reviewer/SKILL.md +118 -0
- package/skills/quick-dev/SKILL.md +34 -10
- package/skills/review/SKILL.md +109 -35
- package/skills/task-reviewer/SKILL.md +113 -0
- package/skills/yolo/SKILL.md +501 -0
- package/src/commands.ts +138 -71
- 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 -126
- package/src/tools/common-tools.ts +0 -575
- package/src/tools/dev-tools.ts +0 -105
- package/src/tools/pm-tools.ts +0 -411
package/skills/idea/SKILL.md
CHANGED
|
@@ -1,37 +1,33 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: idea
|
|
3
|
-
description: Chorus Idea workflow — claim ideas, run elaboration, and prepare for proposal.
|
|
3
|
+
description: Chorus Idea workflow — claim ideas, run elaboration rounds, and prepare for proposal creation.
|
|
4
|
+
license: AGPL-3.0
|
|
4
5
|
metadata:
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
author: chorus
|
|
7
|
+
version: "0.9.4"
|
|
8
|
+
category: project-management
|
|
9
|
+
mcp_server: chorus
|
|
7
10
|
---
|
|
8
11
|
|
|
9
12
|
# Idea Skill
|
|
10
13
|
|
|
11
14
|
This skill covers the **Ideation** stage of the AI-DLC workflow: claiming Ideas, running structured elaboration rounds to clarify requirements, and preparing for Proposal creation.
|
|
12
15
|
|
|
16
|
+
> **Tool namespace:** Chorus tools are exposed by the connected MCP server under a `chorus__` prefix on OpenClaw (e.g. `chorus__chorus_get_idea`). Bare names are used below for readability — prepend `chorus__` when invoking. See `/chorus` for the full rule.
|
|
17
|
+
|
|
13
18
|
---
|
|
14
19
|
|
|
15
20
|
## Overview
|
|
16
21
|
|
|
17
22
|
Ideas are the starting point of the AI-DLC pipeline. Humans (or Admin agents) create Ideas describing what they need. The PM Agent claims an Idea, runs elaboration to clarify requirements, and then moves on to `/proposal` to create a Proposal with document and task drafts.
|
|
18
23
|
|
|
19
|
-
|
|
24
|
+
**Idea status lifecycle (3 stored states):**
|
|
20
25
|
|
|
21
26
|
```
|
|
22
|
-
open --> elaborating -->
|
|
23
|
-
\--> closed
|
|
27
|
+
open --> elaborating --> elaborated
|
|
24
28
|
```
|
|
25
29
|
|
|
26
|
-
|
|
27
|
-
|--------|---------|
|
|
28
|
-
| `open` | Idea is available for an agent to claim |
|
|
29
|
-
| `elaborating` | An agent has claimed the idea and is gathering requirements |
|
|
30
|
-
| `proposal_created` | A Proposal has been created from this idea |
|
|
31
|
-
| `completed` | The resulting Proposal was approved and work is done |
|
|
32
|
-
| `closed` | Idea was closed without implementation |
|
|
33
|
-
|
|
34
|
-
Claiming an idea automatically transitions it from `open` to `elaborating`.
|
|
30
|
+
All post-elaboration progress (planning, building, verifying, done) is **derived** from the state of linked Proposals and Tasks. No agent should set Idea status directly beyond elaboration -- all transitions are side-effects of claiming, releasing, or completing elaboration.
|
|
35
31
|
|
|
36
32
|
---
|
|
37
33
|
|
|
@@ -41,40 +37,25 @@ Claiming an idea automatically transitions it from `open` to `elaborating`.
|
|
|
41
37
|
|
|
42
38
|
| Tool | Purpose |
|
|
43
39
|
|------|---------|
|
|
40
|
+
| `chorus_pm_create_idea` | Create a new idea in a project (on behalf of humans) |
|
|
44
41
|
| `chorus_claim_idea` | Claim an open idea (open -> elaborating) |
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `chorus_get_ideas` | List ideas in a project with optional status filter |
|
|
48
|
-
| `chorus_pm_create_idea` | Create a new idea in a project |
|
|
49
|
-
| `chorus_move_idea` | Move an idea to a different project (also moves linked draft/pending proposals) |
|
|
42
|
+
| `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. |
|
|
50
44
|
|
|
51
45
|
**Requirements Elaboration:**
|
|
52
46
|
|
|
53
47
|
| Tool | Purpose |
|
|
54
48
|
|------|---------|
|
|
55
|
-
| `
|
|
56
|
-
| `
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
49
|
+
| `chorus_pm_start_elaboration` | Generate an elaboration round (first, follow-up, or appended-after-resolution) |
|
|
50
|
+
| `chorus_pm_validate_elaboration` | Mark the whole elaboration complete (requires `idea:admin`; requires human confirmation first) |
|
|
51
|
+
| `chorus_pm_skip_elaboration` | Skip elaboration for trivially clear Ideas |
|
|
52
|
+
| `chorus_answer_elaboration` | Submit answers for an elaboration round (`roundUuid` optional — auto-locates the active round) |
|
|
53
|
+
| `chorus_get_elaboration` | Get full elaboration state (rounds, questions, answers) |
|
|
59
54
|
|
|
60
55
|
**Shared tools** (checkin, query, comment, search, notifications): see `/chorus`
|
|
61
56
|
|
|
62
57
|
---
|
|
63
58
|
|
|
64
|
-
## SSE Wake Events (OpenClaw-Specific)
|
|
65
|
-
|
|
66
|
-
OpenClaw is a single-agent model with SSE-driven wake. The following notification events trigger the agent to wake and act:
|
|
67
|
-
|
|
68
|
-
| SSE Event | Trigger | Agent Action |
|
|
69
|
-
|-----------|---------|--------------|
|
|
70
|
-
| `idea_claimed` | An idea is assigned to you | Wake, review the idea with `chorus_get_idea`, claim it if not auto-claimed |
|
|
71
|
-
| `elaboration_requested` | Elaboration round started on an idea you own | Wake, review questions with `chorus_get_elaboration` |
|
|
72
|
-
| `elaboration_answered` | Answers submitted for your elaboration round | Wake, review answers, validate or create follow-up round |
|
|
73
|
-
|
|
74
|
-
When an SSE event fires, the plugin's event router fetches the notification details and triggers the agent with context (ideaUuid, projectUuid, action). You do not need to poll — work arrives via these events.
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
59
|
## Workflow
|
|
79
60
|
|
|
80
61
|
### Step 1: Check In
|
|
@@ -135,168 +116,173 @@ Before elaborating, understand the full picture:
|
|
|
135
116
|
chorus_get_comments({ targetType: "idea", targetUuid: "<idea-uuid>" })
|
|
136
117
|
```
|
|
137
118
|
|
|
138
|
-
### Step 5:
|
|
119
|
+
### Step 4.5: Brainstorm Mode (Optional Prelude)
|
|
120
|
+
|
|
121
|
+
If the Idea is fuzzy and you'd struggle to enumerate concrete multi-choice questions, offer the user a brainstorm prelude before structured elaboration.
|
|
139
122
|
|
|
140
|
-
**
|
|
123
|
+
> **OpenClaw note:** there is no `AskUserQuestion` primitive. Ask the user once **as a plain-text prompt** whether they want to brainstorm first or jump straight to structured elaboration, e.g.:
|
|
124
|
+
>
|
|
125
|
+
> > "This idea is still fuzzy. Do you want to (A) brainstorm directions together first, or (B) go straight to structured elaboration? Reply A or B."
|
|
141
126
|
|
|
142
|
-
|
|
127
|
+
- **"Already clear" (B):** Skip to Step 5.
|
|
128
|
+
- **"Brainstorm first" (A):** Invoke the `/brainstorm` skill. See `/brainstorm` for the dialogue cadence and synthesis rules — do NOT re-implement them here.
|
|
143
129
|
|
|
144
|
-
|
|
130
|
+
When `/brainstorm` returns, you own the lifecycle decision (the brainstorm skill deliberately leaves it to you):
|
|
145
131
|
|
|
146
|
-
- `
|
|
147
|
-
- `
|
|
148
|
-
- `"comprehensive"` — 10-15 questions (large features, architectural changes)
|
|
132
|
+
- 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.)
|
|
133
|
+
- 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.
|
|
149
134
|
|
|
150
|
-
|
|
135
|
+
Either outcome ends Step 4.5; skip Step 5.
|
|
151
136
|
|
|
152
|
-
|
|
137
|
+
### Step 5: Elaborate on the Idea
|
|
138
|
+
|
|
139
|
+
**Every Idea should go through elaboration.** Skip only when requirements are completely unambiguous (e.g., bug fix with clear steps). Elaboration improves Proposal quality and reduces rejection cycles.
|
|
153
140
|
|
|
154
|
-
####
|
|
141
|
+
#### Simple Ideas (skip elaboration)
|
|
155
142
|
|
|
156
|
-
|
|
143
|
+
You may skip elaboration, but **you MUST ask the user for permission first** before calling `chorus_pm_skip_elaboration`. On OpenClaw, ask as a plain-text prompt (e.g. "This idea has clear reproduction steps. OK to skip elaboration? Reply yes/no."). Never skip on your own judgment alone.
|
|
157
144
|
|
|
158
145
|
```
|
|
159
|
-
|
|
146
|
+
chorus_pm_skip_elaboration({
|
|
160
147
|
ideaUuid: "<idea-uuid>",
|
|
161
|
-
|
|
162
|
-
questions: [
|
|
163
|
-
{
|
|
164
|
-
id: "q1",
|
|
165
|
-
text: "What user roles should have access to this feature?",
|
|
166
|
-
category: "functional",
|
|
167
|
-
options: [
|
|
168
|
-
{ id: "a", label: "All users" },
|
|
169
|
-
{ id: "b", label: "Admin only" },
|
|
170
|
-
{ id: "c", label: "Role-based (configurable)" }
|
|
171
|
-
]
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
id: "q2",
|
|
175
|
-
text: "What is the expected data volume?",
|
|
176
|
-
category: "non_functional",
|
|
177
|
-
options: [
|
|
178
|
-
{ id: "a", label: "Low (<1000 records)" },
|
|
179
|
-
{ id: "b", label: "Medium (1K-100K records)" },
|
|
180
|
-
{ id: "c", label: "High (>100K records)" }
|
|
181
|
-
]
|
|
182
|
-
}
|
|
183
|
-
]
|
|
148
|
+
reason: "Bug fix with clear reproduction steps"
|
|
184
149
|
})
|
|
185
150
|
```
|
|
186
151
|
|
|
187
|
-
|
|
152
|
+
#### Standard/Complex Ideas (run elaboration)
|
|
188
153
|
|
|
189
|
-
|
|
154
|
+
> **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:
|
|
155
|
+
> - the answers to a round **derive new questions** or surface a contradiction/gap, **or**
|
|
156
|
+
> - at the resolve gate (Step 5d / Step 6) the **human raises a new concern or correction** (a plain-text reply on OpenClaw).
|
|
157
|
+
>
|
|
158
|
+
> 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.
|
|
190
159
|
|
|
191
|
-
|
|
160
|
+
1. **Determine depth** based on idea complexity:
|
|
161
|
+
- `"minimal"` — 2-4 questions (small features, minor enhancements)
|
|
162
|
+
- `"standard"` — 5-10 questions (typical new features)
|
|
163
|
+
- `"comprehensive"` — 10-15 questions (large features, architectural changes)
|
|
192
164
|
|
|
193
|
-
|
|
194
|
-
chorus_answer_elaboration({
|
|
195
|
-
ideaUuid: "<idea-uuid>",
|
|
196
|
-
roundUuid: "<round-uuid>",
|
|
197
|
-
answers: [
|
|
198
|
-
{ questionId: "q1", selectedOptionId: "c", customText: null },
|
|
199
|
-
{ questionId: "q2", selectedOptionId: null, customText: "Custom hybrid approach" }
|
|
200
|
-
]
|
|
201
|
-
})
|
|
202
|
-
```
|
|
165
|
+
2. **Create elaboration questions:**
|
|
203
166
|
|
|
204
|
-
|
|
205
|
-
- **Select an option**: `selectedOptionId: "a", customText: null`
|
|
206
|
-
- **Select an option + add a note**: `selectedOptionId: "a", customText: "additional context"`
|
|
207
|
-
- **Choose "Other" (free text)**: `selectedOptionId: null, customText: "your answer"` — customText is required when no option is selected
|
|
167
|
+
> **Note:** Do NOT include an "Other" option in your questions. Treat the free-text path as always available — a user may answer any question with free text instead of picking an option.
|
|
208
168
|
|
|
209
|
-
|
|
169
|
+
```
|
|
170
|
+
chorus_pm_start_elaboration({
|
|
171
|
+
ideaUuid: "<idea-uuid>",
|
|
172
|
+
depth: "standard",
|
|
173
|
+
questions: [
|
|
174
|
+
{
|
|
175
|
+
id: "q1",
|
|
176
|
+
text: "What user roles should have access to this feature?",
|
|
177
|
+
category: "functional",
|
|
178
|
+
options: [
|
|
179
|
+
{ id: "a", label: "All users" },
|
|
180
|
+
{ id: "b", label: "Admin only" },
|
|
181
|
+
{ id: "c", label: "Role-based (configurable)" }
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
]
|
|
185
|
+
})
|
|
186
|
+
```
|
|
210
187
|
|
|
211
|
-
|
|
188
|
+
3. **Present questions to the user as plain text (OpenClaw has no `AskUserQuestion`).** Render each elaboration question and its options as a readable numbered/lettered prompt and ask the user to reply with their selections (and any free-text notes). Example:
|
|
212
189
|
|
|
213
|
-
1. **Get mentionable info:**
|
|
214
190
|
```
|
|
215
|
-
|
|
191
|
+
I have a few questions to clarify this idea. Please reply with your choice for each (you can also write a free-text answer):
|
|
192
|
+
|
|
193
|
+
1. Which new locales should be prioritized for V1?
|
|
194
|
+
a) Japanese only — single locale for initial release
|
|
195
|
+
b) Japanese + Korean — two East Asian locales
|
|
196
|
+
(or describe your own)
|
|
197
|
+
|
|
198
|
+
2. ...
|
|
216
199
|
```
|
|
217
200
|
|
|
218
|
-
|
|
201
|
+
After the user replies, map their answers back to option IDs and call `chorus_answer_elaboration`. If the user gave a free-text answer that doesn't match an option, set `selectedOptionId: null` and put their text in `customText`.
|
|
202
|
+
|
|
203
|
+
4. **Submit answers:**
|
|
219
204
|
```
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
205
|
+
chorus_answer_elaboration({
|
|
206
|
+
ideaUuid: "<idea-uuid>",
|
|
207
|
+
roundUuid: "<round-uuid>",
|
|
208
|
+
answers: [
|
|
209
|
+
{ questionId: "q1", selectedOptionId: "c", customText: null },
|
|
210
|
+
{ questionId: "q2", selectedOptionId: null, customText: "Custom hybrid approach" }
|
|
211
|
+
]
|
|
224
212
|
})
|
|
225
213
|
```
|
|
226
214
|
|
|
227
|
-
|
|
215
|
+
Answer format:
|
|
216
|
+
- **Select an option**: `selectedOptionId: "a", customText: null`
|
|
217
|
+
- **Select an option + add a note**: `selectedOptionId: "a", customText: "additional context"`
|
|
218
|
+
- **Free text (no option matched)**: `selectedOptionId: null, customText: "your answer"` — customText is required when no option is selected
|
|
228
219
|
|
|
229
|
-
|
|
230
|
-
- **Confirmed** — Proceed to validate with empty issues
|
|
231
|
-
- **Additions/corrections** — Incorporate feedback, optionally start a follow-up round
|
|
232
|
-
- **Unclear** — Ask clarifying questions via another comment
|
|
220
|
+
> `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.
|
|
233
221
|
|
|
234
|
-
|
|
222
|
+
5. **Review answers and confirm with the owner (@mention flow):**
|
|
235
223
|
|
|
236
|
-
|
|
224
|
+
After answers are submitted, **@mention the answerer** (typically the agent's owner) with a summary of your understanding. This prevents misinterpretation before you validate.
|
|
237
225
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
issues: []
|
|
243
|
-
})
|
|
244
|
-
```
|
|
226
|
+
a. **Get owner info** from checkin response (`agent.owner`) or search:
|
|
227
|
+
```
|
|
228
|
+
chorus_search_mentionables({ query: "owner-name" })
|
|
229
|
+
```
|
|
245
230
|
|
|
246
|
-
|
|
231
|
+
b. **Post a summary comment** on the idea:
|
|
232
|
+
```
|
|
233
|
+
chorus_add_comment({
|
|
234
|
+
targetType: "idea",
|
|
235
|
+
targetUuid: "<idea-uuid>",
|
|
236
|
+
content: "@[Owner Name](user:owner-uuid) I've reviewed the elaboration answers. Here's my understanding:\n\n- Key requirement 1: ...\n- Key requirement 2: ...\n\nDoes this match your intent?"
|
|
237
|
+
})
|
|
238
|
+
```
|
|
247
239
|
|
|
248
|
-
|
|
249
|
-
chorus_validate_elaboration({
|
|
250
|
-
ideaUuid: "<idea-uuid>",
|
|
251
|
-
roundUuid: "<round-uuid>",
|
|
252
|
-
issues: [
|
|
253
|
-
{ questionId: "q1", type: "ambiguity", description: "Role-based access selected but no roles defined" }
|
|
254
|
-
],
|
|
255
|
-
followUpQuestions: [
|
|
256
|
-
{
|
|
257
|
-
id: "fq1",
|
|
258
|
-
text: "Which specific roles should have access?",
|
|
259
|
-
category: "functional",
|
|
260
|
-
options: [
|
|
261
|
-
{ id: "a", label: "Admin + Editor" },
|
|
262
|
-
{ id: "b", label: "All authenticated users" }
|
|
263
|
-
]
|
|
264
|
-
}
|
|
265
|
-
]
|
|
266
|
-
})
|
|
267
|
-
```
|
|
240
|
+
c. **Wait for confirmation** via comments.
|
|
268
241
|
|
|
269
|
-
|
|
242
|
+
d. **Based on the response — this is the loop decision point:**
|
|
243
|
+
- **Confirmed, nothing left to discuss** — Treat this as the human confirmation required to resolve; proceed to Step 6 and call `chorus_pm_validate_elaboration`.
|
|
244
|
+
- **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.
|
|
245
|
+
- **The answers themselves derived new questions or a contradiction** — Same as above: loop back to `chorus_pm_start_elaboration` for another round before resolving.
|
|
246
|
+
- **Unclear** — Ask clarifying questions via another comment, then continue the loop.
|
|
270
247
|
|
|
271
|
-
**
|
|
248
|
+
6. **Resolve the elaboration (the single commit gate — only when the loop is done):**
|
|
272
249
|
|
|
273
|
-
|
|
250
|
+
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.
|
|
274
251
|
|
|
275
|
-
|
|
252
|
+
> **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).
|
|
276
253
|
|
|
277
|
-
|
|
278
|
-
2. Round 2: Follow-up on ambiguous answers (technical_context)
|
|
279
|
-
3. Round 3: Final confirmation of edge cases (user_scenario)
|
|
254
|
+
> **⚠️ 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.
|
|
280
255
|
|
|
281
|
-
|
|
256
|
+
> **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.
|
|
282
257
|
|
|
283
|
-
|
|
258
|
+
> **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.
|
|
284
259
|
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
|
|
260
|
+
```
|
|
261
|
+
chorus_pm_validate_elaboration({
|
|
262
|
+
ideaUuid: "<idea-uuid>"
|
|
263
|
+
})
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**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.
|
|
267
|
+
|
|
268
|
+
7. **Check elaboration status** at any time:
|
|
269
|
+
```
|
|
270
|
+
chorus_get_elaboration({ ideaUuid: "<idea-uuid>" })
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
**Elaboration as audit trail:** Even if the user discusses requirements with you outside the formal elaboration flow, record key decisions as elaboration rounds so they are persisted and visible to the team.
|
|
288
274
|
|
|
289
|
-
|
|
275
|
+
**Question categories:** `functional`, `non_functional`, `business_context`, `technical_context`, `user_scenario`, `scope`
|
|
290
276
|
|
|
291
277
|
---
|
|
292
278
|
|
|
293
279
|
## Tips
|
|
294
280
|
|
|
295
281
|
- When combining multiple ideas, explain how they relate in the proposal description
|
|
296
|
-
- Elaboration improves Proposal quality —
|
|
282
|
+
- Elaboration improves Proposal quality — don't skip it unless the requirements are trivially clear
|
|
283
|
+
- Present interactive questions as plain text and collect free-text replies — OpenClaw has no `AskUserQuestion` primitive
|
|
297
284
|
- Record decisions made in conversation as elaboration rounds for auditability
|
|
298
|
-
- Always @mention the owner to confirm understanding before
|
|
299
|
-
- SSE events mean you do not need to poll — the plugin wakes you when action is needed
|
|
285
|
+
- Always @mention the owner to confirm understanding before resolving
|
|
300
286
|
|
|
301
287
|
---
|
|
302
288
|
|