specsmd 0.0.0-dev.8 → 0.0.0-dev.80

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.
Files changed (77) hide show
  1. package/README.md +175 -231
  2. package/flows/aidlc/commands/construction-agent.md +5 -1
  3. package/flows/aidlc/commands/inception-agent.md +4 -0
  4. package/flows/aidlc/commands/master-agent.md +4 -0
  5. package/flows/aidlc/commands/operations-agent.md +4 -0
  6. package/flows/aidlc/memory-bank.yaml +2 -1
  7. package/{scripts/artifact-validator.js → flows/aidlc/scripts/artifact-validator.cjs} +3 -3
  8. package/{scripts/bolt-complete.js → flows/aidlc/scripts/bolt-complete.cjs} +36 -5
  9. package/{scripts/status-integrity.js → flows/aidlc/scripts/status-integrity.cjs} +5 -5
  10. package/flows/aidlc/skills/construction/bolt-list.md +1 -1
  11. package/flows/aidlc/skills/construction/bolt-start.md +3 -3
  12. package/flows/aidlc/skills/construction/bolt-status.md +1 -1
  13. package/flows/aidlc/skills/construction/prototype-apply.md +311 -0
  14. package/flows/aidlc/skills/inception/bolt-plan.md +2 -0
  15. package/flows/aidlc/skills/inception/vibe-to-spec.md +410 -0
  16. package/flows/aidlc/skills/master/analyze-context.md +1 -1
  17. package/flows/aidlc/templates/construction/bolt-template.md +2 -2
  18. package/flows/aidlc/templates/construction/bolt-types/ddd-construction-bolt.md +73 -11
  19. package/flows/aidlc/templates/standards/decision-index-template.md +32 -0
  20. package/flows/fire/README.md +19 -0
  21. package/flows/fire/agents/builder/agent.md +260 -0
  22. package/flows/fire/agents/builder/skills/code-review/SKILL.md +257 -0
  23. package/flows/fire/agents/builder/skills/code-review/references/auto-fix-rules.md +218 -0
  24. package/flows/fire/agents/builder/skills/code-review/references/review-categories.md +154 -0
  25. package/flows/fire/agents/builder/skills/code-review/templates/review-report.md.hbs +120 -0
  26. package/flows/fire/agents/builder/skills/run-execute/SKILL.md +705 -0
  27. package/flows/fire/agents/builder/skills/run-execute/scripts/complete-run.cjs +781 -0
  28. package/flows/fire/agents/builder/skills/run-execute/scripts/init-run.cjs +457 -0
  29. package/flows/fire/agents/builder/skills/run-execute/scripts/update-phase.cjs +239 -0
  30. package/flows/fire/agents/builder/skills/run-execute/templates/plan.md.hbs +61 -0
  31. package/flows/fire/agents/builder/skills/run-execute/templates/test-report.md.hbs +81 -0
  32. package/flows/fire/agents/builder/skills/run-plan/SKILL.md +378 -0
  33. package/flows/fire/agents/builder/skills/run-status/SKILL.md +96 -0
  34. package/flows/fire/agents/builder/skills/walkthrough-generate/SKILL.md +264 -0
  35. package/flows/fire/agents/builder/skills/walkthrough-generate/templates/walkthrough.md.hbs +176 -0
  36. package/flows/fire/agents/orchestrator/agent.md +144 -0
  37. package/flows/fire/agents/orchestrator/skills/project-init/SKILL.md +226 -0
  38. package/flows/fire/agents/orchestrator/skills/project-init/templates/coding-standards.md.hbs +149 -0
  39. package/flows/fire/agents/orchestrator/skills/project-init/templates/constitution.md.hbs +43 -0
  40. package/flows/fire/agents/orchestrator/skills/project-init/templates/system-architecture.md.hbs +101 -0
  41. package/flows/fire/agents/orchestrator/skills/project-init/templates/tech-stack.md.hbs +136 -0
  42. package/flows/fire/agents/orchestrator/skills/project-init/templates/testing-standards.md.hbs +94 -0
  43. package/flows/fire/agents/orchestrator/skills/route/SKILL.md +146 -0
  44. package/flows/fire/agents/orchestrator/skills/status/SKILL.md +696 -0
  45. package/flows/fire/agents/planner/agent.md +143 -0
  46. package/flows/fire/agents/planner/skills/design-doc-generate/SKILL.md +156 -0
  47. package/flows/fire/agents/planner/skills/design-doc-generate/templates/design.md.hbs +124 -0
  48. package/flows/fire/agents/planner/skills/intent-capture/SKILL.md +125 -0
  49. package/flows/fire/agents/planner/skills/intent-capture/templates/brief.md.hbs +40 -0
  50. package/flows/fire/agents/planner/skills/work-item-decompose/SKILL.md +166 -0
  51. package/flows/fire/agents/planner/skills/work-item-decompose/templates/work-item.md.hbs +40 -0
  52. package/flows/fire/commands/fire-builder.md +56 -0
  53. package/flows/fire/commands/fire-planner.md +48 -0
  54. package/flows/fire/commands/fire.md +46 -0
  55. package/flows/fire/memory-bank.yaml +240 -0
  56. package/flows/fire/quick-start.md +146 -0
  57. package/flows/simple/README.md +190 -0
  58. package/flows/simple/agents/agent.md +404 -0
  59. package/flows/simple/commands/agent.md +60 -0
  60. package/flows/simple/context-config.yaml +34 -0
  61. package/flows/simple/memory-bank.yaml +66 -0
  62. package/flows/simple/quick-start.md +231 -0
  63. package/flows/simple/skills/design.md +96 -0
  64. package/flows/simple/skills/execute.md +190 -0
  65. package/flows/simple/skills/requirements.md +94 -0
  66. package/flows/simple/skills/tasks.md +136 -0
  67. package/flows/simple/templates/design-template.md +138 -0
  68. package/flows/simple/templates/requirements-template.md +85 -0
  69. package/flows/simple/templates/tasks-template.md +104 -0
  70. package/lib/analytics/tracker.js +6 -2
  71. package/lib/constants.js +20 -8
  72. package/lib/installer.js +19 -15
  73. package/lib/installers/KiroInstaller.js +55 -0
  74. package/lib/installers/OpenCodeInstaller.js +9 -1
  75. package/lib/installers/ToolInstaller.js +4 -1
  76. package/lib/installers/WindsurfInstaller.js +0 -54
  77. package/package.json +3 -52
@@ -115,11 +115,11 @@
115
115
  *
116
116
  * From agent skill (bolt-start.md Step 10):
117
117
  *
118
- * node .specsmd/scripts/bolt-complete.js 016-analytics-tracker
118
+ * node .specsmd/aidlc/scripts/bolt-complete.cjs 016-analytics-tracker
119
119
  *
120
120
  * With optional stage name:
121
121
  *
122
- * node .specsmd/scripts/bolt-complete.js 016-analytics-tracker --last-stage test
122
+ * node .specsmd/aidlc/scripts/bolt-complete.cjs 016-analytics-tracker --last-stage test
123
123
  *
124
124
  * ═══════════════════════════════════════════════════════════════════════════════
125
125
  */
@@ -510,6 +510,29 @@ async function updateIntentStatus(bolt) {
510
510
  return { updated: false };
511
511
  }
512
512
 
513
+ /**
514
+ * Validate bolt status before allowing completion
515
+ *
516
+ * Pre-flight checks to ensure:
517
+ * - Bolt is in "in-progress" status (can't complete already-complete or not-started bolts)
518
+ * - Bolt has not already been completed
519
+ */
520
+ function validateBoltStatus(bolt) {
521
+ const status = bolt.frontmatter.status || 'unknown';
522
+
523
+ // Cannot complete a bolt that's already complete
524
+ if (status === 'complete') {
525
+ return { valid: false, reason: 'Bolt is already complete' };
526
+ }
527
+
528
+ // Bolt should be in-progress before completing
529
+ if (status !== 'in-progress') {
530
+ return { valid: false, reason: `Bolt status is "${status}", expected "in-progress"` };
531
+ }
532
+
533
+ return { valid: true };
534
+ }
535
+
513
536
  /**
514
537
  * Main: Mark bolt as complete with all dependent updates
515
538
  */
@@ -522,6 +545,14 @@ async function boltMarkComplete(boltId, lastStage) {
522
545
  // Step 1: Read bolt file
523
546
  const bolt = await readBolt(boltId);
524
547
 
548
+ // Step 1.5: Validate bolt status before proceeding
549
+ const validation = validateBoltStatus(bolt);
550
+ if (!validation.valid) {
551
+ console.error(`\n${colors.red}Error:${colors.reset} ${validation.reason}`);
552
+ console.error(`${colors.dim}Use bolt-status command to check current state.${colors.reset}`);
553
+ return 1;
554
+ }
555
+
525
556
  console.log(`${colors.dim}Bolt: ${bolt.id}${colors.reset}`);
526
557
  console.log(`${colors.dim}Intent: ${bolt.frontmatter.intent}${colors.reset}`);
527
558
  console.log(`${colors.dim}Unit: ${bolt.frontmatter.unit}${colors.reset}`);
@@ -537,11 +568,11 @@ async function boltMarkComplete(boltId, lastStage) {
537
568
  console.log(`\n${colors.dim}Stories: ${colors.green}${storyResults.updated} updated${colors.reset}, ${colors.dim}${storyResults.skipped} skipped${colors.reset}${storyResults.errors > 0 ? `, ${colors.red}${storyResults.errors} errors${colors.reset}` : ''}\n`);
538
569
 
539
570
  // Step 4: Update unit status
540
- const unitResult = await updateUnitStatus(bolt);
571
+ await updateUnitStatus(bolt);
541
572
  console.log();
542
573
 
543
574
  // Step 5: Update intent status
544
- const intentResult = await updateIntentStatus(bolt);
575
+ await updateIntentStatus(bolt);
545
576
  console.log();
546
577
 
547
578
  // Final summary
@@ -563,7 +594,7 @@ const lastStage = process.argv['--last-stage'] || null;
563
594
 
564
595
  if (!boltId) {
565
596
  console.error(`${colors.red}Error:${colors.reset} Bolt ID required`);
566
- console.error(`${colors.dim}Usage: node bolt-complete.js <bolt-id> [--last-stage <stage-name>]${colors.reset}`);
597
+ console.error(`${colors.dim}Usage: node bolt-complete.cjs <bolt-id> [--last-stage <stage-name>]${colors.reset}`);
567
598
  process.exit(1);
568
599
  }
569
600
 
@@ -7,8 +7,8 @@
7
7
  * Status must cascade correctly: Bolt complete → Stories complete → Unit complete → Intent complete
8
8
  *
9
9
  * Usage:
10
- * node .specsmd/scripts/status-integrity.js
11
- * node .specsmd/scripts/status-integrity.js --fix
10
+ * node .specsmd/aidlc/scripts/status-integrity.cjs
11
+ * node .specsmd/aidlc/scripts/status-integrity.cjs --fix
12
12
  *
13
13
  * Cross-platform: Works on Linux, macOS, Windows via Node.js
14
14
  */
@@ -577,15 +577,15 @@ const shouldFix = args.includes('--fix') || args.includes('-f');
577
577
 
578
578
  if (args.includes('--help') || args.includes('-h')) {
579
579
  console.log(`
580
- Usage: node status-integrity.js [options]
580
+ Usage: node status-integrity.cjs [options]
581
581
 
582
582
  Options:
583
583
  --fix, -f Automatically fix status inconsistencies
584
584
  --help, -h Show this help message
585
585
 
586
586
  Examples:
587
- node .specsmd/scripts/status-integrity.js
588
- node .specsmd/scripts/status-integrity.js --fix
587
+ node .specsmd/aidlc/scripts/status-integrity.cjs
588
+ node .specsmd/aidlc/scripts/status-integrity.cjs --fix
589
589
  `);
590
590
  process.exit(0);
591
591
  }
@@ -52,7 +52,7 @@ For each bolt, determine progress:
52
52
 
53
53
  - **planned**: 0% - Not started
54
54
  - **in-progress**: `stages_completed / total_stages`
55
- - **completed**: 100%
55
+ - **complete**: 100%
56
56
  - **blocked**: Show blocker reason
57
57
 
58
58
  ### 5. Display Results
@@ -194,7 +194,7 @@ If the bolt type specifies automatic validation criteria, follow those rules.
194
194
  ┌─────────────────────────────────────────────────────────────┐
195
195
  │ FINAL STAGE DETECTED │
196
196
  │ → Re-read Step 10 NOW │
197
- │ → You MUST run: node .specsmd/scripts/bolt-complete.js
197
+ │ → You MUST run: node .specsmd/aidlc/scripts/bolt-complete.cjs
198
198
  │ → Do NOT manually edit story files │
199
199
  └─────────────────────────────────────────────────────────────┘
200
200
  ```
@@ -235,7 +235,7 @@ stages_completed:
235
235
  ⛔ HARD GATE - SCRIPT EXECUTION REQUIRED
236
236
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
237
237
  You CANNOT report bolt completion without:
238
- 1. Running the bolt-complete.js script
238
+ 1. Running the bolt-complete.cjs script
239
239
  2. Showing the script output to the user
240
240
 
241
241
  If you skip this, the memory-bank becomes inconsistent.
@@ -245,7 +245,7 @@ Do NOT manually edit story files - the script handles everything.
245
245
  **Run this command:**
246
246
 
247
247
  ```bash
248
- node .specsmd/scripts/bolt-complete.js {bolt-id}
248
+ node .specsmd/aidlc/scripts/bolt-complete.cjs {bolt-id}
249
249
  ```
250
250
 
251
251
  **What this command does (deterministically):**
@@ -81,7 +81,7 @@ Check for issues:
81
81
  - **Unit**: `{unit-name}`
82
82
  - **Intent**: `{intent-name}`
83
83
  - **Type**: {bolt-type}
84
- - **Status**: {planned|in-progress|completed|blocked}
84
+ - **Status**: {planned|in-progress|complete|blocked}
85
85
 
86
86
  ### Progress
87
87
  [██████████░░░░░░░░░░] 50% (2/4 stages)
@@ -0,0 +1,311 @@
1
+ # Skill: Prototype Apply
2
+
3
+ ---
4
+
5
+ ## Goal
6
+
7
+ Apply a vibe-coded prototype's design and components to the real implementation during bolt execution. This skill bridges the gap between extracted prototype specifications and production code.
8
+
9
+ ---
10
+
11
+ ## When to Use
12
+
13
+ Use this skill when:
14
+
15
+ - A bolt references a prototype in its scope
16
+ - You need to implement UI that matches a prototype screenshot
17
+ - The design system from vibe-to-spec should be applied to code
18
+ - Visual acceptance criteria reference prototype screens
19
+
20
+ ---
21
+
22
+ ## Input
23
+
24
+ - **Required**: Bolt ID currently being executed
25
+ - **Required**: Prototype reference (path or name)
26
+ - **Optional**: Specific screen to implement
27
+ - **Optional**: Component to focus on
28
+
29
+ **Prerequisite**: The **vibe-to-spec** skill must have been run on this prototype during Inception.
30
+
31
+ ---
32
+
33
+ ## Process
34
+
35
+ ### Step 1: Load Prototype Context
36
+
37
+ Load all relevant prototype artifacts:
38
+
39
+ ```text
40
+ ## Loading Prototype Context
41
+
42
+ Prototype: {prototype-name}
43
+ Bolt: {bolt-id}
44
+
45
+ ### Available Artifacts
46
+ - [ ] design-system.md - {loaded/not found}
47
+ - [ ] component-catalog.md - {loaded/not found}
48
+ - [ ] screen-inventory.md - {loaded/not found}
49
+ - [ ] user-flows.md - {loaded/not found}
50
+
51
+ ### Bolt Scope Match
52
+ Matching prototype screens to bolt scope:
53
+ - {screen-1} → {story-1}
54
+ - {screen-2} → {story-2}
55
+ ```
56
+
57
+ ---
58
+
59
+ ### Step 2: Extract Implementation Requirements
60
+
61
+ From the prototype artifacts, extract what needs to be built:
62
+
63
+ ```markdown
64
+ ## Implementation Requirements
65
+
66
+ ### Screen: {screen-name}
67
+ **Prototype Source**: {screenshot-path}
68
+ **Target Location**: {src/path/to/component}
69
+
70
+ ### Design Tokens to Apply
71
+ ```typescript
72
+ // From prototype design-system.md
73
+ const tokens = {
74
+ colors: {
75
+ primary: '{hex}',
76
+ secondary: '{hex}',
77
+ background: '{hex}',
78
+ // ...
79
+ },
80
+ typography: {
81
+ fontFamily: '{font}',
82
+ // ...
83
+ },
84
+ spacing: {
85
+ xs: '{px}',
86
+ // ...
87
+ }
88
+ }
89
+ ```
90
+
91
+ ### Components to Implement
92
+
93
+ | Component | Prototype Ref | Target File | Status |
94
+ |-----------|---------------|-------------|--------|
95
+ | {Sidebar} | screen-2.png | Sidebar.tsx | pending |
96
+ | {ChatList} | screen-2.png | ChatList.tsx | pending |
97
+ | {MessageBubble} | screen-3.png | MessageBubble.tsx | pending |
98
+
99
+ ### Layout Structure
100
+
101
+ ```
102
+ {ASCII representation of layout from prototype}
103
+ ┌─────────────────────────────────────────┐
104
+ │ Header │
105
+ ├──────────┬──────────────────────────────┤
106
+ │ Sidebar │ Main Content │
107
+ │ │ │
108
+ │ │ │
109
+ ├──────────┴──────────────────────────────┤
110
+ │ Footer / Input Area │
111
+ └─────────────────────────────────────────┘
112
+ ```
113
+
114
+ ```
115
+
116
+ ---
117
+
118
+ ### Step 3: Map to Project Standards
119
+
120
+ Cross-reference with project standards:
121
+
122
+ ```markdown
123
+ ## Standards Alignment
124
+
125
+ ### Tech Stack Match
126
+ - **Prototype suggests**: {vanilla CSS / Tailwind / etc.}
127
+ - **Project standard**: {from tech-stack.md}
128
+ - **Action**: {adapt prototype to use project's styling approach}
129
+
130
+ ### Component Library Match
131
+ - **Prototype components**: {custom / Bootstrap / etc.}
132
+ - **Project standard**: {from tech-stack.md}
133
+ - **Action**: {map prototype components to project's component library}
134
+
135
+ ### Coding Standards
136
+ - **File naming**: {from coding-standards.md}
137
+ - **Component structure**: {from coding-standards.md}
138
+ ```
139
+
140
+ ---
141
+
142
+ ### Step 4: Generate Implementation Code
143
+
144
+ Generate code that matches the prototype while following project standards.
145
+
146
+ **IMPORTANT**: If the `/frontend-design` skill is available, invoke it for high-quality, production-grade frontend code that avoids generic AI aesthetics. The frontend-design skill specializes in creating distinctive, polished UI components.
147
+
148
+ **For each component**:
149
+
150
+ 1. **Analyze prototype visually** (use screenshot)
151
+ 2. **Extract structure from HTML** (if available)
152
+ 3. **Apply project's styling approach**
153
+ 4. **Ensure accessibility**
154
+ 5. **Add responsive behavior**
155
+
156
+ ```typescript
157
+ // Example output structure
158
+ /**
159
+ * Component: {ComponentName}
160
+ * Prototype: {screenshot-reference}
161
+ *
162
+ * Visual acceptance criteria:
163
+ * - {criterion from prototype}
164
+ * - {criterion from prototype}
165
+ */
166
+ export function ComponentName({ props }: Props) {
167
+ // Implementation matching prototype
168
+ }
169
+ ```
170
+
171
+ ---
172
+
173
+ ### Step 5: Visual Verification Checklist
174
+
175
+ Create a verification checklist comparing implementation to prototype:
176
+
177
+ ```markdown
178
+ ## Visual Verification: {screen-name}
179
+
180
+ ### Layout
181
+ - [ ] Overall structure matches prototype
182
+ - [ ] Spacing between elements is consistent
183
+ - [ ] Responsive breakpoints work correctly
184
+
185
+ ### Colors
186
+ - [ ] Primary color matches: {hex}
187
+ - [ ] Background color matches: {hex}
188
+ - [ ] Text colors match design system
189
+
190
+ ### Typography
191
+ - [ ] Font family applied correctly
192
+ - [ ] Font sizes match design system
193
+ - [ ] Font weights are correct
194
+
195
+ ### Components
196
+ - [ ] {Component-1} matches prototype
197
+ - [ ] {Component-2} matches prototype
198
+ - [ ] Interactive states (hover, focus, active) implemented
199
+
200
+ ### Interactions
201
+ - [ ] {Interaction-1} works as shown in flow
202
+ - [ ] {Interaction-2} works as shown in flow
203
+
204
+ ### Screenshots for Comparison
205
+ - Prototype: `{prototype-path}`
206
+ - Implementation: `{screenshot after implementation}`
207
+ ```
208
+
209
+ ---
210
+
211
+ ## Output
212
+
213
+ ### Implementation Summary
214
+
215
+ ```markdown
216
+ ## Prototype Applied: {screen-name}
217
+
218
+ ### Components Implemented
219
+ | Component | File | Lines | Status |
220
+ |-----------|------|-------|--------|
221
+ | {Sidebar} | src/components/Sidebar.tsx | 45-120 | complete |
222
+ | {ChatList} | src/components/ChatList.tsx | 1-80 | complete |
223
+
224
+ ### Design System Applied
225
+ - Color tokens: {n} applied
226
+ - Typography: {n} styles applied
227
+ - Spacing: {n} values applied
228
+
229
+ ### Deviations from Prototype
230
+ | Aspect | Prototype | Implementation | Reason |
231
+ |--------|-----------|----------------|--------|
232
+ | {color} | #xxx | #yyy | Project standard |
233
+ | {font} | Inter | system-ui | Performance |
234
+
235
+ ### Visual Verification
236
+ - [ ] Side-by-side comparison reviewed
237
+ - [ ] Responsive behavior verified
238
+ - [ ] Accessibility checked
239
+
240
+ ### Files Modified
241
+ - `{file-1}` - {description}
242
+ - `{file-2}` - {description}
243
+
244
+ ### Next Steps
245
+ 1 - Continue with next screen
246
+ 2 - Run visual regression tests
247
+ 3 - Review with stakeholder
248
+ ```
249
+
250
+ ---
251
+
252
+ ## Integration with Bolt Workflow
253
+
254
+ ### During DDD Construction Bolt
255
+
256
+ In the **Implement** stage:
257
+
258
+ 1. Load prototype context for relevant screens
259
+ 2. Generate components matching prototype
260
+ 3. Apply design system tokens
261
+ 4. Create visual verification checklist
262
+
263
+ ### During Simple Construction Bolt
264
+
265
+ In the **Implement** stage:
266
+
267
+ 1. Reference prototype for UI components
268
+ 2. Use extracted design tokens
269
+ 3. Follow component catalog structure
270
+
271
+ ---
272
+
273
+ ## Visual Diff Support
274
+
275
+ When available, use UI diff tools to compare:
276
+
277
+ ```text
278
+ ## Visual Diff Report
279
+
280
+ ### Screen: {screen-name}
281
+ - Prototype: {prototype-screenshot}
282
+ - Implementation: {current-screenshot}
283
+ - Diff: {highlighted differences}
284
+
285
+ ### Discrepancies Found
286
+ 1. {location}: {expected} vs {actual}
287
+ 2. {location}: {expected} vs {actual}
288
+
289
+ ### Action Required
290
+ - [ ] Fix discrepancy 1
291
+ - [ ] Fix discrepancy 2
292
+ - [ ] Accept as intentional deviation
293
+ ```
294
+
295
+ ---
296
+
297
+ ## Test Contract
298
+
299
+ ```yaml
300
+ input:
301
+ - Bolt ID with prototype reference
302
+ - Prototype artifacts from vibe-to-spec
303
+ output:
304
+ - Implementation code matching prototype
305
+ - Visual verification checklist
306
+ - Deviation documentation
307
+ integration:
308
+ - Works within bolt execution flow
309
+ - References design-system.md
310
+ - Follows project standards
311
+ ```
@@ -290,6 +290,7 @@ Establish execution order based on dependencies:
290
290
  Check the plan against:
291
291
 
292
292
  **Frontmatter Validation (CRITICAL - check each bolt.md)**:
293
+
293
294
  - [ ] `id` - Bolt identifier present
294
295
  - [ ] `unit` - Parent unit ID present
295
296
  - [ ] `intent` - Parent intent ID present
@@ -302,6 +303,7 @@ Check the plan against:
302
303
  - [ ] `complexity` - Complexity block with all 4 fields
303
304
 
304
305
  **Content Validation**:
306
+
305
307
  - [ ] All stories are assigned to bolts
306
308
  - [ ] Dependencies are respected (bolt-to-bolt AND unit-to-unit)
307
309
  - [ ] Each bolt has clear outputs