project-iris 0.3.0 → 0.4.0

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.
@@ -22,7 +22,10 @@ agents:
22
22
  purpose: "API design conventions"
23
23
 
24
24
  - path: standards/ux-guide.md
25
- purpose: "UI/UX patterns for frontend code"
25
+ purpose: "Project's UI/UX decisions and design tokens"
26
+
27
+ - path: .iris/aidlc/templates/construction/ui-patterns.md
28
+ purpose: "Design guide for building professional UI (load for any frontend work)"
26
29
 
27
30
  on_missing_critical:
28
31
  action: warn
@@ -143,12 +143,43 @@ agents:
143
143
  optional_context:
144
144
  - path: standards/system-architecture.md
145
145
  - path: standards/api-conventions.md
146
+ - path: standards/ux-guide.md
147
+ - path: .iris/aidlc/templates/construction/ui-patterns.md
146
148
  ```
147
149
 
148
150
  1. Load all `required_context` files (warn if missing with `critical: true`)
149
151
  2. Load `optional_context` files if they exist
150
152
 
151
- **Note**: This is agent-level context. Bolt-type-specific context loading may be added later.
153
+ ### 4b. UI Design Context (Conditional Load)
154
+
155
+ **Check if UI design guidance may be relevant:**
156
+
157
+ Scan the bolt's unit name, story titles, and story descriptions for these signals:
158
+ - `screen`, `page`, `view`, `layout`
159
+ - `component`, `widget`, `button`, `form`, `modal`, `dialog`
160
+ - `ui`, `ux`, `frontend`, `presentation`
161
+ - `navigation`, `menu`, `sidebar`, `header`, `footer`
162
+ - `list`, `card`, `table`, `grid` (in UI context)
163
+
164
+ **If ANY signal is found:**
165
+
166
+ ```text
167
+ ┌─────────────────────────────────────────────────────────────┐
168
+ │ UI DESIGN CONTEXT DETECTED │
169
+ │ │
170
+ │ Signal found: {signal} in {unit/story} │
171
+ │ │
172
+ │ Action: Read ui-patterns.md for design guidance │
173
+ │ Path: .iris/aidlc/templates/construction/ui-patterns.md │
174
+ │ │
175
+ │ Apply these principles where relevant during │
176
+ │ implementation. Not all principles apply to all tasks. │
177
+ └─────────────────────────────────────────────────────────────┘
178
+ ```
179
+
180
+ **Then read the file and keep its principles in mind during code generation.**
181
+
182
+ This is not a hard requirement - use judgment on which principles apply to the current task.
152
183
 
153
184
  ### 5. Determine Current Stage
154
185
 
@@ -159,9 +190,22 @@ Based on bolt state:
159
190
  - **completed** → Inform user bolt is done
160
191
  - **blocked** → Show blocker, ask how to resolve
161
192
 
162
- ### 6. Update Bolt File on Start (CRITICAL - DO FIRST)
193
+ ### 6. Update Bolt File on Start (CRITICAL - HARD GATE)
194
+
195
+ **⛔ HARD GATE - MUST EXECUTE BEFORE ANY STAGE WORK**
163
196
 
164
- **⚠️ BEFORE any stage work begins, update the bolt file IMMEDIATELY.**
197
+ ```text
198
+ ┌─────────────────────────────────────────────────────────────┐
199
+ │ BOLT FILE UPDATE - NON-NEGOTIABLE │
200
+ │ │
201
+ │ You CANNOT proceed to stage work until you have: │
202
+ │ 1. Used the Edit tool to update bolt.md │
203
+ │ 2. Verified the edit was applied │
204
+ │ 3. Shown the user confirmation of the update │
205
+ │ │
206
+ │ This is a BLOCKING GATE - no exceptions. │
207
+ └─────────────────────────────────────────────────────────────┘
208
+ ```
165
209
 
166
210
  When transitioning from `planned` to `in-progress`:
167
211
 
@@ -173,11 +217,23 @@ current_stage: {first-stage} # was: null (e.g., "domain-design")
173
217
  ---
174
218
  ```
175
219
 
176
- **This is NON-NEGOTIABLE.** The bolt file must reflect that work has begun before any stage activities start. This ensures:
220
+ **Verification Output (REQUIRED):**
221
+
222
+ After editing, output this confirmation to the user:
223
+
224
+ ```text
225
+ ✅ Bolt file updated: {bolt-id}/bolt.md
226
+ - status: planned → in-progress
227
+ - started: {timestamp}
228
+ - current_stage: {stage-name}
229
+ ```
230
+
231
+ **Why This Gate Exists:**
177
232
 
178
233
  1. Progress is tracked even if execution is interrupted
179
234
  2. Other tools/agents see accurate status
180
235
  3. Resumption works correctly
236
+ 4. **Prevents "Lost in the Middle" bug where updates are skipped**
181
237
 
182
238
  **Also update construction log** (see "Update Construction Log" section below).
183
239
 
@@ -216,26 +272,95 @@ For the current stage, follow the bolt type definition:
216
272
  - Use templates if specified by bolt type
217
273
  - Place in correct paths per schema
218
274
 
219
- ### 7b. Story-by-Story Execution (Code Generation Stages)
275
+ ### 7a. Stage Artifact Creation (HARD GATE)
276
+
277
+ **⛔ HARD GATE - STAGE ARTIFACTS ARE MANDATORY**
278
+
279
+ ```text
280
+ ┌─────────────────────────────────────────────────────────────┐
281
+ │ ARTIFACT CREATION - NON-NEGOTIABLE │
282
+ │ │
283
+ │ Each stage in the bolt type specifies an artifact. │
284
+ │ You MUST create it before presenting the checkpoint. │
285
+ │ │
286
+ │ ⛔ FORBIDDEN: Completing a stage without its artifact │
287
+ │ ⛔ FORBIDDEN: Skipping artifact because "it's optional" │
288
+ │ ⛔ FORBIDDEN: Only creating source code without docs │
289
+ │ │
290
+ │ The artifact documents what was done. No artifact = stage │
291
+ │ not complete. │
292
+ └─────────────────────────────────────────────────────────────┘
293
+ ```
294
+
295
+ **Artifact Verification (before checkpoint):**
296
+
297
+ ```text
298
+ ✅ Stage artifact created: {artifact-path}
299
+ - Location: memory-bank/bolts/{bolt-id}/{artifact-name}
300
+ - Template used: {yes/no}
301
+ ```
302
+
303
+ **Common artifacts by bolt type:**
304
+
305
+ | Bolt Type | Stage | Required Artifact |
306
+ |-----------|-------|-------------------|
307
+ | simple-construction | Plan | `implementation-plan.md` |
308
+ | simple-construction | Code Generation | `implementation-walkthrough.md` |
309
+ | simple-construction | Testing | `test-walkthrough.md` |
310
+ | ddd-construction | Domain Design | `ddd-01-domain-design.md` |
311
+ | ddd-construction | Logical Design | `ddd-02-logical-design.md` |
312
+ | ddd-construction | Code Generation | `ddd-04-implementation-walkthrough.md` |
313
+ | ddd-construction | Testing | `ddd-03-test-report.md` |
314
+
315
+ **If bolt type specifies an artifact, you MUST create it.**
316
+
317
+ ### 7b. Story-by-Story Execution (Code Generation Stages) - HARD GATE
220
318
 
221
- **⛔ CRITICAL**: When executing stages that involve code generation (e.g., Stage 4 in DDD bolts), process stories SEQUENTIALLY:
319
+ **⛔ HARD GATE - SEQUENTIAL STORY EXECUTION REQUIRED**
222
320
 
223
321
  ```text
224
322
  ┌─────────────────────────────────────────────────────────────┐
225
- │ STORY-BY-STORY EXECUTION
323
+ │ STORY-BY-STORY EXECUTION - NON-NEGOTIABLE
226
324
  │ │
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" │
325
+ FORBIDDEN: Implementing multiple stories at once
326
+ FORBIDDEN: Skipping story file reads
327
+ FORBIDDEN: Not updating stories_progress in bolt file
233
328
  │ │
234
- DO NOT batch implement - track each story individually!
329
+ You MUST process stories ONE AT A TIME in sequence.
330
+ │ Each story requires its own announce → read → implement → │
331
+ │ update cycle. Batch implementation = broken traceability. │
235
332
  └─────────────────────────────────────────────────────────────┘
236
333
  ```
237
334
 
238
- **Story Progress Display (show after each story)**:
335
+ **For EACH story in bolt's stories array, execute this exact sequence:**
336
+
337
+ ```text
338
+ ┌─────────────────────────────────────────────────────────────┐
339
+ │ STORY EXECUTION LOOP (repeat for each story) │
340
+ │ │
341
+ │ STEP A: Announce start │
342
+ │ Output: "⏳ Story {n}/{total}: {story-id} - {title}" │
343
+ │ │
344
+ │ STEP B: Read story file (MANDATORY) │
345
+ │ Action: Read {intent}/units/{unit}/stories/{story-id}.md │
346
+ │ Purpose: Extract acceptance criteria for implementation │
347
+ │ │
348
+ │ STEP C: Implement code for THIS story only │
349
+ │ Action: Create/modify code to satisfy acceptance criteria │
350
+ │ Add traceability: // Story: {story-id} │
351
+ │ │
352
+ │ STEP D: Update bolt file stories_progress (MANDATORY) │
353
+ │ Action: Edit bolt.md to mark story as completed │
354
+ │ │
355
+ │ STEP E: Announce completion │
356
+ │ Output: "✅ Story {story-id}: Implemented → `{files}`" │
357
+ │ │
358
+ │ STEP F: Show updated progress list │
359
+ │ Then proceed to next story (back to STEP A) │
360
+ └─────────────────────────────────────────────────────────────┘
361
+ ```
362
+
363
+ **Story Progress Display (show after EACH story completion):**
239
364
 
240
365
  ```markdown
241
366
  ### Story Progress ({completed}/{total})
@@ -248,7 +373,7 @@ For the current stage, follow the bolt type definition:
248
373
  6. [ ] **{SSS}-{story-slug}**: Pending
249
374
  ```
250
375
 
251
- **Update bolt file after each story:**
376
+ **Update bolt file after EACH story (not at the end):**
252
377
 
253
378
  ```yaml
254
379
  stories_progress:
@@ -264,10 +389,51 @@ stories_progress:
264
389
  status: pending
265
390
  ```
266
391
 
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
392
+ **Why This Pattern Exists:**
393
+
394
+ 1. **Traceability**: Each piece of code maps to a specific story
395
+ 2. **Resumability**: If interrupted, we know exactly where to continue
396
+ 3. **Verification**: We can validate that ALL stories were addressed
397
+ 4. **Visibility**: User sees clear progress through the work
398
+ 5. **Quality**: Reading acceptance criteria prevents missed requirements
399
+
400
+ ### 7c. Final Regression Check (After All Stories Implemented)
401
+
402
+ **⛔ REQUIRED: After implementing all stories, verify no regressions**
403
+
404
+ ```text
405
+ ┌─────────────────────────────────────────────────────────────┐
406
+ │ REGRESSION CHECK - BEFORE STAGE CHECKPOINT │
407
+ │ │
408
+ │ After ALL stories are implemented, you MUST verify: │
409
+ │ 1. Re-read acceptance criteria from FIRST story │
410
+ │ 2. Verify the implementation still satisfies those ACs │
411
+ │ 3. Repeat for each story in order │
412
+ │ 4. Report any regressions found │
413
+ │ │
414
+ │ Later stories may have broken earlier implementations. │
415
+ │ Catch this BEFORE moving to Testing stage. │
416
+ └─────────────────────────────────────────────────────────────┘
417
+ ```
418
+
419
+ **Regression Check Output:**
420
+
421
+ ```text
422
+ ### Regression Check ({stories_count} stories)
423
+
424
+ 1. ✅ **{story-1}**: All ACs still valid
425
+ 2. ✅ **{story-2}**: All ACs still valid
426
+ 3. ⚠️ **{story-3}**: AC2 regression - {description} → FIX REQUIRED
427
+ 4. ✅ **{story-4}**: All ACs still valid
428
+
429
+ {If regressions found: Fix before proceeding to checkpoint}
430
+ ```
431
+
432
+ **Why This Check Exists:**
433
+
434
+ - Story N implementation may modify shared code
435
+ - Changes could invalidate Story 1-N-1 acceptance criteria
436
+ - Catching regressions early prevents cascade failures in Testing stage
271
437
 
272
438
  ### 8. Handle Checkpoints (As Defined by Bolt Type)
273
439
 
@@ -310,14 +476,29 @@ If the bolt type specifies automatic validation criteria, follow those rules.
310
476
  └─────────────────────────────────────────────────────────────┘
311
477
  ```
312
478
 
313
- ### 9. Update Bolt File on Stage Completion
479
+ ### 9. Update Bolt File on Stage Completion (HARD GATE)
480
+
481
+ **⛔ HARD GATE - MUST EXECUTE AFTER EACH STAGE**
314
482
 
315
483
  **Trigger**: After EACH stage completion (not just final stage).
316
484
 
317
- After each stage completion:
485
+ ```text
486
+ ┌─────────────────────────────────────────────────────────────┐
487
+ │ STAGE COMPLETION UPDATE - NON-NEGOTIABLE │
488
+ │ │
489
+ │ Before presenting checkpoint to user, you MUST: │
490
+ │ 1. Use Edit tool to update bolt.md with stage completion │
491
+ │ 2. Show verification output to user │
492
+ │ 3. Only THEN present the checkpoint prompt │
493
+ │ │
494
+ │ Stages not recorded in bolt.md = stages not done. │
495
+ └─────────────────────────────────────────────────────────────┘
496
+ ```
497
+
498
+ **Required Updates:**
318
499
 
319
500
  - Add stage to `stages_completed` with timestamp
320
- - Update `current_stage` to next stage
501
+ - Update `current_stage` to next stage (or null if final)
321
502
 
322
503
  **⚠️ TIMESTAMP FORMAT**: See `memory-bank.yaml` → `conventions.timestamps`
323
504
 
@@ -332,9 +513,18 @@ stages_completed:
332
513
  ---
333
514
  ```
334
515
 
516
+ **Verification Output (REQUIRED):**
517
+
518
+ ```text
519
+ ✅ Stage recorded: {stage-name}
520
+ - stages_completed: [{list of completed stages}]
521
+ - current_stage: {next-stage-name}
522
+ - artifact: {artifact-filename}
523
+ ```
524
+
335
525
  **If this is the FINAL stage**, proceed to **Step 10** (bolt completion).
336
526
 
337
- **If this is NOT the final stage**, update bolt file and proceed to next stage. Stop here.
527
+ **If this is NOT the final stage**, update bolt file, show verification, then present checkpoint.
338
528
 
339
529
  ---
340
530
 
@@ -0,0 +1,58 @@
1
+ ---
2
+ stage: code-generation
3
+ bolt: {bolt-id}
4
+ created: {YYYY-MM-DDTHH:MM:SSZ}
5
+ ---
6
+
7
+ ## Implementation Walkthrough: {unit-name}
8
+
9
+ ### Summary
10
+
11
+ {2-3 sentence overview of what was built - NO CODE}
12
+
13
+ ### Design Alignment
14
+
15
+ How the implementation aligns with design documents:
16
+
17
+ - **Domain Design**: {alignment notes or deviations}
18
+ - **Logical Design**: {alignment notes or deviations}
19
+
20
+ ### Structure Overview
21
+
22
+ {High-level description of the DDD layers implemented - NO CODE}
23
+
24
+ ### Completed Work
25
+
26
+ #### Domain Layer
27
+ - [x] `{path/to/file}` - {what this file does}
28
+
29
+ #### Application Layer
30
+ - [x] `{path/to/file}` - {what this file does}
31
+
32
+ #### Infrastructure Layer
33
+ - [x] `{path/to/file}` - {what this file does}
34
+
35
+ #### Presentation Layer
36
+ - [x] `{path/to/file}` - {what this file does}
37
+
38
+ ### Story Traceability
39
+
40
+ | Story | Files |
41
+ |-------|-------|
42
+ | {story-id} | `{files}` |
43
+
44
+ ### Key Decisions
45
+
46
+ - **{Decision}**: {Why this approach was chosen}
47
+
48
+ ### Deviations from Design
49
+
50
+ {Any changes from domain-design or logical-design and why, or "None"}
51
+
52
+ ### Dependencies Added
53
+
54
+ - [x] `{package}` - {why needed}
55
+
56
+ ### Developer Notes
57
+
58
+ {Gotchas, tips, or context for future work - keep brief}
@@ -33,7 +33,7 @@ Stage 1: Domain Design → Stage 2: Logical Design → Stage 3: ADR Analysis (op
33
33
  - ✅/[ ] **1. Domain Design** (Required) → `ddd-01-domain-design.md`
34
34
  - ✅/[ ] **2. Logical Design** (Required) → `ddd-02-logical-design.md`
35
35
  - ✅/[ ] **3. ADR Analysis** (Optional) → `adr-{n}-{slug}.md` (zero or more)
36
- - ✅/[ ] **4. Code Generation** (Required) → Source code
36
+ - ✅/[ ] **4. Code Generation** (Required) → Source code + `ddd-04-implementation-walkthrough.md`
37
37
  - ✅/[ ] **5. Testing** (Required) → Tests + `ddd-03-test-report.md`
38
38
 
39
39
  **Rules**:
@@ -386,11 +386,18 @@ 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
- **Artifact**: Source code in unit directory
393
- **Location**: `src/{unit}/` or as defined in project structure
393
+ **Artifacts**:
394
+
395
+ - Source code in unit directory: `src/{unit}/` or as defined in project structure
396
+ - `ddd-04-implementation-walkthrough.md`: `memory-bank/bolts/{bolt-id}/ddd-04-implementation-walkthrough.md`
397
+
398
+ **Template**: `.iris/aidlc/templates/construction/bolt-types/ddd-construction-bolt/ddd-04-implementation-walkthrough-template.md`
399
+
400
+ **Implementation Walkthrough** documents what was built, any deviations from design, and key decisions made during coding. This is required - do not skip it.
394
401
 
395
402
  **Project Structure**:
396
403
 
@@ -433,6 +440,7 @@ src/{unit}/
433
440
  **Completion Criteria**:
434
441
 
435
442
  - [ ] **All stories implemented in order** (see Story Progress below)
443
+ - [ ] **Regression check passed** - all previous story ACs still valid
436
444
  - [ ] All domain models implemented
437
445
  - [ ] All use cases implemented
438
446
  - [ ] All API endpoints implemented
@@ -459,6 +467,13 @@ src/{unit}/
459
467
  5. ✅ **{SSS}-{story-slug}**: Implemented → `{files}`
460
468
  6. ✅ **{SSS}-{story-slug}**: Implemented → `{files}`
461
469
 
470
+ ### Regression Check ({n}/{n} stories verified)
471
+
472
+ 1. ✅ **{SSS}-{story-slug}**: All ACs still valid
473
+ 2. ✅ **{SSS}-{story-slug}**: All ACs still valid
474
+ 3. ✅ **{SSS}-{story-slug}**: All ACs still valid
475
+ ...
476
+
462
477
  ### Code Generated
463
478
  - {n} domain entities
464
479
  - {n} use cases
@@ -469,6 +484,7 @@ src/{unit}/
469
484
  - ✅ Types: Passed
470
485
  - ✅ Build: Passed
471
486
  - ✅ Traceability: All files linked to stories
487
+ - ✅ Regression: No story ACs broken
472
488
 
473
489
  ### Acceptance Criteria Preview
474
490
  Each story's ACs will be validated in Stage 5 (Testing).
@@ -147,6 +147,9 @@ created: {YYYY-MM-DDTHH:MM:SSZ}
147
147
 
148
148
  **Duration**: Hours (varies by complexity)
149
149
 
150
+ **For UI Work** (screens, components, layouts):
151
+ Load `.iris/aidlc/templates/construction/ui-patterns.md` before implementing. This guide helps you build professional UI without a designer.
152
+
150
153
  **Activities**:
151
154
 
152
155
  1 - **Setup structure**: Create files and folders
@@ -0,0 +1,352 @@
1
+ # UI Design Guide
2
+
3
+ You are building UI for a project without a designer. Your goal is to create polished, professional interfaces that users love. Think like a designer, not a developer.
4
+
5
+ ---
6
+
7
+ ## Design Mindset
8
+
9
+ **Before writing any UI code, ask yourself:**
10
+
11
+ 1. What is the user trying to accomplish here?
12
+ 2. What's the most important thing on this screen?
13
+ 3. What can I remove to make it simpler?
14
+ 4. Would a non-technical person understand this instantly?
15
+
16
+ **Your north star**: If it looks like a template, you've failed. If it feels intentional and crafted, you've succeeded.
17
+
18
+ ---
19
+
20
+ ## Design Tokens (Non-Negotiable)
21
+
22
+ **Before building screens, define and lock these values:**
23
+
24
+ - Font family
25
+ - Type scale (use the one in this guide)
26
+ - Primary color
27
+ - Neutral gray scale
28
+ - Border radius
29
+ - Shadow levels
30
+ - Spacing scale
31
+
32
+ **Once defined:**
33
+
34
+ - Do not invent new sizes
35
+ - Do not invent new colors
36
+ - Do not invent new radiuses
37
+ - Do not invent new spacing values
38
+
39
+ **Consistency feels like quality. Inconsistency feels like bugs.**
40
+
41
+ This prevents "just one more size/color" syndrome. Every deviation from your tokens is a crack in the system.
42
+
43
+ ---
44
+
45
+ ## One Primary Action Rule
46
+
47
+ **Every screen should answer: "What is the ONE thing the user should do next?"**
48
+
49
+ - One primary button per screen (ideally)
50
+ - Everything else is secondary, tertiary, or hidden
51
+ - If you need two primary actions, the screen is doing too much
52
+
53
+ This is product thinking, not just UI. A confused user does nothing.
54
+
55
+ ---
56
+
57
+ ## Decision Hierarchy
58
+
59
+ **When making UI decisions, prioritize in this order:**
60
+
61
+ 1. **Clarity** - Is it instantly understandable?
62
+ 2. **Hierarchy** - Is the important thing obvious?
63
+ 3. **Consistency** - Does it match the system?
64
+ 4. **Speed** - Is it fast to scan and act on?
65
+ 5. **Aesthetics** - Does it look good?
66
+
67
+ Pretty but confusing is failure. Clear and boring beats clever and unclear.
68
+
69
+ ---
70
+
71
+ ## Visual Hierarchy
72
+
73
+ **The most important design skill.** Guide the user's eye to what matters.
74
+
75
+ ### Size Creates Importance
76
+ The bigger something is, the more important it appears. Your page title should be the largest text. Secondary info should be smaller and lighter.
77
+
78
+ ### Contrast Draws Attention
79
+ High contrast = look here. Low contrast = secondary. Use bold weight, darker colors, or accent colors for emphasis.
80
+
81
+ ### Whitespace Is Not Empty
82
+ Space around elements gives them importance and breathing room. Cramped UIs feel cheap. Generous spacing feels premium.
83
+
84
+ **When building a screen:**
85
+ 1. Identify the ONE most important element
86
+ 2. Make it visually dominant (size, position, contrast)
87
+ 3. De-emphasize everything else
88
+ 4. Add generous whitespace around important elements
89
+
90
+ ---
91
+
92
+ ## Typography
93
+
94
+ **Typography alone can make or break your UI.**
95
+
96
+ ### Headlines
97
+ - Bold, confident, short
98
+ - Use sentence case (not ALL CAPS unless it's a label)
99
+ - Leave room to breathe
100
+
101
+ ### Body Text
102
+ - 16px minimum for readability
103
+ - Line height of 1.5-1.7 for paragraphs
104
+ - Keep line length under 70 characters
105
+
106
+ ### The Type Scale
107
+ Don't use random sizes. Pick a scale and stick to it:
108
+ ```
109
+ 12px - Labels, captions, metadata
110
+ 14px - Secondary text, table content
111
+ 16px - Body text, form inputs
112
+ 18px - Emphasized body, subheadings
113
+ 20px - Section headers
114
+ 24px - Page titles on mobile
115
+ 30px - Page titles on desktop
116
+ 36px+ - Hero headlines only
117
+ ```
118
+
119
+ ### Font Weight
120
+ - Regular (400) - Body text
121
+ - Medium (500) - Subtle emphasis, navigation
122
+ - Semibold (600) - Headings, buttons
123
+ - Bold (700) - Strong emphasis, hero text
124
+
125
+ **Never use light (300) weights for UI text.** It's hard to read.
126
+
127
+ ---
128
+
129
+ ## Color
130
+
131
+ ### Less Is More
132
+ Use 2-3 colors maximum:
133
+ - **Primary**: Your brand color. Use sparingly for CTAs and key actions.
134
+ - **Neutral**: Grays for text, borders, backgrounds. This is 80% of your UI.
135
+ - **Semantic**: Red for errors, green for success, yellow for warnings.
136
+
137
+ ### The Gray Trick
138
+ Most "white" backgrounds shouldn't be pure white (#FFFFFF). Use a very light gray (#FAFAFA or #F9FAFB) for large areas. It's easier on the eyes and makes white cards pop.
139
+
140
+ ### Text Colors
141
+ - Primary text: Not pure black. Use #111827 or #1F2937
142
+ - Secondary text: #6B7280 (gray-500)
143
+ - Muted/disabled: #9CA3AF (gray-400)
144
+
145
+ ### Don't Over-Color
146
+ If everything is colorful, nothing stands out. Keep most of your UI neutral and use color only for:
147
+ - Primary actions (buttons, links)
148
+ - Status indicators
149
+ - Errors and alerts
150
+ - Brand moments
151
+
152
+ ---
153
+
154
+ ## Spacing
155
+
156
+ ### The 4px/8px System
157
+ All spacing should be multiples of 4px or 8px:
158
+ - 4px - Minimum gap (icon to label)
159
+ - 8px - Tight spacing (within a component)
160
+ - 16px - Standard spacing (between elements)
161
+ - 24px - Section spacing
162
+ - 32px - Large section gaps
163
+ - 48px+ - Major divisions
164
+
165
+ ### Padding Consistency
166
+ - Buttons: 12px vertical, 16-24px horizontal
167
+ - Cards: 16-24px padding
168
+ - Page content: 24px on mobile, 32-48px on desktop
169
+ - Modals: 24px padding
170
+
171
+ ### Group Related Items
172
+ Elements that belong together should be closer to each other than elements that don't. This creates visual groupings without needing borders.
173
+
174
+ ---
175
+
176
+ ## Layout Principles
177
+
178
+ ### Alignment Creates Order
179
+ Pick an alignment and stick to it. Left-aligned is almost always correct for Western UIs. Don't center long text.
180
+
181
+ ### Limit Line Length
182
+ Long lines of text are hard to read. Keep content areas between 600-800px max width.
183
+
184
+ ### Use a Grid
185
+ 12-column grids work for most layouts. On mobile, use full width or simple 2-column splits.
186
+
187
+ ### Z-Pattern for Landing Pages
188
+ Users scan in a Z pattern: top-left → top-right → bottom-left → bottom-right. Place key elements along this path.
189
+
190
+ ### F-Pattern for Content Pages
191
+ Users scan in an F pattern for text-heavy pages. Put important info on the left and in headings.
192
+
193
+ ---
194
+
195
+ ## Components That Feel Right
196
+
197
+ ### Buttons
198
+ - Primary button: Solid background, used for main action (one per screen ideally)
199
+ - Secondary button: Outline or ghost, for secondary actions
200
+ - Destructive button: Red, used only for irreversible actions
201
+ - Make buttons look clickable: slight shadow, hover state, cursor pointer
202
+
203
+ ### Forms
204
+ - One column is usually better than two
205
+ - Label above the input, not beside it
206
+ - Group related fields with a section heading
207
+ - Show validation errors below the field in red
208
+ - Use placeholder text for examples, not labels
209
+
210
+ ### Cards
211
+ - Use subtle shadow, not heavy borders
212
+ - Keep padding consistent
213
+ - Don't put too much in one card
214
+ - Cards should be scannable - bold title, muted description
215
+
216
+ ### Tables
217
+ - Align text left, numbers right
218
+ - Use subtle row borders or alternating backgrounds, not both
219
+ - Make rows hoverable
220
+ - Put actions at the end of the row
221
+
222
+ ### Empty States
223
+ - Never show a blank screen
224
+ - Explain what will be here
225
+ - Provide a clear action to fix the emptiness
226
+ - Add an illustration if appropriate
227
+
228
+ ---
229
+
230
+ ## Mobile First
231
+
232
+ ### Design for the smallest screen first
233
+ If it works on mobile, it will work everywhere. The reverse is not true.
234
+
235
+ ### Touch Targets
236
+ Minimum 44x44px for anything tappable. Fingers are imprecise.
237
+
238
+ ### Thumb Zone
239
+ On mobile, important actions should be reachable by thumb (bottom half of screen).
240
+
241
+ ### Simplify, Don't Shrink
242
+ Don't just make the desktop version smaller. Remove and reorganize for mobile.
243
+
244
+ ---
245
+
246
+ ## The Details That Matter
247
+
248
+ ### Micro-interactions
249
+ - Buttons should have hover and active states
250
+ - Loading states should be smooth, not jarring
251
+ - Transitions should be 150-200ms (fast but noticeable)
252
+
253
+ ### Border Radius
254
+ - Pick one and be consistent: 4px (sharp), 8px (friendly), 12px+ (playful)
255
+ - Don't mix different radiuses randomly
256
+
257
+ ### Shadows
258
+ - Use subtle shadows (shadow-sm) for cards and dropdowns
259
+ - Shadows should be soft and diffused, not harsh
260
+ - Don't put shadows on everything
261
+
262
+ ### Icons
263
+ - Use a consistent icon set (Lucide, Heroicons)
264
+ - Icons should be the same visual weight as text
265
+ - Don't use icons without meaning
266
+ - Always pair icon-only buttons with tooltips
267
+
268
+ ---
269
+
270
+ ## Accessibility (Baseline Rules)
271
+
272
+ **These are not optional. They are usability under stress.**
273
+
274
+ - Text contrast must be readable in sunlight
275
+ - Color is never the only indicator (errors, success, status need icons or text too)
276
+ - All interactive elements must be keyboard-focusable
277
+ - Focus states are required (visible ring on focus)
278
+ - Minimum text size: 16px
279
+ - Tap targets: 44x44px minimum
280
+
281
+ Accessibility is not decoration. It's your product working for everyone.
282
+
283
+ ---
284
+
285
+ ## Common UI Mistakes to Avoid
286
+
287
+ **Anti-patterns that make UIs feel amateurish:**
288
+
289
+ - Centered paragraphs of text (hard to read)
290
+ - Too many button styles on one screen
291
+ - Equal visual weight for all elements (nothing stands out)
292
+ - Icons without labels for critical actions
293
+ - Forms split into unnecessary columns
294
+ - Using placeholders instead of labels
295
+ - Overusing borders instead of spacing
296
+ - Multiple font families without reason
297
+ - Inconsistent spacing (16px here, 18px there)
298
+ - Pure black text on pure white backgrounds
299
+ - Tiny click targets on desktop (mobile isn't the only concern)
300
+ - Loading spinners without context ("Loading..." what?)
301
+
302
+ **If you catch yourself doing any of these, stop and reconsider.**
303
+
304
+ ---
305
+
306
+ ## Before You Ship
307
+
308
+ ### The Squint Test
309
+ Squint at your screen. Can you still tell what's most important? If everything blurs into sameness, your hierarchy is weak.
310
+
311
+ ### The Screenshot Test
312
+ Take a screenshot and look at it on your phone. Does it look like a real product or a developer's side project?
313
+
314
+ ### The Mom Test
315
+ Would your non-technical mom understand what to do on this screen without help?
316
+
317
+ ### Checklist
318
+ - [ ] One clear focal point per screen
319
+ - [ ] Consistent spacing throughout
320
+ - [ ] Type hierarchy is clear (3 sizes max per screen)
321
+ - [ ] Color is used intentionally, not decoratively
322
+ - [ ] Empty states are designed
323
+ - [ ] Loading states are smooth
324
+ - [ ] Works on mobile without horizontal scrolling
325
+ - [ ] All interactive elements have hover/focus states
326
+ - [ ] Adequate color contrast for accessibility
327
+
328
+ ---
329
+
330
+ ## Quick Reference
331
+
332
+ **When something feels off:**
333
+ - Add more whitespace
334
+ - Reduce the number of font sizes
335
+ - Increase contrast between heading and body
336
+ - Remove a color
337
+ - Align things properly
338
+
339
+ **When it looks boring:**
340
+ - Don't add more color - add more contrast
341
+ - Don't add decoration - add better typography
342
+ - Don't add borders - use whitespace and shadows
343
+
344
+ **When it's overwhelming:**
345
+ - Remove elements until it hurts, then add one back
346
+ - Break into smaller screens/steps
347
+ - Hide secondary actions in menus
348
+ - Use progressive disclosure
349
+
350
+ ---
351
+
352
+ *Great UI is invisible. The user should focus on their task, not your interface. When in doubt, simplify.*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "project-iris",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
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)
@@ -342,28 +388,50 @@ async function updateStories(bolt) {
342
388
  continue;
343
389
  }
344
390
 
345
- // Check if already complete
346
- if (frontmatter.status === 'complete' && frontmatter.implemented === true) {
391
+ const alreadyComplete = frontmatter.status === 'complete' && frontmatter.implemented === true;
392
+
393
+ // Always check acceptance criteria, even if story is already complete
394
+ const acResult = checkAcceptanceCriteria(content);
395
+ const acNeedsUpdate = acResult.modified;
396
+
397
+ // Skip only if fully complete AND no AC updates needed
398
+ if (alreadyComplete && !acNeedsUpdate) {
347
399
  console.log(` ${colors.dim}−${colors.reset} ${storyId} - ${colors.dim}Already complete${colors.reset}`);
348
400
  results.skipped++;
349
401
  results.details.push({ storyId, status: 'skipped', reason: 'Already complete' });
350
402
  continue;
351
403
  }
352
404
 
353
- // Update frontmatter
354
- const newFrontmatter = {
355
- ...frontmatter,
356
- status: 'complete',
357
- implemented: true
358
- };
405
+ // Update frontmatter (if not already complete)
406
+ let newContent;
407
+ if (alreadyComplete) {
408
+ // Only update ACs, keep existing frontmatter
409
+ newContent = acResult.content;
410
+ } else {
411
+ // Update both frontmatter and ACs
412
+ const newFrontmatter = {
413
+ ...frontmatter,
414
+ status: 'complete',
415
+ implemented: true
416
+ };
417
+ newContent = updateFrontmatter(content, newFrontmatter);
418
+ if (newContent) {
419
+ const acResultUpdated = checkAcceptanceCriteria(newContent);
420
+ newContent = acResultUpdated.content;
421
+ }
422
+ }
359
423
 
360
- const newContent = updateFrontmatter(content, newFrontmatter);
361
424
  if (newContent) {
362
425
  await fs.writeFile(storyPath, newContent, 'utf8');
363
426
  const oldStatus = frontmatter.status || 'draft';
364
- console.log(` ${colors.green}✓${colors.reset} ${storyId} - ${colors.dim}${oldStatus} → complete${colors.reset}`);
427
+ const acNote = acNeedsUpdate ? ` ${colors.dim}(ACs checked)${colors.reset}` : '';
428
+ if (alreadyComplete) {
429
+ console.log(` ${colors.green}✓${colors.reset} ${storyId} - ${colors.dim}ACs checked${colors.reset}`);
430
+ } else {
431
+ console.log(` ${colors.green}✓${colors.reset} ${storyId} - ${colors.dim}${oldStatus} → complete${colors.reset}${acNote}`);
432
+ }
365
433
  results.updated++;
366
- results.details.push({ storyId, status: 'updated', from: oldStatus, to: 'complete' });
434
+ results.details.push({ storyId, status: 'updated', from: oldStatus, to: 'complete', acChecked: acNeedsUpdate });
367
435
  } else {
368
436
  console.log(` ${colors.red}✗${colors.reset} ${storyId} - ${colors.dim}Failed to update${colors.reset}`);
369
437
  results.errors++;