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
@@ -12,7 +12,7 @@ Usage:
12
12
 
13
13
  Exit codes:
14
14
  0 = success
15
- 1 = validation error (step not found, invalid status, etc.)
15
+ 1 = validation error (step not found, invalid status, ambiguous skill, etc.)
16
16
  2 = file error (not found, corrupted JSON)
17
17
 
18
18
  Output (stdout): JSON with {ok: true, step_id, skill, old_status, new_status} or {ok: false, error}
@@ -24,13 +24,27 @@ import os
24
24
  import sys
25
25
  import tempfile
26
26
 
27
- VALID_STATUSES = {"pending", "in_progress", "completed", "skipped", "failed"}
27
+ _PIPELINE_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
28
+ if _PIPELINE_ROOT not in sys.path:
29
+ sys.path.insert(0, _PIPELINE_ROOT)
30
+
31
+ from prizmkit_runtime.checkpoint_state import ( # noqa: E402
32
+ STEP_ID_PATTERN,
33
+ VALID_CHECKPOINT_STATUSES,
34
+ load_checkpoint_state,
35
+ )
36
+
37
+ VALID_STATUSES = VALID_CHECKPOINT_STATUSES
28
38
 
29
39
 
30
40
  def _load_checkpoint(path):
31
- """Load checkpoint JSON. Returns (data, error_string)."""
32
- if not os.path.isfile(path):
33
- return None, "File not found: {}".format(path)
41
+ """Load checkpoint JSON after shared structural validation."""
42
+ state = load_checkpoint_state(path)
43
+ if not state.valid:
44
+ return None, "Invalid checkpoint ({}): {}".format(
45
+ state.error_code,
46
+ state.error_message,
47
+ )
34
48
  try:
35
49
  with open(path, "r", encoding="utf-8") as f:
36
50
  data = json.load(f)
@@ -38,9 +52,6 @@ def _load_checkpoint(path):
38
52
  return None, "Corrupted JSON: {}".format(e)
39
53
  except IOError as e:
40
54
  return None, "Cannot read file: {}".format(e)
41
-
42
- if "steps" not in data or not isinstance(data["steps"], list):
43
- return None, "Invalid checkpoint: missing 'steps' array"
44
55
  return data, None
45
56
 
46
57
 
@@ -60,7 +71,6 @@ def _write_checkpoint(path, data):
60
71
  f.write("\n")
61
72
  os.replace(tmp_path, os.path.abspath(path))
62
73
  except (IOError, OSError) as e:
63
- # Clean up temp file on error
64
74
  if tmp_path is not None and os.path.exists(tmp_path):
65
75
  os.unlink(tmp_path)
66
76
  return "Cannot write file: {}".format(e)
@@ -68,14 +78,29 @@ def _write_checkpoint(path, data):
68
78
 
69
79
 
70
80
  def _find_step(steps, identifier):
71
- """Find a step by skill name or step ID.
72
-
73
- Returns (index, step_dict) or (None, None).
74
- """
75
- for i, step in enumerate(steps):
76
- if step.get("skill") == identifier or step.get("id") == identifier:
77
- return i, step
78
- return None, None
81
+ """Find a step by exact ID or unambiguous skill name."""
82
+ if STEP_ID_PATTERN.match(identifier):
83
+ for i, step in enumerate(steps):
84
+ if step.get("id") == identifier:
85
+ return i, step, None
86
+ return None, None, "Step '{}' not found.".format(identifier)
87
+
88
+ matches = [
89
+ (i, step)
90
+ for i, step in enumerate(steps)
91
+ if step.get("skill") == identifier
92
+ ]
93
+ if len(matches) == 1:
94
+ index, step = matches[0]
95
+ return index, step, None
96
+ if len(matches) > 1:
97
+ ids = [str(step.get("id")) for _index, step in matches]
98
+ example = ids[0] if ids else "SNN"
99
+ return None, None, (
100
+ "Step '{}' matches multiple checkpoint steps ({}). "
101
+ "Use an explicit step ID such as {}."
102
+ ).format(identifier, ", ".join(ids), example)
103
+ return None, None, "Step '{}' not found.".format(identifier)
79
104
 
80
105
 
81
106
  def update_checkpoint(checkpoint_path, step_identifier, new_status, note=None):
@@ -95,17 +120,16 @@ def update_checkpoint(checkpoint_path, step_identifier, new_status, note=None):
95
120
  if err:
96
121
  return {"ok": False, "error": err}
97
122
 
98
- idx, step = _find_step(data["steps"], step_identifier)
123
+ idx, step, find_error = _find_step(data["steps"], step_identifier)
99
124
  if step is None:
100
125
  available = [
101
126
  "{} ({})".format(s.get("id", "?"), s.get("skill", "?"))
102
127
  for s in data["steps"]
103
128
  ]
129
+ suffix = " Available: {}".format(", ".join(available)) if available else ""
104
130
  return {
105
131
  "ok": False,
106
- "error": "Step '{}' not found. Available: {}".format(
107
- step_identifier, ", ".join(available)
108
- ),
132
+ "error": "{}{}".format(find_error or "Step not found.", suffix),
109
133
  }
110
134
 
111
135
  old_status = step.get("status", "unknown")
@@ -166,7 +190,15 @@ def main():
166
190
  args.checkpoint_path, args.step, args.status, args.note
167
191
  )
168
192
  print(json.dumps(result, indent=2, ensure_ascii=False))
169
- return 0 if result.get("ok") else (2 if "File not found" in result.get("error", "") or "Corrupted" in result.get("error", "") else 1)
193
+ error = result.get("error", "")
194
+ file_error = (
195
+ error.startswith("Invalid checkpoint (missing)")
196
+ or error.startswith("Invalid checkpoint (malformed_json)")
197
+ or error.startswith("Invalid checkpoint (read_error)")
198
+ or error.startswith("Corrupted JSON")
199
+ or error.startswith("Cannot read file")
200
+ )
201
+ return 0 if result.get("ok") else (2 if file_error else 1)
170
202
 
171
203
 
172
204
  if __name__ == "__main__":
@@ -337,11 +337,8 @@ def _read_feature_checkpoint_phase(project_root, feature_slug):
337
337
 
338
338
 
339
339
  def _checkpoint_phase_or_cached(project_root, feature_slug, status_data):
340
- """Return live checkpoint phase, falling back to cached status data."""
341
- checkpoint_phase = _read_feature_checkpoint_phase(project_root, feature_slug)
342
- if checkpoint_phase is not None:
343
- return checkpoint_phase
344
- return status_data.get("resume_from_phase")
340
+ """Return live checkpoint phase from the authoritative checkpoint only."""
341
+ return _read_feature_checkpoint_phase(project_root, feature_slug)
345
342
 
346
343
 
347
344
  def _sync_checkpoint_phase(project_root, feature_slug, status_data):
@@ -1263,8 +1260,7 @@ def action_status(feature_list_data, state_dir, feature_filter=None, project_roo
1263
1260
  fstatus = feature.get("status", "pending")
1264
1261
  fs = load_feature_status(state_dir, fid)
1265
1262
  feature_slug = _build_feature_slug(fid, title)
1266
- # Read phase cursor from checkpoint (single source of truth). The
1267
- # status.json field is only a cache/fallback for missing checkpoints.
1263
+ # Read phase cursor from checkpoint (authoritative when valid).
1268
1264
  resume_phase = _checkpoint_phase_or_cached(project_root, feature_slug, fs)
1269
1265
  if resume_phase != fs.get("resume_from_phase"):
1270
1266
  fs["resume_from_phase"] = resume_phase
@@ -231,11 +231,8 @@ def _read_refactor_checkpoint_phase(project_root, refactor_id):
231
231
 
232
232
 
233
233
  def _checkpoint_phase_or_cached(project_root, refactor_id, status_data):
234
- """Return live checkpoint phase, falling back to cached status data."""
235
- checkpoint_phase = _read_refactor_checkpoint_phase(project_root, refactor_id)
236
- if checkpoint_phase is not None:
237
- return checkpoint_phase
238
- return status_data.get("resume_from_phase")
234
+ """Return live checkpoint phase from the authoritative checkpoint only."""
235
+ return _read_refactor_checkpoint_phase(project_root, refactor_id)
239
236
 
240
237
 
241
238
  def _sync_checkpoint_phase(project_root, refactor_id, status_data):
@@ -885,8 +882,7 @@ def action_status(refactor_list_data, state_dir, project_root=None):
885
882
  rs = load_refactor_status(state_dir, rid)
886
883
  retry_count = rs.get("retry_count", 0)
887
884
  max_retries_val = rs.get("max_retries", 3)
888
- # Read phase cursor from checkpoint (single source of truth). The
889
- # status.json field is only a cache/fallback for missing checkpoints.
885
+ # Read phase cursor from checkpoint (authoritative when valid).
890
886
  resume_phase = _checkpoint_phase_or_cached(project_root, rid, rs)
891
887
  if resume_phase != rs.get("resume_from_phase"):
892
888
  rs["resume_from_phase"] = resume_phase
@@ -16,6 +16,10 @@ _PIPELINE_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
16
16
  if _PIPELINE_ROOT not in sys.path:
17
17
  sys.path.insert(0, _PIPELINE_ROOT)
18
18
 
19
+ from prizmkit_runtime.checkpoint_state import ( # noqa: E402
20
+ read_checkpoint_cursor as shared_read_checkpoint_cursor,
21
+ )
22
+
19
23
 
20
24
  def shell_quote(value):
21
25
  """Return a shell-safe token for prompt command examples."""
@@ -773,40 +777,5 @@ def read_platform_conventions(project_root):
773
777
 
774
778
 
775
779
  def read_checkpoint_cursor(checkpoint_path):
776
- """Read the phase cursor from a workflow-checkpoint.json file.
777
-
778
- Returns the first non-completed/skipped step's step index (e.g., 3 for S03).
779
- If every step is completed or skipped, returns the last completed/skipped
780
- step index. Returns None if the file does not exist or is unreadable.
781
-
782
- The cursor is what gets displayed as "CP-BF-<n>" in the terminal status.
783
- """
784
- if not os.path.isfile(checkpoint_path):
785
- return None
786
- try:
787
- with open(checkpoint_path, "r", encoding="utf-8") as f:
788
- data = json.load(f)
789
- except (json.JSONDecodeError, IOError):
790
- return None
791
- if not isinstance(data, dict):
792
- return None
793
- steps = data.get("steps")
794
- if not isinstance(steps, list):
795
- return None
796
- last_completed = 0
797
- for step in steps:
798
- if not isinstance(step, dict):
799
- continue
800
- status = step.get("status", "pending")
801
- sid = step.get("id", "")
802
- try:
803
- step_num = int(sid.lstrip("S"))
804
- except (ValueError, AttributeError):
805
- continue
806
- if status in ("completed", "skipped"):
807
- last_completed = max(last_completed, step_num)
808
- else:
809
- # Return the first non-completed step's number
810
- return step_num
811
- # All steps are completed — return the last step number
812
- return last_completed if last_completed > 0 else None
780
+ """Read the phase cursor from a valid workflow-checkpoint.json file."""
781
+ return shared_read_checkpoint_cursor(checkpoint_path)
@@ -44,7 +44,7 @@ Infer what needs to be done from the feature context above and follow the standa
44
44
  - Do NOT push to remote — the user will push manually.
45
45
  - Write all artifacts to `.prizmkit/specs/{{FEATURE_SLUG}}/`.
46
46
  - If a step fails after 3 attempts, write a status report and stop.
47
- - **Never re-read unmodified files**: once you read a file into context, do NOT read it again unless it was modified by an Edit/Write after your last read — use `grep -n`/`sed -n` for specific lines. Before issuing a Read, ask: "Have I read this file before, and has it changed since?" If no — do NOT read it. Subagents (Critic, Reviewer) must rely on context-snapshot.md rather than re-reading files the orchestrator already read.
47
+ - **Never re-read unmodified files**: once you read a file into context, do NOT read it again unless it was modified by an Edit/Write after your last read — use `grep -n`/`sed -n` for specific lines. Before issuing a Read, ask: "Have I read this file before, and has it changed since?" If no — do NOT read it. Reviewer subagents must rely on context-snapshot.md rather than re-reading files the orchestrator already read.
48
48
  - **Read offset safety**: if Read returns "shorter than offset"/"empty" — run `wc -l` then `sed -n`, do NOT retry same offset.
49
49
  - **Hard Round Cap**: after 6 total test-fix rounds, STOP trial-and-error. Switch to read-once-then-rewrite. Do NOT exceed 7 rounds.
50
50
  - **Layered test**: debug with single-file tests, only run full suite as gate when single-file is green.
@@ -46,7 +46,7 @@ You are running in **headless non-interactive mode** with a FINITE context windo
46
46
 
47
47
  1. **context-snapshot.md is your single source of truth** — After Phase 1 builds it, ALWAYS read context-snapshot.md instead of re-reading individual source files
48
48
  2. **Never re-read your own writes** — After you create/modify a file, do NOT read it back to verify. Trust your write was correct.
49
- 3. **Never re-read unmodified files** — Once you have read a file into context, do NOT read it again unless it was modified by an Edit/Write operation after your last read. Use platform file/search tools for targeted lookup; when shell-free helper lookup is needed, run `{{RUNTIME_HELPER_CMD}} text search <file> --pattern "<pattern>" --json`, then read only the smallest bounded range with the platform file-reading tool instead of full-file Read. Before issuing a Read, ask yourself: "Have I read this file before, and has it changed since?" If the answer is "no, it hasn't changed" — do NOT read it. This applies to all files including those summarized in context-snapshot.md Section 4. Subagents (Critic, Reviewer) must receive context-snapshot.md and rely on it rather than independently re-reading the same files the orchestrator already read.
49
+ 3. **Never re-read unmodified files** — Once you have read a file into context, do NOT read it again unless it was modified by an Edit/Write operation after your last read. Use platform file/search tools for targeted lookup; when shell-free helper lookup is needed, run `{{RUNTIME_HELPER_CMD}} text search <file> --pattern "<pattern>" --json`, then read only the smallest bounded range with the platform file-reading tool instead of full-file Read. Before issuing a Read, ask yourself: "Have I read this file before, and has it changed since?" If the answer is "no, it hasn't changed" — do NOT read it. This applies to all files including those summarized in context-snapshot.md Section 4. Reviewer subagents must receive context-snapshot.md and rely on it rather than independently re-reading the same files the orchestrator already read.
50
50
  4. **Stay focused** — Do NOT explore code unrelated to this feature. No curiosity-driven reads.
51
51
  4. **One task at a time** — In Phase 3 (implement), complete and test one task before starting the next.
52
52
  5. **Minimize tool output** — Never load full command output into context. First capture command output to a temp file using the command/tool output option or the host-appropriate redirection, then inspect only the final relevant lines and use targeted search helpers to extract the information needed for the current task. Only read the filtered result — never the raw full output.
@@ -1,4 +1,4 @@
1
- # Dev-Pipeline Session Bootstrap — Tier 2 (Orchestrator + Critic/Reviewer)
1
+ # Dev-Pipeline Session Bootstrap — Tier 2 (Orchestrator + Reviewer)
2
2
 
3
3
  ## Session Context
4
4
 
@@ -10,12 +10,12 @@
10
10
 
11
11
  You are the **session orchestrator**. Implement Feature {{FEATURE_ID}}: "{{FEATURE_TITLE}}".
12
12
 
13
- **CRITICAL**: You MUST NOT exit until ALL work is complete and committed. When you spawn Critic or Reviewer agents, wait for each to finish (run_in_background=false).
13
+ **CRITICAL**: You MUST NOT exit until ALL work is complete and committed. When you spawn Reviewer agents, wait for each to finish (run_in_background=false).
14
14
 
15
- **Tier 2 — Orchestrator + Critic**: You handle context, planning, and implementation directly. Critic challenges the plan when enabled. Do not spawn top-level Dev or Reviewer subagents; code review runs later through `/prizmkit-code-review`.
15
+ **Tier 2 — Orchestrator + Reviewer**: You handle context, planning, and implementation directly. Do not spawn top-level Dev or Reviewer subagents; code review runs later through `/prizmkit-code-review`.
16
16
 
17
17
  **Agent spawn failure policy (all Agent tool calls)**:
18
- - If spawning Reviewer or Critic fails with team/config/lock errors, retry at most once.
18
+ - If spawning Reviewer fails with team/config/lock errors, retry at most once.
19
19
  - If the second attempt fails, do not keep spawning variants and do not enter artifact polling for Implementation Log, challenge report, or review report markers.
20
20
  - Use the documented inline/recovery fallback for that phase: write the required report yourself where possible, complete remaining work directly in the orchestrator when safe, or write `failure-log.md` with the spawn error and last observable state before stopping for recovery.
21
21
  - Apply the same cap to any re-spawn for report repair or resume prompts; do not burn multiple minutes on identical team/config/lock failures.
@@ -52,7 +52,7 @@ You are running in **headless non-interactive mode** with a FINITE context windo
52
52
 
53
53
  1. **context-snapshot.md is your single source of truth** — After Phase 1 builds it, ALWAYS read context-snapshot.md instead of re-reading individual source files
54
54
  2. **Never re-read your own writes** — After you create/modify a file, do NOT read it back to verify. Trust your write was correct.
55
- 3. **Never re-read unmodified files** — Once you have read a file into context, do NOT read it again unless it was modified by an Edit/Write operation after your last read. Use platform file/search tools for targeted lookup; when shell-free helper lookup is needed, run `{{RUNTIME_HELPER_CMD}} text search <file> --pattern "<pattern>" --json`, then read only the smallest bounded range with the platform file-reading tool instead of full-file Read. Before issuing a Read, ask yourself: "Have I read this file before, and has it changed since?" If the answer is "no, it hasn't changed" — do NOT read it. This applies to all files including those summarized in context-snapshot.md Section 4. Subagents (Critic, Reviewer) must receive context-snapshot.md and rely on it rather than independently re-reading the same files the orchestrator already read.
55
+ 3. **Never re-read unmodified files** — Once you have read a file into context, do NOT read it again unless it was modified by an Edit/Write operation after your last read. Use platform file/search tools for targeted lookup; when shell-free helper lookup is needed, run `{{RUNTIME_HELPER_CMD}} text search <file> --pattern "<pattern>" --json`, then read only the smallest bounded range with the platform file-reading tool instead of full-file Read. Before issuing a Read, ask yourself: "Have I read this file before, and has it changed since?" If the answer is "no, it hasn't changed" — do NOT read it. This applies to all files including those summarized in context-snapshot.md Section 4. Reviewer subagents must receive context-snapshot.md and rely on it rather than independently re-reading the same files the orchestrator already read.
56
56
  4. **Stay focused** — Do NOT explore code unrelated to this feature. No curiosity-driven reads.
57
57
  4. **One task at a time** — In Phase 4 (implement), complete and test one task before starting the next.
58
58
  5. **Minimize tool output** — Never load full command output into context. First capture command output to a temp file using the command/tool output option or the host-appropriate redirection, then inspect only the final relevant lines and use targeted search helpers to extract the information needed for the current task. Only read the filtered result — never the raw full output.
@@ -171,85 +171,6 @@ Do not spawn a top-level Reviewer subagent for planning analysis. Perform a boun
171
171
 
172
172
  **CP-2**: Plan self-check complete; no CRITICAL plan issues remain.
173
173
 
174
- {{IF_CRITIC_ENABLED}}
175
- ### Phase 3.5: Plan Challenge — Critic Agent(s)
176
-
177
- **Guard**: Verify critic agent file exists before spawning:
178
- ```bash
179
- {{RUNTIME_HELPER_CMD}} artifact exists {{CRITIC_SUBAGENT_PATH}} --exists-marker CRITIC:READY --missing-marker CRITIC:MISSING
180
- ```
181
- If CRITIC:MISSING — skip Phase 3.5 entirely and proceed to Phase 4. Log: "Critic agent not installed — skipping Plan Challenge."
182
-
183
- **Choose ONE path based on `{{CRITIC_COUNT}}`:**
184
-
185
- **If {{CRITIC_COUNT}} = 1 → Single Critic** (skip to CP-2.5 after this):
186
-
187
- Spawn Critic agent (Agent tool, subagent_type="prizm-dev-team-critic", mode="plan", run_in_background=false, isolation=default/no worktree). Do not request worktree isolation; this prevents AI tool-created `.claude/worktrees/...` subagent worktrees. PrizmKit pipeline-managed linked git worktrees under `.prizmkit/state/worktrees/...` are separate and controlled by `USE_WORKTREE`.
188
-
189
- Spawn failure cap: for team/config/lock errors, retry at most once for this Critic spawn. If the second attempt fails, do not poll for challenge reports; perform the plan challenge inline and record the fallback.
190
-
191
- Prompt:
192
- > "Read {{CRITIC_SUBAGENT_PATH}}. For feature {{FEATURE_ID}} (slug: {{FEATURE_SLUG}}):
193
- > **MODE: Plan Challenge**
194
- > 1. Read `.prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md` FIRST — Section 3 has project context, Section 4 has file manifest.
195
- > 2. Use context-snapshot.md as the shared source of truth. Do not create or enter AI tool-created `.claude/worktrees/...` subagent worktrees; use default/no worktree isolation and do not request worktree isolation.
196
- > 3. PrizmKit pipeline-managed linked git worktrees under `.prizmkit/state/worktrees/...` are a separate runner feature controlled by `USE_WORKTREE`; do not confuse them with AI tool-created `.claude/worktrees/...`.
197
- > 4. Read additional `.prizmkit/prizm-docs/` or source excerpts only when needed to verify a specific challenge.
198
- > 5. Challenge plan.md against the project's existing architecture, patterns, and style.
199
- > Write `.prizmkit/specs/{{FEATURE_SLUG}}/challenge-report.md` with findings (or 'No significant challenges')."
200
-
201
- Wait for Critic to return.
202
- - Read challenge-report.md. For items marked CRITICAL/HIGH: decide whether to adjust plan.md or document why the plan stands.
203
- - Max 1 plan revision round.
204
-
205
- **If {{CRITIC_COUNT}} = 3 → Multi-Critic Voting** (skip Single Critic above):
206
-
207
- **IMPORTANT**: Spawn all 3 Critics in PARALLEL (issue all 3 Agent tool calls in the SAME message turn). Do NOT wait for one before spawning the next.
208
-
209
- Spawn Critic-A, Critic-B, Critic-C simultaneously (each with mode="plan", run_in_background=false, isolation=default/no worktree). Do not request worktree isolation; this prevents AI tool-created `.claude/worktrees/...` subagent worktrees. PrizmKit pipeline-managed linked git worktrees under `.prizmkit/state/worktrees/...` are separate and controlled by `USE_WORKTREE`:
210
-
211
- Critic-A prompt:
212
- > "Read {{CRITIC_SUBAGENT_PATH}}. For feature {{FEATURE_ID}} (slug: {{FEATURE_SLUG}}):
213
- > **MODE: Plan Challenge — Lens: Architecture & Scalability**
214
- > Focus on: architectural pattern fit, scalability implications, over-engineering risks, component boundary design.
215
- > 1. Read `.prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md` FIRST — Section 3 has TRAPS/RULES, Section 4 has file manifest.
216
- > 2. Use context-snapshot.md as the shared source of truth. Do not create or enter AI tool-created `.claude/worktrees/...` subagent worktrees; use default/no worktree isolation and do not request worktree isolation.
217
- > 3. PrizmKit pipeline-managed linked git worktrees under `.prizmkit/state/worktrees/...` are a separate runner feature controlled by `USE_WORKTREE`; do not confuse them with AI tool-created `.claude/worktrees/...`.
218
- > 4. Read additional `.prizmkit/prizm-docs/` or source excerpts only when needed to verify a specific challenge.
219
- > 4. Challenge plan.md through your architecture lens.
220
- > Write `.prizmkit/specs/{{FEATURE_SLUG}}/challenge-report-A.md`."
221
-
222
- Critic-B prompt:
223
- > "Read {{CRITIC_SUBAGENT_PATH}}. For feature {{FEATURE_ID}} (slug: {{FEATURE_SLUG}}):
224
- > **MODE: Plan Challenge — Lens: Data Model & Edge Cases**
225
- > Focus on: data model design fit, entity relationships, edge cases in business logic, missing boundary conditions.
226
- > 1. Read `.prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md` FIRST — Section 3 has TRAPS/RULES, Section 4 has file manifest.
227
- > 2. Use context-snapshot.md as the shared source of truth. Do not create or enter AI tool-created `.claude/worktrees/...` subagent worktrees; use default/no worktree isolation and do not request worktree isolation.
228
- > 3. PrizmKit pipeline-managed linked git worktrees under `.prizmkit/state/worktrees/...` are a separate runner feature controlled by `USE_WORKTREE`; do not confuse them with AI tool-created `.claude/worktrees/...`.
229
- > 4. Read additional `.prizmkit/prizm-docs/` or source excerpts only when needed to verify a specific challenge.
230
- > 4. Challenge plan.md through your data/edge-case lens.
231
- > Write `.prizmkit/specs/{{FEATURE_SLUG}}/challenge-report-B.md`."
232
-
233
- Critic-C prompt:
234
- > "Read {{CRITIC_SUBAGENT_PATH}}. For feature {{FEATURE_ID}} (slug: {{FEATURE_SLUG}}):
235
- > **MODE: Plan Challenge — Lens: Security & Performance**
236
- > Focus on: security attack surface, authentication/authorization gaps, performance bottlenecks, resource leaks.
237
- > 1. Read `.prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md` FIRST — Section 3 has TRAPS/RULES, Section 4 has file manifest.
238
- > 2. Use context-snapshot.md as the shared source of truth. Do not create or enter AI tool-created `.claude/worktrees/...` subagent worktrees; use default/no worktree isolation and do not request worktree isolation.
239
- > 3. PrizmKit pipeline-managed linked git worktrees under `.prizmkit/state/worktrees/...` are a separate runner feature controlled by `USE_WORKTREE`; do not confuse them with AI tool-created `.claude/worktrees/...`.
240
- > 4. Read additional `.prizmkit/prizm-docs/` or source excerpts only when needed to verify a specific challenge.
241
- > 4. Challenge plan.md through your security/performance lens.
242
- > Write `.prizmkit/specs/{{FEATURE_SLUG}}/challenge-report-C.md`."
243
-
244
- Spawn failure cap: for team/config/lock errors, each Critic retries at most once. If 2 or more Critics fail to spawn after retry, perform the plan challenge inline and record the fallback.
245
-
246
- After all critics return, read all 3 reports:
247
- - Challenge raised by **2/3 or more** critics → **must respond** (adjust plan or justify why not)
248
- - Challenge raised by **1/3 only** → logged in context-snapshot but not blocking
249
- - Max 1 plan revision round.
250
-
251
- **CP-2.5**: Plan challenges reviewed and resolved.
252
- {{END_IF_CRITIC_ENABLED}}
253
174
 
254
175
  ### Implement — Orchestrator Direct (no Dev subagent)
255
176
 
@@ -270,7 +191,7 @@ Before starting, check plan.md Tasks:
270
191
  - Implements task-by-task, marking each `[x]` immediately
271
192
  - Creates/updates L2 `.prizm` docs when creating new modules
272
193
  - Defers scoped/full test execution until after the code-review loop completes
273
- - Preserves Reviewer/Critic behavior; only the top-level implementation Dev handoff is removed
194
+ - Preserves Reviewer behavior; only the top-level implementation Dev handoff is removed
274
195
  - If plan.md has >5 tasks: update checkpoints after every 3 tasks
275
196
 
276
197
  **3b. Focused checks only (no test gate here)**:
@@ -300,7 +221,7 @@ For each Verification Gate from the Task Contract, write one evidence line to Im
300
221
 
301
222
  Review the completed implementation before the scoped feature test gate runs. Use `artifact_dir=.prizmkit/specs/{{FEATURE_SLUG}}/` so the code-review skill can read spec, plan, context snapshot, implementation log, and current diff artifacts. Do not require or read a prior `/prizmkit-test` report here; test generation and test-fix looping happen in the next phase.
302
223
 
303
- Run `/prizmkit-code-review` with `artifact_dir=.prizmkit/specs/{{FEATURE_SLUG}}/`.
224
+ Run `/prizmkit-code-review` with `artifact_dir=.prizmkit/specs/{{FEATURE_SLUG}}/`. The code-review skill must launch Reviewer in `current-workspace / active-checkout / no-worktree` mode so it reviews the active checkout rather than an isolated copy; do not request worktree isolation or use `.claude/worktrees/...` / `.prizmkit/state/worktrees/...`. Do not set `USE_WORKTREE` for reviewer launches.
304
225
 
305
226
  The skill runs an internal review-fix loop (Reviewer Agent → filter → orchestrator fix, max 3 rounds) and writes `review-report.md` to the artifact directory.
306
227
 
@@ -554,9 +475,6 @@ Rules for writing completion notes:
554
475
  |----------|------|
555
476
  | Feature Artifacts Dir | `.prizmkit/specs/{{FEATURE_SLUG}}/` |
556
477
  | Context Snapshot | `.prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md` |
557
- {{IF_CRITIC_ENABLED}}
558
- | Critic Agent Def | {{CRITIC_SUBAGENT_PATH}} |
559
- {{END_IF_CRITIC_ENABLED}}
560
478
  | Project Root | {{PROJECT_ROOT}} |
561
479
 
562
480
  ## Failure Capture Protocol
@@ -578,11 +496,11 @@ If you encounter an unrecoverable error, context overflow, or are about to exit
578
496
 
579
497
  ## Reminders
580
498
 
581
- - Tier 2: orchestrator builds context+plan and implements directly; Critic challenges plan when enabled; `/prizmkit-code-review` handles review later
499
+ - Tier 2: orchestrator builds context+plan and implements directly; `/prizmkit-code-review` handles review later
582
500
  - Build context-snapshot.md FIRST; use it throughout instead of re-reading source files
583
501
  - context-snapshot.md is append-only: orchestrator writes Sections 1-4 + Implementation Log, Reviewer appends Review Notes
584
502
  - Gate checks enforce Implementation Log and Review Notes are written before proceeding
585
- - Do NOT use `run_in_background=true` when spawning Critic agents
503
+ - Do NOT use `run_in_background=true` when spawning Reviewer agents
586
504
  - **NEVER delete, modify, or touch any file under `.prizmkit/state/`** — those are pipeline runtime files managed by the runner
587
505
  - NEVER run `rm -rf`, `git clean`, or any destructive filesystem operations
588
506
  - `/prizmkit-committer` is mandatory, and must not be replaced with manual git commit commands
@@ -1,4 +1,4 @@
1
- # Dev-Pipeline Session Bootstrap — Tier 3 (Orchestrator + Critic/Reviewer)
1
+ # Dev-Pipeline Session Bootstrap — Tier 3 (Orchestrator + Reviewer)
2
2
 
3
3
  ## Session Context
4
4
 
@@ -10,12 +10,12 @@
10
10
 
11
11
  You are the **session orchestrator**. Implement Feature {{FEATURE_ID}}: "{{FEATURE_TITLE}}".
12
12
 
13
- **CRITICAL**: You MUST NOT exit until ALL work is complete and committed. When you spawn Critic or Reviewer agents, wait for each to finish (run_in_background=false). Do NOT spawn agents in background and exit — that kills the session.
13
+ **CRITICAL**: You MUST NOT exit until ALL work is complete and committed. When you spawn Reviewer agents, wait for each to finish (run_in_background=false). Do NOT spawn agents in background and exit — that kills the session.
14
14
 
15
- **Tier 3 — Orchestrator + Critic**: For complex features, the main orchestrator handles context, planning, and implementation directly. Critic challenges the plan. Do not spawn top-level Dev or Reviewer subagents; code review runs later through `/prizmkit-code-review`.
15
+ **Tier 3 — Orchestrator + Reviewer**: For complex features, the main orchestrator handles context, planning, and implementation directly. Do not spawn top-level Dev or Reviewer subagents; code review runs later through `/prizmkit-code-review`.
16
16
 
17
17
  **Agent spawn failure policy (all Agent tool calls)**:
18
- - If spawning Reviewer or Critic fails with team/config/lock errors, retry at most once.
18
+ - If spawning Reviewer fails with team/config/lock errors, retry at most once.
19
19
  - If the second attempt fails, do not keep spawning variants and do not enter artifact polling for Implementation Log, challenge report, or review report markers.
20
20
  - Use the documented inline/recovery fallback for that phase: write the required report yourself where possible, complete remaining work directly in the orchestrator when safe, or write `failure-log.md` with the spawn error and last observable state before stopping for recovery.
21
21
  - Apply the same cap to any re-spawn for report repair or resume prompts; do not burn multiple minutes on identical team/config/lock failures.
@@ -52,7 +52,7 @@ You are running in **headless non-interactive mode** with a FINITE context windo
52
52
 
53
53
  1. **context-snapshot.md is your single source of truth** — After Phase 1-2 builds it, ALWAYS read context-snapshot.md instead of re-reading individual source files
54
54
  2. **Never re-read your own writes** — After you create/modify a file, do NOT read it back to verify. Trust your write was correct.
55
- 3. **Never re-read unmodified files** — Once you have read a file into context, do NOT read it again unless it was modified by an Edit/Write operation after your last read. Use platform file/search tools for targeted lookup; when shell-free helper lookup is needed, run `{{RUNTIME_HELPER_CMD}} text search <file> --pattern "<pattern>" --json`, then read only the smallest bounded range with the platform file-reading tool instead of full-file Read. Before issuing a Read, ask yourself: "Have I read this file before, and has it changed since?" If the answer is "no, it hasn't changed" — do NOT read it. This applies to all files including those summarized in context-snapshot.md Section 4. Subagents (Critic, Reviewer) must receive context-snapshot.md and rely on it rather than independently re-reading the same files the orchestrator already read.
55
+ 3. **Never re-read unmodified files** — Once you have read a file into context, do NOT read it again unless it was modified by an Edit/Write operation after your last read. Use platform file/search tools for targeted lookup; when shell-free helper lookup is needed, run `{{RUNTIME_HELPER_CMD}} text search <file> --pattern "<pattern>" --json`, then read only the smallest bounded range with the platform file-reading tool instead of full-file Read. Before issuing a Read, ask yourself: "Have I read this file before, and has it changed since?" If the answer is "no, it hasn't changed" — do NOT read it. This applies to all files including those summarized in context-snapshot.md Section 4. Reviewer subagents must receive context-snapshot.md and rely on it rather than independently re-reading the same files the orchestrator already read.
56
56
  4. **Stay focused** — Do NOT explore code unrelated to this feature. No curiosity-driven reads.
57
57
  4. **One task at a time** — In Phase 4 (implement), complete and test one task before starting the next.
58
58
  5. **Minimize tool output** — Never load full command output into context. First capture command output to a temp file using the command/tool output option or the host-appropriate redirection, then inspect only the final relevant lines and use targeted search helpers to extract the information needed for the current task. Only read the filtered result — never the raw full output.
@@ -191,60 +191,6 @@ Do not spawn a top-level Reviewer subagent for planning analysis. Perform a boun
191
191
 
192
192
  **CP-2**: Plan self-check complete; no CRITICAL plan issues remain.
193
193
 
194
- {{IF_CRITIC_ENABLED}}
195
- ### Phase 3.5: Plan Challenge — Critic Agent(s)
196
-
197
- **Guard**: Verify critic agent file exists before spawning:
198
- ```bash
199
- {{RUNTIME_HELPER_CMD}} artifact exists {{CRITIC_SUBAGENT_PATH}} --exists-marker CRITIC:READY --missing-marker CRITIC:MISSING
200
- ```
201
- If CRITIC:MISSING — skip Phase 3.5 entirely and proceed to Phase 4. Log: "Critic agent not installed — skipping Plan Challenge."
202
-
203
- **Choose ONE path based on `{{CRITIC_COUNT}}`:**
204
-
205
- **If {{CRITIC_COUNT}} = 1 → Single Critic** (skip to CP-2.5 after this):
206
-
207
- Spawn Critic agent (Agent tool, subagent_type="prizm-dev-team-critic", mode="plan", run_in_background=false, isolation=default/no worktree). Do not request worktree isolation; this prevents AI tool-created `.claude/worktrees/...` subagent worktrees. PrizmKit pipeline-managed linked git worktrees under `.prizmkit/state/worktrees/...` are separate and controlled by `USE_WORKTREE`.
208
-
209
- Spawn failure cap: for team/config/lock errors, retry at most once for this Critic spawn. If the second attempt fails, do not poll for challenge reports; perform the plan challenge inline and record the fallback.
210
-
211
- Prompt:
212
- > "Read {{CRITIC_SUBAGENT_PATH}}. For feature {{FEATURE_ID}} (slug: {{FEATURE_SLUG}}):
213
- > **MODE: Plan Challenge**
214
- > 1. Read `.prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md` FIRST — Section 3 has TRAPS/RULES, Section 4 has file manifest.
215
- > 2. Use context-snapshot.md as the shared source of truth. Do not create or enter AI tool-created `.claude/worktrees/...` subagent worktrees; use default/no worktree isolation and do not request worktree isolation.
216
- > 3. PrizmKit pipeline-managed linked git worktrees under `.prizmkit/state/worktrees/...` are a separate runner feature controlled by `USE_WORKTREE`; do not confuse them with AI tool-created `.claude/worktrees/...`.
217
- > 4. Read additional `.prizmkit/prizm-docs/` or source excerpts only when needed to verify a specific challenge.
218
- > 5. Challenge plan.md against the project's existing architecture, patterns, and style.
219
- > Write `.prizmkit/specs/{{FEATURE_SLUG}}/challenge-report.md` with findings (or 'No significant challenges')."
220
-
221
- **If {{CRITIC_COUNT}} = 3 → Multi-Critic Voting** (skip Single Critic above):
222
-
223
- **IMPORTANT**: Spawn all 3 Critics in PARALLEL (issue all 3 Agent tool calls in the SAME message turn). Do NOT wait for one before spawning the next.
224
-
225
- Spawn Critic-A, Critic-B, Critic-C simultaneously (each with mode="plan", run_in_background=false, isolation=default/no worktree). Do not request worktree isolation; this prevents AI tool-created `.claude/worktrees/...` subagent worktrees. PrizmKit pipeline-managed linked git worktrees under `.prizmkit/state/worktrees/...` are separate and controlled by `USE_WORKTREE`:
226
-
227
- Critic-A prompt (append to base prompt above):
228
- > "**Focus Lens: Architecture & Scalability.** Prioritize: architectural pattern fit, scalability implications, over-engineering risks, component boundary design.
229
- > Write `.prizmkit/specs/{{FEATURE_SLUG}}/challenge-report-A.md`."
230
-
231
- Critic-B prompt (append to base prompt above):
232
- > "**Focus Lens: Data Model & Edge Cases.** Prioritize: data model design fit, entity relationships, edge cases in business logic, missing boundary conditions.
233
- > Write `.prizmkit/specs/{{FEATURE_SLUG}}/challenge-report-B.md`."
234
-
235
- Critic-C prompt (append to base prompt above):
236
- > "**Focus Lens: Security & Performance.** Prioritize: security attack surface, authentication/authorization gaps, performance bottlenecks, resource leaks.
237
- > Write `.prizmkit/specs/{{FEATURE_SLUG}}/challenge-report-C.md`."
238
-
239
- Spawn failure cap: for team/config/lock errors, each Critic retries at most once. If 2 or more Critics fail to spawn after retry, perform the plan challenge inline and record the fallback.
240
-
241
- After all critics return, read all 3 reports:
242
- - Challenge raised by **2/3 or more** critics → **must respond** (adjust plan or justify why not)
243
- - Challenge raised by **1/3 only** → logged in context-snapshot but not blocking
244
- - Max 1 plan revision round.
245
-
246
- **CP-2.5**: Plan challenges reviewed and resolved.
247
- {{END_IF_CRITIC_ENABLED}}
248
194
 
249
195
  ### Implement — Orchestrator Direct (no Dev subagent)
250
196
 
@@ -265,7 +211,7 @@ Before starting, check plan.md Tasks:
265
211
  - Implements task-by-task, marking each `[x]` immediately
266
212
  - Creates/updates L2 `.prizm` docs when creating new modules
267
213
  - Defers scoped/full test execution until after the code-review loop completes
268
- - Preserves Reviewer/Critic behavior; only the top-level implementation Dev handoff is removed
214
+ - Preserves Reviewer behavior; only the top-level implementation Dev handoff is removed
269
215
  - If plan.md has >5 tasks: update checkpoints after every 3 tasks
270
216
 
271
217
  **3b. Focused checks only (no test gate here)**:
@@ -295,7 +241,7 @@ For each Verification Gate from the Task Contract, write one evidence line to Im
295
241
 
296
242
  Review the completed implementation before the scoped feature test gate runs. Use `artifact_dir=.prizmkit/specs/{{FEATURE_SLUG}}/` so the code-review skill can read spec, plan, context snapshot, implementation log, and current diff artifacts. Do not require or read a prior `/prizmkit-test` report here; test generation and test-fix looping happen in the next phase.
297
243
 
298
- Run `/prizmkit-code-review` with `artifact_dir=.prizmkit/specs/{{FEATURE_SLUG}}/`.
244
+ Run `/prizmkit-code-review` with `artifact_dir=.prizmkit/specs/{{FEATURE_SLUG}}/`. The code-review skill must launch Reviewer in `current-workspace / active-checkout / no-worktree` mode so it reviews the active checkout rather than an isolated copy; do not request worktree isolation or use `.claude/worktrees/...` / `.prizmkit/state/worktrees/...`. Do not set `USE_WORKTREE` for reviewer launches.
299
245
 
300
246
  The skill runs an internal review-fix loop (Reviewer Agent → filter → orchestrator fix, max 3 rounds) and writes `review-report.md` to the artifact directory.
301
247
 
@@ -562,9 +508,6 @@ Rules for writing completion notes:
562
508
  | Feature Artifacts Dir | `.prizmkit/specs/{{FEATURE_SLUG}}/` |
563
509
  | Context Snapshot | `.prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md` |
564
510
  | Team Config | `{{TEAM_CONFIG_PATH}}` |
565
- {{IF_CRITIC_ENABLED}}
566
- | Critic Agent Def | {{CRITIC_SUBAGENT_PATH}} |
567
- {{END_IF_CRITIC_ENABLED}}
568
511
  | Project Root | {{PROJECT_ROOT}} |
569
512
  | Feature List Path | {{FEATURE_LIST_PATH}} |
570
513
 
@@ -587,10 +530,10 @@ If you encounter an unrecoverable error, context overflow, or are about to exit
587
530
 
588
531
  ## Reminders
589
532
 
590
- - Tier 3: orchestrator implements directly; Critic challenges plan; `/prizmkit-code-review` handles review later
533
+ - Tier 3: orchestrator implements directly; `/prizmkit-code-review` handles review later
591
534
  - context-snapshot.md is append-only: orchestrator writes Sections 1-4 + Implementation Log, Reviewer appends Review Notes
592
535
  - Gate checks enforce Implementation Log and Review Notes are written before proceeding
593
- - Do NOT use `run_in_background=true` when spawning Critic agents
536
+ - Do NOT use `run_in_background=true` when spawning Reviewer agents
594
537
  - Commit phase must use `/prizmkit-committer`; do NOT replace with manual git commit commands
595
538
  - **NEVER delete, modify, or touch any file under `.prizmkit/state/`** — those are pipeline runtime files managed by the runner
596
539
  - NEVER run `rm -rf`, `git clean`, or any destructive filesystem operations
@@ -181,22 +181,11 @@
181
181
  ],
182
182
  "description": "Bug fix status. Subset of feature status enum plus needs_info."
183
183
  },
184
- "critic": {
185
- "type": "boolean",
186
- "description": "Enable adversarial plan challenge before implementation. Default: true for high severity bugs, false for others.",
187
- "default": false
188
- },
189
- "critic_count": {
190
- "type": "integer",
191
- "description": "Number of parallel critic agents. 1 = single critic, 3 = multi-critic voting. Default: 1 for high severity, omit for others.",
192
- "enum": [
193
- 1,
194
- 3
195
- ]
196
- },
197
184
  "user_context": {
198
185
  "type": "array",
199
- "items": { "type": "string" },
186
+ "items": {
187
+ "type": "string"
188
+ },
200
189
  "description": "User-provided supplementary materials, preserved verbatim. Each entry is either inline content/rules (stored as-is) or a file reference (e.g. 'src/auth/login.ts:42-78', 'src/utils/ — focus on validation logic')."
201
190
  },
202
191
  "model": {
@@ -209,7 +198,11 @@
209
198
  "properties": {
210
199
  "tool": {
211
200
  "type": "string",
212
- "enum": ["playwright-cli", "opencli", "auto"],
201
+ "enum": [
202
+ "playwright-cli",
203
+ "opencli",
204
+ "auto"
205
+ ],
213
206
  "default": "auto",
214
207
  "description": "Browser tool to use. 'auto' (default) = AI chooses at runtime. 'playwright-cli' = local dev server verification in isolated browser. 'opencli' = reuses Chrome logged-in session, ideal for verifying bugs related to third-party integrations or OAuth flows."
215
208
  },
@@ -222,7 +215,8 @@
222
215
  }
223
216
  }
224
217
  }
225
- }
218
+ },
219
+ "additionalProperties": false
226
220
  }
227
221
  },
228
222
  "global_context": {