jettypod 4.4.118 → 4.4.121

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 (240) hide show
  1. package/.env +4 -3
  2. package/Cargo.lock +6450 -0
  3. package/Cargo.toml +35 -0
  4. package/README.md +5 -1
  5. package/TAURI-MIGRATION-PLAN.md +840 -0
  6. package/apps/dashboard/app/connect-claude/page.tsx +5 -6
  7. package/apps/dashboard/app/decision/[id]/page.tsx +63 -58
  8. package/apps/dashboard/app/demo/gates/page.tsx +43 -45
  9. package/apps/dashboard/app/design-system/page.tsx +868 -0
  10. package/apps/dashboard/app/globals.css +80 -4
  11. package/apps/dashboard/app/install-claude/page.tsx +4 -6
  12. package/apps/dashboard/app/login/page.tsx +72 -54
  13. package/apps/dashboard/app/page.tsx +101 -48
  14. package/apps/dashboard/app/settings/page.tsx +61 -13
  15. package/apps/dashboard/app/signup/page.tsx +242 -0
  16. package/apps/dashboard/app/subscribe/page.tsx +0 -2
  17. package/apps/dashboard/app/tests/page.tsx +37 -4
  18. package/apps/dashboard/app/welcome/page.tsx +13 -16
  19. package/apps/dashboard/app/work/[id]/page.tsx +117 -118
  20. package/apps/dashboard/app/work/[id]/proof/page.tsx +1489 -0
  21. package/apps/dashboard/components/AppShell.tsx +92 -85
  22. package/apps/dashboard/components/CardMenu.tsx +45 -12
  23. package/apps/dashboard/components/ClaudePanel.tsx +771 -850
  24. package/apps/dashboard/components/ClaudePanelInput.tsx +43 -15
  25. package/apps/dashboard/components/ConnectClaudeScreen.tsx +17 -34
  26. package/apps/dashboard/components/CopyableId.tsx +3 -4
  27. package/apps/dashboard/components/DetailReviewActions.tsx +100 -0
  28. package/apps/dashboard/components/DragContext.tsx +134 -63
  29. package/apps/dashboard/components/DraggableCard.tsx +3 -5
  30. package/apps/dashboard/components/DropZone.tsx +6 -7
  31. package/apps/dashboard/components/EditableDetailDescription.tsx +7 -13
  32. package/apps/dashboard/components/EditableDetailTitle.tsx +6 -13
  33. package/apps/dashboard/components/EditableTitle.tsx +26 -7
  34. package/apps/dashboard/components/ElapsedTimer.tsx +66 -0
  35. package/apps/dashboard/components/EpicGroup.tsx +359 -0
  36. package/apps/dashboard/components/GateCard.tsx +79 -17
  37. package/apps/dashboard/components/GateChoiceCard.tsx +15 -18
  38. package/apps/dashboard/components/InstallClaudeScreen.tsx +15 -32
  39. package/apps/dashboard/components/JettyLoader.tsx +37 -0
  40. package/apps/dashboard/components/KanbanBoard.tsx +368 -958
  41. package/apps/dashboard/components/KanbanCard.tsx +740 -0
  42. package/apps/dashboard/components/LazyCard.tsx +62 -0
  43. package/apps/dashboard/components/LazyMarkdown.tsx +11 -0
  44. package/apps/dashboard/components/MainNav.tsx +38 -73
  45. package/apps/dashboard/components/MessageBlock.tsx +468 -0
  46. package/apps/dashboard/components/ModeStartCard.tsx +15 -16
  47. package/apps/dashboard/components/OnboardingWelcome.tsx +213 -0
  48. package/apps/dashboard/components/PlaceholderCard.tsx +3 -4
  49. package/apps/dashboard/components/ProjectSwitcher.tsx +30 -30
  50. package/apps/dashboard/components/PrototypeTimeline.tsx +72 -51
  51. package/apps/dashboard/components/RealTimeKanbanWrapper.tsx +406 -388
  52. package/apps/dashboard/components/RealTimeTestsWrapper.tsx +373 -235
  53. package/apps/dashboard/components/ReviewFooter.tsx +139 -0
  54. package/apps/dashboard/components/SessionList.tsx +19 -19
  55. package/apps/dashboard/components/SubscribeContent.tsx +91 -47
  56. package/apps/dashboard/components/TestTree.tsx +16 -16
  57. package/apps/dashboard/components/TipCard.tsx +16 -17
  58. package/apps/dashboard/components/Toast.tsx +5 -6
  59. package/apps/dashboard/components/TypeIcon.tsx +55 -0
  60. package/apps/dashboard/components/ViewModeToolbar.tsx +104 -0
  61. package/apps/dashboard/components/WaveCompletionAnimation.tsx +52 -65
  62. package/apps/dashboard/components/WelcomeScreen.tsx +19 -35
  63. package/apps/dashboard/components/WorkItemHeader.tsx +4 -5
  64. package/apps/dashboard/components/WorkItemTree.tsx +11 -32
  65. package/apps/dashboard/components/settings/AccountSection.tsx +55 -35
  66. package/apps/dashboard/components/settings/AiContextSection.tsx +89 -0
  67. package/apps/dashboard/components/settings/ContextDocumentsSection.tsx +317 -0
  68. package/apps/dashboard/components/settings/EnvVarsSection.tsx +74 -152
  69. package/apps/dashboard/components/settings/GeneralSection.tsx +162 -56
  70. package/apps/dashboard/components/settings/ProjectStackSection.tsx +948 -0
  71. package/apps/dashboard/components/settings/SettingsLayout.tsx +4 -5
  72. package/apps/dashboard/components/ui/Button.tsx +104 -0
  73. package/apps/dashboard/components/ui/Input.tsx +78 -0
  74. package/apps/dashboard/components.json +1 -1
  75. package/apps/dashboard/contexts/ClaudeSessionContext.tsx +711 -418
  76. package/apps/dashboard/contexts/ConnectionStatusContext.tsx +25 -5
  77. package/apps/dashboard/contexts/UsageContext.tsx +87 -32
  78. package/apps/dashboard/dev.sh +35 -0
  79. package/apps/dashboard/eslint.config.mjs +9 -9
  80. package/apps/dashboard/hooks/useKanbanAnimation.ts +29 -0
  81. package/apps/dashboard/hooks/useKanbanUndo.ts +83 -0
  82. package/apps/dashboard/hooks/useWebSocket.ts +138 -83
  83. package/apps/dashboard/index.html +73 -0
  84. package/apps/dashboard/lib/constants.ts +43 -0
  85. package/apps/dashboard/lib/data-bridge.ts +722 -0
  86. package/apps/dashboard/lib/db.ts +69 -1265
  87. package/apps/dashboard/lib/environment-config.ts +173 -0
  88. package/apps/dashboard/lib/environment-verification.ts +119 -0
  89. package/apps/dashboard/lib/kanban-utils.ts +270 -0
  90. package/apps/dashboard/lib/proof-run.ts +495 -0
  91. package/apps/dashboard/lib/proof-scenario-runner.ts +346 -0
  92. package/apps/dashboard/lib/run-migrations.js +27 -2
  93. package/apps/dashboard/lib/service-recovery.ts +326 -0
  94. package/apps/dashboard/lib/session-state-machine.ts +1 -0
  95. package/apps/dashboard/lib/session-state-utils.ts +0 -164
  96. package/apps/dashboard/lib/session-stream-manager.ts +308 -134
  97. package/apps/dashboard/lib/shadows.ts +7 -0
  98. package/apps/dashboard/lib/stream-manager-registry.ts +46 -6
  99. package/apps/dashboard/lib/tauri-bridge.ts +102 -0
  100. package/apps/dashboard/lib/tauri.ts +106 -0
  101. package/apps/dashboard/lib/utils.ts +6 -0
  102. package/apps/dashboard/next-env.d.ts +1 -1
  103. package/apps/dashboard/package.json +21 -32
  104. package/apps/dashboard/public/bug-icon.png +0 -0
  105. package/apps/dashboard/public/buoy-icon.png +0 -0
  106. package/apps/dashboard/public/fonts/Satoshi-Variable.woff2 +0 -0
  107. package/apps/dashboard/public/fonts/Satoshi-VariableItalic.woff2 +0 -0
  108. package/apps/dashboard/public/in-flight-seagull.png +0 -0
  109. package/apps/dashboard/public/jetty-icon-loading-alt.svg +11 -0
  110. package/apps/dashboard/public/jetty-icon-loading.svg +11 -0
  111. package/apps/dashboard/public/jettypod_logo.png +0 -0
  112. package/apps/dashboard/public/pier-icon.png +0 -0
  113. package/apps/dashboard/public/star-icon.png +0 -0
  114. package/apps/dashboard/public/wrench-icon.png +0 -0
  115. package/apps/dashboard/scripts/tauri-build.js +228 -0
  116. package/apps/dashboard/scripts/upload-tauri-to-r2.js +125 -0
  117. package/apps/dashboard/scripts/ws-server.js +191 -0
  118. package/apps/dashboard/src/main.tsx +12 -0
  119. package/apps/dashboard/src/router.tsx +107 -0
  120. package/apps/dashboard/src/vite-env.d.ts +1 -0
  121. package/apps/dashboard/tsconfig.json +7 -12
  122. package/apps/dashboard/tsconfig.tsbuildinfo +1 -1
  123. package/apps/dashboard/vite.config.ts +33 -0
  124. package/apps/update-server/src/index.ts +228 -80
  125. package/claude-hooks/global-guardrails.js +14 -13
  126. package/crates/jettypod-cli/Cargo.toml +19 -0
  127. package/crates/jettypod-cli/src/commands.rs +1249 -0
  128. package/crates/jettypod-cli/src/main.rs +595 -0
  129. package/crates/jettypod-core/Cargo.toml +26 -0
  130. package/crates/jettypod-core/build.rs +98 -0
  131. package/crates/jettypod-core/migrations/V1__baseline.sql +197 -0
  132. package/crates/jettypod-core/migrations/V2__work_items_indexes.sql +6 -0
  133. package/crates/jettypod-core/migrations/V3__qa_steps.sql +2 -0
  134. package/crates/jettypod-core/src/auth.rs +294 -0
  135. package/crates/jettypod-core/src/config.rs +397 -0
  136. package/crates/jettypod-core/src/db/mod.rs +507 -0
  137. package/crates/jettypod-core/src/db/recovery.rs +114 -0
  138. package/crates/jettypod-core/src/db/startup.rs +101 -0
  139. package/crates/jettypod-core/src/db/validate.rs +149 -0
  140. package/crates/jettypod-core/src/error.rs +76 -0
  141. package/crates/jettypod-core/src/git.rs +458 -0
  142. package/crates/jettypod-core/src/lib.rs +20 -0
  143. package/crates/jettypod-core/src/sessions.rs +625 -0
  144. package/crates/jettypod-core/src/skills.rs +556 -0
  145. package/crates/jettypod-core/src/work.rs +1086 -0
  146. package/crates/jettypod-core/src/worktree.rs +628 -0
  147. package/crates/jettypod-core/src/ws.rs +767 -0
  148. package/cucumber-test.cjs +6 -0
  149. package/cucumber.js +9 -3
  150. package/docs/COMMAND_REFERENCE.md +34 -0
  151. package/hooks/post-checkout +32 -75
  152. package/hooks/post-merge +111 -10
  153. package/jest.setup.js +1 -0
  154. package/jettypod.js +145 -116
  155. package/lib/bdd-preflight.js +96 -0
  156. package/lib/chore-taxonomy.js +33 -10
  157. package/lib/database.js +36 -16
  158. package/lib/db-watcher.js +1 -1
  159. package/lib/git-hooks/pre-commit +1 -1
  160. package/lib/jettypod-backup.js +27 -4
  161. package/lib/merge-lock.js +111 -253
  162. package/lib/migrations/027-plan-at-creation-column.js +3 -1
  163. package/lib/migrations/029-remove-autoincrement.js +307 -0
  164. package/lib/migrations/029-rename-corrupted-to-cleaned.js +149 -0
  165. package/lib/migrations/030-rejection-round-columns.js +54 -0
  166. package/lib/migrations/031-session-isolation-index.js +17 -0
  167. package/lib/migrations/index.js +47 -4
  168. package/lib/schema.js +10 -5
  169. package/lib/seed-onboarding.js +1 -1
  170. package/lib/update-command/index.js +9 -175
  171. package/lib/work-commands/index.js +144 -19
  172. package/lib/work-tracking/index.js +148 -27
  173. package/lib/worktree-diagnostics.js +16 -16
  174. package/lib/worktree-facade.js +1 -1
  175. package/lib/worktree-manager.js +8 -8
  176. package/lib/worktree-reconciler.js +5 -5
  177. package/package.json +9 -2
  178. package/scripts/ndjson-to-cucumber-json.js +152 -0
  179. package/scripts/postinstall.js +25 -0
  180. package/skills-templates/bug-mode/SKILL.md +79 -20
  181. package/skills-templates/bug-planning/SKILL.md +25 -29
  182. package/skills-templates/chore-mode/SKILL.md +171 -69
  183. package/skills-templates/chore-mode/verification.js +51 -10
  184. package/skills-templates/chore-planning/SKILL.md +47 -18
  185. package/skills-templates/design-system-selection/SKILL.md +273 -0
  186. package/skills-templates/epic-planning/SKILL.md +82 -48
  187. package/skills-templates/external-transition/SKILL.md +47 -47
  188. package/skills-templates/feature-planning/SKILL.md +173 -74
  189. package/skills-templates/production-mode/SKILL.md +69 -49
  190. package/skills-templates/request-routing/SKILL.md +4 -4
  191. package/skills-templates/simple-improvement/SKILL.md +74 -29
  192. package/skills-templates/speed-mode/SKILL.md +217 -141
  193. package/skills-templates/stable-mode/SKILL.md +148 -89
  194. package/apps/dashboard/README.md +0 -36
  195. package/apps/dashboard/app/api/claude/[workItemId]/message/route.ts +0 -386
  196. package/apps/dashboard/app/api/claude/[workItemId]/pin/route.ts +0 -24
  197. package/apps/dashboard/app/api/claude/[workItemId]/route.ts +0 -167
  198. package/apps/dashboard/app/api/claude/sessions/[sessionId]/content/route.ts +0 -52
  199. package/apps/dashboard/app/api/claude/sessions/[sessionId]/message/route.ts +0 -378
  200. package/apps/dashboard/app/api/claude/sessions/[sessionId]/pin/route.ts +0 -24
  201. package/apps/dashboard/app/api/claude/sessions/cleanup/route.ts +0 -34
  202. package/apps/dashboard/app/api/claude/sessions/route.ts +0 -184
  203. package/apps/dashboard/app/api/decisions/[id]/route.ts +0 -25
  204. package/apps/dashboard/app/api/internal/set-project/route.ts +0 -17
  205. package/apps/dashboard/app/api/kanban/route.ts +0 -15
  206. package/apps/dashboard/app/api/settings/env-vars/route.ts +0 -125
  207. package/apps/dashboard/app/api/settings/general/route.ts +0 -21
  208. package/apps/dashboard/app/api/tests/route.ts +0 -9
  209. package/apps/dashboard/app/api/tests/run/route.ts +0 -82
  210. package/apps/dashboard/app/api/tests/run/stream/route.ts +0 -71
  211. package/apps/dashboard/app/api/tests/undefined/route.ts +0 -9
  212. package/apps/dashboard/app/api/usage/route.ts +0 -17
  213. package/apps/dashboard/app/api/work/[id]/description/route.ts +0 -21
  214. package/apps/dashboard/app/api/work/[id]/epic/route.ts +0 -21
  215. package/apps/dashboard/app/api/work/[id]/order/route.ts +0 -21
  216. package/apps/dashboard/app/api/work/[id]/status/route.ts +0 -21
  217. package/apps/dashboard/app/api/work/[id]/title/route.ts +0 -21
  218. package/apps/dashboard/app/layout.tsx +0 -43
  219. package/apps/dashboard/components/UpgradeBanner.tsx +0 -29
  220. package/apps/dashboard/electron/ipc-handlers.js +0 -1028
  221. package/apps/dashboard/electron/main.js +0 -2124
  222. package/apps/dashboard/electron/preload.js +0 -123
  223. package/apps/dashboard/electron/session-manager.js +0 -141
  224. package/apps/dashboard/electron-builder.config.js +0 -357
  225. package/apps/dashboard/hooks/useClaudeSessions.ts +0 -299
  226. package/apps/dashboard/lib/claude-process-manager.ts +0 -492
  227. package/apps/dashboard/lib/db-bridge.ts +0 -282
  228. package/apps/dashboard/lib/prototypes.ts +0 -202
  229. package/apps/dashboard/lib/test-results-db.ts +0 -307
  230. package/apps/dashboard/lib/tests.ts +0 -282
  231. package/apps/dashboard/next.config.js +0 -50
  232. package/apps/dashboard/postcss.config.mjs +0 -7
  233. package/apps/dashboard/public/file.svg +0 -1
  234. package/apps/dashboard/public/globe.svg +0 -1
  235. package/apps/dashboard/public/next.svg +0 -1
  236. package/apps/dashboard/public/vercel.svg +0 -1
  237. package/apps/dashboard/public/window.svg +0 -1
  238. package/apps/dashboard/scripts/download-node.js +0 -104
  239. package/apps/dashboard/scripts/upload-to-r2.js +0 -89
  240. package/docs/bdd-guidance.md +0 -390
@@ -18,7 +18,7 @@ description: Guide implementation of speed mode chores with autonomous code anal
18
18
  └─────────────────────────────────────────────────────────────────────┘
19
19
  ```
20
20
 
21
- ## 🛑 CRITICAL HANDOFF REQUIREMENT
21
+ ## CRITICAL HANDOFF REQUIREMENT
22
22
 
23
23
  **After completing ALL speed mode chores, you MUST:**
24
24
  1. Generate stable mode BDD scenarios and step definitions
@@ -26,18 +26,18 @@ description: Guide implementation of speed mode chores with autonomous code anal
26
26
  3. Set feature mode to stable
27
27
  4. **IMMEDIATELY invoke stable-mode using the Skill tool**
28
28
 
29
- **🛑 STOP GATE:** DO NOT end this skill without invoking stable-mode. Speed mode is ONLY a checkpoint - features are INCOMPLETE without stable mode.
29
+ **STOP GATE:** DO NOT end this skill without invoking stable-mode. Speed mode is ONLY a checkpoint - features are INCOMPLETE without stable mode.
30
30
 
31
31
  ---
32
32
 
33
- ## 🚫 FORBIDDEN: Skipping Stable Mode
33
+ ## FORBIDDEN: Skipping Stable Mode
34
34
 
35
35
  ```
36
- Ending speed-mode skill without invoking stable-mode skill
37
- Using `jettypod work status <feature-id> done` to mark feature complete
38
- Telling user "feature is complete" after speed mode
39
- Skipping Step 7 (Transition to Stable Mode)
40
- Any action that bypasses the speed→stable progression
36
+ Ending speed-mode skill without invoking stable-mode skill
37
+ Using `jettypod work status <feature-id> done` to mark feature complete
38
+ Telling user "feature is complete" after speed mode
39
+ Skipping Step 7 (Transition to Stable Mode)
40
+ Any action that bypasses the speed→stable progression
41
41
  ```
42
42
 
43
43
  **What "Feature Complete" Actually Means:**
@@ -60,7 +60,7 @@ Guides Claude Code through speed mode implementation with autonomous analysis an
60
60
 
61
61
  When this skill is activated, you are helping implement a speed mode chore to make all success scenarios pass. Follow this structured approach:
62
62
 
63
- ## 🔑 Critical Context
63
+ ## Critical Context
64
64
 
65
65
  **You are working in an isolated git worktree:**
66
66
  - `work start [chore-id]` created a dedicated worktree for this chore
@@ -72,7 +72,7 @@ When this skill is activated, you are helping implement a speed mode chore to ma
72
72
 
73
73
  ---
74
74
 
75
- ## 🚨 SHELL CWD RECOVERY
75
+ ## SHELL CWD RECOVERY
76
76
 
77
77
  **If ALL bash commands start failing with "Error: Exit code 1" and no output:**
78
78
 
@@ -93,7 +93,7 @@ cd /Users/erikspangenberg/personal-assistant && pwd
93
93
 
94
94
  ---
95
95
 
96
- ## 🛑 PRE-FLIGHT VALIDATION (REQUIRED)
96
+ ## PRE-FLIGHT VALIDATION (REQUIRED)
97
97
 
98
98
  **Before proceeding with ANY implementation, you MUST validate the worktree exists.**
99
99
 
@@ -107,11 +107,11 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.status, wt.worktree_path,
107
107
 
108
108
  | worktree_path | What it means | Action |
109
109
  |---------------|---------------|--------|
110
- | **Has a path** (e.g., `/path/to/.jettypod-work/...`) | Worktree exists, ready to proceed | Continue to Step 0 |
111
- | **NULL or empty** | `work start` was not called | **STOP - run `jettypod work start [chore-id]` first** |
112
- | **No rows returned** | No chore is in progress | **STOP - verify the chore exists and run `work start`** |
110
+ | **Has a path** (e.g., `/path/to/.jettypod-work/...`) | Worktree exists, ready to proceed | Continue to Step 0 |
111
+ | **NULL or empty** | `work start` was not called | **STOP - run `jettypod work start [chore-id]` first** |
112
+ | **No rows returned** | No chore is in progress | **STOP - verify the chore exists and run `work start`** |
113
113
 
114
- **🛑 STOP GATE:** If `worktree_path` is NULL or no rows returned, you MUST run `jettypod work start [chore-id]` before continuing. DO NOT proceed without a valid worktree.
114
+ **STOP GATE:** If `worktree_path` is NULL or no rows returned, you MUST run `jettypod work start [chore-id]` before continuing. DO NOT proceed without a valid worktree.
115
115
 
116
116
  **Example of valid output:**
117
117
  ```
@@ -126,7 +126,7 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.status, wt.worktree_path,
126
126
 
127
127
  ---
128
128
 
129
- ## 🔒 WORKTREE PATH LOCK
129
+ ## WORKTREE PATH LOCK
130
130
 
131
131
  **After pre-flight validation passes, capture and lock the worktree path:**
132
132
 
@@ -135,7 +135,7 @@ From the pre-flight query output, extract and store:
135
135
 
136
136
  **Display:**
137
137
  ```
138
- 🔒 WORKTREE LOCK ACTIVE
138
+ WORKTREE LOCK ACTIVE
139
139
  Path: ${WORKTREE_PATH}
140
140
 
141
141
  All file writes will use this path.
@@ -171,7 +171,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
171
171
  **User Profile:** May not know how to code - Claude Code does the implementation autonomously.
172
172
 
173
173
  <details>
174
- <summary><strong>📋 Speed Mode Constraints (click to expand)</strong></summary>
174
+ <summary><strong>Speed Mode Constraints (click to expand)</strong></summary>
175
175
 
176
176
  **What to implement:**
177
177
  - **Integration** - wire feature into the app so it's reachable (Integration Scenario)
@@ -180,10 +180,10 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
180
180
  - Success variations (different outcomes that are all correct)
181
181
 
182
182
  **What NOT to implement:**
183
- - Error handling (try/catch, validation, edge cases)
184
- - Input validation (null checks, type checks, range validation)
185
- - Error messages for failures
186
- - Edge case handling (empty arrays, boundary values, race conditions)
183
+ - Error handling (try/catch, validation, edge cases)
184
+ - Input validation (null checks, type checks, range validation)
185
+ - Error messages for failures
186
+ - Edge case handling (empty arrays, boundary values, race conditions)
187
187
 
188
188
  **Code organization:**
189
189
  - Single file when possible - keep it simple
@@ -195,7 +195,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
195
195
 
196
196
  ---
197
197
 
198
- ## 🧪 Unit Testing in Speed Mode - True TDD
198
+ ## Unit Testing in Speed Mode - True TDD
199
199
 
200
200
  **Unit tests are written DURING the RED→GREEN loop, not after.**
201
201
 
@@ -218,7 +218,7 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
218
218
  - Check existing test files for patterns
219
219
 
220
220
  <details>
221
- <summary><strong>📋 TDD Example (click to expand)</strong></summary>
221
+ <summary><strong>TDD Example (click to expand)</strong></summary>
222
222
 
223
223
  ```javascript
224
224
  // Iteration 1: BDD step "Given a user exists" is failing
@@ -243,14 +243,14 @@ function createUser(name, email) {
243
243
 
244
244
  **Unit test scope in speed mode:**
245
245
  ```javascript
246
- // Speed mode unit tests (success paths)
246
+ // Speed mode unit tests (success paths)
247
247
  test('createUser creates user with valid data', () => {
248
248
  const user = createUser('John', 'john@example.com');
249
249
  expect(user.name).toBe('John');
250
250
  expect(user.email).toBe('john@example.com');
251
251
  });
252
252
 
253
- // NOT in speed mode (stable mode adds these)
253
+ // NOT in speed mode (stable mode adds these)
254
254
  test('createUser throws error for invalid email', () => {
255
255
  expect(() => createUser('John', 'invalid')).toThrow();
256
256
  });
@@ -267,14 +267,17 @@ test('createUser throws error for invalid email', () => {
267
267
  | Step | Location | Why |
268
268
  |------|----------|-----|
269
269
  | Step 3A | Before implementing (conditional) | User confirms implementation approach - only if ambiguous |
270
- | Step 7B | Before creating stable chores | User confirms proposed stable mode chores - always |
270
+ | Step 7C | Before writing stable scenarios | User confirms stable mode BDD scenarios - always |
271
+ | Step 7E | Before creating stable chores | User confirms proposed stable mode chores - always |
271
272
 
272
273
  **Where Claude Code executes autonomously:**
273
274
  - Steps 0-2: Initialize, analyze scenarios, analyze codebase
274
275
  - Step 3: Decision to skip/ask confirmation
275
276
  - Steps 4-5: RED baseline, RED→GREEN→REFACTOR loop
276
277
  - Step 6: Route to next chore OR transition to Step 7
277
- - Step 7 (after confirmation): Create chores, commit, set mode, invoke stable-mode
278
+ - Step 7A-7B: Validate BDD, merge final speed chore
279
+ - Step 7D: Write and merge confirmed stable scenarios
280
+ - Step 7F-7G (after chore confirmation): Create chores, set mode, invoke stable-mode
278
281
 
279
282
  ---
280
283
 
@@ -290,7 +293,7 @@ test('createUser throws error for invalid email', () => {
290
293
  sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.parent_id, parent.title as parent_title, parent.scenario_file, wt.worktree_path, wt.branch_name FROM work_items wi LEFT JOIN work_items parent ON wi.parent_id = parent.id LEFT JOIN worktrees wt ON wi.id = wt.work_item_id WHERE wi.status = 'in_progress' AND wi.type = 'chore'"
291
294
  ```
292
295
 
293
- **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
296
+ **WORKFLOW INTEGRATION: Start workflow tracking**
294
297
 
295
298
  After getting the work context, register this skill execution:
296
299
 
@@ -304,7 +307,7 @@ This validates that `feature_planning_complete` gate is passed and creates an ex
304
307
 
305
308
  ```
306
309
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
307
- 🚀 SPEED MODE: Implementing Chore #[id]
310
+ SPEED MODE: Implementing Chore #[id]
308
311
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
309
312
 
310
313
  Chore: [title]
@@ -321,11 +324,11 @@ Analyzing BDD scenarios to determine implementation approach...
321
324
 
322
325
  ### Step 1: Check for Breadcrumbs and Analyze Scenario
323
326
 
324
- **🚫 FORBIDDEN: Writing Files at This Step**
327
+ **FORBIDDEN: Writing Files at This Step**
325
328
  ```
326
- Write tool to any path
327
- Edit tool to any path
328
- Any file creation or modification
329
+ Write tool to any path
330
+ Edit tool to any path
331
+ Any file creation or modification
329
332
  ```
330
333
  **This is an ANALYSIS step.** File writes happen in Step 5.
331
334
 
@@ -347,9 +350,10 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.description, wi.parent_id,
347
350
  **Check for breadcrumbs** by examining the chore's description for:
348
351
  - "Scenario steps addressed:"
349
352
  - "Implementation guidance:"
353
+ - "UX acceptance criteria:" (loading states, success feedback, empty states, micro-interactions)
350
354
  - "Verification:"
351
355
 
352
- If all three sections exist, use them. Otherwise, fall back to autonomous analysis.
356
+ If at least "Scenario steps addressed:", "Implementation guidance:", and "Verification:" exist, use them. "UX acceptance criteria:" is optional but MUST be implemented if present — these define the visual states and micro-interactions the user expects to see during QA.
353
357
 
354
358
  **Then read the scenario file** using the Read tool on the path returned by `scenario_file`.
355
359
 
@@ -365,7 +369,7 @@ If all three sections exist, use them. Otherwise, fall back to autonomous analys
365
369
  **Display to user (with breadcrumbs):**
366
370
 
367
371
  ```
368
- 🚀 Speed Mode: [Chore Title]
372
+ Speed Mode: [Chore Title]
369
373
 
370
374
  Scenario steps addressed:
371
375
  [Steps from breadcrumbs]
@@ -373,6 +377,9 @@ Scenario steps addressed:
373
377
  Implementation guidance:
374
378
  [Files, patterns, functions from breadcrumbs]
375
379
 
380
+ UX acceptance criteria:
381
+ [Loading states, success feedback, empty states, micro-interactions from breadcrumbs — if present]
382
+
376
383
  Verification:
377
384
  [Step definitions from breadcrumbs]
378
385
 
@@ -382,7 +389,7 @@ Now analyzing codebase to finalize implementation approach...
382
389
  **Display to user (without breadcrumbs):**
383
390
 
384
391
  ```
385
- 🚀 Speed Mode: [Feature Name]
392
+ Speed Mode: [Feature Name]
386
393
 
387
394
  Happy Path Scenario:
388
395
  [Scenario title]
@@ -400,11 +407,11 @@ Now analyzing codebase to propose implementation...
400
407
 
401
408
  ### Step 2: Autonomous Codebase Analysis
402
409
 
403
- **🚫 FORBIDDEN: Writing Files at This Step**
410
+ **FORBIDDEN: Writing Files at This Step**
404
411
  ```
405
- Write tool to any path
406
- Edit tool to any path
407
- Any file creation or modification
412
+ Write tool to any path
413
+ Edit tool to any path
414
+ Any file creation or modification
408
415
  ```
409
416
  **This is an ANALYSIS step.** File writes happen in Step 5.
410
417
 
@@ -458,7 +465,7 @@ Decisions constrain your implementation approach - use them to guide technology
458
465
  **Display analysis results:**
459
466
 
460
467
  ```
461
- 📊 Codebase Analysis Complete
468
+ Codebase Analysis Complete
462
469
 
463
470
  Architectural Constraints:
464
471
  [List any epic decisions that apply]
@@ -476,7 +483,7 @@ Integration Points:
476
483
  Now proposing implementation approach...
477
484
  ```
478
485
 
479
- **🔄 WORKFLOW CHECKPOINT: Codebase analysis complete**
486
+ **WORKFLOW CHECKPOINT: Codebase analysis complete**
480
487
 
481
488
  ```bash
482
489
  jettypod workflow checkpoint <feature-id> --step=2
@@ -484,11 +491,11 @@ jettypod workflow checkpoint <feature-id> --step=2
484
491
 
485
492
  ### Step 3: Decide if Confirmation Needed
486
493
 
487
- **🚫 FORBIDDEN: Writing Files at This Step**
494
+ **FORBIDDEN: Writing Files at This Step**
488
495
  ```
489
- Write tool to any path
490
- Edit tool to any path
491
- Any file creation or modification
496
+ Write tool to any path
497
+ Edit tool to any path
498
+ Any file creation or modification
492
499
  ```
493
500
  **This is a DECISION step.** File writes happen in Step 5.
494
501
 
@@ -508,20 +515,20 @@ jettypod workflow checkpoint <feature-id> --step=2
508
515
 
509
516
  ### Step 3A: Propose Implementation Approach (Conditional)
510
517
 
511
- **🚫 FORBIDDEN: Writing Files at This Step**
518
+ **FORBIDDEN: Writing Files at This Step**
512
519
  ```
513
- Write tool to any path
514
- Edit tool to any path
515
- Any file creation or modification
520
+ Write tool to any path
521
+ Edit tool to any path
522
+ Any file creation or modification
516
523
  ```
517
524
  **This is a PROPOSAL step.** File writes happen in Step 5.
518
525
 
519
- **⚡ ASYNC BOUNDARY - Only execute this if confirmation needed**
526
+ **ASYNC BOUNDARY - Only execute this if confirmation needed**
520
527
 
521
528
  **Present your analysis and proposal to the user:**
522
529
 
523
530
  ```
524
- 💡 Implementation Proposal
531
+ Implementation Proposal
525
532
 
526
533
  I see multiple ways to approach this. Here's what I'm thinking:
527
534
 
@@ -536,7 +543,7 @@ I see multiple ways to approach this. Here's what I'm thinking:
536
543
  Sound good, or would you prefer a different approach?
537
544
  ```
538
545
 
539
- **⚡ WAIT for user confirmation or adjustments.**
546
+ **WAIT for user confirmation or adjustments.**
540
547
 
541
548
  If user adjusts: revise proposal and confirm again before proceeding.
542
549
 
@@ -544,6 +551,16 @@ If user adjusts: revise proposal and confirm again before proceeding.
544
551
 
545
552
  ---
546
553
 
554
+ ### BDD Step Definition Constraints (ENFORCED)
555
+
556
+ Before writing any step definitions, read `templates/bdd-guidance.md`. BANNED in step defs: `setTimeout`/`sleep`, module-level `let`/`var`, raw SQL, assertions in Given/When, loops/branching, self-fulfilling mocks (setting state then asserting it). Steps must be 1-5 lines calling one helper via Cucumber World (`this`). Read `features/support/helpers/` and reuse before creating.
557
+
558
+ **Scaffolding:** If `features/support/helpers/` does not exist in the project, scaffold it before writing step definitions. Copy `templates/bdd-scaffolding/wait.js` to `features/support/helpers/wait.js` and `templates/bdd-scaffolding/world.js` to `features/support/world.js`.
559
+
560
+ **Helper Reuse:** Before writing step definitions, glob `features/support/helpers/**/*.js` and read each file. Import and call existing helpers in your steps — never duplicate functionality that already exists.
561
+
562
+ ---
563
+
547
564
  ### Step 4: Establish RED Baseline
548
565
 
549
566
  **CRITICAL:** After user confirms, execute autonomously - no permission needed for code changes.
@@ -568,27 +585,27 @@ This establishes your RED baseline - all or most steps should be failing initial
568
585
 
569
586
  **Display RED baseline:**
570
587
  ```
571
- 🔴 Establishing RED baseline...
588
+ Establishing RED baseline...
572
589
 
573
590
  RED Baseline: 5 of 8 steps failing
574
591
 
575
592
  Failing steps:
576
- Given a user is logged in
577
- When they click the dashboard button
578
- Then they should see their dashboard
579
- And the dashboard should show their username
580
- And the dashboard should show their recent activity
593
+ Given a user is logged in
594
+ When they click the dashboard button
595
+ Then they should see their dashboard
596
+ And the dashboard should show their username
597
+ And the dashboard should show their recent activity
581
598
 
582
599
  First error:
583
600
  Step: Given a user is logged in
584
601
  Error: Error: login function is not defined
585
602
 
586
- 🎯 Goal: Make all steps pass
603
+ Goal: Make all steps pass
587
604
 
588
605
  Now implementing...
589
606
  ```
590
607
 
591
- **🔄 WORKFLOW CHECKPOINT: RED baseline established**
608
+ **WORKFLOW CHECKPOINT: RED baseline established**
592
609
 
593
610
  ```bash
594
611
  jettypod workflow checkpoint <feature-id> --step=4
@@ -598,9 +615,9 @@ jettypod workflow checkpoint <feature-id> --step=4
598
615
 
599
616
  ### Step 5: RED→GREEN→REFACTOR Loop
600
617
 
601
- **🔒 WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured after pre-flight validation.
618
+ **WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured after pre-flight validation.
602
619
 
603
- **✅ NOW you may write files** - worktree is locked, approach is confirmed.
620
+ **NOW you may write files** - worktree is locked, approach is confirmed.
604
621
 
605
622
  **Emit gate signal:**
606
623
 
@@ -623,23 +640,23 @@ jettypod ui gate implementing --data='{"description":"[speed mode implementation
623
640
  **Show progress each iteration:**
624
641
  ```
625
642
  ━━━ Iteration 3/10 ━━━
626
- 📝 Unit test: test/dashboard.test.js - sortActivityByDate()
643
+ Unit test: test/dashboard.test.js - sortActivityByDate()
627
644
  RED: Test fails - function doesn't exist yet
628
- ✍️ Implementation: src/dashboard.js - added sortActivityByDate()
645
+ Implementation: src/dashboard.js - added sortActivityByDate()
629
646
  GREEN: Unit test passes
630
- 🧪 Running BDD scenarios...
631
- 📊 Progress: 7/8 BDD steps passing
632
- Newly passing: And activity should be sorted by date
633
- 🔧 Next failure: And activity should be filterable
647
+ Running BDD scenarios...
648
+ Progress: 7/8 BDD steps passing
649
+ Newly passing: And activity should be sorted by date
650
+ Next failure: And activity should be filterable
634
651
  BDD step: When I filter by category "work"
635
652
  ```
636
653
 
637
654
  **When GREEN achieved:**
638
655
  ```
639
- 🎉 GREEN: All success scenarios passing!
656
+ GREEN: All success scenarios passing!
640
657
  ```
641
658
 
642
- **🔄 WORKFLOW CHECKPOINT: GREEN achieved**
659
+ **WORKFLOW CHECKPOINT: GREEN achieved**
643
660
 
644
661
  ```bash
645
662
  jettypod workflow checkpoint <feature-id> --step=5
@@ -654,7 +671,7 @@ jettypod workflow checkpoint <feature-id> --step=5
654
671
  **Re-run tests after refactor** to ensure nothing broke.
655
672
 
656
673
  <details>
657
- <summary><strong>📋 TDD Loop Guidelines (click to expand)</strong></summary>
674
+ <summary><strong>TDD Loop Guidelines (click to expand)</strong></summary>
658
675
 
659
676
  **Iteration strategy:**
660
677
  - Start with first failing step
@@ -674,6 +691,8 @@ jettypod workflow checkpoint <feature-id> --step=5
674
691
 
675
692
  </details>
676
693
 
694
+ **Quality Gate:** Before committing, review every `.steps.js` file you wrote or modified. Check for banlist violations: `setTimeout`/`sleep`, module-level `let`/`var`, raw SQL, assertions in Given/When, self-fulfilling mocks, steps longer than 5 lines. Fix violations before proceeding.
695
+
677
696
  ---
678
697
 
679
698
  ### Step 6: Route After Chore Completion
@@ -696,10 +715,10 @@ sqlite3 .jettypod/work.db "SELECT id, title FROM work_items WHERE parent_id = <f
696
715
 
697
716
  ```
698
717
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
699
- 🎯 Speed Mode Chore Complete
718
+ Speed Mode Chore Complete
700
719
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
701
720
 
702
- Success scenarios pass for this chore
721
+ Success scenarios pass for this chore
703
722
 
704
723
  More speed mode chores remain. Starting next chore:
705
724
  #[next-chore-id]: [next-chore-title]
@@ -717,6 +736,8 @@ git add . && git commit -m "feat: [brief description of what was implemented]"
717
736
  jettypod work merge [current-chore-id]
718
737
  ```
719
738
 
739
+ **If merge fails with `Uncommitted changes detected`:** `git stash` from main repo CWD → create a work item for the stashed changes → `jettypod work start <id>` → `git stash pop` in that worktree → commit → merge → cleanup → then retry your original merge.
740
+
720
741
  ```bash
721
742
  # Step 2: cd to main repo
722
743
  cd /path/to/main/repo
@@ -741,7 +762,7 @@ If the query returns no remaining chores, proceed to Step 7.
741
762
 
742
763
  ### Step 7: Transition to Stable Mode
743
764
 
744
- **🛑 CRITICAL: This step ONLY runs after ALL speed chores are complete.**
765
+ **CRITICAL: This step ONLY runs after ALL speed chores are complete.**
745
766
 
746
767
  This is the transition from speed mode to stable mode. Follow these phases in order.
747
768
 
@@ -804,8 +825,8 @@ git add . && git commit -m "feat: [brief description of what was implemented]"
804
825
  ```
805
826
 
806
827
  ```bash
807
- # Step 1: Merge with transition flag (can run from worktree - it won't delete it)
808
- jettypod work merge [current-chore-id] --with-transition
828
+ # Step 1: Merge (works from anywhere ALWAYS include chore ID)
829
+ jettypod work merge [current-chore-id]
809
830
  ```
810
831
 
811
832
  ```bash
@@ -821,42 +842,95 @@ jettypod work cleanup [current-chore-id]
821
842
 
822
843
  After cleanup, you are on main branch. Ready to generate stable mode scenarios.
823
844
 
824
- #### Step 7C: Generate and Propose Stable Mode Chores
845
+ #### Step 7C: Present Stable Mode Scenarios for Review
825
846
 
826
- **⚡ ASYNC BOUNDARY - Must wait for user confirmation**
847
+ **FORBIDDEN: Writing Files at This Step**
848
+ ```
849
+ Write tool to any path
850
+ Edit tool to any path
851
+ Any file creation or modification
852
+ ```
853
+ **This is a PROPOSAL step.** File writes happen in Step 7D after user confirmation.
827
854
 
828
- **1. Create a test worktree for writing stable mode scenarios:**
855
+ **ASYNC BOUNDARY - Must wait for user confirmation**
856
+
857
+ **1. Read the feature's scenario file and analyze for stable mode needs:**
829
858
 
830
- **🚫 FORBIDDEN: Manual Git Worktree Commands**
859
+ ```bash
860
+ sqlite3 .jettypod/work.db "SELECT id, title, scenario_file FROM work_items WHERE id = <feature-id>"
831
861
  ```
832
- ❌ git worktree add ...
833
- git checkout -b tests/...
834
- git branch tests/...
862
+
863
+ **2. Generate stable mode BDD scenarios** covering:
864
+ - **Error scenarios** - Invalid input, missing params, system errors, permission failures
865
+ - **Edge cases** - Empty inputs, boundary values, special characters
866
+ - **State consistency** - Concurrent ops, partial failures, invalid state transitions
867
+
868
+ **3. Present proposed scenarios to user for review:**
869
+
835
870
  ```
836
- **ALWAYS use jettypod commands** - they handle branch naming, path conventions, database tracking, and cleanup. Manual git commands will create orphaned worktrees that break the merge workflow.
871
+ Stable Mode Scenarios
872
+
873
+ I've drafted [N] stable mode scenarios covering error handling and edge cases.
874
+ Please review — these are the contract for what stable mode will implement.
875
+
876
+ **Error Handling:**
877
+
878
+ Scenario: [Error scenario title]
879
+ Given [context]
880
+ When [error condition]
881
+ Then [expected error handling]
882
+
883
+ Scenario: [Error scenario title]
884
+ Given [context]
885
+ When [error condition]
886
+ Then [expected error handling]
887
+
888
+ **Edge Cases:**
889
+
890
+ Scenario: [Edge case title]
891
+ Given [context]
892
+ When [edge case input]
893
+ Then [expected behavior]
894
+
895
+ Does this capture the error handling and edge cases correctly?
896
+ Any scenarios to add, change, or remove?
897
+ ```
898
+
899
+ **WAIT for user confirmation or adjustments.**
900
+
901
+ If user requests changes, revise the scenarios and re-present until confirmed.
902
+
903
+ **WORKFLOW CHECKPOINT: Stable mode scenarios confirmed**
837
904
 
838
905
  ```bash
839
- jettypod work tests <feature-id>
906
+ jettypod workflow checkpoint <feature-id> --step=7C
840
907
  ```
841
908
 
842
- This creates an isolated worktree at `.jettypod-work/tests-<id>-<slug>` with branch `tests/feature-<id>-<slug>`.
909
+ #### Step 7D: Write and Merge Stable Mode Scenarios
843
910
 
844
- **🛑 CRITICAL:** All BDD file operations MUST use absolute paths in the test worktree:
845
- - ✅ `/path/to/.jettypod-work/tests-42-login/features/login.feature`
846
- - ❌ `features/login.feature` (this would write to main repo!)
911
+ **After user confirms scenarios, execute autonomously.**
847
912
 
848
- **2. Read the feature's scenario file and analyze for stable mode needs:**
913
+ **1. Create a test worktree for writing stable mode scenarios:**
914
+
915
+ **FORBIDDEN: Manual Git Worktree Commands**
916
+ ```
917
+ git worktree add ...
918
+ git checkout -b tests/...
919
+ git branch tests/...
920
+ ```
921
+ **ALWAYS use jettypod commands** - they handle branch naming, path conventions, database tracking, and cleanup. Manual git commands will create orphaned worktrees that break the merge workflow.
849
922
 
850
923
  ```bash
851
- sqlite3 .jettypod/work.db "SELECT id, title, scenario_file FROM work_items WHERE id = <feature-id>"
924
+ jettypod work tests <feature-id>
852
925
  ```
853
926
 
854
- **3. Generate stable mode BDD scenarios** covering:
855
- - **Error scenarios** - Invalid input, missing params, system errors, permission failures
856
- - **Edge cases** - Empty inputs, boundary values, special characters
857
- - **State consistency** - Concurrent ops, partial failures, invalid state transitions
927
+ This creates an isolated worktree at `.jettypod-work/tests-<id>-<slug>` with branch `tests/feature-<id>-<slug>`.
858
928
 
859
- **4. Append scenarios to the feature file IN THE TEST WORKTREE:**
929
+ **CRITICAL:** All BDD file operations MUST use absolute paths in the test worktree:
930
+ - `/path/to/.jettypod-work/tests-42-login/features/login.feature`
931
+ - `features/login.feature` (this would write to main repo!)
932
+
933
+ **2. Append confirmed scenarios to the feature file IN THE TEST WORKTREE:**
860
934
 
861
935
  Use the Edit tool to append to `<worktree-path>/features/<feature-file>`:
862
936
 
@@ -874,11 +948,11 @@ Scenario: [Edge case title]
874
948
  Then [expected behavior]
875
949
  ```
876
950
 
877
- **5. Create step definitions IN THE TEST WORKTREE** at `<worktree-path>/features/step_definitions/<feature-slug>-stable.steps.js`
951
+ **3. Create step definitions IN THE TEST WORKTREE** at `<worktree-path>/features/step_definitions/<feature-slug>-stable.steps.js`
878
952
 
879
- **6. Commit and merge the test worktree:**
953
+ **4. Commit and merge the test worktree:**
880
954
 
881
- **🚨 CRITICAL: Shell CWD Corruption Prevention**
955
+ **CRITICAL: Shell CWD Corruption Prevention**
882
956
 
883
957
  The merge will delete the test worktree. If your shell is inside that worktree, ALL subsequent commands will fail. You MUST:
884
958
  1. Chain the cd and merge in a SINGLE bash command
@@ -911,14 +985,16 @@ pwd && ls .jettypod # verify
911
985
  jettypod work cleanup <feature-id>
912
986
  ```
913
987
 
914
- **7. Present proposal to user:**
988
+ #### Step 7E: Propose Stable Mode Chores
915
989
 
916
- ```
917
- 📋 Stable Mode Transition
990
+ **ASYNC BOUNDARY - Must wait for user confirmation**
918
991
 
919
- I've generated [N] stable mode scenarios covering error handling and edge cases.
992
+ **Present chore proposals to user:**
920
993
 
921
- Here are the chores needed to make these scenarios pass:
994
+ ```
995
+ Stable Mode Chores
996
+
997
+ Scenarios are committed. Here are the chores needed to make them pass:
922
998
 
923
999
  **Chore 1: [Title]**
924
1000
  - Why: [What gap this fills]
@@ -933,9 +1009,9 @@ Here are the chores needed to make these scenarios pass:
933
1009
  Sound good? I'll create these chores once you confirm.
934
1010
  ```
935
1011
 
936
- **⚡ WAIT for user confirmation or adjustments.**
1012
+ **WAIT for user confirmation or adjustments.**
937
1013
 
938
- #### Step 7D: Create Chores and Complete Transition
1014
+ #### Step 7F: Create Chores and Complete Transition
939
1015
 
940
1016
  **After user confirms, execute autonomously:**
941
1017
 
@@ -945,27 +1021,28 @@ Sound good? I'll create these chores once you confirm.
945
1021
  jettypod work set-mode <feature-id> stable
946
1022
  ```
947
1023
 
948
- **🛑 CRITICAL:** You MUST set mode to stable BEFORE creating chores. The system blocks chore creation while feature is in speed mode.
1024
+ **CRITICAL:** You MUST set mode to stable BEFORE creating chores. The system blocks chore creation while feature is in speed mode.
949
1025
 
950
1026
  **2. Create stable mode chores:**
951
1027
 
952
- ```bash
953
- jettypod work create chore "[Chore title]" "[Description with scenarios addressed]" --parent=<feature-id>
1028
+ For each confirmed chore, use the **Write** tool to create `/tmp/jettypod-create.json`:
1029
+ ```json
1030
+ {
1031
+ "type": "chore",
1032
+ "title": "[Chore title]",
1033
+ "description": "[Description with scenarios addressed]",
1034
+ "parent": <feature-id>
1035
+ }
954
1036
  ```
955
1037
 
956
- Repeat for each confirmed chore. **Do NOT use `--mode` flag** - chores inherit mode from their parent feature.
957
-
958
- **3. Release merge lock (CRITICAL: separate Bash calls):**
959
-
1038
+ Then run via **Bash**:
960
1039
  ```bash
961
- cd <main-repo> # Bash call 1
1040
+ jettypod work create --from=/tmp/jettypod-create.json
962
1041
  ```
963
1042
 
964
- ```bash
965
- jettypod work merge <last-chore-id> --release-lock # Bash call 2
966
- ```
1043
+ Repeat for each confirmed chore. **Do NOT add a `mode` field** - chores inherit mode from their parent feature.
967
1044
 
968
- **🔄 WORKFLOW COMPLETE: Speed mode finished**
1045
+ **WORKFLOW COMPLETE: Speed mode finished**
969
1046
 
970
1047
  Mark speed mode as complete (this passes the `speed_mode_complete` gate, enabling stable-mode):
971
1048
 
@@ -979,9 +1056,9 @@ jettypod workflow complete speed-mode <feature-id>
979
1056
  jettypod ui gate complete --data='{"summary":"Speed mode complete - transitioning to stable mode","files":["[files implemented]"]}'
980
1057
  ```
981
1058
 
982
- #### Step 7E: Start First Stable Chore and Invoke Stable Mode Skill
1059
+ #### Step 7G: Start First Stable Chore and Invoke Stable Mode Skill
983
1060
 
984
- **🛑 CRITICAL HANDOFF - You MUST start the first chore BEFORE invoking stable-mode.**
1061
+ **CRITICAL HANDOFF - You MUST start the first chore BEFORE invoking stable-mode.**
985
1062
 
986
1063
  **1. Get the first stable chore:**
987
1064
 
@@ -997,12 +1074,12 @@ Note: Chores don't have a `mode` column - they inherit context from their parent
997
1074
  jettypod work start <first-stable-chore-id>
998
1075
  ```
999
1076
 
1000
- **🛑 STOP AND CHECK:** Look at the output. You should see:
1077
+ **STOP AND CHECK:** Look at the output. You should see:
1001
1078
  ```
1002
- Created worktree: /path/to/.jettypod-work/[id]-[title-slug]
1079
+ Created worktree: /path/to/.jettypod-work/[id]-[title-slug]
1003
1080
  ```
1004
1081
 
1005
- If you see `⚠️ Working in main repository (worktree creation failed)`, fix the issue before continuing.
1082
+ If you see `Working in main repository (worktree creation failed)`, fix the issue before continuing.
1006
1083
 
1007
1084
  **3. Verify worktree exists:**
1008
1085
 
@@ -1016,21 +1093,21 @@ If empty, **STOP** - worktree wasn't created properly.
1016
1093
 
1017
1094
  ```
1018
1095
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1019
- 🎯 Speed Mode Complete! Transitioning to Stable Mode
1096
+ Speed Mode Complete! Transitioning to Stable Mode
1020
1097
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1021
1098
 
1022
- ⚠️ CRITICAL: Speed mode is ONLY a checkpoint.
1099
+ CRITICAL: Speed mode is ONLY a checkpoint.
1023
1100
  The feature is INCOMPLETE without stable mode.
1024
1101
 
1025
1102
  What we accomplished:
1026
- All speed mode chores complete
1027
- Generated [N] stable mode BDD scenarios
1028
- Created step definitions for stable scenarios
1029
- Created [N] stable mode chores
1030
- Feature mode set to stable
1031
- Started first stable chore #[id]
1103
+ All speed mode chores complete
1104
+ Generated [N] stable mode BDD scenarios
1105
+ Created step definitions for stable scenarios
1106
+ Created [N] stable mode chores
1107
+ Feature mode set to stable
1108
+ Started first stable chore #[id]
1032
1109
 
1033
- 🚀 Now invoking stable-mode skill...
1110
+ Now invoking stable-mode skill...
1034
1111
  ```
1035
1112
 
1036
1113
  **5. Invoke stable-mode:**
@@ -1039,7 +1116,7 @@ What we accomplished:
1039
1116
  Use the Skill tool with skill: "stable-mode"
1040
1117
  ```
1041
1118
 
1042
- **🛑 CRITICAL:** You MUST:
1119
+ **CRITICAL:** You MUST:
1043
1120
  1. Run `work start` for the first stable chore
1044
1121
  2. Verify the worktree was created
1045
1122
  3. THEN invoke stable-mode using the Skill tool
@@ -1075,8 +1152,7 @@ cd <main-repo>
1075
1152
  ```bash
1076
1153
  # Bash call 2: Merge (ALWAYS include chore ID)
1077
1154
  jettypod work merge <chore-id> # Merge chore by ID
1078
- jettypod work merge <chore-id> --with-transition # Hold lock for transition
1079
- jettypod work merge <chore-id> --release-lock # Release held lock
1155
+ jettypod work merge --release-lock # Force-release stuck lock
1080
1156
  ```
1081
1157
 
1082
1158
  **Start chores:**
@@ -1097,12 +1173,12 @@ jettypod work cleanup <feature-id> # Clean up worktree
1097
1173
  jettypod work set-mode <feature-id> stable
1098
1174
  ```
1099
1175
 
1100
- **Create chores (AFTER setting mode):**
1176
+ **Create chores (AFTER setting mode) — use Write tool for JSON, then:**
1101
1177
  ```bash
1102
- jettypod work create chore "<title>" "<description>" --parent=<feature-id>
1178
+ jettypod work create --from=/tmp/jettypod-create.json
1103
1179
  ```
1104
- Note: Do NOT use `--mode` flag - chores inherit mode from parent feature.
1180
+ Note: Do NOT add `mode` field in JSON - chores inherit mode from parent feature.
1105
1181
 
1106
- **❌ DO NOT use these to complete chores:**
1182
+ **DO NOT use these to complete chores:**
1107
1183
  - `jettypod work status <id> done`
1108
1184
  - `jettypod work complete <id>`