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
@@ -30,7 +30,7 @@ When this skill is activated, you are helping implement a production mode chore
30
30
 
31
31
  ---
32
32
 
33
- ## 🛑 PRE-FLIGHT VALIDATION (REQUIRED)
33
+ ## PRE-FLIGHT VALIDATION (REQUIRED)
34
34
 
35
35
  **Before proceeding with ANY implementation, you MUST validate the worktree exists.**
36
36
 
@@ -44,23 +44,23 @@ sqlite3 .jettypod/work.db "SELECT wi.id, wi.title, wi.status, wt.worktree_path,
44
44
 
45
45
  | worktree_path | What it means | Action |
46
46
  |---------------|---------------|--------|
47
- | **Has a path** (e.g., `/path/to/.jettypod-work/...`) | Worktree exists, ready to proceed | Continue to Step 0 |
48
- | **NULL or empty** | `work start` was not called | **STOP - run `jettypod work start [chore-id]` first** |
49
- | **No rows returned** | No chore is in progress | **STOP - verify the chore exists and run `work start`** |
47
+ | **Has a path** (e.g., `/path/to/.jettypod-work/...`) | Worktree exists, ready to proceed | Continue to Step 0 |
48
+ | **NULL or empty** | `work start` was not called | **STOP - run `jettypod work start [chore-id]` first** |
49
+ | **No rows returned** | No chore is in progress | **STOP - verify the chore exists and run `work start`** |
50
50
 
51
- **🛑 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.
51
+ **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.
52
52
 
53
- **🚫 FORBIDDEN: Manual Git Worktree Commands**
53
+ **FORBIDDEN: Manual Git Worktree Commands**
54
54
  ```
55
- git worktree add ...
56
- git checkout -b feature/...
57
- git branch feature/...
55
+ git worktree add ...
56
+ git checkout -b feature/...
57
+ git branch feature/...
58
58
  ```
59
59
  **ALWAYS use `jettypod work start`** - it handles branch naming, path conventions, database tracking, and cleanup. Manual git commands will create orphaned worktrees that break the merge workflow.
60
60
 
61
61
  ---
62
62
 
63
- ## 🔒 WORKTREE PATH LOCK
63
+ ## WORKTREE PATH LOCK
64
64
 
65
65
  **After pre-flight validation passes, capture and lock the worktree path:**
66
66
 
@@ -70,7 +70,7 @@ From the pre-flight query output, extract and store:
70
70
  **Display:**
71
71
 
72
72
  ```
73
- 🔒 WORKTREE LOCK ACTIVE
73
+ WORKTREE LOCK ACTIVE
74
74
  Path: ${WORKTREE_PATH}
75
75
 
76
76
  All file writes will use this path.
@@ -94,11 +94,11 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
94
94
 
95
95
  **MUST RUN FIRST:** Detect which scenario applies to this feature.
96
96
 
97
- **🚫 FORBIDDEN: Writing Files at This Step**
97
+ **FORBIDDEN: Writing Files at This Step**
98
98
  ```
99
- Write tool to any path
100
- Edit tool to any path
101
- Any file creation or modification
99
+ Write tool to any path
100
+ Edit tool to any path
101
+ Any file creation or modification
102
102
  ```
103
103
  **This is a DETECTION step.** File writes happen in Step 3.
104
104
 
@@ -120,7 +120,7 @@ sqlite3 .jettypod/work.db "SELECT completed_at FROM work_items WHERE parent_id =
120
120
 
121
121
  Based on these checks, determine which scenario applies.
122
122
 
123
- **🔄 WORKFLOW INTEGRATION: Start workflow tracking**
123
+ **WORKFLOW INTEGRATION: Start workflow tracking**
124
124
 
125
125
  After detecting context, register this skill execution:
126
126
 
@@ -155,11 +155,11 @@ This validates that `stable_mode_complete` gate is passed and creates an executi
155
155
 
156
156
  **For all scenarios:** Read production standards file.
157
157
 
158
- **🚫 FORBIDDEN: Writing Files at This Step**
158
+ **FORBIDDEN: Writing Files at This Step**
159
159
  ```
160
- Write tool to any path
161
- Edit tool to any path
162
- Any file creation or modification
160
+ Write tool to any path
161
+ Edit tool to any path
162
+ Any file creation or modification
163
163
  ```
164
164
  **This is a READ step.** File writes happen in Step 3.
165
165
 
@@ -173,7 +173,7 @@ cat .jettypod/production-standards.json
173
173
 
174
174
  If the file doesn't exist, run external-transition first to generate production standards.
175
175
 
176
- **🔄 WORKFLOW CHECKPOINT: Standards read**
176
+ **WORKFLOW CHECKPOINT: Standards read**
177
177
 
178
178
  ```bash
179
179
  jettypod workflow checkpoint <feature-id> --step=1
@@ -185,11 +185,11 @@ jettypod workflow checkpoint <feature-id> --step=1
185
185
 
186
186
  **For Scenario A only:** Quick validation of existing scenarios.
187
187
 
188
- **🚫 FORBIDDEN: Writing Files at This Step**
188
+ **FORBIDDEN: Writing Files at This Step**
189
189
  ```
190
- Write tool to any path
191
- Edit tool to any path
192
- Any file creation or modification
190
+ Write tool to any path
191
+ Edit tool to any path
192
+ Any file creation or modification
193
193
  ```
194
194
  **This is a VALIDATION step.** File writes happen in Step 3.
195
195
 
@@ -208,19 +208,19 @@ try {
208
208
  });
209
209
 
210
210
  if (!feature.scenario_file) {
211
- console.error('Feature has no scenario file.');
211
+ console.error('Feature has no scenario file.');
212
212
  return;
213
213
  }
214
214
 
215
215
  // Validate scenarios against standards
216
216
  const validation = await validateScenarios(feature.scenario_file, standards);
217
217
 
218
- console.log(`✅ Validation complete:`);
218
+ console.log(`Validation complete:`);
219
219
  console.log(` - Covered: ${validation.covered}/${validation.total} standards`);
220
220
  console.log(` - Gaps: ${validation.gaps.length}`);
221
221
 
222
222
  if (validation.hasGaps) {
223
- console.log('\n⚠️ Missing scenarios for:');
223
+ console.log('\n Missing scenarios for:');
224
224
  validation.gaps.forEach(gap => {
225
225
  console.log(` - ${gap.domain}: ${gap.standardId}`);
226
226
  console.log(` ${gap.reasoning}`);
@@ -234,12 +234,12 @@ try {
234
234
  const newScenarios = await generateScenariosFromStandards(missingStandards);
235
235
 
236
236
  await appendScenarios(feature.scenario_file, newScenarios);
237
- console.log(`✅ Added ${newScenarios.length} missing scenarios`);
237
+ console.log(`Added ${newScenarios.length} missing scenarios`);
238
238
  } else {
239
- console.log('All standards are covered by existing scenarios');
239
+ console.log('All standards are covered by existing scenarios');
240
240
  }
241
241
  } catch (err) {
242
- console.error('Validation failed:', err.message);
242
+ console.error('Validation failed:', err.message);
243
243
  return;
244
244
  }
245
245
  ```
@@ -250,11 +250,11 @@ try {
250
250
 
251
251
  **For Scenario B only:** Re-validate with current standards.
252
252
 
253
- **🚫 FORBIDDEN: Writing Files at This Step**
253
+ **FORBIDDEN: Writing Files at This Step**
254
254
  ```
255
- Write tool to any path
256
- Edit tool to any path
257
- Any file creation or modification
255
+ Write tool to any path
256
+ Edit tool to any path
257
+ Any file creation or modification
258
258
  ```
259
259
  **This is a VALIDATION step.** File writes happen in Step 3.
260
260
 
@@ -263,7 +263,7 @@ const { validateScenarios } = require('../../lib/production-scenario-validator')
263
263
  const config = require('../../lib/config');
264
264
 
265
265
  try {
266
- console.log('🔄 Re-validating scenarios against current standards...');
266
+ console.log('Re-validating scenarios against current standards...');
267
267
 
268
268
  // Check if project state changed
269
269
  const projectConfig = config.read();
@@ -281,12 +281,12 @@ try {
281
281
  // Validate scenarios
282
282
  const validation = await validateScenarios(feature.scenario_file, standards);
283
283
 
284
- console.log(`✅ Re-validation complete:`);
284
+ console.log(`Re-validation complete:`);
285
285
  console.log(` - Covered: ${validation.covered}/${validation.total} standards`);
286
286
  console.log(` - New gaps: ${validation.gaps.length}`);
287
287
 
288
288
  if (validation.hasGaps) {
289
- console.log('\n⚠️ Standards added/changed since last run:');
289
+ console.log('\n Standards added/changed since last run:');
290
290
  validation.gaps.forEach(gap => {
291
291
  console.log(` - ${gap.domain}: ${gap.standardId}`);
292
292
  });
@@ -299,10 +299,10 @@ try {
299
299
  const newScenarios = await generateScenariosFromStandards(missingStandards);
300
300
 
301
301
  await appendScenarios(feature.scenario_file, newScenarios);
302
- console.log(`✅ Updated with ${newScenarios.length} new scenarios`);
302
+ console.log(`Updated with ${newScenarios.length} new scenarios`);
303
303
  }
304
304
  } catch (err) {
305
- console.error('Re-validation failed:', err.message);
305
+ console.error('Re-validation failed:', err.message);
306
306
  return;
307
307
  }
308
308
  ```
@@ -313,11 +313,11 @@ try {
313
313
 
314
314
  **For Scenario C only:** Generate production scenarios from standards.
315
315
 
316
- **🚫 FORBIDDEN: Writing Files at This Step**
316
+ **FORBIDDEN: Writing Files at This Step**
317
317
  ```
318
- Write tool to any path
319
- Edit tool to any path
320
- Any file creation or modification
318
+ Write tool to any path
319
+ Edit tool to any path
320
+ Any file creation or modification
321
321
  ```
322
322
  **This is a GENERATION step (via jettypod commands, not direct file writes).** File writes happen in Step 3.
323
323
 
@@ -335,7 +335,7 @@ This will:
335
335
  3. Append scenarios to the feature file
336
336
  4. Create production chores
337
337
 
338
- **🔄 WORKFLOW CHECKPOINT: Scenarios validated/generated** (after any Step 2 variant)
338
+ **WORKFLOW CHECKPOINT: Scenarios validated/generated** (after any Step 2 variant)
339
339
 
340
340
  ```bash
341
341
  jettypod workflow checkpoint <feature-id> --step=2
@@ -345,9 +345,9 @@ jettypod workflow checkpoint <feature-id> --step=2
345
345
 
346
346
  ### Step 3: Implement Production Chore
347
347
 
348
- **🔒 WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured after pre-flight validation.
348
+ **WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured after pre-flight validation.
349
349
 
350
- **✅ NOW you may write files** - worktree is locked, context is detected.
350
+ **NOW you may write files** - worktree is locked, context is detected.
351
351
 
352
352
  **Emit gate signal:**
353
353
 
@@ -373,7 +373,7 @@ Parse the chore description to find which scenario it addresses (look for "Scena
373
373
  npx cucumber-js <scenario-file> --name "<scenario-name>"
374
374
  ```
375
375
 
376
- **🔄 WORKFLOW CHECKPOINT: RED baseline established**
376
+ **WORKFLOW CHECKPOINT: RED baseline established**
377
377
 
378
378
  ```bash
379
379
  jettypod workflow checkpoint <feature-id> --step=3
@@ -444,7 +444,27 @@ Once all production chores complete:
444
444
  2. Can be deployed to external environment
445
445
  3. Meets all standards for scale, security, compliance
446
446
 
447
- **🔄 WORKFLOW INTEGRATION: Complete workflow**
447
+ **Prove It Works (REQUIRED):**
448
+
449
+ Before completing the feature, demonstrate it works in practice — not just that tests pass.
450
+
451
+ 1. **Run or build the actual code** — compile, start the server, execute the command, or trigger the relevant workflow
452
+ 2. **Show real output** — display console output, build result, or observable behavior
453
+ 3. **Confirm it matches expectations** — verify the output is what was requested
454
+
455
+ **Display:**
456
+
457
+ ```
458
+ Verifying in practice...
459
+
460
+ [Actual output from running/building the code]
461
+
462
+ Verified: [what was confirmed]
463
+ ```
464
+
465
+ **If the change cannot be run directly** (requires hardware, external service, or manual UI interaction), state what the user should verify manually and why you can't verify it yourself.
466
+
467
+ **WORKFLOW INTEGRATION: Complete workflow**
448
468
 
449
469
  When all production chores are complete:
450
470
 
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: request-routing
3
- description: "ENTRY POINT FOR ALL WORK REQUESTS. Invoke this skill FIRST when user describes ANY work - 'build X', 'fix Y', 'add Z', 'create feature', 'implement'. Do NOT create work items or invoke other planning skills directly. This skill analyzes intent and routes to the correct workflow. (project)"
3
+ description: "ENTRY POINT FOR ALL WORK REQUESTS. Invoke this skill FIRST when user describes ANY work - 'build X', 'fix Y', 'add Z', 'create feature', 'implement'. Do NOT create work items or invoke other planning skills directly. This skill analyzes intent and routes to the correct workflow. (project)"
4
4
  ---
5
5
 
6
6
  # Request Routing Skill
7
7
 
8
- **⚡ UNIVERSAL ENTRY POINT** - This skill MUST be invoked FIRST when a user describes work they want done.
8
+ **UNIVERSAL ENTRY POINT** - This skill MUST be invoked FIRST when a user describes work they want done.
9
9
 
10
10
  **DO NOT:**
11
11
  - Create work items (`jettypod work create`) before invoking this skill
@@ -121,7 +121,7 @@ Default → chore-planning
121
121
  | **epic-planning (technical)** | Large technical initiative (refactor, migration, infrastructure) with no user-facing features | Break down → chores directly (no features, no modes) |
122
122
  | **epic-planning** | Large initiative spanning multiple features | Break down → plan features |
123
123
  | **feature-planning** | New behavior needing UX exploration OR has edge cases worth sequencing | UX exploration → BDD → speed → stable → production |
124
- | **chore-planning** | Substantial technical work, clear implementation | speedstable production |
124
+ | **chore-planning** | Substantial technical work OR behavior-adding without edge cases | Type-specific verification done (enhancement type uses TDD) |
125
125
  | **simple-improvement** | PURELY COSMETIC: text, copy, color, spacing changes only. No behavior change. | Direct implementation |
126
126
 
127
127
  ## Routing Examples
@@ -178,7 +178,7 @@ Default → chore-planning
178
178
 
179
179
  *(PURELY COSMETIC: only text, copy, color, spacing, or static visual changes. Zero behavior change.)*
180
180
 
181
- **⚠️ NOT simple-improvement (common mistakes):**
181
+ **NOT simple-improvement (common mistakes):**
182
182
  - "Add a loading spinner to the save button" → **chore-planning** (adds behavior: state tracking, show/hide logic)
183
183
  - "Add a tooltip to the settings icon" → **chore-planning** (adds behavior: hover state, positioning)
184
184
  - "Track work item counts" → **feature-planning** (adds behavior: counting, state, display logic)
@@ -73,7 +73,7 @@ Use the description from the user's initial request (passed through request-rout
73
73
  I need more details. What specifically needs to change?
74
74
  ```
75
75
 
76
- **⚡ WAIT for user to clarify, then proceed.**
76
+ **WAIT for user to clarify, then proceed.**
77
77
 
78
78
  **Otherwise, proceed directly with the clear description you already have.**
79
79
 
@@ -94,7 +94,7 @@ Scan the user's description for these patterns:
94
94
  | Multiple components | mentions 3+ different files/areas, "also need to" |
95
95
  | Architectural changes | "refactor", "restructure", "new system" |
96
96
 
97
- **Route back to request-routing if ANY complexity signal detected:**
97
+ **Route back to request-routing if ANY complexity signal detected:**
98
98
  - Any new behavior (even "small" behavior like a spinner or tooltip)
99
99
  - Any state management (loading, toggle, hover, selection)
100
100
  - New database tables/columns needed
@@ -103,7 +103,7 @@ Scan the user's description for these patterns:
103
103
  - Multiple interconnected changes
104
104
  - Need for error handling design
105
105
 
106
- **Continue ONLY if the change is:**
106
+ **Continue ONLY if the change is:**
107
107
  - Purely cosmetic (text, color, spacing, static visual appearance)
108
108
  - Single file or 2-3 related files
109
109
  - Modifying existing static values (not adding logic)
@@ -113,7 +113,7 @@ Scan the user's description for these patterns:
113
113
  **If too complex:**
114
114
 
115
115
  ```
116
- ⚠️ This change appears to require new data models or architectural changes. This is more than a simple improvement.
116
+ This change appears to require new data models or architectural changes. This is more than a simple improvement.
117
117
 
118
118
  I'm routing you back to request-routing for proper planning.
119
119
  ```
@@ -125,7 +125,7 @@ I'm routing you back to request-routing for proper planning.
125
125
  **If confirmed simple:**
126
126
 
127
127
  ```
128
- Confirmed: This is a simple improvement.
128
+ Confirmed: This is a simple improvement.
129
129
 
130
130
  Change: [summarize the specific change]
131
131
  Scope: [list files likely affected]
@@ -147,14 +147,22 @@ jettypod ui gate route-decided --data='{"route":"simple-improvement","title":"[b
147
147
 
148
148
  **Create a single chore with NO mode assigned.**
149
149
 
150
+ Use the **Write** tool to create `/tmp/jettypod-create.json`:
151
+ ```json
152
+ {
153
+ "type": "chore",
154
+ "title": "[Brief description of the change]",
155
+ "description": "[Detailed description including:\n- What to change\n- Where to change it\n- Expected outcome]",
156
+ "parent": <feature-id>
157
+ }
158
+ ```
159
+
160
+ Then run via **Bash**:
150
161
  ```bash
151
- jettypod work create chore "[Brief description of the change]" "[Detailed description including:
152
- - What to change
153
- - Where to change it
154
- - Expected outcome]" --parent=<feature-id>
162
+ jettypod work create --from=/tmp/jettypod-create.json
155
163
  ```
156
164
 
157
- **IMPORTANT:** Do NOT use `--mode` flag. Simple improvements don't use speed/stable modes.
165
+ **IMPORTANT:** Do NOT add a `mode` field. Simple improvements don't use speed/stable modes.
158
166
 
159
167
  **Emit gate signal:**
160
168
 
@@ -165,7 +173,7 @@ jettypod ui gate work-created --data='{"id":[chore-id],"title":"[title]"}'
165
173
  **Display to user:**
166
174
 
167
175
  ```
168
- Created Chore #[id]: [title]
176
+ Created Chore #[id]: [title]
169
177
 
170
178
  Ready to implement. Starting chore...
171
179
  ```
@@ -175,7 +183,7 @@ Ready to implement. Starting chore...
175
183
  When the `jettypod work create` command fails, display error details and suggest recovery:
176
184
 
177
185
  ```
178
- Failed to create chore: [error message] ([error code if available])
186
+ Failed to create chore: [error message] ([error code if available])
179
187
 
180
188
  This could be caused by:
181
189
  • Database is locked by another process
@@ -189,7 +197,7 @@ Suggested actions:
189
197
  4. If persistent, try: jettypod work cleanup --all
190
198
  ```
191
199
 
192
- **⚡ WAIT for user to acknowledge before retrying or investigating further.**
200
+ **WAIT for user to acknowledge before retrying or investigating further.**
193
201
 
194
202
  Do NOT proceed to Step 3 until chore is successfully created.
195
203
 
@@ -205,7 +213,7 @@ Do NOT proceed to Step 3 until chore is successfully created.
205
213
  jettypod work start <chore-id>
206
214
  ```
207
215
 
208
- **🛑 STOP AND CHECK:** Verify worktree was created successfully before proceeding.
216
+ **STOP AND CHECK:** Verify worktree was created successfully before proceeding.
209
217
 
210
218
  ```bash
211
219
  sqlite3 .jettypod/work.db "SELECT worktree_path FROM worktrees WHERE work_item_id = <chore-id> AND status = 'active'"
@@ -225,13 +233,13 @@ jettypod ui gate worktree-started --data='{"path":"${WORKTREE_PATH}"}'
225
233
  **Display confirmation:**
226
234
 
227
235
  ```
228
- 📁 Worktree created: ${WORKTREE_PATH}
236
+ Worktree created: ${WORKTREE_PATH}
229
237
 
230
238
  From this point forward, ALL file operations MUST use paths starting with:
231
239
  ${WORKTREE_PATH}/
232
240
  ```
233
241
 
234
- **🔒 WORKTREE PATH LOCK:** Store `WORKTREE_PATH` - all file operations in this skill MUST use this path prefix.
242
+ **WORKTREE PATH LOCK:** Store `WORKTREE_PATH` - all file operations in this skill MUST use this path prefix.
235
243
 
236
244
  ---
237
245
 
@@ -250,7 +258,7 @@ jettypod ui gate implementing --data='{"description":"[what is being changed]","
250
258
  **Display progress:**
251
259
 
252
260
  ```
253
- 📝 Implementing change...
261
+ Implementing change...
254
262
 
255
263
  Modified: ${WORKTREE_PATH}/[relative path]
256
264
  Change: [what was changed]
@@ -273,7 +281,27 @@ Verifying...
273
281
 
274
282
  **If verification passes:**
275
283
 
276
- **🔒 WORKTREE PATH REQUIRED:** Use the `WORKTREE_PATH` captured in Step 3.
284
+ **Prove It Works (REQUIRED):**
285
+
286
+ Before committing, demonstrate the change works in practice.
287
+
288
+ 1. **Run or build the actual code** — compile, start the server, execute the command, or trigger the relevant workflow
289
+ 2. **Show real output** — display console output, build result, or observable behavior
290
+ 3. **Confirm it matches expectations** — verify the output is what was requested
291
+
292
+ **Display:**
293
+
294
+ ```
295
+ Verifying in practice...
296
+
297
+ [Actual output from running/building the code]
298
+
299
+ Verified: [what was confirmed]
300
+ ```
301
+
302
+ **If the change cannot be run directly** (requires hardware, external service, or manual UI interaction), state what the user should verify manually and why you can't verify it yourself.
303
+
304
+ **WORKTREE PATH REQUIRED:** Use the `WORKTREE_PATH` captured in Step 3.
277
305
 
278
306
  ```bash
279
307
  # Commit the change
@@ -281,14 +309,14 @@ cd ${WORKTREE_PATH}
281
309
  git add .
282
310
  git commit -m "fix: [brief description]
283
311
 
284
- 🤖 Generated with [Claude Code](https://claude.com/claude-code)
312
+ Generated with [Claude Code](https://claude.com/claude-code)
285
313
 
286
314
  Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
287
315
  ```
288
316
 
289
317
  **Then merge (CRITICAL: run as separate Bash calls):**
290
318
 
291
- ⚠️ Shell CWD persists. You MUST run `cd` as a SEPARATE Bash tool call before merge.
319
+ Shell CWD persists. You MUST run `cd` as a SEPARATE Bash tool call before merge.
292
320
 
293
321
  ```bash
294
322
  # Bash call 1: Change to main repo
@@ -301,17 +329,19 @@ jettypod work merge <chore-id>
301
329
  jettypod work cleanup <chore-id>
302
330
  ```
303
331
 
304
- **If merge fails:**
332
+ **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.
333
+
334
+ **If merge fails with merge conflicts:**
305
335
 
306
- When `jettypod work merge` encounters an error (e.g., merge conflicts), the worktree is preserved for debugging.
336
+ When `jettypod work merge` encounters a merge conflict, the worktree is preserved for debugging.
307
337
 
308
338
  ```
309
- Merge failed: [error message from git]
339
+ Merge failed: [error message from git]
310
340
 
311
341
  Conflicting files:
312
342
  • [list conflicting files if available]
313
343
 
314
- ⚠️ IMPORTANT: The worktree has been PRESERVED for debugging at:
344
+ IMPORTANT: The worktree has been PRESERVED for debugging at:
315
345
  [worktree-path]
316
346
 
317
347
  Resolution steps:
@@ -325,13 +355,28 @@ Resolution steps:
325
355
  Need help? Run: git status (in worktree) to see conflict status
326
356
  ```
327
357
 
328
- **⚡ WAIT for user to resolve conflicts before retrying.**
358
+ **WAIT for user to resolve conflicts before retrying.**
329
359
 
330
360
  Do NOT attempt to auto-resolve conflicts - let the user handle them manually.
331
361
 
332
362
  **The merge command automatically sets the feature as ready for review.**
333
363
  It will appear with accept/reject buttons on the kanban board. Do NOT call `jettypod work status <feature-id> done` — that bypasses the review gate.
334
364
 
365
+ **Generate QA checklist:**
366
+
367
+ Based on the change you just made, generate specific QA steps a tester can verify manually. Write a JSON array to `/tmp/qa-steps.json`:
368
+ ```json
369
+ [
370
+ {"section": "Section Name", "text": "Action to perform and expected result", "detail": "Additional context"},
371
+ ...
372
+ ]
373
+ ```
374
+ Be specific (e.g., "Click the Save button — confirmation toast appears") not generic. 3-8 steps for simple improvements.
375
+
376
+ ```bash
377
+ jettypod work set-qa-steps <chore-id> --from=/tmp/qa-steps.json
378
+ ```
379
+
335
380
  **Emit gate signal:**
336
381
 
337
382
  ```bash
@@ -342,7 +387,7 @@ jettypod ui gate complete --data='{"summary":"[what was changed]","files":["[fil
342
387
 
343
388
  ```
344
389
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
345
- Simple Improvement Complete!
390
+ Simple Improvement Complete!
346
391
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
347
392
 
348
393
  Change: [what was changed]
@@ -371,8 +416,8 @@ No further action needed.
371
416
  ## Command Reference
372
417
 
373
418
  ```bash
374
- # Create chore (no mode)
375
- jettypod work create chore "<title>" "<description>" --parent=<feature-id>
419
+ # Create chore (no mode) - use Write tool for JSON, then:
420
+ jettypod work create --from=/tmp/jettypod-create.json
376
421
 
377
422
  # Start chore
378
423
  jettypod work start <chore-id>
@@ -384,5 +429,5 @@ jettypod work merge <chore-id> # Bash call 2
384
429
  # Cleanup
385
430
  jettypod work cleanup <chore-id>
386
431
 
387
- # ⚠️ Do NOT mark feature done manually — merge sets the review gate automatically
432
+ # Do NOT mark feature done manually — merge sets the review gate automatically
388
433
  ```