prizmkit 1.1.130 → 1.1.134
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/adapters/claude/command-adapter.js +0 -2
- package/bundled/dev-pipeline/.env.example +1 -1
- package/bundled/dev-pipeline/assets/skill-subagent-integration.md +11 -6
- package/bundled/dev-pipeline/prizmkit_runtime/checkpoint_state.py +445 -8
- package/bundled/dev-pipeline/prizmkit_runtime/gitops.py +2 -9
- package/bundled/dev-pipeline/prizmkit_runtime/processes.py +21 -1
- package/bundled/dev-pipeline/prizmkit_runtime/runner_classification.py +87 -66
- package/bundled/dev-pipeline/prizmkit_runtime/runner_models.py +53 -3
- package/bundled/dev-pipeline/prizmkit_runtime/runner_recovery.py +55 -25
- package/bundled/dev-pipeline/prizmkit_runtime/runner_status.py +4 -0
- package/bundled/dev-pipeline/prizmkit_runtime/runners.py +119 -18
- package/bundled/dev-pipeline/prizmkit_runtime/sessions.py +3 -2
- package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +411 -17
- package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +57 -14
- package/bundled/dev-pipeline/scripts/generate-recovery-prompt.py +5 -4
- package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +55 -2
- package/bundled/dev-pipeline/scripts/prompt_framework.py +152 -1
- package/bundled/dev-pipeline/scripts/update-bug-status.py +53 -0
- package/bundled/dev-pipeline/scripts/update-checkpoint.py +294 -69
- package/bundled/dev-pipeline/scripts/update-feature-status.py +57 -0
- package/bundled/dev-pipeline/scripts/update-refactor-status.py +53 -0
- package/bundled/dev-pipeline/templates/bootstrap-prompt.md +5 -5
- package/bundled/dev-pipeline/templates/bootstrap-tier3.md +28 -22
- package/bundled/dev-pipeline/templates/bugfix-bootstrap-prompt.md +24 -10
- package/bundled/dev-pipeline/templates/refactor-bootstrap-prompt.md +20 -2
- package/bundled/dev-pipeline/templates/sections/bugfix-phase-commit-report.md +2 -2
- package/bundled/dev-pipeline/templates/sections/bugfix-phase-diagnose-plan.md +1 -1
- package/bundled/dev-pipeline/templates/sections/bugfix-phase-manual-verification.md +5 -10
- package/bundled/dev-pipeline/templates/sections/bugfix-phase-review.md +9 -19
- package/bundled/dev-pipeline/templates/sections/bugfix-phase-test.md +21 -0
- package/bundled/dev-pipeline/templates/sections/bugfix-session-status.md +1 -1
- package/bundled/dev-pipeline/templates/sections/checkpoint-system.md +10 -10
- package/bundled/dev-pipeline/templates/sections/context-budget-rules.md +1 -1
- package/bundled/dev-pipeline/templates/sections/headless-commit-authorization.md +15 -0
- package/bundled/dev-pipeline/templates/sections/phase-commit-full.md +2 -2
- package/bundled/dev-pipeline/templates/sections/phase-commit.md +2 -2
- package/bundled/dev-pipeline/templates/sections/phase-prizmkit-test.md +26 -23
- package/bundled/dev-pipeline/templates/sections/phase-review-agent.md +5 -5
- package/bundled/dev-pipeline/templates/sections/phase-review-full.md +15 -11
- package/bundled/dev-pipeline/templates/sections/refactor-phase-commit-report.md +1 -1
- package/bundled/dev-pipeline/templates/sections/refactor-phase-review.md +6 -6
- package/bundled/dev-pipeline/templates/sections/refactor-phase-test.md +21 -0
- package/bundled/dev-pipeline/templates/sections/refactor-reminders.md +1 -1
- package/bundled/dev-pipeline/templates/sections/subagent-timeout-recovery.md +1 -1
- package/bundled/dev-pipeline/templates/sections/task-contract.md +4 -0
- package/bundled/dev-pipeline/tests/test_checkpoint_state.py +362 -3
- package/bundled/dev-pipeline/tests/test_generate_bootstrap_prompt.py +349 -48
- package/bundled/dev-pipeline/tests/test_generate_bugfix_prompt.py +129 -0
- package/bundled/dev-pipeline/tests/test_generate_refactor_prompt.py +91 -0
- package/bundled/dev-pipeline/tests/test_python_runner_parity.py +567 -23
- package/bundled/dev-pipeline/tests/test_unified_cli.py +37 -10
- package/bundled/skills/_metadata.json +63 -26
- package/bundled/skills/app-planner/SKILL.md +4 -3
- package/bundled/skills/bug-fix-workflow/SKILL.md +89 -180
- package/bundled/skills/bug-planner/SKILL.md +12 -27
- package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +131 -220
- package/bundled/skills/bugfix-pipeline-launcher/references/configuration.md +36 -90
- package/bundled/skills/feature-pipeline-launcher/SKILL.md +129 -271
- package/bundled/skills/feature-pipeline-launcher/references/configuration.md +35 -76
- package/bundled/skills/feature-planner/SKILL.md +27 -22
- package/bundled/skills/feature-planner/assets/planning-guide.md +4 -4
- package/bundled/skills/feature-workflow/SKILL.md +94 -121
- package/bundled/skills/prizmkit/SKILL.md +130 -94
- package/bundled/skills/prizmkit/references/workflow-state-protocol.md +181 -0
- package/bundled/skills/prizmkit-code-review/SKILL.md +132 -86
- package/bundled/skills/prizmkit-code-review/references/independent-code-review.md +243 -0
- package/bundled/skills/prizmkit-code-review/references/review-report-template.md +42 -1
- package/bundled/skills/prizmkit-code-review/references/workflow-state-protocol.md +181 -0
- package/bundled/skills/prizmkit-code-review/scripts/render_review_report.py +93 -1
- package/bundled/skills/prizmkit-committer/SKILL.md +125 -48
- package/bundled/skills/prizmkit-committer/references/workflow-state-protocol.md +181 -0
- package/bundled/skills/prizmkit-implement/SKILL.md +99 -73
- package/bundled/skills/prizmkit-implement/references/implementation-subagent-procedure.md +1 -1
- package/bundled/skills/prizmkit-implement/references/workflow-state-protocol.md +181 -0
- package/bundled/skills/prizmkit-init/SKILL.md +5 -5
- package/bundled/skills/prizmkit-plan/SKILL.md +146 -105
- package/bundled/skills/prizmkit-plan/assets/plan-template.md +18 -0
- package/bundled/skills/prizmkit-plan/references/independent-plan-review.md +242 -0
- package/bundled/skills/prizmkit-plan/references/review-plan-spec-loop.md +4 -4
- package/bundled/skills/prizmkit-plan/references/workflow-state-protocol.md +181 -0
- package/bundled/skills/prizmkit-retrospective/SKILL.md +111 -53
- package/bundled/skills/prizmkit-retrospective/references/knowledge-injection-steps.md +7 -6
- package/bundled/skills/prizmkit-retrospective/references/structural-sync-steps.md +5 -4
- package/bundled/skills/prizmkit-retrospective/references/workflow-state-protocol.md +181 -0
- package/bundled/skills/prizmkit-test/SKILL.md +52 -6
- package/bundled/skills/prizmkit-test/assets/authoritative-records.schema.json +63 -12
- package/bundled/skills/prizmkit-test/assets/evidence-manifest.schema.json +1 -1
- package/bundled/skills/prizmkit-test/assets/evidence-package-template.json +13 -0
- package/bundled/skills/prizmkit-test/references/evidence-protocol.md +6 -1
- package/bundled/skills/prizmkit-test/references/evidence-request-protocol.md +8 -1
- package/bundled/skills/prizmkit-test/references/examples.md +1 -1
- package/bundled/skills/prizmkit-test/references/test-generation-steps.md +4 -1
- package/bundled/skills/prizmkit-test/references/test-report-template.md +1 -1
- package/bundled/skills/prizmkit-test/references/trusted-evidence-execution.md +15 -0
- package/bundled/skills/prizmkit-test/references/workflow-state-protocol.md +181 -0
- package/bundled/skills/prizmkit-test/scripts/build_test_evidence.py +744 -23
- package/bundled/skills/prizmkit-test/scripts/validate_test_evidence.py +194 -15
- package/bundled/skills/prizmkit-workflow/SKILL.md +266 -0
- package/bundled/skills/prizmkit-workflow/references/workflow-state-protocol.md +181 -0
- package/bundled/skills/recovery-workflow/SKILL.md +62 -241
- package/bundled/skills/recovery-workflow/evals/evals.json +17 -33
- package/bundled/skills/recovery-workflow/references/detection.md +28 -52
- package/bundled/skills/recovery-workflow/scripts/detect-recovery-state.py +105 -439
- package/bundled/skills/refactor-pipeline-launcher/SKILL.md +136 -275
- package/bundled/skills/refactor-pipeline-launcher/references/configuration.md +53 -88
- package/bundled/skills/refactor-planner/SKILL.md +12 -57
- package/bundled/skills/refactor-planner/references/behavior-preservation.md +111 -230
- package/bundled/skills/refactor-planner/references/error-recovery.md +37 -0
- package/bundled/skills/refactor-planner/references/planning-phases.md +11 -17
- package/bundled/skills/refactor-planner/scripts/validate-and-generate-refactor.py +1 -1
- package/bundled/skills/refactor-workflow/SKILL.md +98 -139
- package/bundled/templates/project-memory-template.md +4 -4
- package/package.json +1 -1
- package/src/index.js +4 -0
- package/src/prompts.js +10 -3
- package/src/scaffold.js +1 -1
- package/bundled/dev-pipeline/tests/test-deploy-safety.sh +0 -223
- package/bundled/skills/feature-pipeline-launcher/scripts/preflight-check.py +0 -462
|
@@ -13,8 +13,12 @@ from generate_bugfix_prompt import (
|
|
|
13
13
|
format_error_source_details,
|
|
14
14
|
format_environment,
|
|
15
15
|
generate_bugfix_checkpoint,
|
|
16
|
+
bugfix_checkpoint_metadata,
|
|
17
|
+
merge_bugfix_checkpoint_state,
|
|
18
|
+
route_bugfix_repair,
|
|
16
19
|
process_conditional_blocks,
|
|
17
20
|
render_template,
|
|
21
|
+
assemble_bugfix_sections,
|
|
18
22
|
)
|
|
19
23
|
from continuation import append_continuation_handoff
|
|
20
24
|
|
|
@@ -312,6 +316,11 @@ def test_template_source_is_clean_for_headless_prompt_contract():
|
|
|
312
316
|
content = Path("dev-pipeline/templates/bugfix-bootstrap-prompt.md").read_text(encoding="utf-8")
|
|
313
317
|
for forbidden in HEADLESS_FORBIDDEN_PROMPT_STRINGS:
|
|
314
318
|
assert forbidden not in content
|
|
319
|
+
assert "FAST_PATH=true" not in content
|
|
320
|
+
assert "prizmkit-workflow" not in content
|
|
321
|
+
assert "/prizmkit-test scope=this-change artifact_dir=.prizmkit/bugfix/{{BUG_ID}}/" in content
|
|
322
|
+
assert "local_commit_authorized=true" in content
|
|
323
|
+
assert "push_authorized" not in content
|
|
315
324
|
|
|
316
325
|
|
|
317
326
|
def test_bugfix_prompt_keeps_fine_grained_phases_out_of_external_status_contract():
|
|
@@ -455,6 +464,126 @@ class TestBugfixBootstrapShellExtraction:
|
|
|
455
464
|
|
|
456
465
|
|
|
457
466
|
class TestBugfixCheckpointGeneration:
|
|
467
|
+
def test_checkpoint_merge_preserves_family_handoff_state(self, tmp_path):
|
|
468
|
+
fresh = generate_bugfix_checkpoint("B-001", "new")
|
|
469
|
+
existing = generate_bugfix_checkpoint("B-001", "old")
|
|
470
|
+
existing["bugfix_state"] = bugfix_checkpoint_metadata(
|
|
471
|
+
".prizmkit/bugfix/B-001",
|
|
472
|
+
stage="test",
|
|
473
|
+
status="TEST_BLOCKED",
|
|
474
|
+
stage_result="TEST_BLOCKED",
|
|
475
|
+
repair_round=2,
|
|
476
|
+
next_stage="prizmkit-test",
|
|
477
|
+
resume_from="prizmkit-test",
|
|
478
|
+
)
|
|
479
|
+
|
|
480
|
+
merged = merge_bugfix_checkpoint_state(existing, fresh, str(tmp_path))
|
|
481
|
+
|
|
482
|
+
assert merged["bugfix_state"]["stage_result"] == "TEST_BLOCKED"
|
|
483
|
+
assert merged["bugfix_state"]["resume_from"] == "prizmkit-test"
|
|
484
|
+
|
|
485
|
+
def test_default_checkpoint_has_all_atomic_gates_in_order(self):
|
|
486
|
+
checkpoint = generate_bugfix_checkpoint("B-001", "session-1")
|
|
487
|
+
|
|
488
|
+
assert [step["skill"] for step in checkpoint["steps"]] == [
|
|
489
|
+
"prizmkit-init",
|
|
490
|
+
"bug-diagnosis-and-plan",
|
|
491
|
+
"prizmkit-implement",
|
|
492
|
+
"prizmkit-code-review",
|
|
493
|
+
"prizmkit-test",
|
|
494
|
+
"prizmkit-retrospective",
|
|
495
|
+
"prizmkit-committer",
|
|
496
|
+
"bug-report",
|
|
497
|
+
]
|
|
498
|
+
test_step = checkpoint["steps"][4]
|
|
499
|
+
assert test_step["depends_on"] == "S04"
|
|
500
|
+
assert test_step["required_artifacts"] == [
|
|
501
|
+
".prizmkit/test/evidence/*/manifest.json",
|
|
502
|
+
".prizmkit/test/evidence/*/verdict.json",
|
|
503
|
+
".prizmkit/test/evidence/*/validation.json",
|
|
504
|
+
]
|
|
505
|
+
assert checkpoint["steps"][5]["depends_on"] == "S05"
|
|
506
|
+
|
|
507
|
+
def test_bugfix_repair_routing_preserves_review_and_test_boundaries(self):
|
|
508
|
+
review = route_bugfix_repair("REVIEW_NEEDS_FIXES", repair_round=0)
|
|
509
|
+
test_infra = route_bugfix_repair(
|
|
510
|
+
"TEST_FAIL", "test-infrastructure", repair_round=1,
|
|
511
|
+
)
|
|
512
|
+
production = route_bugfix_repair("TEST_FAIL", "public-interface", repair_round=2)
|
|
513
|
+
|
|
514
|
+
assert review["route"] == [
|
|
515
|
+
"prizmkit-implement", "prizmkit-code-review", "prizmkit-test",
|
|
516
|
+
]
|
|
517
|
+
assert test_infra["route"] == ["prizmkit-implement", "prizmkit-test"]
|
|
518
|
+
assert production["route"] == [
|
|
519
|
+
"prizmkit-implement", "prizmkit-code-review", "prizmkit-test",
|
|
520
|
+
]
|
|
521
|
+
assert production["repair_round"] == 3
|
|
522
|
+
|
|
523
|
+
def test_bugfix_repair_routing_blocks_unsafe_blocked_and_exhausted_results(self):
|
|
524
|
+
unknown = route_bugfix_repair("TEST_FAIL", "unknown", repair_round=1)
|
|
525
|
+
blocked = route_bugfix_repair("TEST_BLOCKED", "production", repair_round=1)
|
|
526
|
+
exhausted = route_bugfix_repair("TEST_FAIL", "production", repair_round=3)
|
|
527
|
+
|
|
528
|
+
assert unknown["blocked"] is True
|
|
529
|
+
assert unknown["route"] == []
|
|
530
|
+
assert blocked["blocked"] is True
|
|
531
|
+
assert blocked["resumable"] is False
|
|
532
|
+
assert blocked["next_stage"] is None
|
|
533
|
+
assert blocked["terminal_status"] == "WORKFLOW_BLOCKED"
|
|
534
|
+
assert blocked["blocked_reason"] == "test_blocked"
|
|
535
|
+
assert blocked["route"] == []
|
|
536
|
+
assert "cannot safely edit production" in blocked["reason"]
|
|
537
|
+
assert exhausted["blocked"] is True
|
|
538
|
+
assert exhausted["repair_round"] == 3
|
|
539
|
+
|
|
540
|
+
def test_bugfix_checkpoint_metadata_preserves_artifact_and_evidence_handoff(self):
|
|
541
|
+
metadata = bugfix_checkpoint_metadata(
|
|
542
|
+
".prizmkit/bugfix/B-001",
|
|
543
|
+
evidence={
|
|
544
|
+
"manifest_path": ".prizmkit/test/evidence/id/manifest.json",
|
|
545
|
+
"verdict_path": ".prizmkit/test/evidence/id/verdict.json",
|
|
546
|
+
"validation_path": ".prizmkit/test/evidence/id/validation.json",
|
|
547
|
+
},
|
|
548
|
+
stage="test",
|
|
549
|
+
status="TEST_FAIL",
|
|
550
|
+
stage_result="TEST_FAIL",
|
|
551
|
+
repair_scope="test-infrastructure",
|
|
552
|
+
repair_round=2,
|
|
553
|
+
)
|
|
554
|
+
|
|
555
|
+
assert metadata["artifact_dir"] == ".prizmkit/bugfix/B-001"
|
|
556
|
+
assert metadata["authoritative_evidence_paths"]["validation"].endswith(
|
|
557
|
+
"/validation.json"
|
|
558
|
+
)
|
|
559
|
+
assert metadata["repair_round"] == 2
|
|
560
|
+
assert metadata["resume_from"] == "prizmkit-implement"
|
|
561
|
+
|
|
562
|
+
def test_manual_bugfix_uses_automatic_verification_and_keeps_commit_gate(self):
|
|
563
|
+
sections = assemble_bugfix_sections(
|
|
564
|
+
"standard", "dev-pipeline/templates/sections", False, True,
|
|
565
|
+
)
|
|
566
|
+
names = [name for name, _ in sections]
|
|
567
|
+
|
|
568
|
+
assert "bugfix-manual-gate" in names
|
|
569
|
+
assert "headless-commit-authorization" in names
|
|
570
|
+
assert "bugfix-phase-commit-report" in names
|
|
571
|
+
|
|
572
|
+
def test_rendered_bugfix_prompt_is_atomic_headless_and_local_commit_only(self, tmp_path):
|
|
573
|
+
prompt = _render_bugfix_prompt(tmp_path)
|
|
574
|
+
|
|
575
|
+
assert prompt.index("/prizmkit-code-review") < prompt.index(
|
|
576
|
+
"/prizmkit-test scope=this-change artifact_dir=.prizmkit/bugfix/B-001/"
|
|
577
|
+
) < prompt.index("### Headless Commit Authorization")
|
|
578
|
+
assert "FAST_PATH=true" not in prompt
|
|
579
|
+
assert "prizmkit-workflow" not in prompt
|
|
580
|
+
assert '"local_commit_authorized": true' in prompt
|
|
581
|
+
assert "push_authorized" not in prompt
|
|
582
|
+
assert "Do not ask questions, wait for user input" in prompt
|
|
583
|
+
assert "Remote publication is controlled by the runtime" in prompt
|
|
584
|
+
assert "push_authorized\": true" not in prompt
|
|
585
|
+
assert ".prizmkit/bugfix/B-001/" in prompt
|
|
586
|
+
|
|
458
587
|
def test_setup_section_skips_and_finalization_group_expands(self):
|
|
459
588
|
checkpoint = generate_bugfix_checkpoint(
|
|
460
589
|
"B-001",
|
|
@@ -10,6 +10,8 @@ from generate_refactor_prompt import (
|
|
|
10
10
|
build_replacements,
|
|
11
11
|
generate_refactor_checkpoint,
|
|
12
12
|
merge_refactor_checkpoint_state,
|
|
13
|
+
refactor_checkpoint_metadata,
|
|
14
|
+
route_refactor_repair,
|
|
13
15
|
)
|
|
14
16
|
|
|
15
17
|
REMOVED_MAX_LOG_ENV = "MAX_" + "LOG_SIZE"
|
|
@@ -54,12 +56,24 @@ class TestRefactorCheckpointMerge:
|
|
|
54
56
|
def test_preserves_skipped_without_artifacts(self, tmp_path):
|
|
55
57
|
fresh = generate_refactor_checkpoint("R-008", "R-008-new")
|
|
56
58
|
existing = generate_refactor_checkpoint("R-008", "R-008-old")
|
|
59
|
+
existing["refactor_state"] = refactor_checkpoint_metadata(
|
|
60
|
+
".prizmkit/refactor/R-008",
|
|
61
|
+
stage="test",
|
|
62
|
+
status="TEST_FAIL",
|
|
63
|
+
stage_result="TEST_FAIL",
|
|
64
|
+
repair_scope="public-interface",
|
|
65
|
+
repair_round=2,
|
|
66
|
+
next_stage="prizmkit-implement",
|
|
67
|
+
resume_from="prizmkit-implement",
|
|
68
|
+
)
|
|
57
69
|
existing["steps"][0]["status"] = "skipped"
|
|
58
70
|
|
|
59
71
|
merged = merge_refactor_checkpoint_state(existing, fresh, str(tmp_path))
|
|
60
72
|
|
|
61
73
|
assert merged["steps"][0]["status"] == "skipped"
|
|
62
74
|
assert merged["steps"][1]["status"] == "pending"
|
|
75
|
+
assert merged["refactor_state"]["repair_scope"] == "public-interface"
|
|
76
|
+
assert merged["refactor_state"]["repair_round"] == 2
|
|
63
77
|
|
|
64
78
|
|
|
65
79
|
class TestExplicitProjectRoot:
|
|
@@ -197,6 +211,11 @@ def test_template_source_is_clean_for_headless_prompt_contract():
|
|
|
197
211
|
content = Path("dev-pipeline/templates/refactor-bootstrap-prompt.md").read_text(encoding="utf-8")
|
|
198
212
|
for forbidden in HEADLESS_FORBIDDEN_PROMPT_STRINGS:
|
|
199
213
|
assert forbidden not in content
|
|
214
|
+
assert "prizmkit-workflow" not in content
|
|
215
|
+
assert "/prizmkit-test scope=this-change artifact_dir=.prizmkit/refactor/{{REFACTOR_ID}}/" in content
|
|
216
|
+
assert "local_commit_authorized=true" in content
|
|
217
|
+
assert "push_authorized" not in content
|
|
218
|
+
assert "Behavior-preservation checks remain supporting evidence" in content
|
|
200
219
|
|
|
201
220
|
|
|
202
221
|
# ---------------------------------------------------------------------------
|
|
@@ -315,6 +334,78 @@ class TestRefactorBootstrapShellExtraction:
|
|
|
315
334
|
|
|
316
335
|
|
|
317
336
|
class TestRefactorCheckpointGeneration:
|
|
337
|
+
def test_default_checkpoint_has_all_atomic_gates_in_order(self):
|
|
338
|
+
checkpoint = generate_refactor_checkpoint("R-001", "session-1")
|
|
339
|
+
|
|
340
|
+
assert [step["skill"] for step in checkpoint["steps"]] == [
|
|
341
|
+
"prizmkit-init",
|
|
342
|
+
"prizmkit-plan",
|
|
343
|
+
"prizmkit-implement",
|
|
344
|
+
"prizmkit-code-review",
|
|
345
|
+
"prizmkit-test",
|
|
346
|
+
"prizmkit-retrospective",
|
|
347
|
+
"prizmkit-committer",
|
|
348
|
+
"refactor-report",
|
|
349
|
+
"completion-summary",
|
|
350
|
+
]
|
|
351
|
+
assert checkpoint["steps"][4]["depends_on"] == "S04"
|
|
352
|
+
assert checkpoint["steps"][5]["depends_on"] == "S05"
|
|
353
|
+
|
|
354
|
+
def test_refactor_repair_routing_preserves_behavior_review_and_test(self):
|
|
355
|
+
test_infra = route_refactor_repair(
|
|
356
|
+
"TEST_FAIL", "test-infrastructure", repair_round=1,
|
|
357
|
+
)
|
|
358
|
+
production = route_refactor_repair("TEST_FAIL", "public-interface", repair_round=1)
|
|
359
|
+
blocked = route_refactor_repair("TEST_BLOCKED", "production", repair_round=1)
|
|
360
|
+
|
|
361
|
+
assert test_infra["route"] == ["prizmkit-implement", "prizmkit-test"]
|
|
362
|
+
assert production["route"] == [
|
|
363
|
+
"prizmkit-implement", "prizmkit-code-review", "prizmkit-test",
|
|
364
|
+
]
|
|
365
|
+
unknown = route_refactor_repair("TEST_FAIL", "contract", repair_round=1)
|
|
366
|
+
exhausted = route_refactor_repair("TEST_FAIL", "production", repair_round=3)
|
|
367
|
+
assert unknown["blocked"] is True
|
|
368
|
+
assert unknown["route"] == []
|
|
369
|
+
assert exhausted["blocked"] is True
|
|
370
|
+
assert exhausted["repair_round"] == 3
|
|
371
|
+
assert blocked["blocked"] is True
|
|
372
|
+
assert blocked["route"] == []
|
|
373
|
+
assert blocked["next_stage"] is None
|
|
374
|
+
assert blocked["terminal_status"] == "WORKFLOW_BLOCKED"
|
|
375
|
+
assert blocked["blocked_reason"] == "test_blocked"
|
|
376
|
+
|
|
377
|
+
def test_refactor_checkpoint_metadata_preserves_artifact_and_evidence_handoff(self):
|
|
378
|
+
metadata = refactor_checkpoint_metadata(
|
|
379
|
+
".prizmkit/refactor/R-001",
|
|
380
|
+
evidence={"manifest_path": "manifest.json"},
|
|
381
|
+
stage="test",
|
|
382
|
+
status="TEST_PASS",
|
|
383
|
+
stage_result="TEST_PASS",
|
|
384
|
+
next_stage="prizmkit-retrospective",
|
|
385
|
+
resume_from="prizmkit-retrospective",
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
assert metadata["artifact_dir"] == ".prizmkit/refactor/R-001"
|
|
389
|
+
assert metadata["authoritative_evidence_paths"]["manifest"] == "manifest.json"
|
|
390
|
+
assert metadata["next_stage"] == "prizmkit-retrospective"
|
|
391
|
+
assert metadata["resume_from"] == "prizmkit-retrospective"
|
|
392
|
+
|
|
393
|
+
def test_rendered_refactor_prompt_is_atomic_headless_and_local_commit_only(self, tmp_path):
|
|
394
|
+
prompt = _render_refactor_prompt_full(tmp_path)
|
|
395
|
+
|
|
396
|
+
assert prompt.index("/prizmkit-code-review") < prompt.index(
|
|
397
|
+
"/prizmkit-test scope=this-change artifact_dir=.prizmkit/refactor/R-001/"
|
|
398
|
+
) < prompt.index("### Headless Commit Authorization")
|
|
399
|
+
assert "prizmkit-workflow" not in prompt
|
|
400
|
+
assert "Behavior-preservation checks collected during planning and implementation remain supporting evidence" in prompt
|
|
401
|
+
assert '"local_commit_authorized": true' in prompt
|
|
402
|
+
assert "push_authorized" not in prompt
|
|
403
|
+
assert "Remote publication is controlled by the runtime" in prompt
|
|
404
|
+
assert "automatic push" not in prompt.lower()
|
|
405
|
+
assert "push_authorized\": true" not in prompt
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
class TestRefactorCheckpointGenerationLegacy:
|
|
318
409
|
def test_setup_section_is_step_and_finalization_group_expands(self):
|
|
319
410
|
checkpoint = generate_refactor_checkpoint(
|
|
320
411
|
"R-001",
|