cc-devflow 4.5.6 → 4.5.8
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/.claude/skills/cc-act/CHANGELOG.md +6 -0
- package/.claude/skills/cc-act/PLAYBOOK.md +11 -2
- package/.claude/skills/cc-act/SKILL.md +17 -7
- package/.claude/skills/cc-act/references/closure-contract.md +4 -0
- package/.claude/skills/cc-act/scripts/{archive-requirement.sh → archive-change.sh} +7 -7
- package/.claude/skills/cc-act/scripts/detect-ship-target.sh +27 -0
- package/.claude/skills/cc-act/scripts/ensure-ship-branch.sh +93 -0
- package/.claude/skills/cc-act/scripts/generate-status-report.sh +6 -0
- package/.claude/skills/cc-act/scripts/render-pr-brief.sh +6 -0
- package/.claude/skills/cc-act/scripts/sync-act-docs.sh +14 -0
- package/.claude/skills/cc-dev/CHANGELOG.md +5 -0
- package/.claude/skills/cc-dev/PLAYBOOK.md +63 -0
- package/.claude/skills/cc-dev/SKILL.md +168 -0
- package/.claude/skills/cc-do/CHANGELOG.md +6 -0
- package/.claude/skills/cc-do/SKILL.md +23 -1
- package/.claude/skills/cc-investigate/CHANGELOG.md +5 -0
- package/.claude/skills/cc-investigate/SKILL.md +2 -2
- package/.claude/skills/cc-next/CHANGELOG.md +5 -0
- package/.claude/skills/cc-next/PLAYBOOK.md +52 -0
- package/.claude/skills/cc-next/SKILL.md +161 -0
- package/.claude/skills/cc-plan/CHANGELOG.md +28 -0
- package/.claude/skills/cc-plan/PLAYBOOK.md +20 -17
- package/.claude/skills/cc-plan/SKILL.md +135 -21
- package/.claude/skills/cc-plan/assets/DESIGN_TEMPLATE.md +42 -0
- package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +28 -0
- package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +84 -2
- package/.claude/skills/cc-plan/assets/TINY_DESIGN_TEMPLATE.md +30 -0
- package/.claude/skills/cc-plan/references/planning-contract.md +31 -15
- package/.claude/skills/cc-plan/scripts/next-change-key.sh +78 -0
- package/.claude/skills/cc-pr-land/CHANGELOG.md +5 -0
- package/.claude/skills/cc-pr-land/PLAYBOOK.md +45 -0
- package/.claude/skills/cc-pr-land/SKILL.md +157 -0
- package/.claude/skills/cc-pr-review/CHANGELOG.md +5 -0
- package/.claude/skills/cc-pr-review/PLAYBOOK.md +46 -0
- package/.claude/skills/cc-pr-review/SKILL.md +142 -0
- package/.claude/skills/cc-review/CHANGELOG.md +28 -0
- package/.claude/skills/cc-review/PLAYBOOK.md +108 -0
- package/.claude/skills/cc-review/SKILL.md +340 -0
- package/.claude/skills/cc-review/references/e2e-and-plugin-verification.md +85 -0
- package/.claude/skills/cc-review/references/implementation-review-branch.md +152 -0
- package/.claude/skills/cc-review/references/plan-review-branch.md +151 -0
- package/.claude/skills/cc-review/references/review-methods.md +221 -0
- package/.claude/skills/cc-review/scripts/collect-review-context.sh +80 -0
- package/.claude/skills/cc-roadmap/CHANGELOG.md +6 -0
- package/.claude/skills/cc-roadmap/SKILL.md +102 -8
- package/.claude/skills/cc-roadmap/assets/BACKLOG_TEMPLATE.md +3 -0
- package/.claude/skills/cc-roadmap/assets/ROADMAP_TEMPLATE.md +23 -0
- package/.claude/skills/cc-roadmap/assets/TRACKING_TEMPLATE.json +20 -1
- package/.claude/skills/cc-roadmap/references/roadmap-dialogue.md +28 -13
- package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/markdown.js +18 -0
- package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/schema.js +8 -0
- package/.claude/skills/cc-simplify/CHANGELOG.md +6 -0
- package/.claude/skills/cc-simplify/SKILL.md +19 -8
- package/CHANGELOG.md +16 -0
- package/README.md +58 -4
- package/README.zh-CN.md +58 -4
- package/bin/cc-devflow-cli.js +119 -0
- package/config/distributable-skills.json +10 -0
- package/docs/assets/cc-devflow-pr-harness-en.svg +153 -0
- package/docs/assets/cc-devflow-pr-harness-zh.svg +152 -0
- package/docs/assets/wechat-group-qr.jpg +0 -0
- package/docs/examples/example-bindings.json +11 -6
- package/docs/examples/full-design-blocked/BACKLOG.md +1 -1
- package/docs/examples/full-design-blocked/README.md +1 -1
- package/docs/examples/full-design-blocked/ROADMAP.md +16 -1
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +36 -3
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json +604 -76
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md +46 -1
- package/docs/examples/full-design-blocked/roadmap.json +18 -2
- package/docs/examples/local-handoff/BACKLOG.md +1 -1
- package/docs/examples/local-handoff/README.md +1 -1
- package/docs/examples/local-handoff/ROADMAP.md +16 -1
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +27 -1
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/task-manifest.json +366 -44
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/tasks.md +36 -1
- package/docs/examples/local-handoff/roadmap.json +16 -2
- package/docs/examples/pdca-loop/BACKLOG.md +1 -1
- package/docs/examples/pdca-loop/README.md +1 -1
- package/docs/examples/pdca-loop/ROADMAP.md +16 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +27 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +259 -14
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md +36 -1
- package/docs/examples/pdca-loop/roadmap.json +16 -2
- package/docs/examples/scripts/check-example-bindings.sh +21 -1
- package/docs/guides/getting-started.md +12 -9
- package/docs/guides/getting-started.zh-CN.md +12 -9
- package/lib/skill-runtime/__tests__/archive-change.test.js +124 -0
- package/lib/skill-runtime/__tests__/cli-bootstrap.integration.test.js +1 -0
- package/lib/skill-runtime/__tests__/paths.test.js +81 -1
- package/lib/skill-runtime/archive-change.js +64 -0
- package/lib/skill-runtime/paths.js +32 -0
- package/package.json +7 -1
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"requirementId": "REQ-002",
|
|
7
7
|
"requirementVersion": "REQ-002.v2",
|
|
8
8
|
"planningMeta": {
|
|
9
|
-
"reqPlanSkillVersion": "3.
|
|
9
|
+
"reqPlanSkillVersion": "3.8.2",
|
|
10
10
|
"designVersion": "design.v2",
|
|
11
11
|
"approvedAt": null,
|
|
12
12
|
"approvedBy": null,
|
|
@@ -14,21 +14,28 @@
|
|
|
14
14
|
"requirementBrief": {
|
|
15
15
|
"problemStatement": "Admins onboarding larger teams need predictable bulk invite behavior for duplicates, invalid rows, and seat limits.",
|
|
16
16
|
"solutionSummary": "Freeze deterministic CSV row outcomes before executing the bulk invite flow.",
|
|
17
|
-
"actors": [
|
|
17
|
+
"actors": [
|
|
18
|
+
"workspace admin",
|
|
19
|
+
"support operator"
|
|
20
|
+
],
|
|
18
21
|
"userStories": [
|
|
19
22
|
{
|
|
20
23
|
"id": "US-001",
|
|
21
24
|
"actor": "workspace admin",
|
|
22
25
|
"want": "upload a CSV of invite emails",
|
|
23
26
|
"benefit": "invite many collaborators without one-by-one entry",
|
|
24
|
-
"acceptance": [
|
|
27
|
+
"acceptance": [
|
|
28
|
+
"Mixed valid rows produce visible accepted outcomes"
|
|
29
|
+
]
|
|
25
30
|
},
|
|
26
31
|
{
|
|
27
32
|
"id": "US-002",
|
|
28
33
|
"actor": "workspace admin",
|
|
29
34
|
"want": "see duplicate, invalid, and over-limit row states",
|
|
30
35
|
"benefit": "understand what happened without support help",
|
|
31
|
-
"acceptance": [
|
|
36
|
+
"acceptance": [
|
|
37
|
+
"Every skipped or rejected row has a reason"
|
|
38
|
+
]
|
|
32
39
|
}
|
|
33
40
|
],
|
|
34
41
|
"edgeOrRecoveryStories": [
|
|
@@ -37,19 +44,51 @@
|
|
|
37
44
|
"actor": "workspace admin",
|
|
38
45
|
"boundary": "CSV contains duplicates, invalid emails, or over-limit rows",
|
|
39
46
|
"desiredOutcome": "safe rows can proceed while bad rows are explained",
|
|
40
|
-
"acceptance": [
|
|
47
|
+
"acceptance": [
|
|
48
|
+
"Rule matrix covers duplicate, invalid, and seat-limit cases"
|
|
49
|
+
]
|
|
41
50
|
}
|
|
42
51
|
],
|
|
43
|
-
"implementationDecisions": [
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
52
|
+
"implementationDecisions": [
|
|
53
|
+
"Freeze one row-outcome matrix before execution resumes"
|
|
54
|
+
],
|
|
55
|
+
"testingDecisions": [
|
|
56
|
+
"Test row semantics through bulk-import rules and the admin upload flow"
|
|
57
|
+
],
|
|
58
|
+
"outOfScope": [
|
|
59
|
+
"enterprise SCIM provisioning",
|
|
60
|
+
"background job redesign",
|
|
61
|
+
"rollback wizard for partial success"
|
|
62
|
+
],
|
|
63
|
+
"furtherNotes": [
|
|
64
|
+
"Design remains blocked until duplicate and seat-limit semantics are approved"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
"externalBestPractice": {
|
|
68
|
+
"needed": true,
|
|
69
|
+
"decisionStatus": "declined",
|
|
70
|
+
"decisionQuestionId": "D2",
|
|
71
|
+
"privacyGuard": "generalized terms only; no project names, private requirements, customer names, secrets, logs, or proprietary concepts",
|
|
72
|
+
"generalizedSearchTerms": [
|
|
73
|
+
"bulk invite CSV import validation best practices"
|
|
74
|
+
],
|
|
75
|
+
"sourcesChecked": [],
|
|
76
|
+
"conventionalWisdom": "",
|
|
77
|
+
"currentDiscourse": "",
|
|
78
|
+
"repoFitVerdict": "skipped",
|
|
79
|
+
"designImpacts": [
|
|
80
|
+
"keep the design blocked until row-outcome semantics are approved from internal evidence"
|
|
81
|
+
],
|
|
82
|
+
"skippedReason": "user kept the example repo-local for the blocked design"
|
|
47
83
|
},
|
|
48
84
|
"decisionQuestions": [
|
|
49
85
|
{
|
|
50
86
|
"questionId": "D1",
|
|
51
87
|
"gate": "approach-approval",
|
|
52
|
-
"knownEvidence": [
|
|
88
|
+
"knownEvidence": [
|
|
89
|
+
"Best-effort upload would hide duplicate, invalid, and seat-limit semantics",
|
|
90
|
+
"Audit mapping depends on deterministic row outcomes"
|
|
91
|
+
],
|
|
53
92
|
"recommendation": "Choose Option B and freeze a rule matrix first",
|
|
54
93
|
"options": [
|
|
55
94
|
{
|
|
@@ -75,9 +114,42 @@
|
|
|
75
114
|
},
|
|
76
115
|
{
|
|
77
116
|
"questionId": "D2",
|
|
78
|
-
"gate": "
|
|
79
|
-
"knownEvidence": [
|
|
80
|
-
|
|
117
|
+
"gate": "external-best-practice",
|
|
118
|
+
"knownEvidence": [
|
|
119
|
+
"Bulk CSV import semantics could benefit from generalized external practice",
|
|
120
|
+
"The example keeps private details out of any external lookup"
|
|
121
|
+
],
|
|
122
|
+
"recommendation": "Stay repo-local for this blocked example",
|
|
123
|
+
"options": [
|
|
124
|
+
{
|
|
125
|
+
"id": "A",
|
|
126
|
+
"label": "Search generalized best practices",
|
|
127
|
+
"recommended": false,
|
|
128
|
+
"completeness": "9/10",
|
|
129
|
+
"good": "Could improve row-outcome terminology before task generation",
|
|
130
|
+
"costRisk": "Sends generalized category terms outside the local repo"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"id": "B",
|
|
134
|
+
"label": "Stay repo-local",
|
|
135
|
+
"recommended": true,
|
|
136
|
+
"completeness": "7/10",
|
|
137
|
+
"good": "Keeps the blocked example private and focused on internal semantics",
|
|
138
|
+
"costRisk": "Does not compare against external CSV-import conventions"
|
|
139
|
+
}
|
|
140
|
+
],
|
|
141
|
+
"userChoice": "B",
|
|
142
|
+
"impact": "cc-do still must not start implementation until row outcomes are answered from internal evidence",
|
|
143
|
+
"status": "answered"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"questionId": "D3",
|
|
147
|
+
"gate": "review-blocker",
|
|
148
|
+
"knownEvidence": [
|
|
149
|
+
"Duplicate and seat-limit outcomes are still not explicit enough for final requirement proof",
|
|
150
|
+
"Audit entries must match visible row outcomes"
|
|
151
|
+
],
|
|
152
|
+
"recommendation": "Answer the row-outcome matrix before retry or cc-act",
|
|
81
153
|
"options": [
|
|
82
154
|
{
|
|
83
155
|
"id": "A",
|
|
@@ -97,10 +169,31 @@
|
|
|
97
169
|
}
|
|
98
170
|
],
|
|
99
171
|
"userChoice": null,
|
|
100
|
-
"impact": "
|
|
172
|
+
"impact": "cc-do retry and cc-act must stay blocked until this is answered",
|
|
101
173
|
"status": "asked"
|
|
102
174
|
}
|
|
103
|
-
]
|
|
175
|
+
],
|
|
176
|
+
"aiLeverageDecisionLens": {
|
|
177
|
+
"realUserOrOperator": "workspace admin onboarding larger teams",
|
|
178
|
+
"statusQuoWorkaround": "paste invite emails one by one or track them in spreadsheets",
|
|
179
|
+
"humanTeamEffortForFullScope": "multiple weeks across product, engineering, billing, and support review",
|
|
180
|
+
"ccAgentEffortForFullScope": "several hours once row semantics are approved, but unbounded before that",
|
|
181
|
+
"aiCompressionRatio": "high after semantics freeze, low while the product contract is ambiguous",
|
|
182
|
+
"completeLakeBoundary": "row classification, admin upload flow, billing-seat checks, and audit mapping after rule approval",
|
|
183
|
+
"oceanBoundary": "SCIM, background retries, rollback wizard, and unspecified billing semantics",
|
|
184
|
+
"scopeRecommendation": "sharp-wedge",
|
|
185
|
+
"costModel": {
|
|
186
|
+
"agentTime": "medium after rule approval",
|
|
187
|
+
"humanReviewTime": "high until semantics are approved",
|
|
188
|
+
"verificationCost": "bulk rules, admin flow, billing, and audit tests",
|
|
189
|
+
"maintenanceCost": "medium after semantics freeze",
|
|
190
|
+
"failureCost": "high if billing or audit outcomes drift",
|
|
191
|
+
"reversibility": "limited once execution semantics ship"
|
|
192
|
+
},
|
|
193
|
+
"verdict": "sharp-wedge",
|
|
194
|
+
"missingEvidenceOrPivotReason": "none at plan approval; cc-check later reopened duplicate, invalid-row, partial-success, and seat-limit semantics before retry or cc-act",
|
|
195
|
+
"impactOnApprovedDirection": "allow bounded import-path execution, then block final proof if review finds row semantics drift"
|
|
196
|
+
}
|
|
104
197
|
},
|
|
105
198
|
"currentTaskId": null,
|
|
106
199
|
"activePhase": null,
|
|
@@ -112,22 +205,101 @@
|
|
|
112
205
|
"phase": 1,
|
|
113
206
|
"parallel": false,
|
|
114
207
|
"dependsOn": [],
|
|
115
|
-
"touches": [
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
"
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
"
|
|
208
|
+
"touches": [
|
|
209
|
+
"bulk-invite-rules"
|
|
210
|
+
],
|
|
211
|
+
"files": [
|
|
212
|
+
"src/invite/bulk-import.test.ts"
|
|
213
|
+
],
|
|
214
|
+
"run": [
|
|
215
|
+
"npm test -- src/invite/bulk-import.test.ts"
|
|
216
|
+
],
|
|
217
|
+
"checks": [
|
|
218
|
+
"tests fail before implementation"
|
|
219
|
+
],
|
|
220
|
+
"acceptance": [
|
|
221
|
+
"dangerous row outcomes are reproduced as explicit failing tests"
|
|
222
|
+
],
|
|
223
|
+
"verification": [
|
|
224
|
+
"npm test -- src/invite/bulk-import.test.ts"
|
|
225
|
+
],
|
|
226
|
+
"evidence": [
|
|
227
|
+
"failing test output"
|
|
228
|
+
],
|
|
122
229
|
"context": {
|
|
123
|
-
"readFiles": [
|
|
124
|
-
|
|
125
|
-
|
|
230
|
+
"readFiles": [
|
|
231
|
+
"design.md",
|
|
232
|
+
"tasks.md",
|
|
233
|
+
"src/invite/bulk-import.ts"
|
|
234
|
+
],
|
|
235
|
+
"commands": [
|
|
236
|
+
"npm test -- src/invite/bulk-import.test.ts"
|
|
237
|
+
],
|
|
238
|
+
"notes": [
|
|
239
|
+
"freeze row semantics before broader execution"
|
|
240
|
+
]
|
|
241
|
+
},
|
|
242
|
+
"reviews": {
|
|
243
|
+
"spec": "pass",
|
|
244
|
+
"code": "pass"
|
|
126
245
|
},
|
|
127
|
-
"reviews": { "spec": "pass", "code": "pass" },
|
|
128
246
|
"status": "passed",
|
|
129
247
|
"attempts": 1,
|
|
130
|
-
"maxRetries": 1
|
|
248
|
+
"maxRetries": 1,
|
|
249
|
+
"tddPhase": "red",
|
|
250
|
+
"verticalSlice": "Slice 1",
|
|
251
|
+
"testSeam": {
|
|
252
|
+
"entry": "bulk invite rules and admin upload UI behavior",
|
|
253
|
+
"behaviorAsserted": "dangerous row outcomes are reproduced as explicit failing tests",
|
|
254
|
+
"specStyleTestName": "dangerous row outcomes are reproduced as explicit failing tests",
|
|
255
|
+
"oneLogicalBehavior": true,
|
|
256
|
+
"publicVerificationPath": "Run the bulk invite rule and admin panel tests through their public flows",
|
|
257
|
+
"implementationDetailRisk": "low"
|
|
258
|
+
},
|
|
259
|
+
"feedbackLoop": {
|
|
260
|
+
"type": "automated-test",
|
|
261
|
+
"determinism": "deterministic",
|
|
262
|
+
"expectedFailure": "Fails before the behavior exists"
|
|
263
|
+
},
|
|
264
|
+
"allowedMocks": [
|
|
265
|
+
"file upload boundary",
|
|
266
|
+
"billing / seat limit boundary"
|
|
267
|
+
],
|
|
268
|
+
"testQuality": {
|
|
269
|
+
"usesPublicInterface": true,
|
|
270
|
+
"describesBehavior": true,
|
|
271
|
+
"specStyleName": true,
|
|
272
|
+
"oneLogicalBehavior": true,
|
|
273
|
+
"verifiesThroughPublicPath": true,
|
|
274
|
+
"survivesInternalRefactor": true,
|
|
275
|
+
"mocksOnlySystemBoundaries": true,
|
|
276
|
+
"noBulkRed": true
|
|
277
|
+
},
|
|
278
|
+
"greenMinimality": {
|
|
279
|
+
"guard": "Keep the task scoped to its stated verification evidence",
|
|
280
|
+
"noSpeculativeBranches": true
|
|
281
|
+
},
|
|
282
|
+
"completion": {
|
|
283
|
+
"command": "SCRIPT_ROOT=\".claude/skills/cc-do/scripts\"; if [[ ! -d \"$SCRIPT_ROOT\" && -d \".codex/skills/cc-do/scripts\" ]]; then SCRIPT_ROOT=\".codex/skills/cc-do/scripts\"; fi; bash \"$SCRIPT_ROOT\"/mark-task-complete.sh --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T001",
|
|
284
|
+
"requiredBeforeCompletion": [
|
|
285
|
+
"verification evidence captured",
|
|
286
|
+
"checkpoint written",
|
|
287
|
+
"spec review gate recorded",
|
|
288
|
+
"code review gate recorded"
|
|
289
|
+
],
|
|
290
|
+
"forbiddenShortcuts": [
|
|
291
|
+
"manual checkbox edit",
|
|
292
|
+
"manual manifest status edit",
|
|
293
|
+
"leaving currentTaskId stale"
|
|
294
|
+
]
|
|
295
|
+
},
|
|
296
|
+
"refactorCandidates": [
|
|
297
|
+
"duplication",
|
|
298
|
+
"long method",
|
|
299
|
+
"primitive obsession",
|
|
300
|
+
"naming",
|
|
301
|
+
"more than three nested branches"
|
|
302
|
+
]
|
|
131
303
|
},
|
|
132
304
|
{
|
|
133
305
|
"id": "T002",
|
|
@@ -135,23 +307,105 @@
|
|
|
135
307
|
"type": "IMPL",
|
|
136
308
|
"phase": 1,
|
|
137
309
|
"parallel": false,
|
|
138
|
-
"dependsOn": [
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
"
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
"
|
|
145
|
-
|
|
310
|
+
"dependsOn": [
|
|
311
|
+
"T001"
|
|
312
|
+
],
|
|
313
|
+
"touches": [
|
|
314
|
+
"bulk-invite-rules"
|
|
315
|
+
],
|
|
316
|
+
"files": [
|
|
317
|
+
"src/invite/bulk-import.ts"
|
|
318
|
+
],
|
|
319
|
+
"run": [
|
|
320
|
+
"npm test -- src/invite/bulk-import.test.ts"
|
|
321
|
+
],
|
|
322
|
+
"checks": [
|
|
323
|
+
"rule tests pass"
|
|
324
|
+
],
|
|
325
|
+
"acceptance": [
|
|
326
|
+
"bulk invite rows receive deterministic initial states"
|
|
327
|
+
],
|
|
328
|
+
"verification": [
|
|
329
|
+
"npm test -- src/invite/bulk-import.test.ts"
|
|
330
|
+
],
|
|
331
|
+
"evidence": [
|
|
332
|
+
"passing test output",
|
|
333
|
+
"checkpoint summary"
|
|
334
|
+
],
|
|
146
335
|
"context": {
|
|
147
|
-
"readFiles": [
|
|
148
|
-
|
|
149
|
-
|
|
336
|
+
"readFiles": [
|
|
337
|
+
"design.md",
|
|
338
|
+
"tasks.md",
|
|
339
|
+
"src/invite/bulk-import.test.ts"
|
|
340
|
+
],
|
|
341
|
+
"commands": [
|
|
342
|
+
"npm test -- src/invite/bulk-import.test.ts"
|
|
343
|
+
],
|
|
344
|
+
"notes": [
|
|
345
|
+
"do not invent partial-failure semantics outside the approved design"
|
|
346
|
+
]
|
|
347
|
+
},
|
|
348
|
+
"reviews": {
|
|
349
|
+
"spec": "pass",
|
|
350
|
+
"code": "pass"
|
|
150
351
|
},
|
|
151
|
-
"reviews": { "spec": "pass", "code": "pass" },
|
|
152
352
|
"status": "passed",
|
|
153
353
|
"attempts": 1,
|
|
154
|
-
"maxRetries": 1
|
|
354
|
+
"maxRetries": 1,
|
|
355
|
+
"tddPhase": "green",
|
|
356
|
+
"verticalSlice": "Slice 2",
|
|
357
|
+
"testSeam": {
|
|
358
|
+
"entry": "bulk invite rules and admin upload UI behavior",
|
|
359
|
+
"behaviorAsserted": "bulk invite rows receive deterministic initial states",
|
|
360
|
+
"specStyleTestName": "bulk invite rows receive deterministic initial states",
|
|
361
|
+
"oneLogicalBehavior": true,
|
|
362
|
+
"publicVerificationPath": "Run the bulk invite rule and admin panel tests through their public flows",
|
|
363
|
+
"implementationDetailRisk": "low"
|
|
364
|
+
},
|
|
365
|
+
"feedbackLoop": {
|
|
366
|
+
"type": "automated-test",
|
|
367
|
+
"determinism": "deterministic",
|
|
368
|
+
"expectedFailure": ""
|
|
369
|
+
},
|
|
370
|
+
"allowedMocks": [
|
|
371
|
+
"file upload boundary",
|
|
372
|
+
"billing / seat limit boundary"
|
|
373
|
+
],
|
|
374
|
+
"testQuality": {
|
|
375
|
+
"usesPublicInterface": true,
|
|
376
|
+
"describesBehavior": true,
|
|
377
|
+
"specStyleName": true,
|
|
378
|
+
"oneLogicalBehavior": true,
|
|
379
|
+
"verifiesThroughPublicPath": true,
|
|
380
|
+
"survivesInternalRefactor": true,
|
|
381
|
+
"mocksOnlySystemBoundaries": true,
|
|
382
|
+
"noBulkRed": true
|
|
383
|
+
},
|
|
384
|
+
"greenMinimality": {
|
|
385
|
+
"guard": "Implement only the code needed to pass the current red behavior",
|
|
386
|
+
"noSpeculativeBranches": true
|
|
387
|
+
},
|
|
388
|
+
"completion": {
|
|
389
|
+
"command": "SCRIPT_ROOT=\".claude/skills/cc-do/scripts\"; if [[ ! -d \"$SCRIPT_ROOT\" && -d \".codex/skills/cc-do/scripts\" ]]; then SCRIPT_ROOT=\".codex/skills/cc-do/scripts\"; fi; bash \"$SCRIPT_ROOT\"/mark-task-complete.sh --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T002",
|
|
390
|
+
"requiredBeforeCompletion": [
|
|
391
|
+
"verification evidence captured",
|
|
392
|
+
"checkpoint written",
|
|
393
|
+
"spec review gate recorded",
|
|
394
|
+
"code review gate recorded"
|
|
395
|
+
],
|
|
396
|
+
"forbiddenShortcuts": [
|
|
397
|
+
"manual checkbox edit",
|
|
398
|
+
"manual manifest status edit",
|
|
399
|
+
"leaving currentTaskId stale"
|
|
400
|
+
]
|
|
401
|
+
},
|
|
402
|
+
"refactorCandidates": [
|
|
403
|
+
"duplication",
|
|
404
|
+
"long method",
|
|
405
|
+
"primitive obsession",
|
|
406
|
+
"naming",
|
|
407
|
+
"more than three nested branches"
|
|
408
|
+
]
|
|
155
409
|
},
|
|
156
410
|
{
|
|
157
411
|
"id": "T003",
|
|
@@ -159,23 +413,104 @@
|
|
|
159
413
|
"type": "TEST",
|
|
160
414
|
"phase": 2,
|
|
161
415
|
"parallel": false,
|
|
162
|
-
"dependsOn": [
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
"
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
"
|
|
169
|
-
|
|
416
|
+
"dependsOn": [
|
|
417
|
+
"T002"
|
|
418
|
+
],
|
|
419
|
+
"touches": [
|
|
420
|
+
"admin-bulk-invite-ui"
|
|
421
|
+
],
|
|
422
|
+
"files": [
|
|
423
|
+
"src/admin/BulkInvitePanel.test.tsx"
|
|
424
|
+
],
|
|
425
|
+
"run": [
|
|
426
|
+
"npm test -- src/admin/BulkInvitePanel.test.tsx"
|
|
427
|
+
],
|
|
428
|
+
"checks": [
|
|
429
|
+
"admin panel tests fail before UI integration"
|
|
430
|
+
],
|
|
431
|
+
"acceptance": [
|
|
432
|
+
"mixed row outcomes are visible as UI failures before implementation"
|
|
433
|
+
],
|
|
434
|
+
"verification": [
|
|
435
|
+
"npm test -- src/admin/BulkInvitePanel.test.tsx"
|
|
436
|
+
],
|
|
437
|
+
"evidence": [
|
|
438
|
+
"failing test output"
|
|
439
|
+
],
|
|
170
440
|
"context": {
|
|
171
|
-
"readFiles": [
|
|
172
|
-
|
|
173
|
-
|
|
441
|
+
"readFiles": [
|
|
442
|
+
"design.md",
|
|
443
|
+
"tasks.md",
|
|
444
|
+
"src/admin/BulkInvitePanel.tsx"
|
|
445
|
+
],
|
|
446
|
+
"commands": [
|
|
447
|
+
"npm test -- src/admin/BulkInvitePanel.test.tsx"
|
|
448
|
+
],
|
|
449
|
+
"notes": [
|
|
450
|
+
"UI must not hide ambiguous row states"
|
|
451
|
+
]
|
|
452
|
+
},
|
|
453
|
+
"reviews": {
|
|
454
|
+
"spec": "pass",
|
|
455
|
+
"code": "pass"
|
|
174
456
|
},
|
|
175
|
-
"reviews": { "spec": "pass", "code": "pass" },
|
|
176
457
|
"status": "passed",
|
|
177
458
|
"attempts": 1,
|
|
178
|
-
"maxRetries": 1
|
|
459
|
+
"maxRetries": 1,
|
|
460
|
+
"tddPhase": "red",
|
|
461
|
+
"verticalSlice": "Slice 3",
|
|
462
|
+
"testSeam": {
|
|
463
|
+
"entry": "bulk invite rules and admin upload UI behavior",
|
|
464
|
+
"behaviorAsserted": "mixed row outcomes are visible as UI failures before implementation",
|
|
465
|
+
"specStyleTestName": "mixed row outcomes are visible as UI failures before implementation",
|
|
466
|
+
"oneLogicalBehavior": true,
|
|
467
|
+
"publicVerificationPath": "Run the bulk invite rule and admin panel tests through their public flows",
|
|
468
|
+
"implementationDetailRisk": "low"
|
|
469
|
+
},
|
|
470
|
+
"feedbackLoop": {
|
|
471
|
+
"type": "automated-test",
|
|
472
|
+
"determinism": "deterministic",
|
|
473
|
+
"expectedFailure": "Fails before the behavior exists"
|
|
474
|
+
},
|
|
475
|
+
"allowedMocks": [
|
|
476
|
+
"file upload boundary",
|
|
477
|
+
"billing / seat limit boundary"
|
|
478
|
+
],
|
|
479
|
+
"testQuality": {
|
|
480
|
+
"usesPublicInterface": true,
|
|
481
|
+
"describesBehavior": true,
|
|
482
|
+
"specStyleName": true,
|
|
483
|
+
"oneLogicalBehavior": true,
|
|
484
|
+
"verifiesThroughPublicPath": true,
|
|
485
|
+
"survivesInternalRefactor": true,
|
|
486
|
+
"mocksOnlySystemBoundaries": true,
|
|
487
|
+
"noBulkRed": true
|
|
488
|
+
},
|
|
489
|
+
"greenMinimality": {
|
|
490
|
+
"guard": "Keep the task scoped to its stated verification evidence",
|
|
491
|
+
"noSpeculativeBranches": true
|
|
492
|
+
},
|
|
493
|
+
"completion": {
|
|
494
|
+
"command": "SCRIPT_ROOT=\".claude/skills/cc-do/scripts\"; if [[ ! -d \"$SCRIPT_ROOT\" && -d \".codex/skills/cc-do/scripts\" ]]; then SCRIPT_ROOT=\".codex/skills/cc-do/scripts\"; fi; bash \"$SCRIPT_ROOT\"/mark-task-complete.sh --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T003",
|
|
495
|
+
"requiredBeforeCompletion": [
|
|
496
|
+
"verification evidence captured",
|
|
497
|
+
"checkpoint written",
|
|
498
|
+
"spec review gate recorded",
|
|
499
|
+
"code review gate recorded"
|
|
500
|
+
],
|
|
501
|
+
"forbiddenShortcuts": [
|
|
502
|
+
"manual checkbox edit",
|
|
503
|
+
"manual manifest status edit",
|
|
504
|
+
"leaving currentTaskId stale"
|
|
505
|
+
]
|
|
506
|
+
},
|
|
507
|
+
"refactorCandidates": [
|
|
508
|
+
"duplication",
|
|
509
|
+
"long method",
|
|
510
|
+
"primitive obsession",
|
|
511
|
+
"naming",
|
|
512
|
+
"more than three nested branches"
|
|
513
|
+
]
|
|
179
514
|
},
|
|
180
515
|
{
|
|
181
516
|
"id": "T004",
|
|
@@ -183,23 +518,105 @@
|
|
|
183
518
|
"type": "IMPL",
|
|
184
519
|
"phase": 2,
|
|
185
520
|
"parallel": false,
|
|
186
|
-
"dependsOn": [
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
"
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
"
|
|
193
|
-
|
|
521
|
+
"dependsOn": [
|
|
522
|
+
"T003"
|
|
523
|
+
],
|
|
524
|
+
"touches": [
|
|
525
|
+
"admin-bulk-invite-ui"
|
|
526
|
+
],
|
|
527
|
+
"files": [
|
|
528
|
+
"src/admin/BulkInvitePanel.tsx"
|
|
529
|
+
],
|
|
530
|
+
"run": [
|
|
531
|
+
"npm test -- src/admin/BulkInvitePanel.test.tsx"
|
|
532
|
+
],
|
|
533
|
+
"checks": [
|
|
534
|
+
"admin panel tests pass"
|
|
535
|
+
],
|
|
536
|
+
"acceptance": [
|
|
537
|
+
"admins can see accepted, skipped, and rejected rows in the panel"
|
|
538
|
+
],
|
|
539
|
+
"verification": [
|
|
540
|
+
"npm test -- src/admin/BulkInvitePanel.test.tsx"
|
|
541
|
+
],
|
|
542
|
+
"evidence": [
|
|
543
|
+
"passing test output",
|
|
544
|
+
"review notes"
|
|
545
|
+
],
|
|
194
546
|
"context": {
|
|
195
|
-
"readFiles": [
|
|
196
|
-
|
|
197
|
-
|
|
547
|
+
"readFiles": [
|
|
548
|
+
"design.md",
|
|
549
|
+
"tasks.md",
|
|
550
|
+
"src/admin/BulkInvitePanel.test.tsx"
|
|
551
|
+
],
|
|
552
|
+
"commands": [
|
|
553
|
+
"npm test -- src/admin/BulkInvitePanel.test.tsx"
|
|
554
|
+
],
|
|
555
|
+
"notes": [
|
|
556
|
+
"surface row states without redefining backend truth"
|
|
557
|
+
]
|
|
558
|
+
},
|
|
559
|
+
"reviews": {
|
|
560
|
+
"spec": "pass",
|
|
561
|
+
"code": "pass"
|
|
198
562
|
},
|
|
199
|
-
"reviews": { "spec": "pass", "code": "pass" },
|
|
200
563
|
"status": "passed",
|
|
201
564
|
"attempts": 1,
|
|
202
|
-
"maxRetries": 1
|
|
565
|
+
"maxRetries": 1,
|
|
566
|
+
"tddPhase": "green",
|
|
567
|
+
"verticalSlice": "Slice 3",
|
|
568
|
+
"testSeam": {
|
|
569
|
+
"entry": "bulk invite rules and admin upload UI behavior",
|
|
570
|
+
"behaviorAsserted": "admins can see accepted, skipped, and rejected rows in the panel",
|
|
571
|
+
"specStyleTestName": "admins can see accepted, skipped, and rejected rows in the panel",
|
|
572
|
+
"oneLogicalBehavior": true,
|
|
573
|
+
"publicVerificationPath": "Run the bulk invite rule and admin panel tests through their public flows",
|
|
574
|
+
"implementationDetailRisk": "low"
|
|
575
|
+
},
|
|
576
|
+
"feedbackLoop": {
|
|
577
|
+
"type": "automated-test",
|
|
578
|
+
"determinism": "deterministic",
|
|
579
|
+
"expectedFailure": ""
|
|
580
|
+
},
|
|
581
|
+
"allowedMocks": [
|
|
582
|
+
"file upload boundary",
|
|
583
|
+
"billing / seat limit boundary"
|
|
584
|
+
],
|
|
585
|
+
"testQuality": {
|
|
586
|
+
"usesPublicInterface": true,
|
|
587
|
+
"describesBehavior": true,
|
|
588
|
+
"specStyleName": true,
|
|
589
|
+
"oneLogicalBehavior": true,
|
|
590
|
+
"verifiesThroughPublicPath": true,
|
|
591
|
+
"survivesInternalRefactor": true,
|
|
592
|
+
"mocksOnlySystemBoundaries": true,
|
|
593
|
+
"noBulkRed": true
|
|
594
|
+
},
|
|
595
|
+
"greenMinimality": {
|
|
596
|
+
"guard": "Implement only the code needed to pass the current red behavior",
|
|
597
|
+
"noSpeculativeBranches": true
|
|
598
|
+
},
|
|
599
|
+
"completion": {
|
|
600
|
+
"command": "SCRIPT_ROOT=\".claude/skills/cc-do/scripts\"; if [[ ! -d \"$SCRIPT_ROOT\" && -d \".codex/skills/cc-do/scripts\" ]]; then SCRIPT_ROOT=\".codex/skills/cc-do/scripts\"; fi; bash \"$SCRIPT_ROOT\"/mark-task-complete.sh --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T004",
|
|
601
|
+
"requiredBeforeCompletion": [
|
|
602
|
+
"verification evidence captured",
|
|
603
|
+
"checkpoint written",
|
|
604
|
+
"spec review gate recorded",
|
|
605
|
+
"code review gate recorded"
|
|
606
|
+
],
|
|
607
|
+
"forbiddenShortcuts": [
|
|
608
|
+
"manual checkbox edit",
|
|
609
|
+
"manual manifest status edit",
|
|
610
|
+
"leaving currentTaskId stale"
|
|
611
|
+
]
|
|
612
|
+
},
|
|
613
|
+
"refactorCandidates": [
|
|
614
|
+
"duplication",
|
|
615
|
+
"long method",
|
|
616
|
+
"primitive obsession",
|
|
617
|
+
"naming",
|
|
618
|
+
"more than three nested branches"
|
|
619
|
+
]
|
|
203
620
|
},
|
|
204
621
|
{
|
|
205
622
|
"id": "T005",
|
|
@@ -207,37 +624,148 @@
|
|
|
207
624
|
"type": "OTHER",
|
|
208
625
|
"phase": 3,
|
|
209
626
|
"parallel": false,
|
|
210
|
-
"dependsOn": [
|
|
211
|
-
|
|
212
|
-
|
|
627
|
+
"dependsOn": [
|
|
628
|
+
"T004"
|
|
629
|
+
],
|
|
630
|
+
"touches": [
|
|
631
|
+
"quality-gates"
|
|
632
|
+
],
|
|
633
|
+
"files": [
|
|
634
|
+
"src/admin/BulkInvitePanel.tsx",
|
|
635
|
+
"src/invite/bulk-import.ts"
|
|
636
|
+
],
|
|
213
637
|
"run": [
|
|
214
638
|
"npm test -- src/invite/bulk-import.test.ts",
|
|
215
639
|
"npm test -- src/admin/BulkInvitePanel.test.tsx"
|
|
216
640
|
],
|
|
217
|
-
"checks": [
|
|
218
|
-
|
|
641
|
+
"checks": [
|
|
642
|
+
"targeted tests pass",
|
|
643
|
+
"review evidence collected"
|
|
644
|
+
],
|
|
645
|
+
"acceptance": [
|
|
646
|
+
"fresh verification evidence exists for cc-check"
|
|
647
|
+
],
|
|
219
648
|
"verification": [
|
|
220
649
|
"npm test -- src/invite/bulk-import.test.ts",
|
|
221
650
|
"npm test -- src/admin/BulkInvitePanel.test.tsx"
|
|
222
651
|
],
|
|
223
|
-
"evidence": [
|
|
652
|
+
"evidence": [
|
|
653
|
+
"passing targeted test output",
|
|
654
|
+
"review notes"
|
|
655
|
+
],
|
|
224
656
|
"context": {
|
|
225
|
-
"readFiles": [
|
|
657
|
+
"readFiles": [
|
|
658
|
+
"tasks.md",
|
|
659
|
+
"task-manifest.json"
|
|
660
|
+
],
|
|
226
661
|
"commands": [
|
|
227
662
|
"npm test -- src/invite/bulk-import.test.ts",
|
|
228
663
|
"npm test -- src/admin/BulkInvitePanel.test.tsx"
|
|
229
664
|
],
|
|
230
|
-
"notes": [
|
|
665
|
+
"notes": [
|
|
666
|
+
"fresh evidence can still block if the design contract is incomplete"
|
|
667
|
+
]
|
|
668
|
+
},
|
|
669
|
+
"reviews": {
|
|
670
|
+
"spec": "pass",
|
|
671
|
+
"code": "pass"
|
|
231
672
|
},
|
|
232
|
-
"reviews": { "spec": "pass", "code": "pass" },
|
|
233
673
|
"status": "passed",
|
|
234
674
|
"attempts": 1,
|
|
235
|
-
"maxRetries": 1
|
|
675
|
+
"maxRetries": 1,
|
|
676
|
+
"tddPhase": "evidence",
|
|
677
|
+
"verticalSlice": "Slice 3",
|
|
678
|
+
"testSeam": {
|
|
679
|
+
"entry": "bulk invite rules and admin upload UI behavior",
|
|
680
|
+
"behaviorAsserted": "fresh verification evidence exists for cc-check",
|
|
681
|
+
"specStyleTestName": "fresh verification evidence exists for cc-check",
|
|
682
|
+
"oneLogicalBehavior": true,
|
|
683
|
+
"publicVerificationPath": "Run the bulk invite rule and admin panel tests through their public flows",
|
|
684
|
+
"implementationDetailRisk": "low"
|
|
685
|
+
},
|
|
686
|
+
"feedbackLoop": {
|
|
687
|
+
"type": "automated-test",
|
|
688
|
+
"determinism": "deterministic",
|
|
689
|
+
"expectedFailure": ""
|
|
690
|
+
},
|
|
691
|
+
"allowedMocks": [
|
|
692
|
+
"file upload boundary",
|
|
693
|
+
"billing / seat limit boundary"
|
|
694
|
+
],
|
|
695
|
+
"testQuality": {
|
|
696
|
+
"usesPublicInterface": true,
|
|
697
|
+
"describesBehavior": true,
|
|
698
|
+
"specStyleName": true,
|
|
699
|
+
"oneLogicalBehavior": true,
|
|
700
|
+
"verifiesThroughPublicPath": true,
|
|
701
|
+
"survivesInternalRefactor": true,
|
|
702
|
+
"mocksOnlySystemBoundaries": true,
|
|
703
|
+
"noBulkRed": true
|
|
704
|
+
},
|
|
705
|
+
"greenMinimality": {
|
|
706
|
+
"guard": "Keep the task scoped to its stated verification evidence",
|
|
707
|
+
"noSpeculativeBranches": true
|
|
708
|
+
},
|
|
709
|
+
"completion": {
|
|
710
|
+
"command": "SCRIPT_ROOT=\".claude/skills/cc-do/scripts\"; if [[ ! -d \"$SCRIPT_ROOT\" && -d \".codex/skills/cc-do/scripts\" ]]; then SCRIPT_ROOT=\".codex/skills/cc-do/scripts\"; fi; bash \"$SCRIPT_ROOT\"/mark-task-complete.sh --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T005",
|
|
711
|
+
"requiredBeforeCompletion": [
|
|
712
|
+
"verification evidence captured",
|
|
713
|
+
"checkpoint written",
|
|
714
|
+
"spec review gate recorded",
|
|
715
|
+
"code review gate recorded"
|
|
716
|
+
],
|
|
717
|
+
"forbiddenShortcuts": [
|
|
718
|
+
"manual checkbox edit",
|
|
719
|
+
"manual manifest status edit",
|
|
720
|
+
"leaving currentTaskId stale"
|
|
721
|
+
]
|
|
722
|
+
},
|
|
723
|
+
"refactorCandidates": [
|
|
724
|
+
"duplication",
|
|
725
|
+
"long method",
|
|
726
|
+
"primitive obsession",
|
|
727
|
+
"naming",
|
|
728
|
+
"more than three nested branches"
|
|
729
|
+
]
|
|
236
730
|
}
|
|
237
731
|
],
|
|
238
732
|
"metadata": {
|
|
239
733
|
"source": "tasks.md",
|
|
240
734
|
"generatedBy": "docs-example",
|
|
241
735
|
"planVersion": 1
|
|
736
|
+
},
|
|
737
|
+
"executionProtocol": {
|
|
738
|
+
"templateCompliance": {
|
|
739
|
+
"required": true,
|
|
740
|
+
"sourceTemplate": "assets/TASKS_TEMPLATE.md",
|
|
741
|
+
"taskBlockMustInclude": [
|
|
742
|
+
"Goal",
|
|
743
|
+
"TDD phase",
|
|
744
|
+
"Files",
|
|
745
|
+
"Read first",
|
|
746
|
+
"Verification",
|
|
747
|
+
"Evidence",
|
|
748
|
+
"Test seam",
|
|
749
|
+
"Public verification path",
|
|
750
|
+
"Allowed mocks",
|
|
751
|
+
"Completion"
|
|
752
|
+
],
|
|
753
|
+
"titleOnlyTasks": "forbidden"
|
|
754
|
+
},
|
|
755
|
+
"selection": {
|
|
756
|
+
"sourceOfTruth": "planning/task-manifest.json.currentTaskId",
|
|
757
|
+
"commandTemplate": "SCRIPT_ROOT=\".claude/skills/cc-do/scripts\"; if [[ ! -d \"$SCRIPT_ROOT\" && -d \".codex/skills/cc-do/scripts\" ]]; then SCRIPT_ROOT=\".codex/skills/cc-do/scripts\"; fi; bash \"$SCRIPT_ROOT\"/select-ready-tasks.sh --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json"
|
|
758
|
+
},
|
|
759
|
+
"completion": {
|
|
760
|
+
"manualStatusEdit": "forbidden",
|
|
761
|
+
"commandTemplate": "SCRIPT_ROOT=\".claude/skills/cc-do/scripts\"; if [[ ! -d \"$SCRIPT_ROOT\" && -d \".codex/skills/cc-do/scripts\" ]]; then SCRIPT_ROOT=\".codex/skills/cc-do/scripts\"; fi; bash \"$SCRIPT_ROOT\"/mark-task-complete.sh --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task <task-id>",
|
|
762
|
+
"failurePolicy": "Do not hand-edit status; fix missing checkpoint, review gate, or dependency evidence and rerun the script.",
|
|
763
|
+
"updates": [
|
|
764
|
+
"planning/task-manifest.json.tasks[].status",
|
|
765
|
+
"planning/task-manifest.json.currentTaskId",
|
|
766
|
+
"planning/task-manifest.json.status",
|
|
767
|
+
"planning/tasks.md checkbox"
|
|
768
|
+
]
|
|
769
|
+
}
|
|
242
770
|
}
|
|
243
771
|
}
|