prizmkit 1.1.114 → 1.1.116
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled/VERSION.json +3 -3
- package/bundled/dev-pipeline/.env.example +0 -1
- package/bundled/dev-pipeline/README.md +4 -6
- package/bundled/dev-pipeline/SCHEMA_ANALYSIS.md +40 -518
- package/bundled/dev-pipeline/assets/prizm-dev-team-integration.md +27 -99
- package/bundled/dev-pipeline/prizmkit_runtime/checkpoint_state.py +283 -0
- package/bundled/dev-pipeline/prizmkit_runtime/daemon.py +3 -13
- package/bundled/dev-pipeline/prizmkit_runtime/gitops.py +2 -0
- package/bundled/dev-pipeline/prizmkit_runtime/heartbeat.py +0 -1
- package/bundled/dev-pipeline/prizmkit_runtime/runner_bookkeeping.py +14 -2
- package/bundled/dev-pipeline/prizmkit_runtime/runner_classification.py +25 -31
- package/bundled/dev-pipeline/prizmkit_runtime/runner_models.py +0 -8
- package/bundled/dev-pipeline/prizmkit_runtime/runner_prompts.py +0 -3
- package/bundled/dev-pipeline/prizmkit_runtime/runners.py +13 -7
- package/bundled/dev-pipeline/prizmkit_runtime/sessions.py +13 -1
- package/bundled/dev-pipeline/scripts/continuation.py +8 -40
- package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +76 -261
- package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +16 -35
- package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +15 -34
- package/bundled/dev-pipeline/scripts/init-bugfix-pipeline.py +6 -0
- package/bundled/dev-pipeline/scripts/init-pipeline.py +6 -0
- package/bundled/dev-pipeline/scripts/init-refactor-pipeline.py +6 -0
- package/bundled/dev-pipeline/scripts/parse-stream-progress.py +1 -1
- package/bundled/dev-pipeline/scripts/prompt_framework.py +114 -63
- package/bundled/dev-pipeline/scripts/update-bug-status.py +3 -7
- package/bundled/dev-pipeline/scripts/update-checkpoint.py +54 -22
- package/bundled/dev-pipeline/scripts/update-feature-status.py +3 -7
- package/bundled/dev-pipeline/scripts/update-refactor-status.py +3 -7
- package/bundled/dev-pipeline/scripts/utils.py +6 -37
- package/bundled/dev-pipeline/templates/bootstrap-prompt.md +1 -1
- package/bundled/dev-pipeline/templates/bootstrap-tier1.md +1 -1
- package/bundled/dev-pipeline/templates/bootstrap-tier2.md +9 -91
- package/bundled/dev-pipeline/templates/bootstrap-tier3.md +9 -66
- package/bundled/dev-pipeline/templates/bug-fix-list-schema.json +10 -16
- package/bundled/dev-pipeline/templates/feature-list-schema.json +32 -17
- package/bundled/dev-pipeline/templates/refactor-bootstrap-prompt.md +0 -16
- package/bundled/dev-pipeline/templates/refactor-list-schema.json +10 -16
- package/bundled/dev-pipeline/templates/sections/bugfix-session-context.md +1 -1
- package/bundled/dev-pipeline/templates/sections/context-budget-rules.md +1 -1
- package/bundled/dev-pipeline/templates/sections/critical-paths-agent.md +0 -1
- package/bundled/dev-pipeline/templates/sections/critical-paths-full.md +0 -1
- package/bundled/dev-pipeline/templates/sections/phase-implement-agent.md +1 -1
- package/bundled/dev-pipeline/templates/sections/phase-implement-full.md +1 -1
- package/bundled/dev-pipeline/templates/sections/refactor-session-context.md +1 -1
- package/bundled/dev-pipeline/tests/conftest.py +1 -0
- package/bundled/dev-pipeline/tests/test_checkpoint_state.py +164 -0
- package/bundled/dev-pipeline/tests/test_generate_bootstrap_prompt.py +48 -76
- package/bundled/dev-pipeline/tests/test_generate_bugfix_prompt.py +25 -3
- package/bundled/dev-pipeline/tests/test_generate_refactor_prompt.py +25 -5
- package/bundled/dev-pipeline/tests/test_python_runner_parity.py +329 -16
- package/bundled/dev-pipeline/tests/test_unified_cli.py +40 -9
- package/bundled/skills/_metadata.json +1 -1
- package/bundled/skills/bug-planner/SKILL.md +5 -4
- package/bundled/skills/bug-planner/references/verification.md +29 -0
- package/bundled/skills/bug-planner/scripts/validate-bug-list.py +8 -0
- package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +2 -2
- package/bundled/skills/bugfix-pipeline-launcher/references/configuration.md +1 -6
- package/bundled/skills/feature-pipeline-launcher/SKILL.md +6 -12
- package/bundled/skills/feature-pipeline-launcher/references/configuration.md +0 -1
- package/bundled/skills/feature-planner/SKILL.md +13 -12
- package/bundled/skills/feature-planner/assets/planning-guide.md +2 -2
- package/bundled/skills/feature-planner/scripts/validate-and-generate.py +8 -11
- package/bundled/skills/prizmkit-plan/SKILL.md +15 -1
- package/bundled/skills/prizmkit-plan/references/review-plan-spec-loop.md +101 -0
- package/bundled/skills/refactor-pipeline-launcher/SKILL.md +5 -5
- package/bundled/skills/refactor-pipeline-launcher/references/configuration.md +2 -7
- package/bundled/skills/refactor-planner/SKILL.md +10 -8
- package/bundled/skills/refactor-planner/scripts/validate-and-generate-refactor.py +9 -0
- package/bundled/team/prizm-dev-team.json +2 -9
- package/package.json +1 -1
- package/bundled/agents/prizm-dev-team-critic.md +0 -179
- package/bundled/dev-pipeline/templates/agent-prompts/critic-plan-challenge.md +0 -8
- package/bundled/dev-pipeline/templates/sections/bugfix-phase-critic.md +0 -22
- package/bundled/dev-pipeline/templates/sections/phase-critic-plan-full.md +0 -61
- package/bundled/dev-pipeline/templates/sections/phase-critic-plan.md +0 -38
- package/bundled/dev-pipeline/templates/sections/refactor-phase-critic.md +0 -22
- 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
|
-
|
|
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
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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": "
|
|
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
|
-
|
|
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
|
|
341
|
-
|
|
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 (
|
|
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
|
|
235
|
-
|
|
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 (
|
|
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.
|
|
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.
|
|
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 +
|
|
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
|
|
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 +
|
|
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
|
|
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.
|
|
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
|
|
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;
|
|
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
|
|
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 +
|
|
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
|
|
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 +
|
|
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
|
|
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.
|
|
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
|
|
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;
|
|
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
|
|
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": {
|
|
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": [
|
|
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": {
|