prizmkit 1.1.152 → 1.1.154

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 (44) hide show
  1. package/bundled/VERSION.json +3 -3
  2. package/bundled/dev-pipeline/README.md +100 -87
  3. package/bundled/dev-pipeline/assets/skill-subagent-integration.md +1 -1
  4. package/bundled/dev-pipeline/prizmkit_runtime/checkpoint_state.py +14 -0
  5. package/bundled/dev-pipeline/prizmkit_runtime/cli.py +192 -110
  6. package/bundled/dev-pipeline/prizmkit_runtime/commands.py +146 -111
  7. package/bundled/dev-pipeline/prizmkit_runtime/daemon.py +3 -5
  8. package/bundled/dev-pipeline/prizmkit_runtime/interoperability.py +0 -1
  9. package/bundled/dev-pipeline/prizmkit_runtime/paths.py +0 -3
  10. package/bundled/dev-pipeline/prizmkit_runtime/reset.py +122 -15
  11. package/bundled/dev-pipeline/prizmkit_runtime/reset_preserve.py +1 -1
  12. package/bundled/dev-pipeline/prizmkit_runtime/runner_models.py +1 -1
  13. package/bundled/dev-pipeline/prizmkit_runtime/runners.py +19 -52
  14. package/bundled/dev-pipeline/prizmkit_runtime/status.py +106 -1
  15. package/bundled/dev-pipeline/scripts/init-bugfix-pipeline.py +2 -2
  16. package/bundled/dev-pipeline/scripts/parse-stream-progress.py +10 -12
  17. package/bundled/dev-pipeline/scripts/update-bug-status.py +196 -67
  18. package/bundled/dev-pipeline/scripts/update-checkpoint.py +16 -3
  19. package/bundled/dev-pipeline/scripts/update-feature-status.py +45 -117
  20. package/bundled/dev-pipeline/scripts/update-refactor-status.py +45 -119
  21. package/bundled/dev-pipeline/scripts/utils.py +119 -0
  22. package/bundled/dev-pipeline/templates/bug-fix-list-schema.json +3 -2
  23. package/bundled/dev-pipeline/tests/test_auto_skip.py +111 -32
  24. package/bundled/dev-pipeline/tests/test_checkpoint_state.py +148 -12
  25. package/bundled/dev-pipeline/tests/test_generate_bootstrap_prompt.py +0 -19
  26. package/bundled/dev-pipeline/tests/test_python_runner_parity.py +113 -188
  27. package/bundled/dev-pipeline/tests/test_recovery_workflow.py +211 -0
  28. package/bundled/dev-pipeline/tests/test_reset_modes.py +935 -0
  29. package/bundled/dev-pipeline/tests/test_reset_preserve.py +5 -5
  30. package/bundled/dev-pipeline/tests/test_unified_cli.py +544 -181
  31. package/bundled/skills/_metadata.json +1 -1
  32. package/bundled/skills/bug-planner/references/schema-validation.md +1 -1
  33. package/bundled/skills/bug-planner/scripts/validate-bug-list.py +1 -1
  34. package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +21 -13
  35. package/bundled/skills/feature-pipeline-launcher/SKILL.md +22 -14
  36. package/bundled/skills/recovery-workflow/SKILL.md +7 -5
  37. package/bundled/skills/recovery-workflow/evals/evals.json +2 -2
  38. package/bundled/skills/recovery-workflow/references/detection.md +3 -3
  39. package/bundled/skills/recovery-workflow/scripts/detect-recovery-state.py +1 -1
  40. package/bundled/skills/refactor-pipeline-launcher/SKILL.md +21 -13
  41. package/bundled/templates/project-memory-template.md +19 -11
  42. package/package.json +1 -1
  43. package/bundled/dev-pipeline/prizmkit_runtime/runner_recovery.py +0 -228
  44. package/bundled/dev-pipeline/scripts/generate-recovery-prompt.py +0 -767
@@ -1,5 +1,5 @@
1
1
  {
2
- "frameworkVersion": "1.1.152",
3
- "bundledAt": "2026-07-26T05:11:00.580Z",
4
- "bundledFrom": "4db7f74"
2
+ "frameworkVersion": "1.1.154",
3
+ "bundledAt": "2026-07-26T11:39:59.047Z",
4
+ "bundledFrom": "1d81b9b"
5
5
  }
@@ -14,21 +14,20 @@ Autonomous development pipeline that drives iterative AI CLI sessions through Pr
14
14
 
15
15
  ### Unified Python CLI prerequisites
16
16
 
17
- - Python 3.10+ for the unified Python CLI skeleton under `dev-pipeline/cli.py`
18
- - No third-party Python runtime packages are required by the CLI skeleton
19
- - The existing Python runtime is canonical for behavior while parity-based Python porting proceeds
17
+ - Python 3.10+ for the canonical Python CLI under `dev-pipeline/cli.py`
18
+ - No third-party Python runtime packages are required
19
+ - The Python runtime is the sole behavior source; retired shell and PowerShell wrappers are not compatibility entrypoints
20
20
 
21
- Inspect the transition command surface without invoking legacy shell wrappers:
21
+ Inspect the operation-first command surface without dispatching runtime behavior:
22
22
 
23
23
  ```bash
24
24
  python3 dev-pipeline/cli.py --help
25
- python3 dev-pipeline/cli.py diagnostics paths
26
- python3 dev-pipeline/cli.py diagnostics entrypoints
27
- python3 dev-pipeline/cli.py feature describe
28
- python3 dev-pipeline/cli.py daemon feature describe
25
+ python3 dev-pipeline/cli.py run --help
26
+ python3 dev-pipeline/cli.py status --help
27
+ python3 dev-pipeline/cli.py diagnostics ai-cli
29
28
  ```
30
29
 
31
- The unified CLI currently describes command contracts for feature, bugfix, refactor, recovery, reset, daemon, status, and diagnostics flows. It is an architecture skeleton and transition layer; it does not yet replace the shell implementation for runtime behavior.
30
+ The public namespaces are `run`, `status`, `reset`, `daemon`, `diagnostics`, and `helper`. Standard `--help` is the only command-description interface; family names are targets, not top-level namespaces.
32
31
 
33
32
  ## Quick Start
34
33
 
@@ -42,10 +41,10 @@ python3 .prizmkit/dev-pipeline/scripts/init-pipeline.py \
42
41
  --state-dir .prizmkit/state/features
43
42
 
44
43
  # 3. Run the pipeline (foreground, Ctrl+C to pause, re-run to resume)
45
- python3 ./.prizmkit/dev-pipeline/cli.py feature run .prizmkit/plans/feature-list.json
44
+ python3 ./.prizmkit/dev-pipeline/cli.py run feature .prizmkit/plans/feature-list.json
46
45
 
47
46
  # 4. Check progress at any time (from another terminal)
48
- python3 ./.prizmkit/dev-pipeline/cli.py feature status .prizmkit/plans/feature-list.json
47
+ python3 ./.prizmkit/dev-pipeline/cli.py status feature .prizmkit/plans/feature-list.json
49
48
 
50
49
  # 5. Or run as a background daemon
51
50
  python3 ./.prizmkit/dev-pipeline/cli.py daemon feature start .prizmkit/plans/feature-list.json
@@ -55,17 +54,17 @@ python3 ./.prizmkit/dev-pipeline/cli.py daemon feature start .prizmkit/plans/fea
55
54
 
56
55
  ## Python Runtime CLI Reference
57
56
 
58
- ### `cli.py feature` — Feature Pipeline Runner
57
+ ### `cli.py run feature` — Feature Pipeline Runner
59
58
 
60
- Main entry point. Drives the full feature development pipeline.
59
+ Main foreground entry point for the feature pipeline.
61
60
 
62
61
  ```bash
63
- python3 ./cli.py feature run [.prizmkit/plans/feature-list.json] # Run all features
64
- python3 ./cli.py feature run <feature-id> [options] # Run a single feature (F-NNN)
65
- python3 ./cli.py feature status [.prizmkit/plans/feature-list.json] # Show pipeline status
66
- python3 ./cli.py reset feature # Clear all state in state/
67
- python3 ./cli.py feature test-cli # Test AI CLI detection
68
- python3 ./cli.py feature help # Show usage help
62
+ python3 ./cli.py run feature [.prizmkit/plans/feature-list.json] # Run all features
63
+ python3 ./cli.py run feature <feature-id> [options] # Run a single feature (F-NNN)
64
+ python3 ./cli.py status feature [.prizmkit/plans/feature-list.json] # Show feature status
65
+ python3 ./cli.py reset feature <feature-id> --state-only # Recover causal state without Git/artifact cleanup
66
+ python3 ./cli.py diagnostics ai-cli # Inspect AI CLI resolution
67
+ python3 ./cli.py run feature --help # Show parser-owned usage help
69
68
  ```
70
69
 
71
70
  **Single-feature options:**
@@ -80,59 +79,74 @@ python3 ./cli.py feature help # Show usage hel
80
79
 
81
80
  ```bash
82
81
  # Run all features
83
- python3 ./.prizmkit/dev-pipeline/cli.py feature run .prizmkit/plans/feature-list.json
82
+ python3 ./.prizmkit/dev-pipeline/cli.py run feature .prizmkit/plans/feature-list.json
84
83
 
85
84
  # Run a single feature
86
- python3 ./.prizmkit/dev-pipeline/cli.py feature run F-007
85
+ python3 ./.prizmkit/dev-pipeline/cli.py run feature F-007
87
86
 
88
87
  # Dry run — inspect the generated prompt without spawning a session
89
- python3 ./.prizmkit/dev-pipeline/cli.py feature run F-007 --dry-run
88
+ python3 ./.prizmkit/dev-pipeline/cli.py run feature F-007 --dry-run
90
89
 
91
90
  # Resume from Phase 6 (implementation)
92
- python3 ./.prizmkit/dev-pipeline/cli.py feature run .prizmkit/plans/feature-list.json --resume-phase 6
91
+ python3 ./.prizmkit/dev-pipeline/cli.py run feature .prizmkit/plans/feature-list.json --resume-phase 6
93
92
  ```
94
93
 
95
94
  If `.prizmkit/plans/feature-list.json` path is omitted, defaults to `.prizmkit/plans/feature-list.json` in the project root.
96
95
 
97
96
  ---
98
97
 
99
- ### `cli.py reset feature`Reset Feature Recovery State
98
+ ### `cli.py reset <family>`Explicit Recovery and Cleanup Modes
100
99
 
101
- Reset is state-only and never starts execution. `--run` is unsupported; invoke `feature run` separately after a successful reset.
100
+ Reset never starts execution and rejects `--run`; invoke the matching `run <family>` command separately. Every invocation must select exactly one mode before the runtime will inspect mutable pipeline state or Git resources.
102
101
 
103
102
  ```bash
104
- python3 ./cli.py reset feature <feature-id> [--clean] [.prizmkit/plans/feature-list.json]
105
- python3 ./cli.py reset feature --failed --preserve-runtime [.prizmkit/plans/feature-list.json]
103
+ python3 ./cli.py reset <family> <item-id> --state-only [list-path]
104
+ python3 ./cli.py reset <family> --state-only --all [list-path]
105
+ python3 ./cli.py reset <family> <item-id-or-range> --fresh-checkout [list-path]
106
+ python3 ./cli.py reset <family> <--auto-skipped|--failed|--stalled> --fresh-checkout [list-path]
107
+ python3 ./cli.py reset <family> <item-id-or-range> --clean [list-path]
108
+ python3 ./cli.py reset <family> <--auto-skipped|--failed|--stalled> --clean [list-path]
109
+ python3 ./cli.py reset <family> --failed --preserve-runtime [list-path]
106
110
  ```
107
111
 
108
- | Flag | Description |
109
- |------|-------------|
110
- | `--clean` | Delete the task branch, session history, and `.prizmkit/specs/{slug}/` artifacts |
111
- | `--failed --preserve-runtime` | Restore every failed chain in the list while retaining checkout identity, branches/worktrees, sessions, checkpoints, artifacts, and WIP |
112
+ | Mode | Selector and effect |
113
+ |------|---------------------|
114
+ | `--state-only` | Requires one ID or explicit `--all`. Resets supported blocking roots and only causal `auto_skipped` descendants whose full blocker set is recovered; preserves checkout identity, branches/worktrees, source changes, checkpoints, and artifact/session files. Feature/Refactor roots are `failed` or `skipped`; Bugfix additionally supports `needs_info`. |
115
+ | `--fresh-checkout` | Requires one ID, range, or supported status filter. Performs the former standard reset, may discard active-checkout WIP, and publishes a new checkout boundary without deleting the task branch. |
116
+ | `--clean` | Accepts the fresh-checkout selectors and additionally deletes task branches, session history, continuation summaries, and task artifacts. |
117
+ | `--failed --preserve-runtime` | Whole-list failed-only recovery. Retains runtime history, valid checkout identity, branches/worktrees, checkpoints, artifacts, and WIP; a missing recorded branch is replaced from its local base and implementation-and-later checkpoints are rewound. |
112
118
 
113
- `--preserve-runtime` requires `--failed` and cannot be combined with `--clean`, an item ID/range, or another reset filter. It restores every `failed` root plus causal `auto_skipped` descendants, clears code/infrastructure retry counters, and marks continuation pending without clearing existing history or failure metadata. Valid checkout/branch/worktree/checkpoint identity is reused unchanged; when the recorded branch is missing, reset creates a replacement from the recorded base, retains old artifacts for reference, and rewinds implementation-and-later checkpoint stages to `pending`.
119
+ State-only rejects ranges and status filters. Preserve-runtime rejects IDs, ranges, `--all`, clean, other modes, and other filters. Missing modes, conflicting modes, unsupported selectors, and malformed causal dependency state fail before mutation.
114
120
 
115
121
  **Examples:**
116
122
 
117
123
  ```bash
118
- # Preserve all failed runtime chains, then execute separately
119
- python3 ./.prizmkit/dev-pipeline/cli.py reset feature --failed --preserve-runtime
120
- python3 ./.prizmkit/dev-pipeline/cli.py feature run .prizmkit/plans/feature-list.json
124
+ # Recover one causal state chain without changing Git/checkpoints/artifact files
125
+ python3 ./.prizmkit/dev-pipeline/cli.py reset feature F-007 --state-only
126
+ python3 ./.prizmkit/dev-pipeline/cli.py run feature F-007
121
127
 
122
- # Fresh single-feature reset, then execute separately
123
- python3 ./.prizmkit/dev-pipeline/cli.py reset feature F-007
124
- python3 ./.prizmkit/dev-pipeline/cli.py feature run F-007
128
+ # Recover all causal state chains
129
+ python3 ./.prizmkit/dev-pipeline/cli.py reset bugfix --state-only --all
130
+ python3 ./.prizmkit/dev-pipeline/cli.py run bugfix .prizmkit/plans/bug-fix-list.json
125
131
 
126
- # Destructive clean reset, then execute separately
132
+ # Preserve all failed runtime chains
133
+ python3 ./.prizmkit/dev-pipeline/cli.py reset refactor --failed --preserve-runtime
134
+ python3 ./.prizmkit/dev-pipeline/cli.py run refactor .prizmkit/plans/refactor-list.json
135
+
136
+ # Publish a fresh checkout boundary
137
+ python3 ./.prizmkit/dev-pipeline/cli.py reset feature F-007 --fresh-checkout
138
+ python3 ./.prizmkit/dev-pipeline/cli.py run feature F-007
139
+
140
+ # Destructive clean reset
127
141
  python3 ./.prizmkit/dev-pipeline/cli.py reset feature F-007 --clean my-features.json
128
- python3 ./.prizmkit/dev-pipeline/cli.py feature run F-007 my-features.json
142
+ python3 ./.prizmkit/dev-pipeline/cli.py run feature F-007 my-features.json
129
143
  ```
130
144
 
131
145
  ---
132
146
 
133
147
  ### `cli.py daemon feature` — Feature Pipeline Daemon
134
148
 
135
- Manages `cli.py feature` as a background daemon process with PID tracking and log consolidation. Designed for invocation from AI skill sessions.
149
+ Manages `cli.py run feature` as a background daemon process with PID tracking and log consolidation. Designed for invocation from AI skill sessions.
136
150
 
137
151
  ```bash
138
152
  python3 ./cli.py daemon feature start [.prizmkit/plans/feature-list.json] [--mode <mode>] [--env "KEY=VAL ..."]
@@ -140,7 +154,7 @@ python3 ./cli.py daemon feature stop
140
154
  python3 ./cli.py daemon feature status
141
155
  python3 ./cli.py daemon feature logs [--lines N] [--follow]
142
156
  python3 ./cli.py daemon feature restart [.prizmkit/plans/feature-list.json] [--mode <mode>] [--env "KEY=VAL ..."]
143
- python3 ./cli.py daemon feature help
157
+ python3 ./cli.py daemon feature --help
144
158
  ```
145
159
 
146
160
  | Subcommand | Description |
@@ -183,19 +197,19 @@ python3 ./.prizmkit/dev-pipeline/cli.py daemon feature start .prizmkit/plans/fea
183
197
 
184
198
  ---
185
199
 
186
- ### `cli.py bugfix` — Bug-Fix Pipeline Runner
200
+ ### `cli.py run bugfix` — Bug-Fix Pipeline Runner
187
201
 
188
- Equivalent to `cli.py feature` but for the bug-fix pipeline.
202
+ Uses the same operation-first foreground contract as `cli.py run feature`.
189
203
 
190
204
  ```bash
191
- python3 ./cli.py bugfix run [.prizmkit/plans/bug-fix-list.json] # Run all bugs
192
- python3 ./cli.py bugfix run <bug-id> [options] # Run single bug (B-NNN)
193
- python3 ./cli.py bugfix status [.prizmkit/plans/bug-fix-list.json] # Show status
194
- python3 ./cli.py reset bugfix # Clear all bugfix state
195
- python3 ./cli.py bugfix help
205
+ python3 ./cli.py run bugfix [.prizmkit/plans/bug-fix-list.json] # Run all bugs
206
+ python3 ./cli.py run bugfix <bug-id> [options] # Run single bug (B-NNN)
207
+ python3 ./cli.py status bugfix [.prizmkit/plans/bug-fix-list.json] # Show status
208
+ python3 ./cli.py reset bugfix <bug-id> --state-only # Recover causal Bugfix state
209
+ python3 ./cli.py run bugfix --help
196
210
  ```
197
211
 
198
- **Single-bug options:** `--dry-run` (same as `cli.py feature`)
212
+ **Single-bug options:** `--dry-run` (same as `cli.py run feature`)
199
213
 
200
214
  Processes bugs by: **severity** (critical > high > medium > low) then **priority** (high > medium > low).
201
215
 
@@ -203,7 +217,7 @@ Processes bugs by: **severity** (critical > high > medium > low) then **priority
203
217
 
204
218
  ### `cli.py daemon bugfix` — Bug-Fix Pipeline Daemon
205
219
 
206
- Identical interface to `cli.py daemon feature` but manages `cli.py bugfix` in background.
220
+ Identical interface to `cli.py daemon feature` but manages `cli.py run bugfix` in background.
207
221
 
208
222
  ```bash
209
223
  python3 ./cli.py daemon bugfix start [.prizmkit/plans/bug-fix-list.json] [--env "KEY=VAL ..."]
@@ -309,7 +323,7 @@ python3 scripts/generate-bootstrap-prompt.py \
309
323
  { "success": true, "output_path": "/absolute/path/prompt.md", "model": "claude-sonnet-4.6" }
310
324
  ```
311
325
 
312
- The `model` field is extracted from the feature's `"model"` field in .prizmkit/plans/feature-list.json (empty string if not specified). Used by `cli.py feature` to set `--model` on the AI CLI.
326
+ The `model` field is extracted from the feature's `"model"` field in .prizmkit/plans/feature-list.json (empty string if not specified). Used by `cli.py run feature` to set `--model` on the AI CLI.
313
327
 
314
328
  **Conditional blocks resolved for explicit legacy templates:**
315
329
  - `{{IF_RESUME}}` / `{{IF_FRESH_START}}` — Resume vs fresh start
@@ -531,10 +545,10 @@ Also exports: `log_info`, `log_warn`, `log_error`, `log_success` (with timestamp
531
545
 
532
546
  | Variable | Default | Used By | Description |
533
547
  |----------|---------|---------|-------------|
534
- | `MAX_RETRIES` | `3` | cli.py feature | Max retry attempts per feature before marking as failed |
535
- | `PIPELINE_MODE` | (auto) | cli.py feature, cli.py daemon feature | Override mode for all features: `lite\|standard\|full` |
536
- | `DEV_BRANCH` | auto-generated | cli.py feature | Custom git branch name (default: `dev/{feature-id}-{timestamp}`) |
537
- | `AUTO_PUSH` | `0` | cli.py feature | Set to `1` to auto-push branch to remote after successful session |
548
+ | `MAX_RETRIES` | `3` | cli.py run feature | Max retry attempts per feature before marking as failed |
549
+ | `PIPELINE_MODE` | (auto) | cli.py run feature, cli.py daemon feature | Override mode for all features: `lite\|standard\|full` |
550
+ | `DEV_BRANCH` | auto-generated | cli.py run feature | Custom git branch name (default: `dev/{feature-id}-{timestamp}`) |
551
+ | `AUTO_PUSH` | `0` | cli.py run feature | Set to `1` to auto-push branch to remote after successful session |
538
552
 
539
553
  ### AI CLI Configuration
540
554
 
@@ -542,23 +556,23 @@ Also exports: `log_info`, `log_warn`, `log_error`, `log_success` (with timestamp
542
556
  |----------|---------|---------|-------------|
543
557
  | `AI_CLI` | auto-detect | Python runtime | AI CLI command name. Auto-detects `cbc`, `claude`, or `codex` |
544
558
  | `PRIZMKIT_PLATFORM` | auto-detect | Python runtime | Platform hint for custom/wrapped AI CLI commands: `codebuddy`, `claude`, or `codex` |
545
- | `MODEL` | (none) | cli.py feature, cli.py bugfix | AI model fallback. Overridden by per-feature `model` field. See [Model Selection](#model-selection) |
559
+ | `MODEL` | (none) | cli.py run feature, cli.py run bugfix | AI model fallback. Overridden by per-feature `model` field. See [Model Selection](#model-selection) |
546
560
  | `CODEBUDDY_CLI` | (deprecated) | Python runtime | Legacy alias for `AI_CLI`. Prefer `AI_CLI` |
547
- | `VERBOSE` | `0` | cli.py feature | Set to `1` to enable `--verbose` on AI CLI |
561
+ | `VERBOSE` | `0` | cli.py run feature | Set to `1` to enable `--verbose` on AI CLI |
548
562
 
549
563
  ### Monitoring & Logging
550
564
 
551
565
  | Variable | Default | Used By | Description |
552
566
  |----------|---------|---------|-------------|
553
- | `HEARTBEAT_INTERVAL` | `30` | cli.py feature | Seconds between heartbeat log output |
554
- | `HEARTBEAT_STALE_THRESHOLD` | `600` | cli.py feature | Seconds before a session is considered stale/stuck |
567
+ | `HEARTBEAT_INTERVAL` | `30` | cli.py run feature | Seconds between heartbeat log output |
568
+ | `HEARTBEAT_STALE_THRESHOLD` | `600` | cli.py run feature | Seconds before a session is considered stale/stuck |
555
569
 
556
570
  **Examples:**
557
571
 
558
572
  ```bash
559
573
  # All env vars in one invocation
560
574
  MAX_RETRIES=5 MODEL=claude-sonnet-4.6 VERBOSE=1 \
561
- python3 ./.prizmkit/dev-pipeline/cli.py feature run .prizmkit/plans/feature-list.json
575
+ python3 ./.prizmkit/dev-pipeline/cli.py run feature .prizmkit/plans/feature-list.json
562
576
 
563
577
  # Via daemon with --env
564
578
  python3 ./.prizmkit/dev-pipeline/cli.py daemon feature start .prizmkit/plans/feature-list.json \
@@ -598,14 +612,14 @@ Specify a model for individual features in `.prizmkit/plans/feature-list.json`:
598
612
 
599
613
  ```bash
600
614
  # All features without a per-feature model use Sonnet
601
- MODEL=claude-sonnet-4.6 python3 ./.prizmkit/dev-pipeline/cli.py feature run .prizmkit/plans/feature-list.json
615
+ MODEL=claude-sonnet-4.6 python3 ./.prizmkit/dev-pipeline/cli.py run feature .prizmkit/plans/feature-list.json
602
616
 
603
617
  # Destructively reset, then retry with Opus as a separate run
604
618
  python3 ./.prizmkit/dev-pipeline/cli.py reset feature F-007 --clean
605
- MODEL=claude-opus-4.6 python3 ./.prizmkit/dev-pipeline/cli.py feature run F-007
619
+ MODEL=claude-opus-4.6 python3 ./.prizmkit/dev-pipeline/cli.py run feature F-007
606
620
 
607
- # Test which model the CLI is using
608
- MODEL=claude-sonnet-4.6 python3 ./.prizmkit/dev-pipeline/cli.py feature test-cli
621
+ # Inspect the resolved global AI CLI and model
622
+ MODEL=claude-sonnet-4.6 python3 ./.prizmkit/dev-pipeline/cli.py diagnostics ai-cli
609
623
  ```
610
624
 
611
625
  ### Dry-Run Model Verification
@@ -613,7 +627,7 @@ MODEL=claude-sonnet-4.6 python3 ./.prizmkit/dev-pipeline/cli.py feature test-cli
613
627
  Use `--dry-run` to verify which model will be used without spawning a session:
614
628
 
615
629
  ```bash
616
- python3 ./.prizmkit/dev-pipeline/cli.py feature run F-017 --dry-run
630
+ python3 ./.prizmkit/dev-pipeline/cli.py run feature F-017 --dry-run
617
631
  # Output includes: "Feature Model: claude-opus-4.6"
618
632
  ```
619
633
 
@@ -652,15 +666,15 @@ To permanently configure, create `.prizmkit/config.json`:
652
666
  Or override per-invocation:
653
667
 
654
668
  ```bash
655
- AI_CLI=claude python3 ./.prizmkit/dev-pipeline/cli.py feature run .prizmkit/plans/feature-list.json
669
+ AI_CLI=claude python3 ./.prizmkit/dev-pipeline/cli.py run feature .prizmkit/plans/feature-list.json
656
670
  ```
657
671
 
658
- ### Testing AI CLI (`test-cli`)
672
+ ### AI CLI Diagnostics
659
673
 
660
674
  ```bash
661
- python3 ./.prizmkit/dev-pipeline/cli.py feature test-cli
662
- MODEL=claude-sonnet-4.6 python3 ./.prizmkit/dev-pipeline/cli.py feature test-cli
663
- AI_CLI=cbc python3 ./.prizmkit/dev-pipeline/cli.py feature test-cli
675
+ python3 ./.prizmkit/dev-pipeline/cli.py diagnostics ai-cli
676
+ MODEL=claude-sonnet-4.6 python3 ./.prizmkit/dev-pipeline/cli.py diagnostics ai-cli
677
+ AI_CLI=cbc python3 ./.prizmkit/dev-pipeline/cli.py diagnostics ai-cli
664
678
  ```
665
679
 
666
680
  ---
@@ -670,7 +684,7 @@ AI_CLI=cbc python3 ./.prizmkit/dev-pipeline/cli.py feature test-cli
670
684
  ### Feature Pipeline Execution Flow
671
685
 
672
686
  ```
673
- cli.py feature run command
687
+ cli.py run feature command
674
688
  |
675
689
  +- detect-stuck.py # Check for stale/stuck sessions
676
690
  +- update-feature-status.py # get_next: find next runnable feature
@@ -749,14 +763,14 @@ cat .prizmkit/state/features/F-003/sessions/F-003-*/logs/session.log | less
749
763
  ### Pause & Resume
750
764
 
751
765
  - **Ctrl+C** triggers graceful shutdown — current state is saved
752
- - **Re-running** `python3 ./cli.py feature run` resumes from where it left off (completed features skipped)
753
- - Force resume from a phase: `python3 ./cli.py feature run .prizmkit/plans/feature-list.json --resume-phase 6`
766
+ - **Re-running** `python3 ./cli.py run feature` resumes from where it left off (completed features skipped)
767
+ - Force resume from a phase: `python3 ./cli.py run feature .prizmkit/plans/feature-list.json --resume-phase 6`
754
768
 
755
769
  ### Manual Intervention
756
770
 
757
771
  ```bash
758
772
  # Check what failed
759
- python3 ./.prizmkit/dev-pipeline/cli.py feature status .prizmkit/plans/feature-list.json
773
+ python3 ./.prizmkit/dev-pipeline/cli.py status feature .prizmkit/plans/feature-list.json
760
774
 
761
775
  # Review session logs
762
776
  cat .prizmkit/state/features/F-XXX/sessions/*/logs/session.log
@@ -774,7 +788,7 @@ python3 .prizmkit/dev-pipeline/scripts/update-feature-status.py \
774
788
  --feature-id F-XXX --action reset
775
789
 
776
790
  # Resume
777
- python3 ./.prizmkit/dev-pipeline/cli.py feature run .prizmkit/plans/feature-list.json
791
+ python3 ./.prizmkit/dev-pipeline/cli.py run feature .prizmkit/plans/feature-list.json
778
792
  ```
779
793
 
780
794
  ---
@@ -788,17 +802,17 @@ The bug fix pipeline provides the same autonomous outer-loop as the feature pipe
788
802
  ```bash
789
803
  # 1. Generate bug fix list (via bug-planner skill)
790
804
  # 2. Run foreground
791
- python3 ./.prizmkit/dev-pipeline/cli.py bugfix run .prizmkit/plans/bug-fix-list.json
805
+ python3 ./.prizmkit/dev-pipeline/cli.py run bugfix .prizmkit/plans/bug-fix-list.json
792
806
  # 3. Or as daemon
793
807
  python3 ./.prizmkit/dev-pipeline/cli.py daemon bugfix start .prizmkit/plans/bug-fix-list.json
794
808
  # 4. Check progress
795
- python3 ./.prizmkit/dev-pipeline/cli.py bugfix status .prizmkit/plans/bug-fix-list.json
809
+ python3 ./.prizmkit/dev-pipeline/cli.py status bugfix .prizmkit/plans/bug-fix-list.json
796
810
  ```
797
811
 
798
812
  ### Bug Fix Execution Flow
799
813
 
800
814
  ```
801
- cli.py bugfix run command
815
+ cli.py run bugfix command
802
816
  |
803
817
  +- update-bug-status.py # get_next (severity -> priority order)
804
818
  +- generate-bugfix-prompt.py # Build prompt from template
@@ -851,13 +865,12 @@ cli.py bugfix run command
851
865
 
852
866
  ```
853
867
  .prizmkit/dev-pipeline/
854
- +-- cli.py feature # Main pipeline runner (features)
855
- +-- cli.py reset feature # Reset & retry failed feature
856
- +-- cli.py reset feature # Reset/clean feature for re-execution
857
- +-- cli.py daemon feature # Background daemon for feature pipeline
858
- +-- cli.py bugfix # Bug-fix pipeline runner
859
- +-- cli.py reset bugfix # Reset & retry failed bug
860
- +-- cli.py daemon bugfix # Background daemon for bugfix pipeline
868
+ +-- cli.py run <family> # Foreground feature/bugfix/refactor runners
869
+ +-- cli.py status <family|all> # Read-only family or aggregate status
870
+ +-- cli.py reset <family> # Explicit state-only/fresh/clean/preserve reset modes
871
+ +-- cli.py daemon <family> # Background daemon lifecycle
872
+ +-- cli.py diagnostics <action> # Paths, entrypoints, version, and AI CLI resolution
873
+ +-- cli.py helper # Low-level cross-platform helper commands
861
874
  +-- README.md # This file
862
875
  +-- .gitignore # Ignores .prizmkit/state/, __pycache__/
863
876
  |
@@ -945,7 +958,7 @@ Check `set -e` interactions. All python invocations in the main loop should have
945
958
  Verify CLI is functional: `claude -p "test" --dangerously-skip-permissions`, `echo "test" | cbc --print -y`, or `echo "test" | codex --ask-for-approval never --sandbox danger-full-access exec --skip-git-repo-check -`
946
959
 
947
960
  ### "PIPELINE_BLOCKED" loops
948
- All remaining features have unmet dependencies. Use `python3 ./cli.py feature status` to find the blocking feature, then reset or manually complete it.
961
+ All remaining features have unmet dependencies. Use `python3 ./cli.py status feature` to find the blocking feature, then reset or manually complete it.
949
962
 
950
963
  ### Feature marked as "crashed"
951
964
  Session exited without `session-status.json`. Pipeline retries up to `MAX_RETRIES` times automatically.
@@ -15,7 +15,7 @@ Skill behavior is owned by canonical skills:
15
15
  ```text
16
16
  dev-pipeline (outer loop)
17
17
  |
18
- +-- cli.py feature/bugfix/refactor Python runtime CLI — picks next item, starts CLI
18
+ +-- cli.py run <family> Python runtime CLI — picks next item, starts CLI
19
19
  +-- scripts/ Python state and prompt management scripts
20
20
  +-- templates/ Session prompt templates and sections
21
21
  |
@@ -634,6 +634,20 @@ def _derive_semantic_state(
634
634
  return _semantic_error(workflow_type, current_step, "invalid_blocked_reason", "blocked_reason must be a non-empty string")
635
635
  if terminal_status == "WORKFLOW_BLOCKED" and not blocked_reason:
636
636
  return _semantic_error(workflow_type, current_step, "missing_blocked_reason", "WORKFLOW_BLOCKED requires blocked_reason")
637
+ if blocked_reason and terminal_status == "WORKFLOW_COMPLETED":
638
+ return _semantic_error(
639
+ workflow_type,
640
+ current_step,
641
+ "completed_workflow_has_blocked_reason",
642
+ "WORKFLOW_COMPLETED cannot retain blocked_reason",
643
+ )
644
+ if blocked_reason and terminal_status != "WORKFLOW_BLOCKED":
645
+ return _semantic_error(
646
+ workflow_type,
647
+ current_step,
648
+ "blocked_reason_without_blocked_terminal",
649
+ "blocked_reason requires terminal_status=WORKFLOW_BLOCKED",
650
+ )
637
651
 
638
652
  review_step = _single_step(steps, "prizmkit-code-review")
639
653
  test_step = _single_step(steps, "prizmkit-test")