codebyplan 1.13.12 → 1.13.14
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/dist/cli.js +328 -2
- package/package.json +2 -2
- package/templates/hooks/hooks.json +0 -4
- package/templates/rules/task-routing-recommendation.md +51 -0
- package/templates/settings.project.base.json +8 -0
- package/templates/skills/cbp-round-check/SKILL.md +28 -4
- package/templates/skills/cbp-round-end/SKILL.md +35 -12
- package/templates/skills/cbp-round-execute/SKILL.md +30 -7
- package/templates/skills/cbp-round-input/SKILL.md +31 -10
- package/templates/skills/cbp-round-start/SKILL.md +35 -14
- package/templates/skills/cbp-round-update/SKILL.md +43 -12
- package/templates/skills/cbp-standalone-task-check/SKILL.md +152 -0
- package/templates/skills/cbp-standalone-task-complete/SKILL.md +201 -0
- package/templates/skills/cbp-standalone-task-create/SKILL.md +150 -0
- package/templates/skills/cbp-standalone-task-start/SKILL.md +177 -0
- package/templates/skills/cbp-standalone-task-testing/SKILL.md +210 -0
- package/templates/skills/cbp-task-check/SKILL.md +5 -5
- package/templates/skills/cbp-task-complete/SKILL.md +9 -22
- package/templates/skills/cbp-task-create/SKILL.md +11 -31
- package/templates/skills/cbp-task-start/SKILL.md +6 -13
- package/templates/skills/cbp-task-testing/SKILL.md +5 -5
|
@@ -5,6 +5,27 @@ description: Execute the approved plan from /cbp-round-start — runs per-wave e
|
|
|
5
5
|
effort: xhigh
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
+
## Kind Detection
|
|
9
|
+
|
|
10
|
+
Inspect the resolved identifier from argument parsing to determine the task kind:
|
|
11
|
+
|
|
12
|
+
| Identifier shape | KIND |
|
|
13
|
+
|-----------------|------|
|
|
14
|
+
| `{task}-{round}` (2-segment, e.g. `45-2`) | `standalone` |
|
|
15
|
+
| `{chk}-{task}-{round}` (3-segment, e.g. `141-3-1`) | `checkpoint` |
|
|
16
|
+
| _(empty / free-text)_ | Check `get_current_standalone_task` first; if found → `standalone`. Else → `checkpoint` via `get_current_task`. |
|
|
17
|
+
|
|
18
|
+
Set `KIND` for the rest of this skill. MCP tool names vary by KIND:
|
|
19
|
+
|
|
20
|
+
| Operation | `checkpoint` KIND | `standalone` KIND |
|
|
21
|
+
|-----------|------------------|-------------------|
|
|
22
|
+
| Get task | `get_current_task(repo_id)` | `get_current_standalone_task(repo_id)` |
|
|
23
|
+
| Get rounds | `get_rounds(task_id)` | `get_standalone_rounds(standalone_task_id)` |
|
|
24
|
+
| Add round | `add_round(task_id, ...)` | `add_standalone_round(standalone_task_id, ...)` |
|
|
25
|
+
| Update round | `update_round(round_id, ...)` | `update_standalone_round(standalone_round_id, ...)` |
|
|
26
|
+
| Complete round | `complete_round(round_id, duration_minutes?)` | `complete_standalone_round(standalone_round_id, duration_minutes?, caller_worktree_id)` ⚠️ `caller_worktree_id` is REQUIRED for standalone |
|
|
27
|
+
| Update task | `update_task(task_id, ...)` | `update_standalone_task(standalone_task_id, ...)` |
|
|
28
|
+
|
|
8
29
|
# Round Execute Command
|
|
9
30
|
|
|
10
31
|
Execution and validation phase. Receives the approved plan from `/cbp-round-start`, dispatches wave executors, runs per-wave `cbp-testing-qa-agent` in parallel, and routes to `/cbp-round-end`.
|
|
@@ -17,14 +38,16 @@ Execution and validation phase. Receives the approved plan from `/cbp-round-star
|
|
|
17
38
|
|
|
18
39
|
## Identifier Notation
|
|
19
40
|
|
|
20
|
-
This skill operates on the **active** task/round resolved via MCP
|
|
41
|
+
This skill operates on the **active** task/round resolved via MCP and does not accept a positional identifier argument. Canonical chk-task-round notation — used in prose, error messages, and cross-references — follows `.claude/rules/notation-consistency.md` "CHK / TASK / ROUND Identifier Notation": `108-1` (CHK-108 TASK-1), `45` (standalone TASK-45), `108-1-2` (round 2 of CHK-108 TASK-1), `45-2` (round 2 of standalone TASK-45).
|
|
21
42
|
|
|
22
43
|
## Instructions
|
|
23
44
|
|
|
24
45
|
### Step 1: Get Current Task and Round
|
|
25
46
|
|
|
26
|
-
Use
|
|
27
|
-
|
|
47
|
+
Use Kind Detection above to set KIND. Then:
|
|
48
|
+
|
|
49
|
+
- **checkpoint KIND**: MCP `get_current_task(repo_id)` (pass checkpoint_id if known) to find the active task. MCP `get_rounds(task_id)` to find the in-progress round.
|
|
50
|
+
- **standalone KIND**: MCP `get_current_standalone_task(repo_id)` to find the active task. MCP `get_standalone_rounds(standalone_task_id)` to find the in-progress round.
|
|
28
51
|
|
|
29
52
|
If no in-progress round: `No active round. Run /cbp-round-start first.`
|
|
30
53
|
|
|
@@ -178,7 +201,7 @@ Per-wave hard-fail signal — true when ANY hold:
|
|
|
178
201
|
**All waves hard_fail: false** → proceed to Step 7. **Any wave hard_fail: true**:
|
|
179
202
|
|
|
180
203
|
- **Simple fixes** (type errors, lint, missing imports, test assertion fixes, e2e `real`-category with clear code-side root cause, no prior re-trigger this round) → save failure details to round context; retrigger the failing wave's executor; re-run testing-qa AND the eligible `cbp-e2e-*` specialists for that wave.
|
|
181
|
-
- **Structural OR already re-triggered once OR e2e preflight aborts OR `e2e_eligible_skipped`** → save failure context via MCP `update_round
|
|
204
|
+
- **Structural OR already re-triggered once OR e2e preflight aborts OR `e2e_eligible_skipped`** → save failure context via MCP `update_round` / `update_standalone_round` per KIND; auto-trigger `/cbp-round-input`. STOP.
|
|
182
205
|
|
|
183
206
|
## Inline execution fallback
|
|
184
207
|
|
|
@@ -190,7 +213,7 @@ When `cbp-testing-qa-agent` spawn fails OR the resolved `testing_profile` is `cl
|
|
|
190
213
|
|
|
191
214
|
### Step 7: Save Executor Output
|
|
192
215
|
|
|
193
|
-
Update round context via MCP `update_round
|
|
216
|
+
Update round context via MCP `update_round` / `update_standalone_round` per KIND:
|
|
194
217
|
|
|
195
218
|
- `context`: { ...existing, executor_output, testing_qa_output, e2e_eligible, e2e_outputs, frontend_ui_review }
|
|
196
219
|
|
|
@@ -216,8 +239,8 @@ Trigger `/cbp-round-end`.
|
|
|
216
239
|
|
|
217
240
|
## Integration
|
|
218
241
|
|
|
219
|
-
- **Reads**: MCP `get_current_task`, `get_rounds`
|
|
220
|
-
- **Writes**: MCP `update_round` (context with executor_output + testing_qa_output + e2e_eligible + e2e_outputs + frontend_ui_review)
|
|
242
|
+
- **Reads**: MCP `get_current_task` / `get_current_standalone_task`, `get_rounds` / `get_standalone_rounds` (per KIND)
|
|
243
|
+
- **Writes**: MCP `update_round` / `update_standalone_round` (context with executor_output + testing_qa_output + e2e_eligible + e2e_outputs + frontend_ui_review) — per KIND
|
|
221
244
|
- **Spawns**: `cbp-round-executor` (per wave or single), `cbp-testing-qa-agent` (per wave, parallel sibling of the `cbp-e2e-*` specialists), the `cbp-e2e-*` specialists (config-driven dispatch per `context/testing/e2e.md`, one per eligible framework in `.codebyplan/e2e.json`), `cbp-database-agent` (if DB work), `cbp-security-agent` (if security review needed)
|
|
222
245
|
- **Skill invocations**: `cbp-frontend-ui` at Step 5b with `phase: 'screenshot_review'` (post-e2e)
|
|
223
246
|
- **Triggers**: `/cbp-round-end` (auto)
|
|
@@ -6,6 +6,27 @@ argument-hint: [chk-task-round | task-round | requirements-text]
|
|
|
6
6
|
effort: xhigh
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## Kind Detection
|
|
10
|
+
|
|
11
|
+
Inspect the resolved identifier from argument parsing to determine the task kind:
|
|
12
|
+
|
|
13
|
+
| Identifier shape | KIND |
|
|
14
|
+
|-----------------|------|
|
|
15
|
+
| `{task}-{round}` (2-segment, e.g. `45-2`) | `standalone` |
|
|
16
|
+
| `{chk}-{task}-{round}` (3-segment, e.g. `141-3-1`) | `checkpoint` |
|
|
17
|
+
| _(empty / free-text)_ | Check `get_current_standalone_task` first; if found → `standalone`. Else → `checkpoint` via `get_current_task`. |
|
|
18
|
+
|
|
19
|
+
Set `KIND` for the rest of this skill. MCP tool names vary by KIND:
|
|
20
|
+
|
|
21
|
+
| Operation | `checkpoint` KIND | `standalone` KIND |
|
|
22
|
+
|-----------|------------------|-------------------|
|
|
23
|
+
| Get task | `get_current_task(repo_id)` | `get_current_standalone_task(repo_id)` |
|
|
24
|
+
| Get rounds | `get_rounds(task_id)` | `get_standalone_rounds(standalone_task_id)` |
|
|
25
|
+
| Add round | `add_round(task_id, ...)` | `add_standalone_round(standalone_task_id, ...)` |
|
|
26
|
+
| Update round | `update_round(round_id, ...)` | `update_standalone_round(standalone_round_id, ...)` |
|
|
27
|
+
| Complete round | `complete_round(round_id, duration_minutes?)` | `complete_standalone_round(standalone_round_id, duration_minutes?, caller_worktree_id)` ⚠️ `caller_worktree_id` is REQUIRED for standalone |
|
|
28
|
+
| Update task | `update_task(task_id, ...)` | `update_standalone_task(standalone_task_id, ...)` |
|
|
29
|
+
|
|
9
30
|
# Round Input Command
|
|
10
31
|
|
|
11
32
|
Gathers input for a new round. Performs deep analysis of unapproved files, requirements coverage, and testing-QA failures before formulating requirements. Follow-up rounds get the same depth as round 1.
|
|
@@ -28,7 +49,7 @@ Try the numeric identifier regex first: `^[0-9]+(-[0-9]+){0,2}$`
|
|
|
28
49
|
| `{task}` (e.g. `45`) | 1 | Standalone TASK-{task} next round (matches cbp-task-start standalone convention) |
|
|
29
50
|
| `{chk}-{task}` (e.g. `108-1`) | 2 | CHK-{chk} TASK-{task} next round (round number implicit — round-input creates a new round) |
|
|
30
51
|
| `{chk}-{task}-{round}` (e.g. `108-1-2`) | 3 | CHK-{chk} TASK-{task} targeting ROUND-{round} (existing round context) |
|
|
31
|
-
| _(no match / empty)_ | — | Free-text requirements (passed through to Step 5) OR empty → use
|
|
52
|
+
| _(no match / empty)_ | — | Free-text requirements (passed through to Step 5) OR empty → use Kind Detection |
|
|
32
53
|
|
|
33
54
|
If the argument matches the numeric regex, resolve the target task/round from DB. If no match (or empty), treat the argument as free-text requirements and proceed to Step 2 for context (free-text path still runs deep analysis before Step 5).
|
|
34
55
|
|
|
@@ -37,16 +58,16 @@ If the argument matches the numeric regex, resolve the target task/round from DB
|
|
|
37
58
|
- `round-input 45` → standalone TASK-45 next round
|
|
38
59
|
- `round-input 108-1` → CHK-108 TASK-1 next round
|
|
39
60
|
- `round-input 108-1-2` → CHK-108 TASK-1 ROUND-2
|
|
40
|
-
- `round-input` (no arg) → active task via
|
|
61
|
+
- `round-input` (no arg) → active task via Kind Detection
|
|
41
62
|
- `round-input Fix the broken lint rule in the auth module` → free-text requirements (numeric regex fails → falls through to free-text path)
|
|
42
63
|
|
|
43
64
|
> **Note on 2-segment divergence**: `round-input 108-1` resolves to **CHK-108 TASK-1** (targeting that task's next round). This diverges from `/cbp-round-start` where the 2-segment `108-1` means **standalone TASK-108 ROUND-1**. Round-input always operates on a task-level context (it creates a new round on a task), so the round number is implicit and 2 segments are interpreted as `{chk}-{task}`. To target a standalone task here, use the 1-segment form `45`. To target a specific existing round, use the 3-segment form `108-1-2`.
|
|
44
65
|
|
|
45
66
|
### Step 2: Deep Analysis (MANDATORY — always runs)
|
|
46
67
|
|
|
47
|
-
**2a:** Load task via MCP `get_current_task`
|
|
68
|
+
**2a:** Load task via KIND-appropriate MCP tool (`get_current_task` or `get_current_standalone_task`) — get `files_changed`, `requirements`, `context`, `qa`
|
|
48
69
|
|
|
49
|
-
**2b:** Load all rounds via MCP `get_rounds(task_id)` — get previous round context, testing-qa output
|
|
70
|
+
**2b:** Load all rounds via MCP `get_rounds(task_id)` (checkpoint KIND) or `get_standalone_rounds(standalone_task_id)` (standalone KIND) — get previous round context, testing-qa output
|
|
50
71
|
|
|
51
72
|
**2c:** Identify unapproved files from `task.files_changed` where `user_approved === false`
|
|
52
73
|
|
|
@@ -123,10 +144,10 @@ Based on the analysis + user input, create detailed requirements that:
|
|
|
123
144
|
|
|
124
145
|
If the new round requirements change the task direction:
|
|
125
146
|
|
|
126
|
-
1. Update task context via MCP `update_task(task_id, context: { ... })
|
|
147
|
+
1. Update task context via MCP `update_task(task_id, context: { ... })` / `update_standalone_task(standalone_task_id, context: { ... })` per KIND:
|
|
127
148
|
- Add new decisions to `context.decisions[]`
|
|
128
149
|
- Update `context.discoveries[]` if applicable
|
|
129
|
-
2. If checkpoint-level changes needed, update checkpoint context via MCP `update_checkpoint`
|
|
150
|
+
2. If checkpoint-level changes needed (checkpoint KIND only), update checkpoint context via MCP `update_checkpoint`
|
|
130
151
|
|
|
131
152
|
### Step 7: Auto-trigger Round Start
|
|
132
153
|
|
|
@@ -145,8 +166,8 @@ Trigger `/cbp-round-start` with the round requirements as arguments.
|
|
|
145
166
|
If this command is triggered **directly** (not via `/cbp-todo`) and no context is available in the session:
|
|
146
167
|
|
|
147
168
|
1. Read `.codebyplan/repo.json` for `repo_id`
|
|
148
|
-
2. Use MCP
|
|
149
|
-
3. Use MCP `get_rounds(task_id)` to load round history
|
|
169
|
+
2. Use Kind Detection to determine KIND, then use the appropriate MCP tool to load checkpoint + task
|
|
170
|
+
3. Use MCP `get_rounds(task_id)` / `get_standalone_rounds(standalone_task_id)` per KIND to load round history
|
|
150
171
|
4. Continue from Step 2 (deep analysis handles all context loading)
|
|
151
172
|
|
|
152
173
|
## Key Rules
|
|
@@ -160,6 +181,6 @@ If this command is triggered **directly** (not via `/cbp-todo`) and no context i
|
|
|
160
181
|
## Integration
|
|
161
182
|
|
|
162
183
|
- **Triggered by**: `/cbp-round-update` (auto, unapproved files), `/cbp-round-execute` (auto, on hard-fail after retry exhausted), `/cbp-todo` (after /clear), user manually
|
|
163
|
-
- **Reads**: MCP `get_current_task`, `get_rounds
|
|
164
|
-
- **Writes**: MCP `update_task` (context), `update_checkpoint` (context, if needed)
|
|
184
|
+
- **Reads**: MCP `get_current_task` / `get_current_standalone_task`, `get_rounds` / `get_standalone_rounds` (per KIND), file contents (Read tool)
|
|
185
|
+
- **Writes**: MCP `update_task` / `update_standalone_task` (context), `update_checkpoint` (context, if checkpoint KIND and needed)
|
|
165
186
|
- **Triggers**: `/cbp-round-start` (auto)
|
|
@@ -7,6 +7,27 @@ argument-hint: [chk-task-round | task-round | requirements-text] # e.g. `108-1-
|
|
|
7
7
|
effort: xhigh
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## Kind Detection
|
|
11
|
+
|
|
12
|
+
Inspect the resolved identifier from argument parsing to determine the task kind:
|
|
13
|
+
|
|
14
|
+
| Identifier shape | KIND |
|
|
15
|
+
|-----------------|------|
|
|
16
|
+
| `{task}-{round}` (2-segment, e.g. `45-2`) | `standalone` |
|
|
17
|
+
| `{chk}-{task}-{round}` (3-segment, e.g. `141-3-1`) | `checkpoint` |
|
|
18
|
+
| _(empty / free-text)_ | Check `get_current_standalone_task` first; if found → `standalone`. Else → `checkpoint` via `get_current_task`. |
|
|
19
|
+
|
|
20
|
+
Set `KIND` for the rest of this skill. MCP tool names vary by KIND:
|
|
21
|
+
|
|
22
|
+
| Operation | `checkpoint` KIND | `standalone` KIND |
|
|
23
|
+
|-----------|------------------|-------------------|
|
|
24
|
+
| Get task | `get_current_task(repo_id)` | `get_current_standalone_task(repo_id)` |
|
|
25
|
+
| Get rounds | `get_rounds(task_id)` | `get_standalone_rounds(standalone_task_id)` |
|
|
26
|
+
| Add round | `add_round(task_id, ...)` | `add_standalone_round(standalone_task_id, ...)` |
|
|
27
|
+
| Update round | `update_round(round_id, ...)` | `update_standalone_round(standalone_round_id, ...)` |
|
|
28
|
+
| Complete round | `complete_round(round_id, duration_minutes?)` | `complete_standalone_round(standalone_round_id, duration_minutes?, caller_worktree_id)` ⚠️ `caller_worktree_id` is REQUIRED for standalone |
|
|
29
|
+
| Update task | `update_task(task_id, ...)` | `update_standalone_task(standalone_task_id, ...)` |
|
|
30
|
+
|
|
10
31
|
# Round Start Command
|
|
11
32
|
|
|
12
33
|
Planning phase for a new round. Analyzes context, creates plan, gets user approval. NO execution or testing — those are separate commands.
|
|
@@ -31,7 +52,7 @@ Inline-fallback is NOT a quality downgrade trapdoor — Phase 1.5 row-by-row ver
|
|
|
31
52
|
/cbp-round-start (planning) → [user approval] → /cbp-round-execute (auto)
|
|
32
53
|
```
|
|
33
54
|
|
|
34
|
-
**Auto-loop mode**: when `round.context.auto_loop_mode === true` flows in from `/cbp-round-input`, Step 6 (Q&A) and Step 8 (user approval) skip user prompts. See cbp-round-update SKILL.md Step
|
|
55
|
+
**Auto-loop mode**: when `round.context.auto_loop_mode === true` flows in from `/cbp-round-input`, Step 6 (Q&A) and Step 8 (user approval) skip user prompts. See cbp-round-update SKILL.md Step 4 (auto-loop decision) and cbp-round-end SKILL.md Step 8 for the full contract.
|
|
35
56
|
|
|
36
57
|
## Instructions
|
|
37
58
|
|
|
@@ -44,7 +65,7 @@ Disambiguate the argument up front. Three input shapes (see `.claude/rules/notat
|
|
|
44
65
|
| `{chk}-{task}-{round}` (e.g. `108-1-2`) | `^[0-9]+-[0-9]+-[0-9]+$` | **Identifier**: targets round {round} of CHK-{chk} TASK-{task}. Sets `target_checkpoint`, `target_task`, `target_round`. |
|
|
45
66
|
| `{task}-{round}` (e.g. `45-2`) | `^[0-9]+-[0-9]+$` | **Identifier**: targets round {round} of standalone TASK-{task}. Sets `target_task`, `target_round` (no checkpoint). |
|
|
46
67
|
| Non-empty, non-identifier-shaped | — | **Free-text round requirements** (the round-input passthrough path). |
|
|
47
|
-
| _(empty)_ | — | No identifier, no requirements text — derive task/round from
|
|
68
|
+
| _(empty)_ | — | No identifier, no requirements text — derive task/round from Kind Detection above. |
|
|
48
69
|
|
|
49
70
|
Malformed identifier shapes (`108-`, `-1-2`, `108--1`, `abc-1`) — surface this error and stop, mirroring `/cbp-task-start`'s error vocabulary:
|
|
50
71
|
|
|
@@ -62,7 +83,7 @@ round-start: invalid argument `{value}`. Expected:
|
|
|
62
83
|
- `round-start 45-2` → resolve standalone TASK-45, target round 2
|
|
63
84
|
- `round-start 108-1` → **standalone TASK-108 round 1** (NOT CHK-108 TASK-1). The 2-segment form means `{task}-{round}`; checkpoint-bound round-targeting requires all three numbers (`108-1-2`). If you got here trying to target CHK-108 TASK-1, you want `108-1-2` (specifying a round number) or `/cbp-task-start 108-1` (specifying just a task).
|
|
64
85
|
- `round-start "Implement OAuth flow per CHK-X plan"` → free-text path; current-task/round derivation from state
|
|
65
|
-
- `round-start` (empty) → derive from
|
|
86
|
+
- `round-start` (empty) → derive from Kind Detection; round 1 uses `task.requirements`
|
|
66
87
|
- `round-start 108-` → error: malformed identifier
|
|
67
88
|
- `round-start -1-2` → error: malformed identifier
|
|
68
89
|
- `round-start abc-1` → error: malformed identifier
|
|
@@ -71,17 +92,17 @@ round-start: invalid argument `{value}`. Expected:
|
|
|
71
92
|
|
|
72
93
|
### Step 1: Get Current Task
|
|
73
94
|
|
|
74
|
-
If Step 0 produced an identifier (`target_task` set): resolve directly per the identifier (bound or standalone) — MCP
|
|
95
|
+
If Step 0 produced an identifier (`target_task` set): resolve directly per the identifier (bound or standalone) — use KIND-appropriate MCP tools per the Kind Detection table above.
|
|
75
96
|
|
|
76
|
-
Otherwise: use MCP `get_current_task`
|
|
97
|
+
Otherwise: use Kind Detection to determine KIND, then use MCP `get_current_task` (checkpoint KIND) or `get_current_standalone_task` (standalone KIND) with repo_id to find the active task.
|
|
77
98
|
|
|
78
99
|
If no in-progress task and Step 0 produced no identifier, show error: `No active task. Run /cbp-task-start first.`
|
|
79
100
|
|
|
80
101
|
### Step 2: Determine Round Number
|
|
81
102
|
|
|
82
|
-
If Step 0 produced `target_round`: use that as the round number directly (may target an existing round for resume, or N+1 for a new round — disambiguate by checking MCP `get_rounds`).
|
|
103
|
+
If Step 0 produced `target_round`: use that as the round number directly (may target an existing round for resume, or N+1 for a new round — disambiguate by checking MCP `get_rounds` / `get_standalone_rounds` per KIND).
|
|
83
104
|
|
|
84
|
-
Otherwise: use MCP `get_rounds` for the task; count existing rounds; next is N+1.
|
|
105
|
+
Otherwise: use MCP `get_rounds` (checkpoint KIND) or `get_standalone_rounds` (standalone KIND) for the task; count existing rounds; next is N+1.
|
|
85
106
|
|
|
86
107
|
### Step 3: Gather Round Requirements
|
|
87
108
|
|
|
@@ -99,8 +120,8 @@ Otherwise: use MCP `get_rounds` for the task; count existing rounds; next is N+1
|
|
|
99
120
|
|
|
100
121
|
### Step 4: Create Round in DB
|
|
101
122
|
|
|
102
|
-
Use MCP `add_round
|
|
103
|
-
- `task_id
|
|
123
|
+
Use MCP `add_round` (checkpoint KIND) or `add_standalone_round` (standalone KIND):
|
|
124
|
+
- `task_id` (checkpoint) / `standalone_task_id` (standalone): current task ID
|
|
104
125
|
- `number`: next round number
|
|
105
126
|
- `status`: "in_progress"
|
|
106
127
|
- `started_at`: now (ISO format)
|
|
@@ -115,7 +136,7 @@ Load from checkpoint and task:
|
|
|
115
136
|
- Task context and requirements
|
|
116
137
|
- Resources from checkpoint and task (documentation links, API docs, guides)
|
|
117
138
|
- Previous round results (files_changed, QA results)
|
|
118
|
-
- For round 2+: load the latest completed round's `context.testing_qa_output` and `context.executor_output` via `get_rounds`
|
|
139
|
+
- For round 2+: load the latest completed round's `context.testing_qa_output` and `context.executor_output` via `get_rounds` / `get_standalone_rounds` per KIND
|
|
119
140
|
- Identify unapproved files from task.files_changed (where user_approved === false)
|
|
120
141
|
|
|
121
142
|
### Step 6: First Round Analysis (Round 1 only)
|
|
@@ -126,7 +147,7 @@ For the first round only:
|
|
|
126
147
|
2. Identify any ambiguities or gaps
|
|
127
148
|
3. If questions are needed, ask user via AskUserQuestion (max 4 per batch)
|
|
128
149
|
4. If task context changes from Q&A answers:
|
|
129
|
-
- Update task context via MCP `update_task(task_id, context: {...})`
|
|
150
|
+
- Update task context via MCP `update_task(task_id, context: {...})` / `update_standalone_task(standalone_task_id, context: {...})` per KIND
|
|
130
151
|
- Save Q&A decisions as `context.decisions[]`
|
|
131
152
|
|
|
132
153
|
Skip this step for round 2+ (context already established via `/cbp-round-input`).
|
|
@@ -199,7 +220,7 @@ Single-wave plans present the existing flat plan view (no wave table) — backwa
|
|
|
199
220
|
|
|
200
221
|
### Step 9: Auto-trigger Round Execute
|
|
201
222
|
|
|
202
|
-
On approval, save planner output to round context via MCP `update_round
|
|
223
|
+
On approval, save planner output to round context via MCP `update_round` / `update_standalone_round` per KIND, then trigger `/cbp-round-execute`.
|
|
203
224
|
|
|
204
225
|
```
|
|
205
226
|
Plan approved. Starting execution phase...
|
|
@@ -215,8 +236,8 @@ Plan approved. Starting execution phase...
|
|
|
215
236
|
|
|
216
237
|
## Integration
|
|
217
238
|
|
|
218
|
-
- **Reads**: MCP `get_current_task`, `get_rounds`
|
|
219
|
-
- **Writes**: MCP `add_round`, `update_round`, `update_task` (context only)
|
|
239
|
+
- **Reads**: MCP `get_current_task` / `get_current_standalone_task`, `get_rounds` / `get_standalone_rounds` (per KIND)
|
|
240
|
+
- **Writes**: MCP `add_round` / `add_standalone_round`, `update_round` / `update_standalone_round`, `update_task` / `update_standalone_task` (context only) — per KIND
|
|
220
241
|
- **Spawns**: `cbp-task-planner`
|
|
221
242
|
- **Triggers**: `/cbp-round-execute` (auto, on plan approval)
|
|
222
243
|
- **Triggered by**: `/cbp-task-start` (round 1), `/cbp-round-input` (round 2+)
|
|
@@ -3,10 +3,31 @@ scope: org-shared
|
|
|
3
3
|
name: cbp-round-update
|
|
4
4
|
description: Check file approvals, complete round, and route to next step
|
|
5
5
|
argument-hint: [chk-task-round | task-round]
|
|
6
|
-
triggers: [cbp-round-input, cbp-task-check]
|
|
6
|
+
triggers: [cbp-round-input, cbp-task-check, cbp-standalone-task-check]
|
|
7
7
|
effort: low
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## Kind Detection
|
|
11
|
+
|
|
12
|
+
Inspect the resolved identifier from argument parsing to determine the task kind:
|
|
13
|
+
|
|
14
|
+
| Identifier shape | KIND |
|
|
15
|
+
|-----------------|------|
|
|
16
|
+
| `{task}-{round}` (2-segment, e.g. `45-2`) | `standalone` |
|
|
17
|
+
| `{chk}-{task}-{round}` (3-segment, e.g. `141-3-1`) | `checkpoint` |
|
|
18
|
+
| _(empty / free-text)_ | Check `get_current_standalone_task` first; if found → `standalone`. Else → `checkpoint` via `get_current_task`. |
|
|
19
|
+
|
|
20
|
+
Set `KIND` for the rest of this skill. MCP tool names vary by KIND:
|
|
21
|
+
|
|
22
|
+
| Operation | `checkpoint` KIND | `standalone` KIND |
|
|
23
|
+
|-----------|------------------|-------------------|
|
|
24
|
+
| Get task | `get_current_task(repo_id)` | `get_current_standalone_task(repo_id)` |
|
|
25
|
+
| Get rounds | `get_rounds(task_id)` | `get_standalone_rounds(standalone_task_id)` |
|
|
26
|
+
| Add round | `add_round(task_id, ...)` | `add_standalone_round(standalone_task_id, ...)` |
|
|
27
|
+
| Update round | `update_round(round_id, ...)` | `update_standalone_round(standalone_round_id, ...)` |
|
|
28
|
+
| Complete round | `complete_round(round_id, duration_minutes?)` | `complete_standalone_round(standalone_round_id, duration_minutes?, caller_worktree_id)` ⚠️ `caller_worktree_id` is REQUIRED for standalone |
|
|
29
|
+
| Update task | `update_task(task_id, ...)` | `update_standalone_task(standalone_task_id, ...)` |
|
|
30
|
+
|
|
10
31
|
# Round Update Command
|
|
11
32
|
|
|
12
33
|
Checks file approval status, completes the round, and routes to next step. NEVER asks the user to git add or stage anything — it only reads current state.
|
|
@@ -29,7 +50,7 @@ Parse the argument using the canonical chk-task-round notation (see `.claude/rul
|
|
|
29
50
|
|-------|-------|-------------|
|
|
30
51
|
| `{chk}-{task}-{round}` (e.g. `108-1-2`) | `^[0-9]+-[0-9]+-[0-9]+$` | Checkpoint-bound: CHK-{chk} TASK-{task} ROUND-{round} |
|
|
31
52
|
| `{task}-{round}` (e.g. `45-2`) | `^[0-9]+-[0-9]+$` | Standalone: standalone TASK-{task} ROUND-{round} |
|
|
32
|
-
| _(empty)_ | — | Use
|
|
53
|
+
| _(empty)_ | — | Use Kind Detection to find active task and latest round |
|
|
33
54
|
|
|
34
55
|
Anything else is malformed — surface this error and stop:
|
|
35
56
|
|
|
@@ -46,7 +67,7 @@ Error cases: `abc`, `108-`, `-1`, anything with whitespace or non-numeric charac
|
|
|
46
67
|
|
|
47
68
|
- `round-update 108-1-2` → CHK-108 TASK-1 ROUND-2
|
|
48
69
|
- `round-update 45-2` → standalone TASK-45 ROUND-2
|
|
49
|
-
- `round-update` (no arg) → active task and latest in-progress round via
|
|
70
|
+
- `round-update` (no arg) → active task and latest in-progress round via Kind Detection
|
|
50
71
|
- `round-update abc` → error: malformed
|
|
51
72
|
|
|
52
73
|
### Step 1.5: Get Current Task and Round
|
|
@@ -56,8 +77,8 @@ Given the parse from Step 1:
|
|
|
56
77
|
| Parse | Resolution path |
|
|
57
78
|
|-------|-----------------|
|
|
58
79
|
| `{chk}-{task}-{round}` | MCP `get_checkpoints(repo_id)` → filter `number === {chk}`. MCP `get_tasks(checkpoint_id)` → filter `number === {task}`. MCP `get_rounds(task_id)` → filter `number === {round}`. |
|
|
59
|
-
| `{task}-{round}` | MCP `
|
|
60
|
-
| _(empty)_ | MCP `get_current_task(repo_id)`
|
|
80
|
+
| `{task}-{round}` | MCP `get_standalone_rounds` via `get_current_standalone_task` or direct task lookup → filter `number === {round}`. |
|
|
81
|
+
| _(empty)_ | Use Kind Detection: checkpoint KIND → MCP `get_current_task(repo_id)` + `get_rounds(task_id)`; standalone KIND → MCP `get_current_standalone_task(repo_id)` + `get_standalone_rounds(standalone_task_id)`. |
|
|
61
82
|
|
|
62
83
|
If no task found: `No active task. Nothing to update.`
|
|
63
84
|
|
|
@@ -108,7 +129,16 @@ If the command exits non-zero, surface the stderr and STOP. Do NOT proceed to St
|
|
|
108
129
|
### Step 3: Complete Round
|
|
109
130
|
|
|
110
131
|
Calculate duration from `started_at` to now in minutes.
|
|
111
|
-
|
|
132
|
+
|
|
133
|
+
- **checkpoint KIND**: MCP `complete_round(round_id, duration_minutes)`.
|
|
134
|
+
- **standalone KIND**: MCP `complete_standalone_round(standalone_round_id, duration_minutes, caller_worktree_id)`. ⚠️ `caller_worktree_id` is REQUIRED — resolve via `CALLER_WT=$(npx codebyplan resolve-worktree 2>/dev/null)`. If `CALLER_WT` is empty, surface this warning and ask user to confirm before proceeding:
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
Warning: could not resolve caller_worktree_id (npx codebyplan resolve-worktree returned empty).
|
|
138
|
+
The complete_standalone_round call may be rejected by the pre-guard. Proceed anyway? (yes / no)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
If user confirms yes, proceed with `caller_worktree_id: ""`. If no, stop.
|
|
112
142
|
|
|
113
143
|
### Step 4: Auto-Loop Decision
|
|
114
144
|
|
|
@@ -118,7 +148,7 @@ Procedure:
|
|
|
118
148
|
|
|
119
149
|
1. Compute `next_index = (round.context.auto_loop_index ?? 0) + 1`.
|
|
120
150
|
2. **If `next_index > (round.context.auto_loop_cap ?? 5)`**: surface the cap-exhausted prompt via AskUserQuestion (options: extend cap, stop loop / drop into round-input, close task as-is). Persist `round.context.auto_loop_cap_exhausted = { user_choice, decided_at }` and route per choice.
|
|
121
|
-
3. **Otherwise**: persist `round.context.auto_loop_decision = { spawned_next: true, next_index, decided_at }` on the CURRENT round via `update_round` (audit trail), then auto-trigger `/cbp-round-input` with NO AskUserQuestion. Pass `auto_loop_mode: true`, `auto_loop_index: next_index`, `auto_loop_cap: (prior cap ?? 5)` forward — round-start Step 4 persists them on the new round.
|
|
151
|
+
3. **Otherwise**: persist `round.context.auto_loop_decision = { spawned_next: true, next_index, decided_at }` on the CURRENT round via `update_round` / `update_standalone_round` per KIND (audit trail), then auto-trigger `/cbp-round-input` with NO AskUserQuestion. Pass `auto_loop_mode: true`, `auto_loop_index: next_index`, `auto_loop_cap: (prior cap ?? 5)` forward — round-start Step 4 persists them on the new round.
|
|
122
152
|
|
|
123
153
|
> **Permission-gate note**: the "NO AskUserQuestion" in item 3 governs only the auto-loop's decision to spawn `/cbp-round-input` — it does not add a prompt for that hand-off. It is NOT a bypass of the Step 1.6 permission gate: when the spawned round eventually re-enters `/cbp-round-update`, Step 1.6 prompts again (the gate always fires, including inside the auto-loop).
|
|
124
154
|
|
|
@@ -135,7 +165,7 @@ If BOTH signals are clean, fall through to Step 5 (exit routing).
|
|
|
135
165
|
Survey rounds produce no file diff; A/B/C predicates assume `files_changed[]` non-empty. Survey routing is decided by `improve_round_findings[]` instead:
|
|
136
166
|
|
|
137
167
|
- `improve_round_findings[]` non-empty → auto-trigger `/cbp-round-input`
|
|
138
|
-
- `improve_round_findings[]` empty → auto-trigger `/cbp-task-check`
|
|
168
|
+
- `improve_round_findings[]` empty → checkpoint KIND: auto-trigger `/cbp-task-check`; standalone KIND: auto-trigger `/cbp-standalone-task-check`
|
|
139
169
|
|
|
140
170
|
Output: `"## Round [N] Complete — Survey Round"` with duration, files=0, findings count, routing message. Skip Branches A/B/C.
|
|
141
171
|
|
|
@@ -150,7 +180,7 @@ Output: `"## Round [N] Complete — Survey Round"` with duration, files=0, findi
|
|
|
150
180
|
|
|
151
181
|
Surface AskUserQuestion (clean-exit user-gate):
|
|
152
182
|
|
|
153
|
-
- **(a) close & complete round** → auto-trigger `/cbp-task-check`
|
|
183
|
+
- **(a) close & complete round** → checkpoint KIND: auto-trigger `/cbp-task-check`; standalone KIND: auto-trigger `/cbp-standalone-task-check`
|
|
154
184
|
- **(b) start new round** → auto-trigger `/cbp-round-input`
|
|
155
185
|
|
|
156
186
|
Persist `round.context.auto_loop_exit = { staged_count, unstaged_count, route, decided_at }`.
|
|
@@ -187,11 +217,12 @@ Unreachable in the auto-loop path — Step 4 catches it first. Retained for MANU
|
|
|
187
217
|
- **Step 4 owns the dirty-loop case**; Step 5 owns the clean-exit case. Step 5 Branch C is for manual invocation only.
|
|
188
218
|
- **NEVER ask user to git add files** — only reads staging status. **NEVER stage files** — Claude does not touch git staging area.
|
|
189
219
|
- Auto-triggered by `/cbp-round-end`, or run manually by user.
|
|
220
|
+
- **standalone KIND Step 3**: `caller_worktree_id` is REQUIRED for `complete_standalone_round` — always resolve and pass it.
|
|
190
221
|
|
|
191
222
|
## Integration
|
|
192
223
|
|
|
193
224
|
- **Gates**: Step 1.6 permission gate — asks the user to confirm before any side effect; **Cancel** aborts cleanly with no writes. Fires on every invocation incl. the Step 4 auto-loop; sits before and independent of the top-of-file Step 2 hard gate.
|
|
194
225
|
- **Triggered by**: `/cbp-round-end` (auto), or user manually
|
|
195
|
-
- **Reads**: MCP `get_current_task`, `get_rounds
|
|
196
|
-
- **Writes**: MCP `update_round` (auto_loop_decision / auto_loop_exit / auto_loop_cap_exhausted)
|
|
197
|
-
- **Triggers**: `/cbp-round-input` (Step 4 dirty-loop spawn; Branch A 'b' choice; Branch B auto-loop-exit; Branch C manual), `/cbp-task-check` (Branch A 'a' choice; Branch D survey-clean), staging-gate stop (Branch B manual mode), cap-exhausted prompt routes from Step 4 (any of the three options)
|
|
226
|
+
- **Reads**: MCP `get_current_task` / `get_current_standalone_task`, `get_rounds` / `get_standalone_rounds` (per KIND); delegates git+approval sync to `npx codebyplan round sync-approvals`
|
|
227
|
+
- **Writes**: MCP `update_round` / `update_standalone_round` (auto_loop_decision / auto_loop_exit / auto_loop_cap_exhausted); `complete_round` / `complete_standalone_round` (per KIND); round+task files_changed written by CLI
|
|
228
|
+
- **Triggers**: `/cbp-round-input` (Step 4 dirty-loop spawn; Branch A 'b' choice; Branch B auto-loop-exit; Branch C manual), `/cbp-task-check` (Branch A 'a' choice per checkpoint KIND; Branch D survey-clean per checkpoint KIND), `/cbp-standalone-task-check` (Branch A 'a' choice per standalone KIND; Branch D survey-clean per standalone KIND), staging-gate stop (Branch B manual mode), cap-exhausted prompt routes from Step 4 (any of the three options)
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
---
|
|
2
|
+
scope: repo-only:codebyplan
|
|
3
|
+
name: cbp-standalone-task-check
|
|
4
|
+
description: AI production review for the current standalone task
|
|
5
|
+
argument-hint: [task] # e.g. `45` (standalone TASK-45)
|
|
6
|
+
triggers: [cbp-standalone-task-testing]
|
|
7
|
+
effort: high
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Standalone Task Check Command
|
|
11
|
+
|
|
12
|
+
AI-driven production readiness review for standalone tasks. Spawns the `cbp-task-check` agent for thorough verification including user satisfaction discussion. This command is a thin orchestrator — the agent does the heavy lifting.
|
|
13
|
+
|
|
14
|
+
## Inline-Fallback for Spawn Failure
|
|
15
|
+
|
|
16
|
+
If the `cbp-task-check` agent spawn fails for any reason, follow the canonical inline-fallback procedure documented in `skills/cbp-round-end/SKILL.md` "Inline-fallback for any spawn failure". Walk every agent phase inline with the same Read/Grep depth the agent would have used — do not skip phases.
|
|
17
|
+
|
|
18
|
+
## When Used
|
|
19
|
+
|
|
20
|
+
- After all rounds complete and all files approved (auto-triggered by `/cbp-round-update`)
|
|
21
|
+
- Before `/cbp-standalone-task-testing`
|
|
22
|
+
- Never skippable
|
|
23
|
+
|
|
24
|
+
## Instructions
|
|
25
|
+
|
|
26
|
+
### Step 1: Parse `$ARGUMENTS`
|
|
27
|
+
|
|
28
|
+
| Shape | Regex | Resolves to |
|
|
29
|
+
|-------|-------|-------------|
|
|
30
|
+
| `{task}` (e.g. `45`) | `^[0-9]+$` | Standalone TASK-{task} |
|
|
31
|
+
| _(empty)_ | — | Use MCP `get_current_standalone_task` to find the active in-progress task |
|
|
32
|
+
|
|
33
|
+
Any multi-segment input is an error:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
standalone-task-check: argument `{value}` looks like a checkpoint-task pair.
|
|
37
|
+
Use /cbp-task-check {chk}-{task} for checkpoint-bound tasks.
|
|
38
|
+
Standalone tasks use a bare number, e.g. /cbp-standalone-task-check 45.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Error cases: any multi-segment input, `abc`, `108-`, `-1`, anything with whitespace or non-numeric characters.
|
|
42
|
+
|
|
43
|
+
#### Worked examples
|
|
44
|
+
|
|
45
|
+
- `standalone-task-check 45` → standalone TASK-45
|
|
46
|
+
- `standalone-task-check` (no arg) → active in-progress task via `get_current_standalone_task`
|
|
47
|
+
- `standalone-task-check 141-3` → error: "Use /cbp-task-check {chk}-{task} for checkpoint-bound tasks."
|
|
48
|
+
- `standalone-task-check abc` → error: malformed
|
|
49
|
+
|
|
50
|
+
### Step 1.5: Get Current Task
|
|
51
|
+
|
|
52
|
+
| Parse | Resolution path |
|
|
53
|
+
|-------|-----------------|
|
|
54
|
+
| `{task}` | MCP `get_standalone_tasks(repo_id)` → filter `number === {task}`. |
|
|
55
|
+
| _(empty)_ | MCP `get_current_standalone_task(repo_id)` — finds the active in-progress task. |
|
|
56
|
+
|
|
57
|
+
If no in-progress task, show error and stop.
|
|
58
|
+
|
|
59
|
+
### Step 2: Quick Gate — Verify All Rounds Complete
|
|
60
|
+
|
|
61
|
+
Use MCP `get_standalone_rounds(standalone_task_id)`. Verify all rounds are `completed`.
|
|
62
|
+
|
|
63
|
+
If any rounds still in_progress:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
## Cannot Run Standalone Task Check
|
|
67
|
+
|
|
68
|
+
Standalone TASK-[N] has an active round (Round [N]). Complete it first:
|
|
69
|
+
- Run `/cbp-round-update` to finish the round
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Stop here.
|
|
73
|
+
|
|
74
|
+
### Step 3: Load All Context
|
|
75
|
+
|
|
76
|
+
1. Get task details: id, title, requirements, context, qa
|
|
77
|
+
2. Get all rounds via `get_standalone_rounds(standalone_task_id)`: number, requirements, context, qa, files_changed
|
|
78
|
+
|
|
79
|
+
No checkpoint context is needed — standalone tasks have no parent checkpoint.
|
|
80
|
+
|
|
81
|
+
### Step 4: Spawn Task Check Agent
|
|
82
|
+
|
|
83
|
+
Spawn `cbp-task-check` agent with full context:
|
|
84
|
+
|
|
85
|
+
```yaml
|
|
86
|
+
input:
|
|
87
|
+
task_number: [N]
|
|
88
|
+
round_number: [total rounds]
|
|
89
|
+
checkpoint: null
|
|
90
|
+
task: { id, title, requirements, context, files_changed, qa }
|
|
91
|
+
rounds: [{ number, requirements, context, qa, files_changed }]
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Wait for agent to complete. Agent handles all phases including user satisfaction discussion.
|
|
95
|
+
|
|
96
|
+
### Step 5: Save Agent Output
|
|
97
|
+
|
|
98
|
+
Save agent output to task context via MCP `update_standalone_task`:
|
|
99
|
+
|
|
100
|
+
- `task.context.check_verdict` = agent output (verdict, requirements_check, etc.)
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
update_standalone_task(task_id, context: { ...existing, check_verdict: agentOutput })
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Step 6: Route Based on Verdict
|
|
107
|
+
|
|
108
|
+
**READY + satisfied:**
|
|
109
|
+
|
|
110
|
+
**Next**: Run `/clear`, then `/cbp-standalone-task-testing {task}` to run comprehensive task-level testing.
|
|
111
|
+
|
|
112
|
+
**NOT READY — fixable issues:**
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
Issues found that need addressing:
|
|
116
|
+
- [issue 1]
|
|
117
|
+
- [issue 2]
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Suggest: `/cbp-round-input` with specific issues. Stop — wait for user.
|
|
121
|
+
|
|
122
|
+
**NOT READY — needs new task:**
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
Scope issues identified that require a new task:
|
|
126
|
+
- [scope issue]
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Suggest: `/cbp-standalone-task-create`. Stop — wait for user.
|
|
130
|
+
|
|
131
|
+
**NOT READY — approvals missing:**
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
Code review passed but [N] files need user approval.
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Suggest: Approve files, then re-run `/cbp-standalone-task-check {task}`. Stop — wait for user.
|
|
138
|
+
|
|
139
|
+
## Key Rules
|
|
140
|
+
|
|
141
|
+
- **Never skippable** — mandatory before `/cbp-standalone-task-testing`
|
|
142
|
+
- **This is AI review + user satisfaction** — not automated testing
|
|
143
|
+
- **Read all changed files** — agent does the heavy lifting
|
|
144
|
+
- **No file changes** — review only, never edit
|
|
145
|
+
- **No checkpoint context** — standalone tasks are self-contained
|
|
146
|
+
|
|
147
|
+
## Integration
|
|
148
|
+
|
|
149
|
+
- **Reads**: MCP `get_current_standalone_task`, `get_standalone_tasks`, `get_standalone_rounds`, all changed files (via agent)
|
|
150
|
+
- **Writes**: MCP `update_standalone_task` (context.check_verdict)
|
|
151
|
+
- **Triggers**: emits directive `Next: /clear, then /cbp-standalone-task-testing {task}` on READY + satisfied
|
|
152
|
+
- **Triggered by**: `/cbp-round-update` (auto, when all files approved)
|