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.
- package/.env +4 -3
- package/Cargo.lock +6450 -0
- package/Cargo.toml +35 -0
- package/README.md +5 -1
- package/TAURI-MIGRATION-PLAN.md +840 -0
- package/apps/dashboard/app/connect-claude/page.tsx +5 -6
- package/apps/dashboard/app/decision/[id]/page.tsx +63 -58
- package/apps/dashboard/app/demo/gates/page.tsx +43 -45
- package/apps/dashboard/app/design-system/page.tsx +868 -0
- package/apps/dashboard/app/globals.css +80 -4
- package/apps/dashboard/app/install-claude/page.tsx +4 -6
- package/apps/dashboard/app/login/page.tsx +72 -54
- package/apps/dashboard/app/page.tsx +101 -48
- package/apps/dashboard/app/settings/page.tsx +61 -13
- package/apps/dashboard/app/signup/page.tsx +242 -0
- package/apps/dashboard/app/subscribe/page.tsx +0 -2
- package/apps/dashboard/app/tests/page.tsx +37 -4
- package/apps/dashboard/app/welcome/page.tsx +13 -16
- package/apps/dashboard/app/work/[id]/page.tsx +117 -118
- package/apps/dashboard/app/work/[id]/proof/page.tsx +1489 -0
- package/apps/dashboard/components/AppShell.tsx +92 -85
- package/apps/dashboard/components/CardMenu.tsx +45 -12
- package/apps/dashboard/components/ClaudePanel.tsx +771 -850
- package/apps/dashboard/components/ClaudePanelInput.tsx +43 -15
- package/apps/dashboard/components/ConnectClaudeScreen.tsx +17 -34
- package/apps/dashboard/components/CopyableId.tsx +3 -4
- package/apps/dashboard/components/DetailReviewActions.tsx +100 -0
- package/apps/dashboard/components/DragContext.tsx +134 -63
- package/apps/dashboard/components/DraggableCard.tsx +3 -5
- package/apps/dashboard/components/DropZone.tsx +6 -7
- package/apps/dashboard/components/EditableDetailDescription.tsx +7 -13
- package/apps/dashboard/components/EditableDetailTitle.tsx +6 -13
- package/apps/dashboard/components/EditableTitle.tsx +26 -7
- package/apps/dashboard/components/ElapsedTimer.tsx +66 -0
- package/apps/dashboard/components/EpicGroup.tsx +359 -0
- package/apps/dashboard/components/GateCard.tsx +79 -17
- package/apps/dashboard/components/GateChoiceCard.tsx +15 -18
- package/apps/dashboard/components/InstallClaudeScreen.tsx +15 -32
- package/apps/dashboard/components/JettyLoader.tsx +37 -0
- package/apps/dashboard/components/KanbanBoard.tsx +368 -958
- package/apps/dashboard/components/KanbanCard.tsx +740 -0
- package/apps/dashboard/components/LazyCard.tsx +62 -0
- package/apps/dashboard/components/LazyMarkdown.tsx +11 -0
- package/apps/dashboard/components/MainNav.tsx +38 -73
- package/apps/dashboard/components/MessageBlock.tsx +468 -0
- package/apps/dashboard/components/ModeStartCard.tsx +15 -16
- package/apps/dashboard/components/OnboardingWelcome.tsx +213 -0
- package/apps/dashboard/components/PlaceholderCard.tsx +3 -4
- package/apps/dashboard/components/ProjectSwitcher.tsx +30 -30
- package/apps/dashboard/components/PrototypeTimeline.tsx +72 -51
- package/apps/dashboard/components/RealTimeKanbanWrapper.tsx +406 -388
- package/apps/dashboard/components/RealTimeTestsWrapper.tsx +373 -235
- package/apps/dashboard/components/ReviewFooter.tsx +139 -0
- package/apps/dashboard/components/SessionList.tsx +19 -19
- package/apps/dashboard/components/SubscribeContent.tsx +91 -47
- package/apps/dashboard/components/TestTree.tsx +16 -16
- package/apps/dashboard/components/TipCard.tsx +16 -17
- package/apps/dashboard/components/Toast.tsx +5 -6
- package/apps/dashboard/components/TypeIcon.tsx +55 -0
- package/apps/dashboard/components/ViewModeToolbar.tsx +104 -0
- package/apps/dashboard/components/WaveCompletionAnimation.tsx +52 -65
- package/apps/dashboard/components/WelcomeScreen.tsx +19 -35
- package/apps/dashboard/components/WorkItemHeader.tsx +4 -5
- package/apps/dashboard/components/WorkItemTree.tsx +11 -32
- package/apps/dashboard/components/settings/AccountSection.tsx +55 -35
- package/apps/dashboard/components/settings/AiContextSection.tsx +89 -0
- package/apps/dashboard/components/settings/ContextDocumentsSection.tsx +317 -0
- package/apps/dashboard/components/settings/EnvVarsSection.tsx +74 -152
- package/apps/dashboard/components/settings/GeneralSection.tsx +162 -56
- package/apps/dashboard/components/settings/ProjectStackSection.tsx +948 -0
- package/apps/dashboard/components/settings/SettingsLayout.tsx +4 -5
- package/apps/dashboard/components/ui/Button.tsx +104 -0
- package/apps/dashboard/components/ui/Input.tsx +78 -0
- package/apps/dashboard/components.json +1 -1
- package/apps/dashboard/contexts/ClaudeSessionContext.tsx +711 -418
- package/apps/dashboard/contexts/ConnectionStatusContext.tsx +25 -5
- package/apps/dashboard/contexts/UsageContext.tsx +87 -32
- package/apps/dashboard/dev.sh +35 -0
- package/apps/dashboard/eslint.config.mjs +9 -9
- package/apps/dashboard/hooks/useKanbanAnimation.ts +29 -0
- package/apps/dashboard/hooks/useKanbanUndo.ts +83 -0
- package/apps/dashboard/hooks/useWebSocket.ts +138 -83
- package/apps/dashboard/index.html +73 -0
- package/apps/dashboard/lib/constants.ts +43 -0
- package/apps/dashboard/lib/data-bridge.ts +722 -0
- package/apps/dashboard/lib/db.ts +69 -1265
- package/apps/dashboard/lib/environment-config.ts +173 -0
- package/apps/dashboard/lib/environment-verification.ts +119 -0
- package/apps/dashboard/lib/kanban-utils.ts +270 -0
- package/apps/dashboard/lib/proof-run.ts +495 -0
- package/apps/dashboard/lib/proof-scenario-runner.ts +346 -0
- package/apps/dashboard/lib/run-migrations.js +27 -2
- package/apps/dashboard/lib/service-recovery.ts +326 -0
- package/apps/dashboard/lib/session-state-machine.ts +1 -0
- package/apps/dashboard/lib/session-state-utils.ts +0 -164
- package/apps/dashboard/lib/session-stream-manager.ts +308 -134
- package/apps/dashboard/lib/shadows.ts +7 -0
- package/apps/dashboard/lib/stream-manager-registry.ts +46 -6
- package/apps/dashboard/lib/tauri-bridge.ts +102 -0
- package/apps/dashboard/lib/tauri.ts +106 -0
- package/apps/dashboard/lib/utils.ts +6 -0
- package/apps/dashboard/next-env.d.ts +1 -1
- package/apps/dashboard/package.json +21 -32
- package/apps/dashboard/public/bug-icon.png +0 -0
- package/apps/dashboard/public/buoy-icon.png +0 -0
- package/apps/dashboard/public/fonts/Satoshi-Variable.woff2 +0 -0
- package/apps/dashboard/public/fonts/Satoshi-VariableItalic.woff2 +0 -0
- package/apps/dashboard/public/in-flight-seagull.png +0 -0
- package/apps/dashboard/public/jetty-icon-loading-alt.svg +11 -0
- package/apps/dashboard/public/jetty-icon-loading.svg +11 -0
- package/apps/dashboard/public/jettypod_logo.png +0 -0
- package/apps/dashboard/public/pier-icon.png +0 -0
- package/apps/dashboard/public/star-icon.png +0 -0
- package/apps/dashboard/public/wrench-icon.png +0 -0
- package/apps/dashboard/scripts/tauri-build.js +228 -0
- package/apps/dashboard/scripts/upload-tauri-to-r2.js +125 -0
- package/apps/dashboard/scripts/ws-server.js +191 -0
- package/apps/dashboard/src/main.tsx +12 -0
- package/apps/dashboard/src/router.tsx +107 -0
- package/apps/dashboard/src/vite-env.d.ts +1 -0
- package/apps/dashboard/tsconfig.json +7 -12
- package/apps/dashboard/tsconfig.tsbuildinfo +1 -1
- package/apps/dashboard/vite.config.ts +33 -0
- package/apps/update-server/src/index.ts +228 -80
- package/claude-hooks/global-guardrails.js +14 -13
- package/crates/jettypod-cli/Cargo.toml +19 -0
- package/crates/jettypod-cli/src/commands.rs +1249 -0
- package/crates/jettypod-cli/src/main.rs +595 -0
- package/crates/jettypod-core/Cargo.toml +26 -0
- package/crates/jettypod-core/build.rs +98 -0
- package/crates/jettypod-core/migrations/V1__baseline.sql +197 -0
- package/crates/jettypod-core/migrations/V2__work_items_indexes.sql +6 -0
- package/crates/jettypod-core/migrations/V3__qa_steps.sql +2 -0
- package/crates/jettypod-core/src/auth.rs +294 -0
- package/crates/jettypod-core/src/config.rs +397 -0
- package/crates/jettypod-core/src/db/mod.rs +507 -0
- package/crates/jettypod-core/src/db/recovery.rs +114 -0
- package/crates/jettypod-core/src/db/startup.rs +101 -0
- package/crates/jettypod-core/src/db/validate.rs +149 -0
- package/crates/jettypod-core/src/error.rs +76 -0
- package/crates/jettypod-core/src/git.rs +458 -0
- package/crates/jettypod-core/src/lib.rs +20 -0
- package/crates/jettypod-core/src/sessions.rs +625 -0
- package/crates/jettypod-core/src/skills.rs +556 -0
- package/crates/jettypod-core/src/work.rs +1086 -0
- package/crates/jettypod-core/src/worktree.rs +628 -0
- package/crates/jettypod-core/src/ws.rs +767 -0
- package/cucumber-test.cjs +6 -0
- package/cucumber.js +9 -3
- package/docs/COMMAND_REFERENCE.md +34 -0
- package/hooks/post-checkout +32 -75
- package/hooks/post-merge +111 -10
- package/jest.setup.js +1 -0
- package/jettypod.js +145 -116
- package/lib/bdd-preflight.js +96 -0
- package/lib/chore-taxonomy.js +33 -10
- package/lib/database.js +36 -16
- package/lib/db-watcher.js +1 -1
- package/lib/git-hooks/pre-commit +1 -1
- package/lib/jettypod-backup.js +27 -4
- package/lib/merge-lock.js +111 -253
- package/lib/migrations/027-plan-at-creation-column.js +3 -1
- package/lib/migrations/029-remove-autoincrement.js +307 -0
- package/lib/migrations/029-rename-corrupted-to-cleaned.js +149 -0
- package/lib/migrations/030-rejection-round-columns.js +54 -0
- package/lib/migrations/031-session-isolation-index.js +17 -0
- package/lib/migrations/index.js +47 -4
- package/lib/schema.js +10 -5
- package/lib/seed-onboarding.js +1 -1
- package/lib/update-command/index.js +9 -175
- package/lib/work-commands/index.js +144 -19
- package/lib/work-tracking/index.js +148 -27
- package/lib/worktree-diagnostics.js +16 -16
- package/lib/worktree-facade.js +1 -1
- package/lib/worktree-manager.js +8 -8
- package/lib/worktree-reconciler.js +5 -5
- package/package.json +9 -2
- package/scripts/ndjson-to-cucumber-json.js +152 -0
- package/scripts/postinstall.js +25 -0
- package/skills-templates/bug-mode/SKILL.md +79 -20
- package/skills-templates/bug-planning/SKILL.md +25 -29
- package/skills-templates/chore-mode/SKILL.md +171 -69
- package/skills-templates/chore-mode/verification.js +51 -10
- package/skills-templates/chore-planning/SKILL.md +47 -18
- package/skills-templates/design-system-selection/SKILL.md +273 -0
- package/skills-templates/epic-planning/SKILL.md +82 -48
- package/skills-templates/external-transition/SKILL.md +47 -47
- package/skills-templates/feature-planning/SKILL.md +173 -74
- package/skills-templates/production-mode/SKILL.md +69 -49
- package/skills-templates/request-routing/SKILL.md +4 -4
- package/skills-templates/simple-improvement/SKILL.md +74 -29
- package/skills-templates/speed-mode/SKILL.md +217 -141
- package/skills-templates/stable-mode/SKILL.md +148 -89
- package/apps/dashboard/README.md +0 -36
- package/apps/dashboard/app/api/claude/[workItemId]/message/route.ts +0 -386
- package/apps/dashboard/app/api/claude/[workItemId]/pin/route.ts +0 -24
- package/apps/dashboard/app/api/claude/[workItemId]/route.ts +0 -167
- package/apps/dashboard/app/api/claude/sessions/[sessionId]/content/route.ts +0 -52
- package/apps/dashboard/app/api/claude/sessions/[sessionId]/message/route.ts +0 -378
- package/apps/dashboard/app/api/claude/sessions/[sessionId]/pin/route.ts +0 -24
- package/apps/dashboard/app/api/claude/sessions/cleanup/route.ts +0 -34
- package/apps/dashboard/app/api/claude/sessions/route.ts +0 -184
- package/apps/dashboard/app/api/decisions/[id]/route.ts +0 -25
- package/apps/dashboard/app/api/internal/set-project/route.ts +0 -17
- package/apps/dashboard/app/api/kanban/route.ts +0 -15
- package/apps/dashboard/app/api/settings/env-vars/route.ts +0 -125
- package/apps/dashboard/app/api/settings/general/route.ts +0 -21
- package/apps/dashboard/app/api/tests/route.ts +0 -9
- package/apps/dashboard/app/api/tests/run/route.ts +0 -82
- package/apps/dashboard/app/api/tests/run/stream/route.ts +0 -71
- package/apps/dashboard/app/api/tests/undefined/route.ts +0 -9
- package/apps/dashboard/app/api/usage/route.ts +0 -17
- package/apps/dashboard/app/api/work/[id]/description/route.ts +0 -21
- package/apps/dashboard/app/api/work/[id]/epic/route.ts +0 -21
- package/apps/dashboard/app/api/work/[id]/order/route.ts +0 -21
- package/apps/dashboard/app/api/work/[id]/status/route.ts +0 -21
- package/apps/dashboard/app/api/work/[id]/title/route.ts +0 -21
- package/apps/dashboard/app/layout.tsx +0 -43
- package/apps/dashboard/components/UpgradeBanner.tsx +0 -29
- package/apps/dashboard/electron/ipc-handlers.js +0 -1028
- package/apps/dashboard/electron/main.js +0 -2124
- package/apps/dashboard/electron/preload.js +0 -123
- package/apps/dashboard/electron/session-manager.js +0 -141
- package/apps/dashboard/electron-builder.config.js +0 -357
- package/apps/dashboard/hooks/useClaudeSessions.ts +0 -299
- package/apps/dashboard/lib/claude-process-manager.ts +0 -492
- package/apps/dashboard/lib/db-bridge.ts +0 -282
- package/apps/dashboard/lib/prototypes.ts +0 -202
- package/apps/dashboard/lib/test-results-db.ts +0 -307
- package/apps/dashboard/lib/tests.ts +0 -282
- package/apps/dashboard/next.config.js +0 -50
- package/apps/dashboard/postcss.config.mjs +0 -7
- package/apps/dashboard/public/file.svg +0 -1
- package/apps/dashboard/public/globe.svg +0 -1
- package/apps/dashboard/public/next.svg +0 -1
- package/apps/dashboard/public/vercel.svg +0 -1
- package/apps/dashboard/public/window.svg +0 -1
- package/apps/dashboard/scripts/download-node.js +0 -104
- package/apps/dashboard/scripts/upload-to-r2.js +0 -89
- package/docs/bdd-guidance.md +0 -390
|
@@ -11,7 +11,7 @@ Guides Claude through feature planning including UX approach exploration, option
|
|
|
11
11
|
|
|
12
12
|
When this skill is activated, you are helping discover the best approach for a feature. Follow this structured approach:
|
|
13
13
|
|
|
14
|
-
##
|
|
14
|
+
## Critical Command Distinction
|
|
15
15
|
|
|
16
16
|
**Six commands in workflow order:**
|
|
17
17
|
|
|
@@ -32,9 +32,9 @@ When this skill is activated, you are helping discover the best approach for a f
|
|
|
32
32
|
- `work tests merge` = Land BDD tests on main
|
|
33
33
|
- `work start` = Creates worktree/branch for chore implementation
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
**STOP GATE:** DO NOT run `work start` until Step 13. Tests must be merged to main first.
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
**HANDOFF REQUIREMENT:** After `work start`, you MUST invoke speed-mode using the Skill tool. See Step 13.
|
|
38
38
|
|
|
39
39
|
---
|
|
40
40
|
|
|
@@ -58,7 +58,7 @@ This returns: title, description, parent epic (if any), mode, phase, and any exi
|
|
|
58
58
|
|
|
59
59
|
**If the feature is not found**, ask the user to verify the ID or run `jettypod backlog` to find it.
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
**WORKFLOW INTEGRATION: Start workflow tracking**
|
|
62
62
|
|
|
63
63
|
After getting the feature context, register this skill execution:
|
|
64
64
|
|
|
@@ -87,10 +87,10 @@ This outputs any architectural decisions recorded for the parent epic. If no dec
|
|
|
87
87
|
Display the context with decisions:
|
|
88
88
|
|
|
89
89
|
```
|
|
90
|
-
|
|
90
|
+
Planning Feature: [Feature Name]
|
|
91
91
|
Epic: [Epic Name]
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
**Epic Architectural Decisions:**
|
|
94
94
|
[If decisions exist:]
|
|
95
95
|
- **[Aspect]:** [Decision]
|
|
96
96
|
*Rationale:* [Why this was chosen]
|
|
@@ -114,25 +114,25 @@ Propose exactly 3 approaches with varying complexity/trade-offs:
|
|
|
114
114
|
Here are 3 different approaches for [feature name]:
|
|
115
115
|
|
|
116
116
|
**Option 1: [Simple/Minimal approach name]**
|
|
117
|
-
- **Pros**:
|
|
118
|
-
- **Cons**:
|
|
117
|
+
- **Pros**: [2-3 advantages]
|
|
118
|
+
- **Cons**: [2-3 trade-offs]
|
|
119
119
|
- **Experience**: [What it feels like to use]
|
|
120
120
|
|
|
121
121
|
**Option 2: [Balanced approach name]**
|
|
122
|
-
- **Pros**:
|
|
123
|
-
- **Cons**:
|
|
122
|
+
- **Pros**: [2-3 advantages]
|
|
123
|
+
- **Cons**: [2-3 trade-offs]
|
|
124
124
|
- **Experience**: [What it feels like to use]
|
|
125
125
|
|
|
126
126
|
**Option 3: [Advanced/Comprehensive approach name]**
|
|
127
|
-
- **Pros**:
|
|
128
|
-
- **Cons**:
|
|
127
|
+
- **Pros**: [2-3 advantages]
|
|
128
|
+
- **Cons**: [2-3 trade-offs]
|
|
129
129
|
- **Experience**: [What it feels like to use]
|
|
130
130
|
|
|
131
131
|
**Additional approaches considered but not recommended:**
|
|
132
132
|
- *[Alternative 1]*: [Brief] - Not selected because [reason]
|
|
133
133
|
- *[Alternative 2]*: [Brief] - Not selected because [reason]
|
|
134
134
|
|
|
135
|
-
|
|
135
|
+
**Recommendation:** [State which option you recommend and why - 2-3 sentences explaining the reasoning]
|
|
136
136
|
|
|
137
137
|
Would you like me to create working prototypes of these approaches?
|
|
138
138
|
```
|
|
@@ -140,7 +140,7 @@ Would you like me to create working prototypes of these approaches?
|
|
|
140
140
|
**After presenting approaches, emit a question gate so the narrated UI can render an interactive choice card:**
|
|
141
141
|
|
|
142
142
|
```bash
|
|
143
|
-
jettypod ui gate question --data='{"question":"Which approach should we take for [feature name]?","options":[{"id":"option-1","emoji":"
|
|
143
|
+
jettypod ui gate question --data='{"question":"Which approach should we take for [feature name]?","options":[{"id":"option-1","emoji":"","label":"[Simple approach name]","description":"[1-line summary of what it does]"},{"id":"option-2","emoji":"","label":"[Balanced approach name]","description":"[1-line summary of what it does]"},{"id":"option-3","emoji":"","label":"[Advanced approach name]","description":"[1-line summary of what it does]"}]}'
|
|
144
144
|
```
|
|
145
145
|
|
|
146
146
|
**WAIT for user response.**
|
|
@@ -165,10 +165,16 @@ jettypod work prototype start 42 simple-form
|
|
|
165
165
|
|
|
166
166
|
This creates a worktree at `.jettypod-work/prototype-<id>-<slug>-<approach>/` where prototypes can be safely built and committed.
|
|
167
167
|
|
|
168
|
-
|
|
168
|
+
**STOP AND CHECK:** Verify worktree was created successfully before proceeding.
|
|
169
169
|
|
|
170
170
|
**Sub-step 2: Build prototypes in the worktree**
|
|
171
171
|
|
|
172
|
+
**Design system check:** Before building, check if a design system directory is configured:
|
|
173
|
+
```bash
|
|
174
|
+
node -e "const c=JSON.parse(require('fs').readFileSync('.jettypod/config.json','utf-8')); c.designSystemDir && console.log(c.designSystemDir)"
|
|
175
|
+
```
|
|
176
|
+
If a path is returned, read the files in that directory and apply the project's design tokens (colors, typography, spacing, border radii, component patterns) to all prototypes. Prototypes should look like they belong to the product, not use generic browser defaults.
|
|
177
|
+
|
|
172
178
|
1. **Build prototypes** using **absolute paths** to the worktree:
|
|
173
179
|
- `<worktree_path>/prototypes/feature-[id]-[approach-name]/`
|
|
174
180
|
2. **Name format**: `YYYY-MM-DD-[feature-slug]-[option].ext`
|
|
@@ -176,7 +182,7 @@ This creates a worktree at `.jettypod-work/prototype-<id>-<slug>-<approach>/` wh
|
|
|
176
182
|
4. **Add visible banner header at TOP of page** (for HTML/web prototypes):
|
|
177
183
|
```html
|
|
178
184
|
<div style="background: #f0f0f0; border: 2px solid #333; padding: 16px; margin-bottom: 24px; font-family: monospace;">
|
|
179
|
-
<strong
|
|
185
|
+
<strong>PROTOTYPE</strong><br>
|
|
180
186
|
Feature: [feature name]<br>
|
|
181
187
|
Option: [option number/name]<br>
|
|
182
188
|
Created: [YYYY-MM-DD]<br>
|
|
@@ -208,7 +214,7 @@ jettypod work cleanup ${FEATURE_ID}
|
|
|
208
214
|
This merges prototype files to main (in `/prototypes/` directory) and cleans up the worktree.
|
|
209
215
|
|
|
210
216
|
<details>
|
|
211
|
-
<summary><strong
|
|
217
|
+
<summary><strong>Prototyping Guidelines (click to expand)</strong></summary>
|
|
212
218
|
|
|
213
219
|
**Use fastest tech to demonstrate UX:**
|
|
214
220
|
- Quick HTML+JS for web UX
|
|
@@ -241,12 +247,65 @@ Which approach works best?
|
|
|
241
247
|
|
|
242
248
|
User picks winner. Note their choice - you'll record it formally in Step 11 when transitioning to implementation.
|
|
243
249
|
|
|
244
|
-
|
|
250
|
+
**WORKFLOW CHECKPOINT: Winner chosen**
|
|
245
251
|
|
|
246
252
|
```bash
|
|
247
253
|
jettypod workflow checkpoint <feature-id> --step=5
|
|
248
254
|
```
|
|
249
255
|
|
|
256
|
+
**Proceed to Step 5B.**
|
|
257
|
+
|
|
258
|
+
### Step 5B: UX States Inventory
|
|
259
|
+
|
|
260
|
+
**CRITICAL:** Before defining scenarios, enumerate every UI state the feature will need. Features fail QA when states like loading, empty, and transition are left unspecified — Claude implements the literal happy path and skips everything else.
|
|
261
|
+
|
|
262
|
+
**For each screen/view/component the chosen approach touches, list:**
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
UX States Inventory
|
|
266
|
+
|
|
267
|
+
**[Screen/View/Component 1: e.g., Login Form]**
|
|
268
|
+
| State | What the user sees |
|
|
269
|
+
|-------|-------------------|
|
|
270
|
+
| Default | [Initial state when user arrives] |
|
|
271
|
+
| Loading | [What shows during async operations — spinner, skeleton, disabled button, etc.] |
|
|
272
|
+
| Success | [Feedback after successful action — toast, redirect, animation, message] |
|
|
273
|
+
| Empty | [What shows when there's no data — illustration, CTA, placeholder text] |
|
|
274
|
+
| Partial | [What shows when some data is loaded but not all — progressive loading] |
|
|
275
|
+
|
|
276
|
+
**[Screen/View/Component 2: e.g., Dashboard after login]**
|
|
277
|
+
| State | What the user sees |
|
|
278
|
+
|-------|-------------------|
|
|
279
|
+
| Default | [...] |
|
|
280
|
+
| Loading | [...] |
|
|
281
|
+
| ... | ... |
|
|
282
|
+
|
|
283
|
+
**Micro-interactions:**
|
|
284
|
+
- [Button click] → [immediate visual feedback: disable + spinner? ripple? color change?]
|
|
285
|
+
- [Form submission] → [what happens between click and response?]
|
|
286
|
+
- [Data appears] → [instant swap? fade in? skeleton → content?]
|
|
287
|
+
- [Navigation] → [instant page swap? transition animation?]
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**What to inventory (checklist):**
|
|
291
|
+
- [ ] Every screen/view the feature adds or modifies
|
|
292
|
+
- [ ] Loading states for every async operation (API calls, file uploads, data fetches)
|
|
293
|
+
- [ ] Success feedback for every user action (toasts, redirects, inline messages)
|
|
294
|
+
- [ ] Empty states where data might not exist yet
|
|
295
|
+
- [ ] Transition animations between states
|
|
296
|
+
- [ ] Button/input states (default, hover, active, disabled, loading)
|
|
297
|
+
- [ ] What happens between user action and system response (micro-interactions)
|
|
298
|
+
|
|
299
|
+
**Display the inventory to user and ask:**
|
|
300
|
+
|
|
301
|
+
```
|
|
302
|
+
Does this cover all the states? Anything missing for how this should feel?
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
**WAIT for user confirmation or additions.**
|
|
306
|
+
|
|
307
|
+
Store the confirmed UX States Inventory — it feeds into BDD scenarios (Step 8) and chore UX acceptance criteria (Step 10).
|
|
308
|
+
|
|
250
309
|
**Proceed to Step 6.**
|
|
251
310
|
|
|
252
311
|
### Step 6: Define Integration Contract
|
|
@@ -274,7 +333,7 @@ jettypod workflow checkpoint <feature-id> --step=5
|
|
|
274
333
|
**Display to user:**
|
|
275
334
|
|
|
276
335
|
```
|
|
277
|
-
|
|
336
|
+
Integration Contract
|
|
278
337
|
|
|
279
338
|
**Entry Point:** [How users reach this feature]
|
|
280
339
|
**Caller Code:** [What existing code invokes this]
|
|
@@ -297,11 +356,11 @@ Example:
|
|
|
297
356
|
2. Claude has `WORKTREE_PATH` before being tempted to write files
|
|
298
357
|
3. Writing to main is impossible because we're in worktree context
|
|
299
358
|
|
|
300
|
-
|
|
359
|
+
**FORBIDDEN: Manual Git Worktree Commands**
|
|
301
360
|
```
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
361
|
+
git worktree add ...
|
|
362
|
+
git checkout -b tests/...
|
|
363
|
+
git branch tests/...
|
|
305
364
|
```
|
|
306
365
|
**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.
|
|
307
366
|
|
|
@@ -315,14 +374,14 @@ This creates:
|
|
|
315
374
|
- Worktree at `.jettypod-work/tests-<id>-<slug>/`
|
|
316
375
|
- Branch `tests/feature-<id>-<slug>`
|
|
317
376
|
|
|
318
|
-
|
|
377
|
+
**STOP AND CHECK:** Verify worktree was created successfully. If you see an error, investigate before continuing.
|
|
319
378
|
|
|
320
379
|
**Capture from output:**
|
|
321
380
|
- `WORKTREE_PATH` - the absolute path to the worktree (e.g., `/path/to/.jettypod-work/tests-42-email-login`)
|
|
322
381
|
|
|
323
382
|
Example output:
|
|
324
383
|
```
|
|
325
|
-
|
|
384
|
+
Created test worktree: /path/to/.jettypod-work/tests-42-email-login
|
|
326
385
|
Branch: tests/feature-42-email-login
|
|
327
386
|
|
|
328
387
|
Write your BDD files to:
|
|
@@ -333,13 +392,13 @@ Write your BDD files to:
|
|
|
333
392
|
**Display:**
|
|
334
393
|
|
|
335
394
|
```
|
|
336
|
-
|
|
395
|
+
Test worktree created: ${WORKTREE_PATH}
|
|
337
396
|
Branch: tests/feature-${FEATURE_ID}-${FEATURE_SLUG}
|
|
338
397
|
|
|
339
|
-
|
|
398
|
+
WORKTREE LOCK ACTIVE: All BDD file writes will use this path.
|
|
340
399
|
```
|
|
341
400
|
|
|
342
|
-
|
|
401
|
+
**WORKTREE PATH LOCK**
|
|
343
402
|
|
|
344
403
|
From this point forward, ALL file operations for BDD tests MUST use paths starting with:
|
|
345
404
|
```
|
|
@@ -350,13 +409,17 @@ ${WORKTREE_PATH}/features/
|
|
|
350
409
|
|
|
351
410
|
**Proceed to Step 8.**
|
|
352
411
|
|
|
412
|
+
### BDD Scenario Formulation Rules (ENFORCED)
|
|
413
|
+
|
|
414
|
+
Before proposing scenarios, read `templates/bdd-guidance.md`. Scenarios MUST be: declarative (describe intent, not UI clicks), one behavior per scenario, deterministic (factory data, not ambient), no implementation leakage ("Given a user with an unpaid invoice" not "Given the database has a row in invoices"). No UI specifics unless the feature IS a UI interaction.
|
|
415
|
+
|
|
353
416
|
### Step 8: Propose BDD Scenarios
|
|
354
417
|
|
|
355
|
-
|
|
418
|
+
**FORBIDDEN: Writing Files at This Step**
|
|
356
419
|
```
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
420
|
+
Write tool to ${WORKTREE_PATH}/features/*.feature
|
|
421
|
+
Write tool to ${WORKTREE_PATH}/features/step_definitions/*.js
|
|
422
|
+
Any file creation (even in worktree)
|
|
360
423
|
```
|
|
361
424
|
**Files are written in Step 9** after user confirms the scenarios. At this step, you are ONLY displaying proposed scenarios to the user for confirmation.
|
|
362
425
|
|
|
@@ -369,7 +432,7 @@ ${WORKTREE_PATH}/features/
|
|
|
369
432
|
Based on chosen approach, **display** the proposed scenarios to the user:
|
|
370
433
|
|
|
371
434
|
```
|
|
372
|
-
|
|
435
|
+
Proposed BDD Scenarios
|
|
373
436
|
|
|
374
437
|
**Feature file:** ${WORKTREE_PATH}/features/[feature-slug].feature
|
|
375
438
|
**Step definitions:** ${WORKTREE_PATH}/features/step_definitions/[feature-slug].steps.js
|
|
@@ -431,6 +494,11 @@ Does this capture the feature correctly? Any scenarios to add/change?
|
|
|
431
494
|
- NO error handling scenarios (added in stable mode)
|
|
432
495
|
- NO validation failures (added in stable mode)
|
|
433
496
|
- NO security/compliance scenarios (added in production mode)
|
|
497
|
+
- **Incorporate UX states from Step 5B** into scenario Then/And steps:
|
|
498
|
+
- Loading indicators: "And I see a loading indicator while [action] completes"
|
|
499
|
+
- Success feedback: "And I see a success confirmation"
|
|
500
|
+
- Empty states: "Then I see an empty state with [description]"
|
|
501
|
+
- Transitions: "And the [content] appears with [transition description]"
|
|
434
502
|
|
|
435
503
|
**WAIT for user confirmation.**
|
|
436
504
|
|
|
@@ -438,7 +506,7 @@ Does this capture the feature correctly? Any scenarios to add/change?
|
|
|
438
506
|
- If user requests changes → Revise scenarios and display again
|
|
439
507
|
- **Store the confirmed scenarios in memory** - you'll write them in Step 9
|
|
440
508
|
|
|
441
|
-
|
|
509
|
+
**WORKFLOW CHECKPOINT: BDD scenarios confirmed**
|
|
442
510
|
|
|
443
511
|
```bash
|
|
444
512
|
jettypod workflow checkpoint <feature-id> --step=8
|
|
@@ -520,7 +588,7 @@ Scenario: User logs in with "Remember me" option (optional feature)
|
|
|
520
588
|
```
|
|
521
589
|
|
|
522
590
|
<details>
|
|
523
|
-
<summary><strong
|
|
591
|
+
<summary><strong>BDD Scenario Guidelines (click to expand)</strong></summary>
|
|
524
592
|
|
|
525
593
|
**Scenario naming:**
|
|
526
594
|
- Use present tense
|
|
@@ -573,7 +641,7 @@ Scenario: Prevent unauthorized access
|
|
|
573
641
|
|
|
574
642
|
**NOW you may write files** - the worktree exists (from Step 7) and scenarios are confirmed (from Step 8).
|
|
575
643
|
|
|
576
|
-
|
|
644
|
+
**WORKTREE PATH REQUIRED:** All file writes MUST use the `WORKTREE_PATH` captured in Step 7.
|
|
577
645
|
|
|
578
646
|
Using the scenarios confirmed in Step 8, write the files using **absolute paths to the worktree**:
|
|
579
647
|
|
|
@@ -605,14 +673,14 @@ cd ${WORKTREE_PATH} && npx cucumber-js --dry-run features/${FEATURE_SLUG}.featur
|
|
|
605
673
|
|
|
606
674
|
**What the output means:**
|
|
607
675
|
|
|
608
|
-
|
|
676
|
+
**Success** - No errors, all steps have definitions:
|
|
609
677
|
```
|
|
610
678
|
0 scenarios
|
|
611
679
|
0 steps
|
|
612
680
|
```
|
|
613
681
|
(Dry-run doesn't execute, so 0 is correct)
|
|
614
682
|
|
|
615
|
-
|
|
683
|
+
**Undefined steps** - Missing step definitions:
|
|
616
684
|
```
|
|
617
685
|
Undefined. Implement with the following snippet:
|
|
618
686
|
Given('I am on the login page', function () {
|
|
@@ -621,13 +689,13 @@ Undefined. Implement with the following snippet:
|
|
|
621
689
|
```
|
|
622
690
|
→ Add the missing step definition to your `.steps.js` file
|
|
623
691
|
|
|
624
|
-
|
|
692
|
+
**Syntax error** - Invalid Gherkin:
|
|
625
693
|
```
|
|
626
694
|
Parse error in features/foo.feature
|
|
627
695
|
```
|
|
628
696
|
→ Fix the feature file syntax
|
|
629
697
|
|
|
630
|
-
|
|
698
|
+
**Duplicate steps** - Multiple definitions match:
|
|
631
699
|
```
|
|
632
700
|
Multiple step definitions match
|
|
633
701
|
```
|
|
@@ -640,7 +708,7 @@ Multiple step definitions match
|
|
|
640
708
|
4. **Loop until validation passes** - do NOT proceed until green
|
|
641
709
|
|
|
642
710
|
**If validation succeeds:**
|
|
643
|
-
Display: "
|
|
711
|
+
Display: "BDD infrastructure validated - all steps have definitions"
|
|
644
712
|
|
|
645
713
|
**Update database with scenario file path:**
|
|
646
714
|
|
|
@@ -677,7 +745,7 @@ Now let me analyze the codebase and propose implementation chores for speed mode
|
|
|
677
745
|
|
|
678
746
|
Based on the scenario and my understanding of the codebase, here are the chores I recommend for speed mode:
|
|
679
747
|
|
|
680
|
-
**Chore 1: [Integration chore - wire feature into app]**
|
|
748
|
+
**Chore 1: [Integration chore - wire feature into app]** INTEGRATION
|
|
681
749
|
- Why: Makes the feature reachable from [entry point]
|
|
682
750
|
- Integration Contract:
|
|
683
751
|
• Entry point: [from Step 6]
|
|
@@ -698,6 +766,11 @@ Based on the scenario and my understanding of the codebase, here are the chores
|
|
|
698
766
|
• Files to create/modify: [specific paths]
|
|
699
767
|
• Patterns to follow: [reference existing similar code]
|
|
700
768
|
• Key functions/components needed: [list]
|
|
769
|
+
- UX acceptance criteria (from Step 5B):
|
|
770
|
+
• [Loading state: what shows during async operations in this chore's scope]
|
|
771
|
+
• [Success feedback: what the user sees after the action completes]
|
|
772
|
+
• [Empty state: what shows when there's no data, if applicable]
|
|
773
|
+
• [Micro-interactions: button states, transitions, visual feedback]
|
|
701
774
|
- Verification:
|
|
702
775
|
• [Which step definitions should pass]
|
|
703
776
|
|
|
@@ -739,18 +812,24 @@ Does this rationale capture why you chose this approach? (You can edit it if nee
|
|
|
739
812
|
|
|
740
813
|
**CRITICAL: Create chores BEFORE running `work implement`.** The system validates that chores exist before allowing the transition.
|
|
741
814
|
|
|
742
|
-
For each chore that the user confirmed in Step 10, use the
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
815
|
+
For each chore that the user confirmed in Step 10, use the **Write** tool to create `/tmp/jettypod-create.json`:
|
|
816
|
+
```json
|
|
817
|
+
{
|
|
818
|
+
"type": "chore",
|
|
819
|
+
"title": "[Chore title]",
|
|
820
|
+
"description": "[Chore description]",
|
|
821
|
+
"parent": ${FEATURE_ID}
|
|
822
|
+
}
|
|
746
823
|
```
|
|
747
824
|
|
|
748
|
-
|
|
825
|
+
Then run via **Bash**:
|
|
749
826
|
```bash
|
|
750
|
-
jettypod work create
|
|
827
|
+
jettypod work create --from=/tmp/jettypod-create.json
|
|
751
828
|
```
|
|
752
829
|
|
|
753
|
-
|
|
830
|
+
Replace `${FEATURE_ID}` with actual ID. Example: Write `{"type":"chore","title":"Set up auth routes","description":"Create login/logout endpoints...","parent":42}` to `/tmp/jettypod-create.json`, then run `jettypod work create --from=/tmp/jettypod-create.json`.
|
|
831
|
+
|
|
832
|
+
**CRITICAL: Copy the EXACT proposal from Step 10 into each chore description.** Do not paraphrase or summarize - the implementation guidance AND UX acceptance criteria must be preserved verbatim:
|
|
754
833
|
|
|
755
834
|
```
|
|
756
835
|
[Technical description from Step 10]
|
|
@@ -763,6 +842,9 @@ Implementation guidance:
|
|
|
763
842
|
• Patterns to follow: [EXACT references from Step 10]
|
|
764
843
|
• Key functions/components needed: [EXACT list from Step 10]
|
|
765
844
|
|
|
845
|
+
UX acceptance criteria:
|
|
846
|
+
• [EXACT UX criteria from Step 10 — loading states, success feedback, empty states, micro-interactions]
|
|
847
|
+
|
|
766
848
|
Verification:
|
|
767
849
|
• [EXACT step definitions from Step 10]
|
|
768
850
|
```
|
|
@@ -792,13 +874,13 @@ jettypod work implement 42 --winner="Simple inline form" --rationale="Fastest UX
|
|
|
792
874
|
After successful transition, display:
|
|
793
875
|
|
|
794
876
|
```
|
|
795
|
-
|
|
796
|
-
|
|
877
|
+
Feature transitioned to implementation phase
|
|
878
|
+
Created X chores for speed mode
|
|
797
879
|
|
|
798
880
|
Now I'll merge the BDD tests to main...
|
|
799
881
|
```
|
|
800
882
|
|
|
801
|
-
|
|
883
|
+
**WORKFLOW CHECKPOINT: Implementation transition complete**
|
|
802
884
|
|
|
803
885
|
```bash
|
|
804
886
|
jettypod workflow checkpoint <feature-id> --step=11
|
|
@@ -817,6 +899,8 @@ The BDD files were written in Step 9. Now merge them to main.
|
|
|
817
899
|
jettypod work tests merge ${FEATURE_ID}
|
|
818
900
|
```
|
|
819
901
|
|
|
902
|
+
**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.
|
|
903
|
+
|
|
820
904
|
```bash
|
|
821
905
|
# Step 2: cd to main repo
|
|
822
906
|
cd <main-repo-path>
|
|
@@ -834,33 +918,33 @@ This will:
|
|
|
834
918
|
- Push to remote
|
|
835
919
|
- Mark worktree as merged (cleanup is separate)
|
|
836
920
|
|
|
837
|
-
|
|
838
|
-
-
|
|
839
|
-
-
|
|
921
|
+
**STOP AND CHECK:** Verify merge succeeded:
|
|
922
|
+
- "Tests merged to main" → Proceed to Step 13
|
|
923
|
+
- Error → Investigate, worktree still exists for debugging
|
|
840
924
|
|
|
841
925
|
**After successful merge, display:**
|
|
842
926
|
|
|
843
927
|
```
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
928
|
+
Feature transitioned to implementation phase
|
|
929
|
+
Created X chores for speed mode
|
|
930
|
+
BDD tests merged to main
|
|
847
931
|
|
|
848
932
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
849
|
-
|
|
933
|
+
Feature Planning Complete!
|
|
850
934
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
851
935
|
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
936
|
+
BDD scenarios: features/[feature-slug].feature
|
|
937
|
+
Step definitions: features/step_definitions/[feature-slug].steps.js
|
|
938
|
+
Feature phase: Implementation
|
|
939
|
+
Feature mode: Speed
|
|
856
940
|
|
|
857
|
-
|
|
941
|
+
Recommendation: Start with Chore #[first-chore-id] ([chore-title])
|
|
858
942
|
[Brief reasoning - e.g., "It sets up the foundation the other chores depend on."]
|
|
859
943
|
|
|
860
944
|
Start this one? [yes / pick different / done for now]
|
|
861
945
|
```
|
|
862
946
|
|
|
863
|
-
|
|
947
|
+
**WORKFLOW INTEGRATION: Complete workflow**
|
|
864
948
|
|
|
865
949
|
```bash
|
|
866
950
|
jettypod workflow complete feature-planning <feature-id>
|
|
@@ -897,11 +981,11 @@ End feature-planning skill without starting a chore. Do NOT invoke speed-mode.
|
|
|
897
981
|
|
|
898
982
|
**After user picks a chore, execute these steps IN ORDER:**
|
|
899
983
|
|
|
900
|
-
|
|
984
|
+
**FORBIDDEN: Manual Git Worktree Commands**
|
|
901
985
|
```
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
986
|
+
git worktree add ...
|
|
987
|
+
git checkout -b feature/...
|
|
988
|
+
git branch feature/...
|
|
905
989
|
```
|
|
906
990
|
**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.
|
|
907
991
|
|
|
@@ -910,17 +994,17 @@ End feature-planning skill without starting a chore. Do NOT invoke speed-mode.
|
|
|
910
994
|
jettypod work start [chore-id]
|
|
911
995
|
```
|
|
912
996
|
|
|
913
|
-
|
|
997
|
+
**STOP AND CHECK:** Look at the output of `work start`. You should see:
|
|
914
998
|
```
|
|
915
|
-
|
|
999
|
+
Created worktree: /path/to/.jettypod-work/[id]-[title-slug]
|
|
916
1000
|
Branch: feature/work-[id]-[title-slug]
|
|
917
1001
|
```
|
|
918
1002
|
|
|
919
|
-
**If you see
|
|
1003
|
+
**If you see `Working in main repository (worktree creation failed)`:**
|
|
920
1004
|
- **DO NOT proceed to speed-mode**
|
|
921
1005
|
- Investigate why worktree failed (uncommitted changes? branch conflict?)
|
|
922
1006
|
- Fix the issue and re-run `work start`
|
|
923
|
-
- Only continue after seeing
|
|
1007
|
+
- Only continue after seeing `Created worktree`
|
|
924
1008
|
|
|
925
1009
|
**Step 2: Verify worktree exists before invoking speed-mode:**
|
|
926
1010
|
```bash
|
|
@@ -937,7 +1021,7 @@ If this returns empty/no rows, **STOP** - the worktree wasn't created properly.
|
|
|
937
1021
|
Use the Skill tool with skill: "speed-mode"
|
|
938
1022
|
```
|
|
939
1023
|
|
|
940
|
-
|
|
1024
|
+
**CRITICAL:** You MUST:
|
|
941
1025
|
1. Run `work start` first
|
|
942
1026
|
2. Verify the worktree was created (not fallback to main)
|
|
943
1027
|
3. THEN invoke speed-mode using the Skill tool
|
|
@@ -958,6 +1042,20 @@ If you skip `work start` or proceed when worktree creation failed, the merge wor
|
|
|
958
1042
|
|
|
959
1043
|
**User picks:** Option 1 (Simple inline form)
|
|
960
1044
|
|
|
1045
|
+
**UX States Inventory:**
|
|
1046
|
+
|
|
1047
|
+
| State | Login Form | Dashboard (after login) |
|
|
1048
|
+
|-------|-----------|----------------------|
|
|
1049
|
+
| Default | Email + password fields, "Sign In" button | N/A (redirected here) |
|
|
1050
|
+
| Loading | Button shows spinner, fields disabled | Skeleton cards for activity |
|
|
1051
|
+
| Success | Brief checkmark animation, then redirect | Full dashboard with welcome toast |
|
|
1052
|
+
| Empty | N/A | "No recent activity" with illustration |
|
|
1053
|
+
|
|
1054
|
+
**Micro-interactions:**
|
|
1055
|
+
- Sign In click → button disabled + spinner → redirect on success
|
|
1056
|
+
- "Remember me" checkbox → toggle animation
|
|
1057
|
+
- Page transition → fade/slide to dashboard
|
|
1058
|
+
|
|
961
1059
|
**Scenarios generated (speed mode - all success paths):**
|
|
962
1060
|
```gherkin
|
|
963
1061
|
Feature: Email/Password Login
|
|
@@ -992,6 +1090,7 @@ Before completing feature planning, ensure:
|
|
|
992
1090
|
- [ ] Epic's architectural decision is shown (if exists)
|
|
993
1091
|
- [ ] Exactly 3 approaches suggested
|
|
994
1092
|
- [ ] Winner chosen (with prototypes or without)
|
|
1093
|
+
- [ ] **UX States Inventory completed** (all screens/states/micro-interactions enumerated, confirmed by user)
|
|
995
1094
|
- [ ] **Integration Contract defined** (entry point, caller code, integration scenario)
|
|
996
1095
|
- [ ] **Test worktree created** with `work tests start` (Step 7)
|
|
997
1096
|
- [ ] **Integration Scenario is FIRST scenario** in proposed scenarios
|