prizmkit 1.1.114 → 1.1.115

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 (75) hide show
  1. package/bundled/VERSION.json +3 -3
  2. package/bundled/dev-pipeline/.env.example +0 -1
  3. package/bundled/dev-pipeline/README.md +4 -6
  4. package/bundled/dev-pipeline/SCHEMA_ANALYSIS.md +40 -518
  5. package/bundled/dev-pipeline/assets/prizm-dev-team-integration.md +27 -99
  6. package/bundled/dev-pipeline/prizmkit_runtime/checkpoint_state.py +283 -0
  7. package/bundled/dev-pipeline/prizmkit_runtime/daemon.py +3 -13
  8. package/bundled/dev-pipeline/prizmkit_runtime/heartbeat.py +0 -1
  9. package/bundled/dev-pipeline/prizmkit_runtime/runner_classification.py +25 -31
  10. package/bundled/dev-pipeline/prizmkit_runtime/runner_models.py +0 -8
  11. package/bundled/dev-pipeline/prizmkit_runtime/runner_prompts.py +0 -3
  12. package/bundled/dev-pipeline/prizmkit_runtime/runners.py +13 -7
  13. package/bundled/dev-pipeline/prizmkit_runtime/sessions.py +13 -1
  14. package/bundled/dev-pipeline/scripts/continuation.py +8 -40
  15. package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +76 -261
  16. package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +16 -35
  17. package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +15 -34
  18. package/bundled/dev-pipeline/scripts/init-bugfix-pipeline.py +6 -0
  19. package/bundled/dev-pipeline/scripts/init-pipeline.py +6 -0
  20. package/bundled/dev-pipeline/scripts/init-refactor-pipeline.py +6 -0
  21. package/bundled/dev-pipeline/scripts/parse-stream-progress.py +1 -1
  22. package/bundled/dev-pipeline/scripts/prompt_framework.py +114 -63
  23. package/bundled/dev-pipeline/scripts/update-bug-status.py +3 -7
  24. package/bundled/dev-pipeline/scripts/update-checkpoint.py +54 -22
  25. package/bundled/dev-pipeline/scripts/update-feature-status.py +3 -7
  26. package/bundled/dev-pipeline/scripts/update-refactor-status.py +3 -7
  27. package/bundled/dev-pipeline/scripts/utils.py +6 -37
  28. package/bundled/dev-pipeline/templates/bootstrap-prompt.md +1 -1
  29. package/bundled/dev-pipeline/templates/bootstrap-tier1.md +1 -1
  30. package/bundled/dev-pipeline/templates/bootstrap-tier2.md +9 -91
  31. package/bundled/dev-pipeline/templates/bootstrap-tier3.md +9 -66
  32. package/bundled/dev-pipeline/templates/bug-fix-list-schema.json +10 -16
  33. package/bundled/dev-pipeline/templates/feature-list-schema.json +32 -17
  34. package/bundled/dev-pipeline/templates/refactor-bootstrap-prompt.md +0 -16
  35. package/bundled/dev-pipeline/templates/refactor-list-schema.json +10 -16
  36. package/bundled/dev-pipeline/templates/sections/bugfix-session-context.md +1 -1
  37. package/bundled/dev-pipeline/templates/sections/context-budget-rules.md +1 -1
  38. package/bundled/dev-pipeline/templates/sections/critical-paths-agent.md +0 -1
  39. package/bundled/dev-pipeline/templates/sections/critical-paths-full.md +0 -1
  40. package/bundled/dev-pipeline/templates/sections/phase-implement-agent.md +1 -1
  41. package/bundled/dev-pipeline/templates/sections/phase-implement-full.md +1 -1
  42. package/bundled/dev-pipeline/templates/sections/refactor-session-context.md +1 -1
  43. package/bundled/dev-pipeline/tests/conftest.py +1 -0
  44. package/bundled/dev-pipeline/tests/test_checkpoint_state.py +164 -0
  45. package/bundled/dev-pipeline/tests/test_generate_bootstrap_prompt.py +48 -76
  46. package/bundled/dev-pipeline/tests/test_generate_bugfix_prompt.py +25 -3
  47. package/bundled/dev-pipeline/tests/test_generate_refactor_prompt.py +25 -5
  48. package/bundled/dev-pipeline/tests/test_python_runner_parity.py +128 -10
  49. package/bundled/dev-pipeline/tests/test_unified_cli.py +40 -9
  50. package/bundled/skills/_metadata.json +1 -1
  51. package/bundled/skills/bug-planner/SKILL.md +5 -4
  52. package/bundled/skills/bug-planner/references/verification.md +29 -0
  53. package/bundled/skills/bug-planner/scripts/validate-bug-list.py +8 -0
  54. package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +2 -2
  55. package/bundled/skills/bugfix-pipeline-launcher/references/configuration.md +1 -6
  56. package/bundled/skills/feature-pipeline-launcher/SKILL.md +6 -12
  57. package/bundled/skills/feature-pipeline-launcher/references/configuration.md +0 -1
  58. package/bundled/skills/feature-planner/SKILL.md +13 -12
  59. package/bundled/skills/feature-planner/assets/planning-guide.md +2 -2
  60. package/bundled/skills/feature-planner/scripts/validate-and-generate.py +8 -11
  61. package/bundled/skills/prizmkit-plan/SKILL.md +15 -1
  62. package/bundled/skills/prizmkit-plan/references/review-plan-spec-loop.md +101 -0
  63. package/bundled/skills/refactor-pipeline-launcher/SKILL.md +5 -5
  64. package/bundled/skills/refactor-pipeline-launcher/references/configuration.md +2 -7
  65. package/bundled/skills/refactor-planner/SKILL.md +10 -8
  66. package/bundled/skills/refactor-planner/scripts/validate-and-generate-refactor.py +9 -0
  67. package/bundled/team/prizm-dev-team.json +2 -9
  68. package/package.json +1 -1
  69. package/bundled/agents/prizm-dev-team-critic.md +0 -179
  70. package/bundled/dev-pipeline/templates/agent-prompts/critic-plan-challenge.md +0 -8
  71. package/bundled/dev-pipeline/templates/sections/bugfix-phase-critic.md +0 -22
  72. package/bundled/dev-pipeline/templates/sections/phase-critic-plan-full.md +0 -61
  73. package/bundled/dev-pipeline/templates/sections/phase-critic-plan.md +0 -38
  74. package/bundled/dev-pipeline/templates/sections/refactor-phase-critic.md +0 -22
  75. package/bundled/skills/bug-planner/references/critic-and-verification.md +0 -44
@@ -793,9 +793,6 @@ def test_session_preamble_writes_redacted_start_command_for_all_launch_profiles(
793
793
 
794
794
  def test_headless_subagent_prompt_guidance_keeps_no_worktree_boundary_visible():
795
795
  guidance_files = [
796
- REPO_ROOT / "dev-pipeline" / "templates" / "sections" / "phase-critic-plan.md",
797
- REPO_ROOT / "dev-pipeline" / "templates" / "sections" / "phase-critic-plan-full.md",
798
- REPO_ROOT / "dev-pipeline" / "templates" / "agent-prompts" / "critic-plan-challenge.md",
799
796
  REPO_ROOT / "dev-pipeline" / "templates" / "bootstrap-tier2.md",
800
797
  REPO_ROOT / "dev-pipeline" / "templates" / "bootstrap-tier3.md",
801
798
  REPO_ROOT / "core" / "skills" / "prizmkit-skill" / "prizmkit-code-review" / "SKILL.md",
@@ -1029,12 +1026,13 @@ def test_compact_progress_line_hides_stale_until_no_progress(tmp_path):
1029
1026
 
1030
1027
  session_log = tmp_path / "session.log"
1031
1028
  progress = tmp_path / "progress.json"
1029
+ checkpoint = tmp_path / "workflow-checkpoint.json"
1032
1030
  progress.write_text(
1033
1031
  json.dumps(
1034
1032
  {
1035
1033
  "child_total_bytes": 2 * 1024 * 1024,
1036
1034
  "subagent_spawn_count": 5,
1037
- "current_phase": "retrospective",
1035
+ "current_phase": "stream-derived-phase",
1038
1036
  "current_tool": "Read",
1039
1037
  "message_count": 465,
1040
1038
  "total_tool_calls": 412,
@@ -1042,20 +1040,28 @@ def test_compact_progress_line_hides_stale_until_no_progress(tmp_path):
1042
1040
  ),
1043
1041
  encoding="utf-8",
1044
1042
  )
1043
+ checkpoint.write_text(
1044
+ json.dumps({"steps": [
1045
+ {"id": "S01", "skill": "plan", "name": "Plan", "status": "completed"},
1046
+ {"id": "S02", "skill": "retro", "name": "Retrospective", "status": "pending", "depends_on": "S01"},
1047
+ ]}),
1048
+ encoding="utf-8",
1049
+ )
1045
1050
  running = HeartbeatState(last_seen_epoch=1.0, stale=False, details="progress", stale_seconds=0, log_size=4 * 1024 * 1024)
1046
1051
  brief_pause = HeartbeatState(last_seen_epoch=1.0, stale=False, details="no progress", stale_seconds=125, log_size=4 * 1024 * 1024)
1047
1052
  paused = HeartbeatState(last_seen_epoch=1.0, stale=True, details="no progress", stale_seconds=15 * 60, log_size=4 * 1024 * 1024)
1048
1053
  resumed = HeartbeatState(last_seen_epoch=3.0, stale=False, details="progress", stale_seconds=0, log_size=5 * 1024 * 1024)
1049
1054
 
1050
- running_line = _compact_progress_line(0, session_log, progress, running, stale_threshold_seconds=15 * 60)
1051
- brief_pause_line = _compact_progress_line(0, session_log, progress, brief_pause, stale_threshold_seconds=15 * 60)
1052
- paused_line = _compact_progress_line(0, session_log, progress, paused, stale_threshold_seconds=15 * 60)
1053
- resumed_line = _compact_progress_line(0, session_log, progress, resumed, stale_threshold_seconds=15 * 60)
1055
+ running_line = _compact_progress_line(0, session_log, progress, running, checkpoint_path=checkpoint, stale_threshold_seconds=15 * 60)
1056
+ brief_pause_line = _compact_progress_line(0, session_log, progress, brief_pause, checkpoint_path=checkpoint, stale_threshold_seconds=15 * 60)
1057
+ paused_line = _compact_progress_line(0, session_log, progress, paused, checkpoint_path=checkpoint, stale_threshold_seconds=15 * 60)
1058
+ resumed_line = _compact_progress_line(0, session_log, progress, resumed, checkpoint_path=checkpoint, stale_threshold_seconds=15 * 60)
1054
1059
 
1055
1060
  assert "▶ [HEARTBEAT]" in running_line
1056
1061
  assert "log: 4MB" in running_line
1057
1062
  assert "child: 2MB/5" in running_line
1058
- assert "phase: retrospective" in running_line
1063
+ assert "phase: Retrospective" in running_line
1064
+ assert "stream-derived-phase" not in running_line
1059
1065
  assert "tool: Read" in running_line
1060
1066
  assert "msgs: 465" in running_line
1061
1067
  assert "412 tool calls" in running_line
@@ -1068,6 +1074,31 @@ def test_compact_progress_line_hides_stale_until_no_progress(tmp_path):
1068
1074
  assert "log: 5MB" in resumed_line
1069
1075
  assert "stale:" not in resumed_line
1070
1076
 
1077
+ def test_compact_progress_line_omits_phase_without_valid_checkpoint(tmp_path):
1078
+ from prizmkit_runtime.heartbeat import HeartbeatState
1079
+ from prizmkit_runtime.sessions import _compact_progress_line
1080
+
1081
+ session_log = tmp_path / "session.log"
1082
+ progress = tmp_path / "progress.json"
1083
+ malformed = tmp_path / "bad-checkpoint.json"
1084
+ invalid = tmp_path / "invalid-checkpoint.json"
1085
+ progress.write_text(
1086
+ json.dumps({"current_phase": "legacy-plan", "current_tool": "Edit"}),
1087
+ encoding="utf-8",
1088
+ )
1089
+ malformed.write_text("{bad", encoding="utf-8")
1090
+ invalid.write_text(json.dumps({"steps": [{"id": "S01", "skill": "x", "name": "X", "status": "done"}]}), encoding="utf-8")
1091
+ state = HeartbeatState(last_seen_epoch=1.0, stale=False, details="progress", stale_seconds=0, log_size=12)
1092
+
1093
+ missing_line = _compact_progress_line(0, session_log, progress, state, checkpoint_path=tmp_path / "missing.json")
1094
+ malformed_line = _compact_progress_line(0, session_log, progress, state, checkpoint_path=malformed)
1095
+ invalid_line = _compact_progress_line(0, session_log, progress, state, checkpoint_path=invalid)
1096
+
1097
+ for line in (missing_line, malformed_line, invalid_line):
1098
+ assert "phase:" not in line
1099
+ assert "legacy-plan" not in line
1100
+ assert "tool: Edit" in line
1101
+
1071
1102
 
1072
1103
  def test_heartbeat_observation_stale_accumulates_by_elapsed_time_and_resets_on_progress(tmp_path, monkeypatch):
1073
1104
  import prizmkit_runtime.heartbeat as heartbeat
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.114",
2
+ "version": "1.1.115",
3
3
  "skills": {
4
4
  "prizmkit": {
5
5
  "description": "Full-lifecycle dev toolkit. Covers spec-driven development, Prizm context docs, code quality, debugging, deployment, and knowledge management.",
@@ -414,14 +414,15 @@ Bug List (by priority):
414
414
 
415
415
  ---
416
416
 
417
- ## Adversarial Critic & Browser Verification
417
+ ## Verification Defaults
418
418
 
419
- When configuring critic settings or browser verification for bugs, read `${SKILL_DIR}/references/critic-and-verification.md` for default behavior tables and verification type guidance.
419
+ When configuring bug verification, read `${SKILL_DIR}/references/verification.md` for verification type and browser verification guidance.
420
420
 
421
421
  Key points:
422
- - Critic is enabled by default for critical/high severity, disabled for medium/low
423
- - Users can override critic settings per-bug during Phase 2 or Phase 3
422
+ - Critical/high severity bugs require clear automated, manual, or hybrid verification evidence.
423
+ - Medium/low severity bugs use the smallest verification that proves the fix and guards against regression.
424
424
  - `browser_interaction` is supported for UI-reproducible bugs; `verification_type` still declares whether verification is automated, manual, or hybrid.
425
+ - Do not generate `critic` or `critic_count`; those fields are fully removed and validators reject them.
425
426
 
426
427
  ---
427
428
 
@@ -0,0 +1,29 @@
1
+ # Bug Verification Guidance
2
+
3
+ ## Verification Defaults
4
+
5
+ All bug fixes need verification that matches severity, reproduction clarity, and risk.
6
+
7
+ | Severity | Default verification expectation | Rationale |
8
+ |---|---|---|
9
+ | critical | Automated or hybrid verification with explicit regression coverage | Crash/data-loss/security bugs need durable proof. |
10
+ | high | Automated or hybrid verification for the broken core path | Core-feature failures need regression protection. |
11
+ | medium | Focused automated or manual verification | Workaround cases need proof without over-scoping. |
12
+ | low | Smallest meaningful check | Cosmetic or minor edge cases should stay lightweight. |
13
+
14
+ ## Verification Type
15
+
16
+ - `automated`: use when a unit, integration, or E2E test can reliably reproduce the bug and prove the fix.
17
+ - `manual`: use when reproduction needs external state or human judgment and no stable automated check is practical.
18
+ - `hybrid`: use when automated regression coverage is possible but final confidence needs manual/browser confirmation.
19
+
20
+ ## Browser Verification
21
+
22
+ Use `browser_interaction` for UI-reproducible bugs.
23
+
24
+ - `tool: auto` lets the runtime choose the best browser tool.
25
+ - `tool: playwright-cli` is best for local dev-server verification in an isolated browser.
26
+ - `tool: opencli` is best when an existing Chrome login/session or third-party integration cookies are needed.
27
+ - `verify_steps` should describe what to prove, not low-level click scripts.
28
+
29
+ Do not emit `critic` or `critic_count`; those fields are retired and validators reject them.
@@ -139,6 +139,14 @@ def validate(data, feature_ids=None):
139
139
  for i, bug in enumerate(bugs):
140
140
  prefix = "bugs[{}]".format(i)
141
141
 
142
+ for retired_field in ("critic", "critic_count"):
143
+ if retired_field in bug:
144
+ errors.append(
145
+ "{}: '{}' field is retired; remove it from bug-fix-list data".format(
146
+ prefix, retired_field
147
+ )
148
+ )
149
+
142
150
  # Required fields
143
151
  bug_id = bug.get("id", "")
144
152
  if not bug_id:
@@ -123,7 +123,7 @@ Detect user intent from their message, then follow the corresponding workflow:
123
123
  ```
124
124
  Selected-options example:
125
125
  ```bash
126
- VERBOSE=1 ENABLE_CRITIC=1 MAX_RETRIES=5 STOP_ON_FAILURE=1 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
126
+ VERBOSE=1 MAX_RETRIES=5 STOP_ON_FAILURE=1 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
127
127
  python3 ./.prizmkit/dev-pipeline/cli.py bugfix run .prizmkit/plans/bug-fix-list.json
128
128
  ```
129
129
 
@@ -134,7 +134,7 @@ Detect user intent from their message, then follow the corresponding workflow:
134
134
  Selected-options example:
135
135
  ```bash
136
136
  python3 ./.prizmkit/dev-pipeline/cli.py daemon bugfix start .prizmkit/plans/bug-fix-list.json \
137
- --env "VERBOSE=1 ENABLE_CRITIC=1 MAX_RETRIES=5 STOP_ON_FAILURE=1 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high"
137
+ --env "VERBOSE=1 MAX_RETRIES=5 STOP_ON_FAILURE=1 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high"
138
138
  ```
139
139
 
140
140
  **Manual mode**: Print the assembled command(s) and **stop here**. Do not execute anything. Do not proceed to step 7.
@@ -11,7 +11,6 @@ Translating user responses to env vars:
11
11
  | Verbose: Off | `VERBOSE=0` |
12
12
  | Verbose: On | `VERBOSE=1` |
13
13
  | Max retries: N | `MAX_RETRIES=N` |
14
- | Critic: On | `ENABLE_CRITIC=1` |
15
14
  | Stop on failure: On | `STOP_ON_FAILURE=1` |
16
15
  | Deploy: Yes | `ENABLE_DEPLOY=1` |
17
16
  | Effort: value | `PRIZMKIT_EFFORT=<value>` |
@@ -43,15 +42,11 @@ Present these via `AskUserQuestion` in step 5. Round 1 is one `AskUserQuestion`
43
42
  - 1
44
43
  - 5
45
44
 
46
- **Question 3 — Critic review** (multiSelect: false):
47
- - Off (default) — Skip adversarial review (`ENABLE_CRITIC=0`)
48
- - On — Enable adversarial critic review (`ENABLE_CRITIC=1`): an independent AI agent reviews the diagnosis/plan for completeness and the fix for defects, edge cases, and regression risks. Adds ~5-10 min per bug.
49
-
50
45
  **Question 4 — Advanced config?** (multiSelect: false):
51
46
  - No (default) — Use defaults for failure behavior
52
47
  - Yes — Configure stop-on-failure, deploy, and reasoning effort options
53
48
 
54
- Note: Bug filter defaults to all bugs. Runtime selects eligible bugs in stable list order after dependencies are completed; planners should order unrelated bugs by severity/priority before launch. Default Critic to Off unless bugs have `severity: "critical"` or `severity: "high"` (in which case default to On). If the user selects "Other" on any option, handle their custom input.
49
+ Note: Bug filter defaults to all bugs. Runtime selects eligible bugs in stable list order after dependencies are completed; planners should order unrelated bugs by severity/priority before launch. If the user selects "Other" on any option, handle their custom input.
55
50
 
56
51
  ### Round 2 (only if Advanced config = Yes)
57
52
 
@@ -133,27 +133,21 @@ Detect user intent from their message, then follow the corresponding workflow:
133
133
 
134
134
  6. **Ask configuration options** — MANDATORY INTERACTIVE STEP, applies to ALL execution modes (Foreground, Background, AND Manual). This is a SEPARATE `AskUserQuestion` call from step 5 (see the RULE above). You MUST call `AskUserQuestion` with the 4 questions below and WAIT for the user's response before proceeding to step 7. Do NOT assume defaults, do NOT show the command as text and ask "ready?", and do NOT merge step 6 and step 7. If you find yourself writing the final command before the user has answered these 4 questions, STOP — you are violating this rule.
135
135
 
136
- Use `AskUserQuestion` to present ALL 4 configuration choices:
136
+ Use `AskUserQuestion` to present ALL 3 configuration choices:
137
137
 
138
- **Question 1 — Critic review** (multiSelect: false):
139
- - Off (default) — Skip adversarial review
140
- - On — Enable adversarial critic review: an independent AI agent reviews the spec/plan for completeness and the implementation for defects, edge cases, and missed requirements. Adds ~5-10 min per feature.
141
-
142
- **Question 2 — Verbose logging** (multiSelect: false):
138
+ **Question 1 — Verbose logging** (multiSelect: false):
143
139
  - On (default) — Detailed AI session logs including tool calls and subagent activity
144
140
  - Off — Minimal logging
145
141
 
146
- **Question 3 — Max retries** (multiSelect: false):
142
+ **Question 2 — Max retries** (multiSelect: false):
147
143
  - 3 (default)
148
144
  - 1
149
145
  - 5
150
146
 
151
- **Question 4 — Advanced config?** (multiSelect: false):
147
+ **Question 3 — Advanced config?** (multiSelect: false):
152
148
  - No (default) — Use defaults for failure behavior
153
149
  - Yes — Configure stop-on-failure, deploy-after-completion, and reasoning effort options
154
150
 
155
- Default Critic to Off unless features have `estimated_complexity: "high"` or above (in which case default to On).
156
-
157
151
  **If user chose "Yes" to Advanced config**, ask a second round of `AskUserQuestion` — see the advanced config questions (stop-on-failure, deploy-after-completion, reasoning effort) in `${SKILL_DIR}/references/configuration.md`.
158
152
 
159
153
  Read `${SKILL_DIR}/references/configuration.md` for the current environment-variable mapping and advanced environment-variable tables.
@@ -167,7 +161,7 @@ Detect user intent from their message, then follow the corresponding workflow:
167
161
  ```
168
162
  Selected-options example:
169
163
  ```bash
170
- VERBOSE=1 ENABLE_CRITIC=true MAX_RETRIES=5 STOP_ON_FAILURE=1 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
164
+ VERBOSE=1 MAX_RETRIES=5 STOP_ON_FAILURE=1 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
171
165
  python3 ./.prizmkit/dev-pipeline/cli.py feature run .prizmkit/plans/feature-list.json --features F-001:F-005
172
166
  ```
173
167
 
@@ -178,7 +172,7 @@ Detect user intent from their message, then follow the corresponding workflow:
178
172
  Selected-options example:
179
173
  ```bash
180
174
  python3 ./.prizmkit/dev-pipeline/cli.py daemon feature start .prizmkit/plans/feature-list.json --features F-001:F-005 \
181
- --env "VERBOSE=1 ENABLE_CRITIC=true MAX_RETRIES=5 STOP_ON_FAILURE=1 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high"
175
+ --env "VERBOSE=1 MAX_RETRIES=5 STOP_ON_FAILURE=1 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high"
182
176
  ```
183
177
 
184
178
  **Manual mode**: Print the assembled command(s) and **stop here**. Do not execute anything. Do not proceed to step 8.
@@ -28,7 +28,6 @@ Translating user responses to env vars:
28
28
 
29
29
  | Config choice | Environment variable |
30
30
  |-----------|---------------------|
31
- | Critic: On | `ENABLE_CRITIC=true` |
32
31
  | Verbose: Off | `VERBOSE=0` |
33
32
  | Verbose: On | `VERBOSE=1` |
34
33
  | Max retries: N | `MAX_RETRIES=N` |
@@ -106,7 +106,7 @@ Trigger conditions are covered by the frontmatter `description`. Do NOT use this
106
106
  8. **Browser interaction**: If present, may include `tool` and `verify_steps`; planner should add concrete `verify_steps` when known, but the schema permits an empty object for AI runtime exploration.
107
107
  9. **Complexity enum**: If present, is one of: low, medium, high, critical
108
108
  10. **Model field**: If present, is a non-empty string
109
- 11. **Critic field**: If present, is boolean; if true, critic_count should be 1 or 3
109
+ 11. **Retired fields**: `critic` and `critic_count` must not appear; validation fails if either field is present
110
110
  12. **Root schema**: Has $schema='dev-pipeline-feature-list-v1', project_name, and non-empty features array
111
111
 
112
112
  5. **Use script output as source of truth** — if validation fails, fix and re-run until pass
@@ -184,7 +184,7 @@ Assign `estimated_complexity` from concrete scope indicators, not from perceived
184
184
  - acceptance-criteria count and edge-case breadth
185
185
  - test coverage and verification difficulty
186
186
 
187
- Use `low` for focused changes in 1 module with <=5 acceptance criteria and no public API/schema changes. Use `medium` for normal multi-file or 2-3 module work with bounded interfaces. Use `high` only when multiple concrete high indicators are present, such as 3+ modules plus public API changes, deep dependencies, weak tests, or substantial architectural risk. Use `critical` only for system-wide architectural/infrastructure changes or safety-critical work requiring full-team/multi-critic execution.
187
+ Use `low` for focused changes in 1 module with <=5 acceptance criteria and no public API/schema changes. Use `medium` for normal multi-file or 2-3 module work with bounded interfaces. Use `high` only when multiple concrete high indicators are present, such as 3+ modules plus public API changes, deep dependencies, weak tests, or substantial architectural risk. Use `critical` only for system-wide architectural/infrastructure changes or safety-critical work requiring the strongest orchestrator/reviewer/test guardrails.
188
188
 
189
189
  ### Required Planning Review Summary
190
190
 
@@ -266,7 +266,7 @@ Checkpoints catch cascading errors early — skipping one means the next phase b
266
266
  | **CP-FP-2** | Feature Proposals | Feature set with titles+deps identified (pre-validation) | 3-5 |
267
267
  | **CP-FP-3** | DAG Validity | No cycles, dependencies resolved (validation dry-run) | 5 |
268
268
  | **CP-FP-3.1** | Browser Interaction Applied | Qualifying features have `browser_interaction` field; user confirmed or opted out | 4 |
269
- | **CP-FP-3.2** | Testing Defaults Applied | All features have appropriate `critic`, `critic_count`, and testing expectations | 7 |
269
+ | **CP-FP-3.2** | Testing Defaults Applied | All features have appropriate testing expectations and no retired `critic`/`critic_count` fields | 7 |
270
270
  | **CP-FP-3.3** | Completeness Review Passed | All features reviewed for description adequacy and cross-feature gaps | 6 |
271
271
  | **CP-FP-4** | `.prizmkit/plans/feature-list.json` Generated | Schema validates, all required keys present | 7-8 |
272
272
  | **CP-FP-5** | Final Validation Pass | Python script returns `"valid": true` with zero errors | 9 |
@@ -357,13 +357,12 @@ Key requirements:
357
357
  - `priority`: `"critical"`, `"high"`, `"medium"`, or `"low"` (string, NOT numeric)
358
358
  - new items default `status: "pending"`
359
359
  - English feature titles for stable slug generation
360
- - `critic` / `critic_count` defaults per Testing Defaults section
361
360
  - `browser_interaction` auto-generated for qualifying frontend features (with `tool` selection: `auto`/`playwright-cli`/`opencli`)
362
361
  - descriptions: minimum 15 words (error), recommended minimum 30/50/80/100+ for low/medium/high/critical (warning). No upper limit — more detail prevents AI guessing
363
362
  - `estimated_complexity` determines pipeline execution tier:
364
363
  - `low` / `medium` → **lite** (single agent, no subagents)
365
- - `high` → **standard** (orchestrator + dev + reviewer, 3 agents)
366
- - `critical` → **full** (full team + critic agents, 5 agents). Use for: architectural changes touching 10+ files, cross-module refactoring with API surface changes, features requiring multi-critic voting
364
+ - `high` → **standard** (orchestrator + reviewer guardrails, 3-agent metadata)
365
+ - `critical` → **full** (strongest orchestrator/reviewer guardrails). Use for: architectural changes touching 10+ files, cross-module refactoring with API surface changes, or safety/security/data-loss risk
367
366
 
368
367
  **IMPORTANT: Do NOT hand-write the final JSON file.** Instead:
369
368
  1. Write a draft JSON to a temporary path (e.g., `.prizmkit/plans/feature-list.draft.json`)
@@ -394,13 +393,15 @@ Run this gate **after** `.prizmkit/plans/feature-list.json` passes the validatio
394
393
 
395
394
  ## Testing Defaults (Phase 8)
396
395
 
397
- Set default testing-related fields for each feature. The user can opt out.
396
+ Set default testing-related fields for each feature. The user can opt out of generated testing expectations, but do not generate retired review-agent configuration fields.
398
397
 
399
- | Priority | `critic` | `critic_count` | Rationale |
400
- |----------|----------|----------------|-----------|
401
- | high | `true` | `3` | Multi-critic voting |
402
- | medium | `true` | `1` | Single critic review |
403
- | low | `false` | (omitted) | Skip critic |
398
+ | Priority | Testing expectation | Rationale |
399
+ |----------|---------------------|-----------|
400
+ | high | Require scoped tests and review-gate evidence | Higher-risk feature behavior needs stronger verification. |
401
+ | medium | Require focused tests for changed public behavior | Normal changes need meaningful boundary coverage. |
402
+ | low | Require the smallest relevant verification | Low-risk changes should stay lightweight. |
403
+
404
+ Never emit `critic` or `critic_count`; those fields are fully removed and the validator rejects them.
404
405
 
405
406
  For frontend features with `browser_interaction`, browser verification is enabled by default. The `tool` field uses the user's choice from the mandatory browser tool question in Phase 4.2 (see §Browser Interaction Planning → Default Behavior).
406
407
 
@@ -123,7 +123,7 @@ Complexity is an execution-scope estimate, not a priority or importance signal.
123
123
  | low | 1 module/layer, 1-3 files, no public API/schema change, shallow dependencies, <=5 acceptance criteria, clear existing tests | 1-2 API endpoints, 1-2 pages, focused config or copy behavior | lite (1 agent) |
124
124
  | medium | 2-3 modules/layers, 3-6 files, bounded API/interface changes, moderate dependency depth, 4-8 acceptance criteria, standard test updates | 3-5 API endpoints, 2-4 pages, normal integration work | lite (1 agent) |
125
125
  | high | 3+ modules/layers plus public API/interface or schema impact, deep dependencies, weak test coverage, complex state, third-party integration risk, or 8+ acceptance criteria | 5+ API endpoints, complex interactions, cross-cutting behavior | standard (3 agents) |
126
- | critical | System-wide architecture, new infrastructure, 10+ files with multi-module API surface changes, safety/security/data-loss risk requiring multi-critic review | System-wide refactoring, new infrastructure + app logic | full (5 agents + critic) |
126
+ | critical | System-wide architecture, new infrastructure, 10+ files with multi-module API surface changes, safety/security/data-loss risk requiring strongest review and test gates | System-wide refactoring, new infrastructure + app logic | full (5 agents + critic) |
127
127
 
128
128
  ### Complexity Indicator Checklist
129
129
 
@@ -152,7 +152,7 @@ Consider splitting a feature if it exhibits any of the following:
152
152
  - If a feature is marked as `low` complexity, it should not have more than 5 acceptance criteria and should have no public API/schema changes.
153
153
  - If a feature is marked as `medium` complexity, explain why the scope is bounded even if it touches multiple files.
154
154
  - If a feature is marked as `high` complexity, it must have a clear concrete justification (e.g., "payment processing with webhook idempotency across API, persistence, and worker modules").
155
- - Use `critical` complexity only for features requiring architectural changes that touch 10+ files, involve cross-module API surface changes, or need multi-critic voting for safety.
155
+ - Use `critical` complexity only for features requiring architectural changes that touch 10+ files, involve cross-module API surface changes, or need stronger review and test gates for safety.
156
156
  - When in doubt between two levels, choose the higher level only when the concrete scope indicators support it; do not use `high` as a safe default.
157
157
 
158
158
  ### Mixed Calibration Examples
@@ -335,17 +335,14 @@ def validate_feature_list(data, is_new_plan=True):
335
335
  # -- Sub-features --
336
336
  subs = feat.get("sub_features")
337
337
 
338
- # -- Critic fields (optional but validated if present) --
339
- critic = feat.get("critic")
340
- if critic is not None and not isinstance(critic, bool):
341
- errors.append(
342
- "{}: 'critic' must be a boolean, got {}".format(label, type(critic).__name__)
343
- )
344
- critic_count = feat.get("critic_count")
345
- if critic_count is not None and critic_count not in (1, 3):
346
- errors.append(
347
- "{}: 'critic_count' must be 1 or 3, got {}".format(label, critic_count)
348
- )
338
+ # -- Retired fields --
339
+ for retired_field in ("critic", "critic_count"):
340
+ if retired_field in feat:
341
+ errors.append(
342
+ "{}: '{}' field is retired; remove it from feature-list data".format(
343
+ label, retired_field
344
+ )
345
+ )
349
346
 
350
347
  # -- Browser interaction check (warning for frontend features) --
351
348
  has_frontend = bool(
@@ -96,7 +96,21 @@ Steps:
96
96
  - Polish tasks when needed
97
97
  - Checkpoint tasks between phases when integration risk exists
98
98
  3. Mark parallel tasks with `[P]` only when they can safely run independently.
99
- 4. Run the verification checklist from `${SKILL_DIR}/references/verification-checklist.md` and fix issues before output.
99
+ 4. Run the verification checklist from `${SKILL_DIR}/references/verification-checklist.md` and fix issues before the planning quality gate.
100
+
101
+ ### Phase 3: Plan/Spec Review Loop
102
+
103
+ Run this phase every time `spec.md` and `plan.md` are created or updated, before reporting the plan or handing off to implementation.
104
+
105
+ 1. Explicitly read `${SKILL_DIR}/references/review-plan-spec-loop.md`.
106
+ 2. Execute that guide against the current `spec.md` and `plan.md`.
107
+ 3. Apply all resolvable `BLOCKER` fixes and accepted `SHOULD_FIX` fixes directly to `spec.md` and/or `plan.md`.
108
+ 4. Treat `OPTIONAL` findings as non-blocking.
109
+ 5. Rerun the review once when fixes were applied, respecting the guide's maximum of 2 total rounds.
110
+ 6. If unresolved `BLOCKER` findings remain, stop and ask targeted clarification questions in interactive mode; in non-interactive mode, record the blocker and stop. Do not escalate to a Critic agent.
111
+ 7. Only proceed to `/prizmkit-implement` handoff after the loop has no unresolved blockers.
112
+
113
+ The review loop is planning-only. It must not start implementation, run tests/builds, launch a pipeline, create a separate skill, or require a Critic agent.
100
114
 
101
115
  ## Output
102
116
 
@@ -0,0 +1,101 @@
1
+ # Review Plan/Spec Loop
2
+
3
+ ## Purpose
4
+
5
+ Run this local planning-quality gate after `spec.md` and `plan.md` are drafted or updated, before handing off to `/prizmkit-implement`.
6
+
7
+ This is not a separate skill and it does not use a Critic agent. It is a bounded review loop executed inside `prizmkit-plan` to improve the planning artifacts only.
8
+
9
+ ## Non-Goals
10
+
11
+ Do not do any of the following from this guide:
12
+
13
+ - Start implementation or edit product/source code.
14
+ - Run tests, builds, lint, or package commands.
15
+ - Launch a feature, bugfix, or refactor pipeline.
16
+ - Spawn or require a Critic agent.
17
+ - Create a separate review-loop skill.
18
+ - Expand scope beyond improving `spec.md` and `plan.md`.
19
+
20
+ ## Required Inputs
21
+
22
+ - `spec.md` in the selected artifact directory.
23
+ - `plan.md` in the selected artifact directory.
24
+ - Relevant Prizm docs and source summaries already loaded by `prizmkit-plan`.
25
+
26
+ Use source reads sparingly. Prefer the context already loaded for planning. Read additional source only when a finding cannot be classified without confirming an existing interface, naming pattern, dependency, or constraint.
27
+
28
+ ## Review Dimensions
29
+
30
+ Review both artifacts against these dimensions:
31
+
32
+ | Dimension | Check |
33
+ |---|---|
34
+ | Ambiguity | Requirements, scope, terms, or expected behavior are unclear or internally inconsistent. |
35
+ | Acceptance criteria completeness | Each goal has verifiable acceptance criteria; edge/error cases are included when meaningful. |
36
+ | Missing constraints | Security, data, compatibility, performance, platform, deployment, migration, or non-goal constraints are absent where relevant. |
37
+ | Task ordering errors | Tasks are sequenced before their prerequisites, checkpoints are misplaced, or dependency order is unsafe. |
38
+ | Dependency assumptions | The plan assumes missing APIs, schemas, files, services, packages, auth, environment variables, or generated artifacts without evidence. |
39
+ | Scope drift | The plan adds unrelated work, backlog items, nice-to-haves, or implementation beyond the spec. |
40
+ | Overengineering | The plan introduces abstractions, services, agents, workflows, data stores, or cross-module rewrites that the spec does not justify. |
41
+ | Implementation readiness | Tasks are actionable, file-scoped when possible, testable, and resumable; blockers are explicit. |
42
+ | Source-reading overhead | The implementation plan avoids broad rereads and identifies the minimum context/files needed for execution. |
43
+
44
+ ## Finding Classification
45
+
46
+ Use exactly these classifications:
47
+
48
+ ### BLOCKER
49
+
50
+ A finding is `BLOCKER` when implementation would likely fail, produce the wrong behavior, or require user clarification before a safe plan exists.
51
+
52
+ Examples:
53
+ - Acceptance criteria contradict each other.
54
+ - A required interface/data model decision is unresolved.
55
+ - The task order starts implementation before required schema/context decisions.
56
+ - The plan includes scope that conflicts with explicit non-goals.
57
+
58
+ ### SHOULD_FIX
59
+
60
+ A finding is `SHOULD_FIX` when the artifact can be improved directly without changing user intent or requiring clarification.
61
+
62
+ Examples:
63
+ - Add missing acceptance criteria derived from the stated goal.
64
+ - Clarify a constraint already implied by the task context.
65
+ - Reorder dependent tasks.
66
+ - Remove an unjustified overengineered step.
67
+ - Add a minimal file/context note to reduce source-reading overhead.
68
+
69
+ ### OPTIONAL
70
+
71
+ A finding is `OPTIONAL` when it is a nice-to-have improvement that does not block implementation readiness.
72
+
73
+ Examples:
74
+ - Extra detail that could help but is not necessary.
75
+ - Alternative task grouping with no correctness impact.
76
+ - A lower-risk cleanup suggestion outside current scope.
77
+
78
+ Optional findings do not block handoff.
79
+
80
+ ## Loop Algorithm
81
+
82
+ 1. Read this guide, then review the current `spec.md` and `plan.md` together.
83
+ 2. Produce a concise internal finding list grouped by `BLOCKER`, `SHOULD_FIX`, and `OPTIONAL`.
84
+ 3. Apply fixes directly to `spec.md` and/or `plan.md` for:
85
+ - every `BLOCKER` that can be resolved from existing task context;
86
+ - every `SHOULD_FIX` that is accepted as aligned with the user's intent.
87
+ 4. Do not apply `OPTIONAL` findings unless they clearly improve readiness without expanding scope.
88
+ 5. If any fixes were applied, rerun this review once.
89
+ 6. Stop after at most 2 total review rounds.
90
+ 7. If unresolved `BLOCKER` findings remain after the final round, stop planning and ask targeted clarification questions. Do not escalate to a Critic agent.
91
+ 8. If no unresolved blockers remain, report that the planning quality gate passed and hand off to `/prizmkit-implement`.
92
+
93
+ ## Output Summary
94
+
95
+ At handoff, include a short summary:
96
+
97
+ - Review rounds run: `1` or `2`.
98
+ - Fixes applied to `spec.md`: short list or `none`.
99
+ - Fixes applied to `plan.md`: short list or `none`.
100
+ - Optional findings deferred: short list or `none`.
101
+ - Unresolved blockers: `none` before handoff.
@@ -166,12 +166,12 @@ Detect user intent from their message, then follow the corresponding workflow:
166
166
  - Off — Skip post-task test verification (faster but riskier)
167
167
 
168
168
  **Question 4 — Advanced config?** (multiSelect: false):
169
- - No (default) — Use defaults for critic review and failure behavior
170
- - Yes — Configure critic review, stop-on-failure, and reasoning effort options
169
+ - No (default) — Use defaults for failure behavior
170
+ - Yes — Configure stop-on-failure, deploy-after-completion, and reasoning effort options
171
171
 
172
172
  Note: Refactor filter defaults to all refactor items. Runtime selects eligible refactors in stable list order after dependencies are completed; planners should order unrelated refactors by user priority before launch. If the user selects "Other" on any option, handle their custom input.
173
173
 
174
- **If user chose "Yes" to Advanced config**, run the advanced configuration round (a second `AskUserQuestion` round, plus a reasoning-effort follow-up). It applies to a minority of sessions, so the full question set lives in `${SKILL_DIR}/references/configuration.md` → **Advanced Configuration Round**. Default Critic to Off unless refactor items have `priority: "critical"` (in which case default to On).
174
+ **If user chose "Yes" to Advanced config**, run the advanced configuration round (a second `AskUserQuestion` round, plus a reasoning-effort follow-up). It applies to a minority of sessions, so the full question set lives in `${SKILL_DIR}/references/configuration.md` → **Advanced Configuration Round**.
175
175
 
176
176
  Read `${SKILL_DIR}/references/configuration.md` for the current environment-variable mapping and advanced environment-variable tables.
177
177
 
@@ -184,7 +184,7 @@ Detect user intent from their message, then follow the corresponding workflow:
184
184
  ```
185
185
  Selected-options example:
186
186
  ```bash
187
- VERBOSE=1 STRICT_BEHAVIOR_CHECK=1 ENABLE_CRITIC=true MAX_RETRIES=5 STOP_ON_FAILURE=1 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
187
+ VERBOSE=1 STRICT_BEHAVIOR_CHECK=1 MAX_RETRIES=5 STOP_ON_FAILURE=1 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
188
188
  python3 ./.prizmkit/dev-pipeline/cli.py refactor run .prizmkit/plans/refactor-list.json
189
189
  ```
190
190
 
@@ -195,7 +195,7 @@ Detect user intent from their message, then follow the corresponding workflow:
195
195
  Selected-options example:
196
196
  ```bash
197
197
  python3 ./.prizmkit/dev-pipeline/cli.py daemon refactor start .prizmkit/plans/refactor-list.json \
198
- --env "VERBOSE=1 STRICT_BEHAVIOR_CHECK=1 ENABLE_CRITIC=true MAX_RETRIES=5 STOP_ON_FAILURE=1 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high"
198
+ --env "VERBOSE=1 STRICT_BEHAVIOR_CHECK=1 MAX_RETRIES=5 STOP_ON_FAILURE=1 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high"
199
199
  ```
200
200
 
201
201
  **Manual mode**: Print the assembled command(s) and **stop here**. Do not execute anything. Do not proceed to step 8.
@@ -13,7 +13,6 @@ Translating user responses to env vars:
13
13
  | Max retries: N | `MAX_RETRIES=N` |
14
14
  | Strict behavior: On | `STRICT_BEHAVIOR_CHECK=1` |
15
15
  | Strict behavior: Off | `STRICT_BEHAVIOR_CHECK=0` |
16
- | Critic: On | `ENABLE_CRITIC=true` |
17
16
  | Stop on failure: On | `STOP_ON_FAILURE=1` |
18
17
  | Deploy: Yes | `ENABLE_DEPLOY=1` |
19
18
  | Effort: value | `PRIZMKIT_EFFORT=<value>` |
@@ -54,17 +53,13 @@ Not exposed in interactive menu, pass via `--env`:
54
53
 
55
54
  Only run this when the user answered "Yes" to the **Advanced config?** question in step 6. It applies to a minority of sessions.
56
55
 
57
- Ask a second round of `AskUserQuestion` with these 3 questions:
56
+ Ask a second round of `AskUserQuestion` with these 2 questions:
58
57
 
59
58
  **Question 1 — Stop on failure** (multiSelect: false):
60
59
  - Off (default) — Pipeline continues to next task after failure
61
60
  - On — Pipeline halts immediately when a task exhausts all retries (`STOP_ON_FAILURE=1`)
62
61
 
63
- **Question 2 — Critic review** (multiSelect: false):
64
- - Off (default) — Skip adversarial review
65
- - On — Enable adversarial critic review: an independent AI agent reviews the refactor plan for completeness and the implementation for regressions, missed edge cases, and behavior violations. Adds ~5-10 min per refactor task.
66
-
67
- **Question 3 — Deploy after completion?** (multiSelect: false):
62
+ **Question 2 — Deploy after completion?** (multiSelect: false):
68
63
  - No (default) — Skip deployment after pipeline completes
69
64
  - Yes — Run /prizmkit-deploy automatically after all refactors complete successfully (`ENABLE_DEPLOY=1`). Deployment is blocked if any refactor did not complete successfully (status not 'completed' or manually 'skipped').
70
65
 
@@ -320,16 +320,18 @@ Run this gate **after** `.prizmkit/plans/refactor-list.json` passes the validati
320
320
  - `model` field is optional — omitting it means the pipeline uses $MODEL env or CLI default
321
321
  - `scope` object with nested structure: `files` array (target file paths) and `modules` array (module names)
322
322
 
323
- ## Adversarial Critic Defaults
323
+ ## Verification Defaults
324
324
 
325
- Set default critic fields for each refactor item. The user can override per-item.
325
+ Set behavior-preservation and testing expectations for each refactor item. Do not generate retired review-agent configuration fields.
326
326
 
327
- | Priority | Complexity | `critic` | `critic_count` |
328
- |----------|-----------|----------|----------------|
329
- | critical | high | `true` | `3` |
330
- | critical | medium/low | `true` | `1` |
331
- | high | high | `true` | `1` |
332
- | other combinations | any | `false` | (omitted) |
327
+ | Priority | Complexity | Verification expectation |
328
+ |----------|-----------|--------------------------|
329
+ | critical | high | Strong behavior-preservation evidence plus scoped tests and review gate |
330
+ | critical | medium/low | Focused behavior-preservation evidence plus review gate |
331
+ | high | high | Scoped tests for changed boundaries plus review gate |
332
+ | other combinations | any | Smallest meaningful behavior-preservation check |
333
+
334
+ Never emit `critic` or `critic_count`; those fields are fully removed and validators reject them.
333
335
 
334
336
  ---
335
337
 
@@ -246,6 +246,15 @@ def validate_refactor_list(data):
246
246
  )
247
247
  )
248
248
 
249
+ # -- Retired fields --
250
+ for retired_field in ("critic", "critic_count"):
251
+ if retired_field in refactor:
252
+ errors.append(
253
+ "{}: '{}' field is retired; remove it from refactor-list data".format(
254
+ label, retired_field
255
+ )
256
+ )
257
+
249
258
  # -- Scope --
250
259
  scope = refactor.get("scope")
251
260
  if isinstance(scope, dict):