project-iris 0.3.0 → 0.3.1

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.
@@ -159,9 +159,22 @@ Based on bolt state:
159
159
  - **completed** → Inform user bolt is done
160
160
  - **blocked** → Show blocker, ask how to resolve
161
161
 
162
- ### 6. Update Bolt File on Start (CRITICAL - DO FIRST)
162
+ ### 6. Update Bolt File on Start (CRITICAL - HARD GATE)
163
163
 
164
- **⚠️ BEFORE any stage work begins, update the bolt file IMMEDIATELY.**
164
+ **⛔ HARD GATE - MUST EXECUTE BEFORE ANY STAGE WORK**
165
+
166
+ ```text
167
+ ┌─────────────────────────────────────────────────────────────┐
168
+ │ BOLT FILE UPDATE - NON-NEGOTIABLE │
169
+ │ │
170
+ │ You CANNOT proceed to stage work until you have: │
171
+ │ 1. Used the Edit tool to update bolt.md │
172
+ │ 2. Verified the edit was applied │
173
+ │ 3. Shown the user confirmation of the update │
174
+ │ │
175
+ │ This is a BLOCKING GATE - no exceptions. │
176
+ └─────────────────────────────────────────────────────────────┘
177
+ ```
165
178
 
166
179
  When transitioning from `planned` to `in-progress`:
167
180
 
@@ -173,11 +186,23 @@ current_stage: {first-stage} # was: null (e.g., "domain-design")
173
186
  ---
174
187
  ```
175
188
 
176
- **This is NON-NEGOTIABLE.** The bolt file must reflect that work has begun before any stage activities start. This ensures:
189
+ **Verification Output (REQUIRED):**
190
+
191
+ After editing, output this confirmation to the user:
192
+
193
+ ```text
194
+ ✅ Bolt file updated: {bolt-id}/bolt.md
195
+ - status: planned → in-progress
196
+ - started: {timestamp}
197
+ - current_stage: {stage-name}
198
+ ```
199
+
200
+ **Why This Gate Exists:**
177
201
 
178
202
  1. Progress is tracked even if execution is interrupted
179
203
  2. Other tools/agents see accurate status
180
204
  3. Resumption works correctly
205
+ 4. **Prevents "Lost in the Middle" bug where updates are skipped**
181
206
 
182
207
  **Also update construction log** (see "Update Construction Log" section below).
183
208
 
@@ -216,26 +241,53 @@ For the current stage, follow the bolt type definition:
216
241
  - Use templates if specified by bolt type
217
242
  - Place in correct paths per schema
218
243
 
219
- ### 7b. Story-by-Story Execution (Code Generation Stages)
244
+ ### 7b. Story-by-Story Execution (Code Generation Stages) - HARD GATE
220
245
 
221
- **⛔ CRITICAL**: When executing stages that involve code generation (e.g., Stage 4 in DDD bolts), process stories SEQUENTIALLY:
246
+ **⛔ HARD GATE - SEQUENTIAL STORY EXECUTION REQUIRED**
222
247
 
223
248
  ```text
224
249
  ┌─────────────────────────────────────────────────────────────┐
225
- │ STORY-BY-STORY EXECUTION
250
+ │ STORY-BY-STORY EXECUTION - NON-NEGOTIABLE
226
251
  │ │
227
- For EACH story in bolt's stories array:
228
- 1. Announce: "⏳ Story {n}/{total}: {story-id}"
229
- 2. Read story file for acceptance criteria
230
- │ 3. Implement code for that story │
231
- │ 4. Update stories_progress in bolt file │
232
- │ 5. Announce: "✅ Story {story-id}: Implemented" │
252
+ FORBIDDEN: Implementing multiple stories at once
253
+ FORBIDDEN: Skipping story file reads
254
+ FORBIDDEN: Not updating stories_progress in bolt file
233
255
  │ │
234
- DO NOT batch implement - track each story individually!
256
+ You MUST process stories ONE AT A TIME in sequence.
257
+ │ Each story requires its own announce → read → implement → │
258
+ │ update cycle. Batch implementation = broken traceability. │
235
259
  └─────────────────────────────────────────────────────────────┘
236
260
  ```
237
261
 
238
- **Story Progress Display (show after each story)**:
262
+ **For EACH story in bolt's stories array, execute this exact sequence:**
263
+
264
+ ```text
265
+ ┌─────────────────────────────────────────────────────────────┐
266
+ │ STORY EXECUTION LOOP (repeat for each story) │
267
+ │ │
268
+ │ STEP A: Announce start │
269
+ │ Output: "⏳ Story {n}/{total}: {story-id} - {title}" │
270
+ │ │
271
+ │ STEP B: Read story file (MANDATORY) │
272
+ │ Action: Read {intent}/units/{unit}/stories/{story-id}.md │
273
+ │ Purpose: Extract acceptance criteria for implementation │
274
+ │ │
275
+ │ STEP C: Implement code for THIS story only │
276
+ │ Action: Create/modify code to satisfy acceptance criteria │
277
+ │ Add traceability: // Story: {story-id} │
278
+ │ │
279
+ │ STEP D: Update bolt file stories_progress (MANDATORY) │
280
+ │ Action: Edit bolt.md to mark story as completed │
281
+ │ │
282
+ │ STEP E: Announce completion │
283
+ │ Output: "✅ Story {story-id}: Implemented → `{files}`" │
284
+ │ │
285
+ │ STEP F: Show updated progress list │
286
+ │ Then proceed to next story (back to STEP A) │
287
+ └─────────────────────────────────────────────────────────────┘
288
+ ```
289
+
290
+ **Story Progress Display (show after EACH story completion):**
239
291
 
240
292
  ```markdown
241
293
  ### Story Progress ({completed}/{total})
@@ -248,7 +300,7 @@ For the current stage, follow the bolt type definition:
248
300
  6. [ ] **{SSS}-{story-slug}**: Pending
249
301
  ```
250
302
 
251
- **Update bolt file after each story:**
303
+ **Update bolt file after EACH story (not at the end):**
252
304
 
253
305
  ```yaml
254
306
  stories_progress:
@@ -264,10 +316,51 @@ stories_progress:
264
316
  status: pending
265
317
  ```
266
318
 
267
- This ensures:
268
- - Clear visibility into which story is being worked on
269
- - Ability to resume if interrupted
270
- - Validation that all stories are addressed
319
+ **Why This Pattern Exists:**
320
+
321
+ 1. **Traceability**: Each piece of code maps to a specific story
322
+ 2. **Resumability**: If interrupted, we know exactly where to continue
323
+ 3. **Verification**: We can validate that ALL stories were addressed
324
+ 4. **Visibility**: User sees clear progress through the work
325
+ 5. **Quality**: Reading acceptance criteria prevents missed requirements
326
+
327
+ ### 7c. Final Regression Check (After All Stories Implemented)
328
+
329
+ **⛔ REQUIRED: After implementing all stories, verify no regressions**
330
+
331
+ ```text
332
+ ┌─────────────────────────────────────────────────────────────┐
333
+ │ REGRESSION CHECK - BEFORE STAGE CHECKPOINT │
334
+ │ │
335
+ │ After ALL stories are implemented, you MUST verify: │
336
+ │ 1. Re-read acceptance criteria from FIRST story │
337
+ │ 2. Verify the implementation still satisfies those ACs │
338
+ │ 3. Repeat for each story in order │
339
+ │ 4. Report any regressions found │
340
+ │ │
341
+ │ Later stories may have broken earlier implementations. │
342
+ │ Catch this BEFORE moving to Testing stage. │
343
+ └─────────────────────────────────────────────────────────────┘
344
+ ```
345
+
346
+ **Regression Check Output:**
347
+
348
+ ```text
349
+ ### Regression Check ({stories_count} stories)
350
+
351
+ 1. ✅ **{story-1}**: All ACs still valid
352
+ 2. ✅ **{story-2}**: All ACs still valid
353
+ 3. ⚠️ **{story-3}**: AC2 regression - {description} → FIX REQUIRED
354
+ 4. ✅ **{story-4}**: All ACs still valid
355
+
356
+ {If regressions found: Fix before proceeding to checkpoint}
357
+ ```
358
+
359
+ **Why This Check Exists:**
360
+
361
+ - Story N implementation may modify shared code
362
+ - Changes could invalidate Story 1-N-1 acceptance criteria
363
+ - Catching regressions early prevents cascade failures in Testing stage
271
364
 
272
365
  ### 8. Handle Checkpoints (As Defined by Bolt Type)
273
366
 
@@ -310,14 +403,29 @@ If the bolt type specifies automatic validation criteria, follow those rules.
310
403
  └─────────────────────────────────────────────────────────────┘
311
404
  ```
312
405
 
313
- ### 9. Update Bolt File on Stage Completion
406
+ ### 9. Update Bolt File on Stage Completion (HARD GATE)
407
+
408
+ **⛔ HARD GATE - MUST EXECUTE AFTER EACH STAGE**
314
409
 
315
410
  **Trigger**: After EACH stage completion (not just final stage).
316
411
 
317
- After each stage completion:
412
+ ```text
413
+ ┌─────────────────────────────────────────────────────────────┐
414
+ │ STAGE COMPLETION UPDATE - NON-NEGOTIABLE │
415
+ │ │
416
+ │ Before presenting checkpoint to user, you MUST: │
417
+ │ 1. Use Edit tool to update bolt.md with stage completion │
418
+ │ 2. Show verification output to user │
419
+ │ 3. Only THEN present the checkpoint prompt │
420
+ │ │
421
+ │ Stages not recorded in bolt.md = stages not done. │
422
+ └─────────────────────────────────────────────────────────────┘
423
+ ```
424
+
425
+ **Required Updates:**
318
426
 
319
427
  - Add stage to `stages_completed` with timestamp
320
- - Update `current_stage` to next stage
428
+ - Update `current_stage` to next stage (or null if final)
321
429
 
322
430
  **⚠️ TIMESTAMP FORMAT**: See `memory-bank.yaml` → `conventions.timestamps`
323
431
 
@@ -332,9 +440,18 @@ stages_completed:
332
440
  ---
333
441
  ```
334
442
 
443
+ **Verification Output (REQUIRED):**
444
+
445
+ ```text
446
+ ✅ Stage recorded: {stage-name}
447
+ - stages_completed: [{list of completed stages}]
448
+ - current_stage: {next-stage-name}
449
+ - artifact: {artifact-filename}
450
+ ```
451
+
335
452
  **If this is the FINAL stage**, proceed to **Step 10** (bolt completion).
336
453
 
337
- **If this is NOT the final stage**, update bolt file and proceed to next stage. Stop here.
454
+ **If this is NOT the final stage**, update bolt file, show verification, then present checkpoint.
338
455
 
339
456
  ---
340
457
 
@@ -386,8 +386,9 @@ Implement CQRS pattern with separate read models for task queries.
386
386
 
387
387
  **After ALL stories are implemented:**
388
388
 
389
- 6 - **Setup project structure**: Verify scaffolding exists
390
- 7 - **Run code quality validation**: Execute linting, type checking, build
389
+ 6 - **Run regression check**: Re-verify ALL story acceptance criteria still valid
390
+ 7 - **Setup project structure**: Verify scaffolding exists
391
+ 8 - **Run code quality validation**: Execute linting, type checking, build
391
392
 
392
393
  **Artifact**: Source code in unit directory
393
394
  **Location**: `src/{unit}/` or as defined in project structure
@@ -433,6 +434,7 @@ src/{unit}/
433
434
  **Completion Criteria**:
434
435
 
435
436
  - [ ] **All stories implemented in order** (see Story Progress below)
437
+ - [ ] **Regression check passed** - all previous story ACs still valid
436
438
  - [ ] All domain models implemented
437
439
  - [ ] All use cases implemented
438
440
  - [ ] All API endpoints implemented
@@ -459,6 +461,13 @@ src/{unit}/
459
461
  5. ✅ **{SSS}-{story-slug}**: Implemented → `{files}`
460
462
  6. ✅ **{SSS}-{story-slug}**: Implemented → `{files}`
461
463
 
464
+ ### Regression Check ({n}/{n} stories verified)
465
+
466
+ 1. ✅ **{SSS}-{story-slug}**: All ACs still valid
467
+ 2. ✅ **{SSS}-{story-slug}**: All ACs still valid
468
+ 3. ✅ **{SSS}-{story-slug}**: All ACs still valid
469
+ ...
470
+
462
471
  ### Code Generated
463
472
  - {n} domain entities
464
473
  - {n} use cases
@@ -469,6 +478,7 @@ src/{unit}/
469
478
  - ✅ Types: Passed
470
479
  - ✅ Build: Passed
471
480
  - ✅ Traceability: All files linked to stories
481
+ - ✅ Regression: No story ACs broken
472
482
 
473
483
  ### Acceptance Criteria Preview
474
484
  Each story's ACs will be validated in Stage 5 (Testing).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "project-iris",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Multi-agent orchestration system for AI-native software development. Delivers AI-DLC, Agile, and custom SDLC flows as markdown-based agent systems.",
5
5
  "main": "lib/installer.js",
6
6
  "bin": {
@@ -58,6 +58,8 @@
58
58
  * │ 3. If not complete: │
59
59
  * │ status: {current} → complete │
60
60
  * │ implemented: false → true │
61
+ * │ 4. Check off acceptance criteria checkboxes: │
62
+ * │ - [ ] → - [x] (within ## Acceptance Criteria section) │
61
63
  * │ │
62
64
  * │ Story search strategy: │
63
65
  * │ - Direct path: {intent}/units/{unit}/stories/{story}.md │
@@ -106,7 +108,7 @@
106
108
  * │ └── {unit}/
107
109
  * │ ├── unit-brief.md ← Updated: status (if all bolts complete)
108
110
  * │ └── stories/
109
- * │ ├── 001-{story}.md ← Updated: status, implemented
111
+ * │ ├── 001-{story}.md ← Updated: status, implemented, ACs checked
110
112
  * │ └── ...
111
113
  *
112
114
  * ┌──────────────────────────────────────────────────────────────────────────┐
@@ -177,6 +179,50 @@ function updateFrontmatter(content, newFrontmatter) {
177
179
  return `---\n${newYaml}\n---${content.slice(match[0].length)}`;
178
180
  }
179
181
 
182
+ /**
183
+ * Check off all acceptance criteria checkboxes in markdown content
184
+ * Converts "- [ ]" to "- [x]" in the Acceptance Criteria section
185
+ */
186
+ function checkAcceptanceCriteria(content) {
187
+ // Find the Acceptance Criteria section and check all boxes
188
+ // Pattern matches: - [ ] at start of line (with optional leading whitespace)
189
+ // Only within Acceptance Criteria section
190
+
191
+ const lines = content.split('\n');
192
+ let inAcceptanceCriteria = false;
193
+ let modified = false;
194
+
195
+ const updatedLines = lines.map(line => {
196
+ // Check if we're entering Acceptance Criteria section
197
+ if (line.match(/^##\s*Acceptance Criteria/i)) {
198
+ inAcceptanceCriteria = true;
199
+ return line;
200
+ }
201
+
202
+ // Check if we're leaving (another h2 section)
203
+ if (inAcceptanceCriteria && line.match(/^##\s+[^#]/)) {
204
+ inAcceptanceCriteria = false;
205
+ return line;
206
+ }
207
+
208
+ // If in Acceptance Criteria section, check off unchecked boxes
209
+ if (inAcceptanceCriteria) {
210
+ const checkedLine = line.replace(/^(\s*-\s*)\[ \]/, '$1[x]');
211
+ if (checkedLine !== line) {
212
+ modified = true;
213
+ }
214
+ return checkedLine;
215
+ }
216
+
217
+ return line;
218
+ });
219
+
220
+ return {
221
+ content: updatedLines.join('\n'),
222
+ modified
223
+ };
224
+ }
225
+
180
226
  /**
181
227
  * Format timestamp as ISO 8601
182
228
  * Format: YYYY-MM-DDTHH:MM:SSZ (no milliseconds, per memory-bank.yaml convention)
@@ -357,13 +403,19 @@ async function updateStories(bolt) {
357
403
  implemented: true
358
404
  };
359
405
 
360
- const newContent = updateFrontmatter(content, newFrontmatter);
406
+ let newContent = updateFrontmatter(content, newFrontmatter);
361
407
  if (newContent) {
408
+ // Also check off acceptance criteria checkboxes
409
+ const acResult = checkAcceptanceCriteria(newContent);
410
+ newContent = acResult.content;
411
+ const acChecked = acResult.modified;
412
+
362
413
  await fs.writeFile(storyPath, newContent, 'utf8');
363
414
  const oldStatus = frontmatter.status || 'draft';
364
- console.log(` ${colors.green}✓${colors.reset} ${storyId} - ${colors.dim}${oldStatus} → complete${colors.reset}`);
415
+ const acNote = acChecked ? ` ${colors.dim}(ACs checked)${colors.reset}` : '';
416
+ console.log(` ${colors.green}✓${colors.reset} ${storyId} - ${colors.dim}${oldStatus} → complete${colors.reset}${acNote}`);
365
417
  results.updated++;
366
- results.details.push({ storyId, status: 'updated', from: oldStatus, to: 'complete' });
418
+ results.details.push({ storyId, status: 'updated', from: oldStatus, to: 'complete', acChecked });
367
419
  } else {
368
420
  console.log(` ${colors.red}✗${colors.reset} ${storyId} - ${colors.dim}Failed to update${colors.reset}`);
369
421
  results.errors++;