prizmkit 1.1.119 → 1.1.121

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 (91) hide show
  1. package/bin/create-prizmkit.js +1 -5
  2. package/bundled/VERSION.json +3 -3
  3. package/bundled/dev-pipeline/README.md +41 -38
  4. package/bundled/dev-pipeline/assets/skill-subagent-integration.md +76 -0
  5. package/bundled/dev-pipeline/prizmkit_runtime/config.py +2 -8
  6. package/bundled/dev-pipeline/prizmkit_runtime/interoperability.py +1 -1
  7. package/bundled/dev-pipeline/prizmkit_runtime/platform_detection.py +3 -3
  8. package/bundled/dev-pipeline/prizmkit_runtime/runner_classification.py +23 -25
  9. package/bundled/dev-pipeline/prizmkit_runtime/runner_models.py +8 -2
  10. package/bundled/dev-pipeline/prizmkit_runtime/runner_prompts.py +10 -1
  11. package/bundled/dev-pipeline/prizmkit_runtime/runners.py +88 -32
  12. package/bundled/dev-pipeline/prizmkit_runtime/sessions.py +28 -6
  13. package/bundled/dev-pipeline/scripts/continuation.py +51 -6
  14. package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +60 -102
  15. package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +1 -19
  16. package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +1 -19
  17. package/bundled/dev-pipeline/scripts/{init-dev-team.py → init-change-artifact.py} +6 -16
  18. package/bundled/dev-pipeline/scripts/parse-stream-progress.py +364 -76
  19. package/bundled/dev-pipeline/scripts/update-bug-status.py +57 -14
  20. package/bundled/dev-pipeline/scripts/update-feature-status.py +54 -5
  21. package/bundled/dev-pipeline/scripts/update-refactor-status.py +57 -14
  22. package/bundled/dev-pipeline/scripts/utils.py +1 -1
  23. package/bundled/dev-pipeline/templates/bootstrap-prompt.md +2 -2
  24. package/bundled/dev-pipeline/templates/bootstrap-tier3.md +9 -11
  25. package/bundled/dev-pipeline/templates/bugfix-bootstrap-prompt.md +2 -1
  26. package/bundled/dev-pipeline/templates/refactor-bootstrap-prompt.md +2 -2
  27. package/bundled/dev-pipeline/templates/sections/bugfix-phase-review.md +3 -3
  28. package/bundled/dev-pipeline/templates/sections/context-budget-rules.md +1 -1
  29. package/bundled/dev-pipeline/templates/sections/critical-paths-agent.md +0 -1
  30. package/bundled/dev-pipeline/templates/sections/critical-paths-full.md +0 -2
  31. package/bundled/dev-pipeline/templates/sections/phase-commit-full.md +8 -1
  32. package/bundled/dev-pipeline/templates/sections/phase-implement-agent.md +6 -7
  33. package/bundled/dev-pipeline/templates/sections/phase-implement-full.md +6 -7
  34. package/bundled/dev-pipeline/templates/sections/phase-implement-lite.md +4 -2
  35. package/bundled/dev-pipeline/templates/sections/phase-review-agent.md +3 -3
  36. package/bundled/dev-pipeline/templates/sections/phase-review-full.md +5 -3
  37. package/bundled/dev-pipeline/templates/sections/phase-specify-plan-full.md +20 -0
  38. package/bundled/dev-pipeline/templates/sections/refactor-phase-review.md +3 -3
  39. package/bundled/dev-pipeline/tests/test_auto_skip.py +5 -5
  40. package/bundled/dev-pipeline/tests/test_generate_bootstrap_prompt.py +214 -144
  41. package/bundled/dev-pipeline/tests/test_generate_bugfix_prompt.py +25 -12
  42. package/bundled/dev-pipeline/tests/test_generate_refactor_prompt.py +11 -14
  43. package/bundled/dev-pipeline/tests/test_python_runner_parity.py +235 -32
  44. package/bundled/dev-pipeline/tests/test_unified_cli.py +219 -16
  45. package/bundled/skills/_metadata.json +4 -4
  46. package/bundled/skills/app-planner/SKILL.md +2 -2
  47. package/bundled/skills/app-planner/references/architecture-decisions.md +1 -3
  48. package/bundled/skills/prizmkit-code-review/SKILL.md +50 -47
  49. package/bundled/skills/prizmkit-code-review/references/review-report-template.md +13 -8
  50. package/bundled/skills/prizmkit-code-review/references/reviewer-agent-prompt.md +47 -33
  51. package/bundled/skills/prizmkit-code-review/references/reviewer-workspace-protocol.md +90 -0
  52. package/bundled/skills/prizmkit-implement/SKILL.md +21 -1
  53. package/bundled/skills/prizmkit-implement/references/implementation-subagent-procedure.md +67 -0
  54. package/bundled/skills/prizmkit-test/SKILL.md +159 -155
  55. package/bundled/skills/prizmkit-test/assets/authoritative-records.schema.json +420 -0
  56. package/bundled/skills/prizmkit-test/assets/behavior-risk-matrix.schema.json +116 -0
  57. package/bundled/skills/prizmkit-test/assets/evidence-manifest.schema.json +112 -0
  58. package/bundled/skills/prizmkit-test/assets/evidence-package-template.json +97 -0
  59. package/bundled/skills/prizmkit-test/references/boundary-coverage-protocol.md +76 -192
  60. package/bundled/skills/prizmkit-test/references/contract-mock-protocol.md +65 -0
  61. package/bundled/skills/prizmkit-test/references/evidence-protocol.md +194 -0
  62. package/bundled/skills/prizmkit-test/references/evidence-request-protocol.md +78 -0
  63. package/bundled/skills/prizmkit-test/references/examples.md +65 -108
  64. package/bundled/skills/prizmkit-test/references/service-boundary-test-catalog.md +10 -7
  65. package/bundled/skills/prizmkit-test/references/test-generation-steps.md +90 -82
  66. package/bundled/skills/prizmkit-test/references/test-report-template.md +77 -98
  67. package/bundled/skills/prizmkit-test/references/trusted-evidence-execution.md +97 -0
  68. package/bundled/skills/prizmkit-test/scripts/build_test_evidence.py +723 -0
  69. package/bundled/skills/prizmkit-test/scripts/validate_test_evidence.py +1426 -0
  70. package/package.json +1 -1
  71. package/src/clean.js +12 -8
  72. package/src/config.js +24 -42
  73. package/src/index.js +1 -10
  74. package/src/manifest.js +3 -9
  75. package/src/metadata.js +0 -26
  76. package/src/prompts.js +0 -13
  77. package/src/scaffold.js +76 -201
  78. package/src/upgrade.js +16 -33
  79. package/bundled/adapters/claude/agent-adapter.js +0 -96
  80. package/bundled/adapters/claude/team-adapter.js +0 -183
  81. package/bundled/adapters/codebuddy/agent-adapter.js +0 -42
  82. package/bundled/adapters/codebuddy/team-adapter.js +0 -46
  83. package/bundled/adapters/codex/agent-adapter.js +0 -38
  84. package/bundled/adapters/codex/team-adapter.js +0 -37
  85. package/bundled/agents/prizm-dev-team-dev.md +0 -123
  86. package/bundled/agents/prizm-dev-team-reviewer.md +0 -113
  87. package/bundled/dev-pipeline/assets/prizm-dev-team-integration.md +0 -65
  88. package/bundled/dev-pipeline/templates/bootstrap-tier1.md +0 -436
  89. package/bundled/dev-pipeline/templates/bootstrap-tier2.md +0 -510
  90. package/bundled/skills/prizmkit-test/scripts/validate_boundary_report.py +0 -347
  91. package/bundled/team/prizm-dev-team.json +0 -27
@@ -276,6 +276,33 @@ def _set_continuation_common(status_data, args, session_id):
276
276
  status_data["last_session_id"] = session_id
277
277
 
278
278
 
279
+ def _set_ai_error_continuation_metadata(status_data, args, session_id, reason):
280
+ """Preserve durable task/session state for any retryable launched AI error."""
281
+ if args.active_dev_branch:
282
+ status_data["active_dev_branch"] = args.active_dev_branch
283
+ if args.base_branch:
284
+ status_data["base_branch"] = args.base_branch
285
+ status_data["continuation_pending"] = True
286
+ status_data["continuation_reason"] = reason
287
+ status_data["continuation_count"] = status_data.get("continuation_count", 0) + 1
288
+ status_data["previous_session_id"] = session_id
289
+ status_data["last_fatal_error_code"] = args.last_fatal_error_code or reason
290
+ if args.continuation_summary_path:
291
+ status_data["continuation_summary_path"] = args.continuation_summary_path
292
+ if args.no_progress_count is not None:
293
+ status_data["no_progress_count"] = max(0, args.no_progress_count)
294
+ fingerprint = _load_progress_fingerprint(args.progress_fingerprint)
295
+ if fingerprint is not None:
296
+ status_data["last_progress_fingerprint"] = fingerprint
297
+ status_data["resume_from_phase"] = None
298
+ if session_id:
299
+ sessions = status_data.get("sessions", [])
300
+ if session_id not in sessions:
301
+ sessions.append(session_id)
302
+ status_data["sessions"] = sessions
303
+ status_data["last_session_id"] = session_id
304
+
305
+
279
306
  def set_context_overflow_continuation_metadata(status_data, args, session_id):
280
307
  """Record continuation metadata for a context-overflow outcome in status.json."""
281
308
  status_data["context_overflow_count"] = status_data.get("context_overflow_count", 0) + 1
@@ -456,6 +483,18 @@ def action_update(args, bug_list_path, state_dir):
456
483
 
457
484
  # Track what status we write to bug-fix-list.json
458
485
  new_status = current_list_status
486
+ if args.active_dev_branch:
487
+ bs["active_dev_branch"] = args.active_dev_branch
488
+ if args.base_branch:
489
+ bs["base_branch"] = args.base_branch
490
+ if args.last_fatal_error_code:
491
+ bs["last_fatal_error_code"] = args.last_fatal_error_code
492
+ if args.continuation_summary_path:
493
+ bs["continuation_summary_path"] = args.continuation_summary_path
494
+ fingerprint = _load_progress_fingerprint(args.progress_fingerprint)
495
+ if fingerprint is not None:
496
+ bs["last_progress_fingerprint"] = fingerprint
497
+
459
498
 
460
499
  if session_status == "success":
461
500
  bs["infra_error_count"] = 0
@@ -499,10 +538,14 @@ def action_update(args, bug_list_path, state_dir):
499
538
 
500
539
  if infra_error_count >= max_infra_retries:
501
540
  new_status = "failed"
541
+ bs["continuation_pending"] = False
542
+ bs["continuation_reason"] = session_status
543
+ bs["needs_attention"] = True
502
544
  if session_id:
503
545
  bs["last_failed_session_id"] = session_id
504
546
  else:
505
- new_status = "pending"
547
+ new_status = "in_progress"
548
+ _set_ai_error_continuation_metadata(bs, args, session_id, session_status)
506
549
 
507
550
  err = update_bug_in_list(bug_list_path, bug_id, new_status)
508
551
  if err:
@@ -528,27 +571,25 @@ def action_update(args, bug_list_path, state_dir):
528
571
  else:
529
572
  bs["retry_count"] = bs.get("retry_count", 0) + 1
530
573
 
531
- cleaned = cleanup_bug_artifacts(
532
- state_dir=state_dir,
533
- bug_id=bug_id,
534
- project_root=args.project_root,
535
- )
536
-
537
574
  if bs["retry_count"] >= max_retries:
538
575
  new_status = "failed"
576
+ bs["continuation_pending"] = False
577
+ bs["continuation_reason"] = session_status
578
+ bs["needs_attention"] = True
539
579
  else:
540
- new_status = "pending"
580
+ new_status = "in_progress"
581
+ _set_ai_error_continuation_metadata(bs, args, session_id, session_status)
541
582
 
542
583
  bs["resume_from_phase"] = None
543
- bs["sessions"] = []
544
- bs["last_session_id"] = None
584
+ if session_id:
585
+ bs["last_failed_session_id"] = session_id
545
586
 
546
587
  err = update_bug_in_list(bug_list_path, bug_id, new_status)
547
588
  if err:
548
589
  error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
549
590
  return
550
591
 
551
- if session_status == "success" and session_id:
592
+ if session_id:
552
593
  sessions = bs.get("sessions", [])
553
594
  if session_id not in sessions:
554
595
  sessions.append(session_id)
@@ -581,8 +622,9 @@ def action_update(args, bug_list_path, state_dir):
581
622
  summary["degraded_reason"] = session_status
582
623
  summary["restart_policy"] = "finalization_retry"
583
624
  elif session_status == "infra_error":
584
- summary["restart_policy"] = "infra_retry"
625
+ summary["restart_policy"] = "in_process_ai_error_continuation" if new_status == "in_progress" else "needs_attention"
585
626
  summary["infra_error_count"] = bs.get("infra_error_count", 0)
627
+ summary.update(continuation_metadata_summary(bs))
586
628
  summary["artifacts_preserved"] = True
587
629
  elif session_status == "context_overflow":
588
630
  summary["restart_policy"] = "context_overflow_continuation"
@@ -593,8 +635,9 @@ def action_update(args, bug_list_path, state_dir):
593
635
  summary.update(continuation_metadata_summary(bs))
594
636
  summary["artifacts_preserved"] = True
595
637
  elif session_status != "success":
596
- summary["restart_policy"] = "full_restart"
597
- summary["cleanup_performed"] = cleaned
638
+ summary["restart_policy"] = "in_process_ai_error_continuation" if new_status == "in_progress" else "needs_attention"
639
+ summary.update(continuation_metadata_summary(bs))
640
+ summary["artifacts_preserved"] = True
598
641
 
599
642
  print(json.dumps(summary, indent=2, ensure_ascii=False))
600
643
 
@@ -381,6 +381,33 @@ def _set_continuation_common(status_data, args, session_id):
381
381
  status_data["last_session_id"] = session_id
382
382
 
383
383
 
384
+ def _set_ai_error_continuation_metadata(status_data, args, session_id, reason):
385
+ """Preserve durable task/session state for any retryable launched AI error."""
386
+ if args.active_dev_branch:
387
+ status_data["active_dev_branch"] = args.active_dev_branch
388
+ if args.base_branch:
389
+ status_data["base_branch"] = args.base_branch
390
+ status_data["continuation_pending"] = True
391
+ status_data["continuation_reason"] = reason
392
+ status_data["continuation_count"] = status_data.get("continuation_count", 0) + 1
393
+ status_data["previous_session_id"] = session_id
394
+ status_data["last_fatal_error_code"] = args.last_fatal_error_code or reason
395
+ if args.continuation_summary_path:
396
+ status_data["continuation_summary_path"] = args.continuation_summary_path
397
+ if args.no_progress_count is not None:
398
+ status_data["no_progress_count"] = max(0, args.no_progress_count)
399
+ fingerprint = _load_progress_fingerprint(args.progress_fingerprint)
400
+ if fingerprint is not None:
401
+ status_data["last_progress_fingerprint"] = fingerprint
402
+ status_data["resume_from_phase"] = None
403
+ if session_id:
404
+ sessions = status_data.get("sessions", [])
405
+ if session_id not in sessions:
406
+ sessions.append(session_id)
407
+ status_data["sessions"] = sessions
408
+ status_data["last_session_id"] = session_id
409
+
410
+
384
411
  def set_context_overflow_continuation_metadata(status_data, args, session_id):
385
412
  """Record continuation metadata for a context-overflow outcome in status.json."""
386
413
  status_data["context_overflow_count"] = status_data.get("context_overflow_count", 0) + 1
@@ -848,6 +875,18 @@ def action_update(args, feature_list_path, state_dir):
848
875
 
849
876
  # Track what status we write to feature-list.json
850
877
  new_status = current_list_status
878
+ if args.active_dev_branch:
879
+ fs["active_dev_branch"] = args.active_dev_branch
880
+ if args.base_branch:
881
+ fs["base_branch"] = args.base_branch
882
+ if args.last_fatal_error_code:
883
+ fs["last_fatal_error_code"] = args.last_fatal_error_code
884
+ if args.continuation_summary_path:
885
+ fs["continuation_summary_path"] = args.continuation_summary_path
886
+ fingerprint = _load_progress_fingerprint(args.progress_fingerprint)
887
+ if fingerprint is not None:
888
+ fs["last_progress_fingerprint"] = fingerprint
889
+
851
890
 
852
891
  if session_status == "success":
853
892
  fs["infra_error_count"] = 0
@@ -923,10 +962,14 @@ def action_update(args, feature_list_path, state_dir):
923
962
 
924
963
  if infra_error_count >= max_infra_retries:
925
964
  new_status = "failed"
965
+ fs["continuation_pending"] = False
966
+ fs["continuation_reason"] = session_status
967
+ fs["needs_attention"] = True
926
968
  if session_id:
927
969
  fs["last_failed_session_id"] = session_id
928
970
  else:
929
- new_status = "pending"
971
+ new_status = "in_progress"
972
+ _set_ai_error_continuation_metadata(fs, args, session_id, session_status)
930
973
 
931
974
  err = update_feature_in_list(feature_list_path, feature_id, new_status)
932
975
  if err:
@@ -955,8 +998,12 @@ def action_update(args, feature_list_path, state_dir):
955
998
 
956
999
  if fs["retry_count"] >= max_retries:
957
1000
  new_status = "failed"
1001
+ fs["continuation_pending"] = False
1002
+ fs["continuation_reason"] = session_status
1003
+ fs["needs_attention"] = True
958
1004
  else:
959
- new_status = "pending"
1005
+ new_status = "in_progress"
1006
+ _set_ai_error_continuation_metadata(fs, args, session_id, session_status)
960
1007
 
961
1008
  fs["resume_from_phase"] = None
962
1009
  if session_id:
@@ -969,7 +1016,7 @@ def action_update(args, feature_list_path, state_dir):
969
1016
  error_out("Failed to update .prizmkit/plans/feature-list.json: {}".format(err))
970
1017
  return
971
1018
 
972
- if session_status == "success" and session_id:
1019
+ if session_id:
973
1020
  sessions = fs.get("sessions", [])
974
1021
  if session_id not in sessions:
975
1022
  sessions.append(session_id)
@@ -1013,8 +1060,9 @@ def action_update(args, feature_list_path, state_dir):
1013
1060
  summary["degraded_reason"] = session_status
1014
1061
  summary["restart_policy"] = "finalization_retry"
1015
1062
  elif session_status == "infra_error":
1016
- summary["restart_policy"] = "infra_retry"
1063
+ summary["restart_policy"] = "in_process_ai_error_continuation" if new_status == "in_progress" else "needs_attention"
1017
1064
  summary["infra_error_count"] = fs.get("infra_error_count", 0)
1065
+ summary.update(continuation_metadata_summary(fs))
1018
1066
  summary["artifacts_preserved"] = True
1019
1067
  elif session_status == "context_overflow":
1020
1068
  summary["restart_policy"] = "context_overflow_continuation"
@@ -1025,7 +1073,8 @@ def action_update(args, feature_list_path, state_dir):
1025
1073
  summary.update(continuation_metadata_summary(fs))
1026
1074
  summary["artifacts_preserved"] = True
1027
1075
  elif session_status != "success":
1028
- summary["restart_policy"] = "preserve_and_retry"
1076
+ summary["restart_policy"] = "in_process_ai_error_continuation" if new_status == "in_progress" else "needs_attention"
1077
+ summary.update(continuation_metadata_summary(fs))
1029
1078
  summary["artifacts_preserved"] = True
1030
1079
 
1031
1080
  print(json.dumps(summary, indent=2, ensure_ascii=False))
@@ -275,6 +275,33 @@ def _set_continuation_common(status_data, args, session_id):
275
275
  status_data["last_session_id"] = session_id
276
276
 
277
277
 
278
+ def _set_ai_error_continuation_metadata(status_data, args, session_id, reason):
279
+ """Preserve durable task/session state for any retryable launched AI error."""
280
+ if args.active_dev_branch:
281
+ status_data["active_dev_branch"] = args.active_dev_branch
282
+ if args.base_branch:
283
+ status_data["base_branch"] = args.base_branch
284
+ status_data["continuation_pending"] = True
285
+ status_data["continuation_reason"] = reason
286
+ status_data["continuation_count"] = status_data.get("continuation_count", 0) + 1
287
+ status_data["previous_session_id"] = session_id
288
+ status_data["last_fatal_error_code"] = args.last_fatal_error_code or reason
289
+ if args.continuation_summary_path:
290
+ status_data["continuation_summary_path"] = args.continuation_summary_path
291
+ if args.no_progress_count is not None:
292
+ status_data["no_progress_count"] = max(0, args.no_progress_count)
293
+ fingerprint = _load_progress_fingerprint(args.progress_fingerprint)
294
+ if fingerprint is not None:
295
+ status_data["last_progress_fingerprint"] = fingerprint
296
+ status_data["resume_from_phase"] = None
297
+ if session_id:
298
+ sessions = status_data.get("sessions", [])
299
+ if session_id not in sessions:
300
+ sessions.append(session_id)
301
+ status_data["sessions"] = sessions
302
+ status_data["last_session_id"] = session_id
303
+
304
+
278
305
  def set_context_overflow_continuation_metadata(status_data, args, session_id):
279
306
  """Record continuation metadata for a context-overflow outcome in status.json."""
280
307
  status_data["context_overflow_count"] = status_data.get("context_overflow_count", 0) + 1
@@ -460,6 +487,18 @@ def action_update(args, refactor_list_path, state_dir):
460
487
 
461
488
  # Track what status we write to refactor-list.json
462
489
  new_status = current_list_status
490
+ if args.active_dev_branch:
491
+ rs["active_dev_branch"] = args.active_dev_branch
492
+ if args.base_branch:
493
+ rs["base_branch"] = args.base_branch
494
+ if args.last_fatal_error_code:
495
+ rs["last_fatal_error_code"] = args.last_fatal_error_code
496
+ if args.continuation_summary_path:
497
+ rs["continuation_summary_path"] = args.continuation_summary_path
498
+ fingerprint = _load_progress_fingerprint(args.progress_fingerprint)
499
+ if fingerprint is not None:
500
+ rs["last_progress_fingerprint"] = fingerprint
501
+
463
502
 
464
503
  if session_status == "success":
465
504
  rs["infra_error_count"] = 0
@@ -503,10 +542,14 @@ def action_update(args, refactor_list_path, state_dir):
503
542
 
504
543
  if infra_error_count >= max_infra_retries:
505
544
  new_status = "failed"
545
+ rs["continuation_pending"] = False
546
+ rs["continuation_reason"] = session_status
547
+ rs["needs_attention"] = True
506
548
  if session_id:
507
549
  rs["last_failed_session_id"] = session_id
508
550
  else:
509
- new_status = "pending"
551
+ new_status = "in_progress"
552
+ _set_ai_error_continuation_metadata(rs, args, session_id, session_status)
510
553
 
511
554
  err = update_refactor_in_list(refactor_list_path, refactor_id, new_status)
512
555
  if err:
@@ -532,27 +575,25 @@ def action_update(args, refactor_list_path, state_dir):
532
575
  else:
533
576
  rs["retry_count"] = rs.get("retry_count", 0) + 1
534
577
 
535
- cleaned = cleanup_refactor_artifacts(
536
- state_dir=state_dir,
537
- refactor_id=refactor_id,
538
- project_root=args.project_root,
539
- )
540
-
541
578
  if rs["retry_count"] >= max_retries:
542
579
  new_status = "failed"
580
+ rs["continuation_pending"] = False
581
+ rs["continuation_reason"] = session_status
582
+ rs["needs_attention"] = True
543
583
  else:
544
- new_status = "pending"
584
+ new_status = "in_progress"
585
+ _set_ai_error_continuation_metadata(rs, args, session_id, session_status)
545
586
 
546
587
  rs["resume_from_phase"] = None
547
- rs["sessions"] = []
548
- rs["last_session_id"] = None
588
+ if session_id:
589
+ rs["last_failed_session_id"] = session_id
549
590
 
550
591
  err = update_refactor_in_list(refactor_list_path, refactor_id, new_status)
551
592
  if err:
552
593
  error_out("Failed to update .prizmkit/plans/refactor-list.json: {}".format(err))
553
594
  return
554
595
 
555
- if session_status == "success" and session_id:
596
+ if session_id:
556
597
  sessions = rs.get("sessions", [])
557
598
  if session_id not in sessions:
558
599
  sessions.append(session_id)
@@ -594,8 +635,9 @@ def action_update(args, refactor_list_path, state_dir):
594
635
  summary["degraded_reason"] = session_status
595
636
  summary["restart_policy"] = "finalization_retry"
596
637
  elif session_status == "infra_error":
597
- summary["restart_policy"] = "infra_retry"
638
+ summary["restart_policy"] = "in_process_ai_error_continuation" if new_status == "in_progress" else "needs_attention"
598
639
  summary["infra_error_count"] = rs.get("infra_error_count", 0)
640
+ summary.update(continuation_metadata_summary(rs))
599
641
  summary["artifacts_preserved"] = True
600
642
  elif session_status == "context_overflow":
601
643
  summary["restart_policy"] = "context_overflow_continuation"
@@ -606,8 +648,9 @@ def action_update(args, refactor_list_path, state_dir):
606
648
  summary.update(continuation_metadata_summary(rs))
607
649
  summary["artifacts_preserved"] = True
608
650
  elif session_status != "success":
609
- summary["restart_policy"] = "full_restart"
610
- summary["cleanup_performed"] = cleaned
651
+ summary["restart_policy"] = "in_process_ai_error_continuation" if new_status == "in_progress" else "needs_attention"
652
+ summary.update(continuation_metadata_summary(rs))
653
+ summary["artifacts_preserved"] = True
611
654
 
612
655
  print(json.dumps(summary, indent=2, ensure_ascii=False))
613
656
 
@@ -745,7 +745,7 @@ def resolve_prompt_platform(project_root):
745
745
  if resolution.platform:
746
746
  return resolution.platform
747
747
  raise RuntimeError(
748
- "PrizmKit agents not found. None of .claude/agents/, .codex/agents/, or .codebuddy/agents/ exists. "
748
+ "PrizmKit platform skills not found. None of .claude/commands/, .agents/skills/, or .codebuddy/skills/ exists. "
749
749
  "Run `npx prizmkit install` first, set .prizmkit/config.json ai_cli/platform, or set PRIZMKIT_PLATFORM=claude|codex|codebuddy explicitly."
750
750
  )
751
751
 
@@ -1,8 +1,8 @@
1
1
  # Dev-Pipeline Fallback Bootstrap Prompt
2
2
 
3
3
  > **Note**: This is an emergency fallback template. Normally, `generate-bootstrap-prompt.py`
4
- > selects a tier-specific template (`bootstrap-tier1.md`, `bootstrap-tier2.md`, or `bootstrap-tier3.md`).
5
- > If you are seeing this prompt, the tier-specific templates were not found.
4
+ > renders modular full guidance from `templates/sections/`. If sections are unavailable,
5
+ > it tries `bootstrap-tier3.md` before this last-resort fallback.
6
6
 
7
7
  ## Feature Context
8
8
 
@@ -50,7 +50,7 @@ You are running in **headless non-interactive mode** with a FINITE context windo
50
50
 
51
51
  0. **NON-INTERACTIVE MODE** — There is NO human on the other end. NEVER ask for user confirmation, NEVER wait for user input, NEVER use interactive prompts (e.g. "Would you like me to…"). If a skill has an interactive step (e.g. offer remediation, ask for approval), skip it and proceed autonomously. Make decisions based on the data available and move forward.
52
52
 
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
53
+ 1. **context-snapshot.md is your single source of truth** — After Phase 1-2 makes it available, use it instead of re-reading individual source files. If you just created or updated it in this session, continue from the in-context content; read it only when resuming/continuing, after context compaction/loss, or when handing work to a subagent.
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
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.
@@ -205,14 +205,13 @@ Before starting, check plan.md Tasks:
205
205
 
206
206
  **Build artifacts rule**: After any build/compile command, ensure output is in `.gitignore`. Never commit binaries/build output.
207
207
 
208
- **3a.** Run `/prizmkit-implement` directly — you (the orchestrator) execute the full cycle:
209
- - Read plan.md Tasks from `.prizmkit/specs/{{FEATURE_SLUG}}/`
210
- - Use context-snapshot.md Section 4 File Manifest for targeted reads do NOT re-read files already summarized there
208
+ **3a.** Run `/prizmkit-implement` directly:
209
+ - Continue from the `spec.md` / `plan.md` / `context-snapshot.md` content you created in Phase 1-2; do not re-read self-authored artifacts just because implementation starts
210
+ - Re-read `plan.md` or `context-snapshot.md` only when resuming/continuing, when current context was compacted or lost, or when task checkbox state may have changed outside this session
211
+ - If implementation is delegated to a Dev subagent, the subagent must read `spec.md` if the artifact exists, plus `plan.md` and `context-snapshot.md`, before editing
212
+ - Use context-snapshot.md Section 4 File Manifest for targeted source reads; avoid re-reading source files already summarized there unless they changed after the snapshot
211
213
  - Implements task-by-task, marking each `[x]` immediately
212
- - Creates/updates L2 `.prizm` docs when creating new modules
213
- - Defers scoped/full test execution until after the code-review loop completes
214
- - Preserves Reviewer behavior; only the top-level implementation Dev handoff is removed
215
- - If plan.md has >5 tasks: update checkpoints after every 3 tasks
214
+ - Remeber to update checkpoints after finishing a series of tasks
216
215
 
217
216
  **3b. Focused checks only (no test gate here)**:
218
217
  - During implementation, do not run mandatory periodic or full-suite tests.
@@ -241,7 +240,7 @@ For each Verification Gate from the Task Contract, write one evidence line to Im
241
240
 
242
241
  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.
243
242
 
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.
243
+ Run `/prizmkit-code-review` with `artifact_dir=.prizmkit/specs/{{FEATURE_SLUG}}/`. The skill chooses a platform-supported independent Reviewer strategy and verifies that the Reviewer's snapshot is equivalent to the current workspace under its skill-owned workspace protocol. Do not prescribe Agent launch parameters from this bootstrap prompt.
245
244
 
246
245
  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.
247
246
 
@@ -254,7 +253,7 @@ If GATE:MISSING:
254
253
  - Do not re-run `/prizmkit-code-review` in an unbounded report-repair loop.
255
254
  - Perform one bounded status check; retry at most once: inspect the skill output, `review-report.md` path, and any Reviewer agent spawn messages.
256
255
  - If the missing report is caused by Reviewer agent spawn or review skill error, retry `/prizmkit-code-review` at most once only if it appears transient.
257
- - If the report is still missing after that single check/retry, write `failure-log.md` with the spawn/skill error and last observable state, then either perform a safe inline fallback review (spec/plan/diff/tests → write `review-report.md` with `## Verdict`) or stop with a clear recovery failure.
256
+ - If the report is still missing after that single check/retry, write `failure-log.md` with the spawn/skill error and last observable state, then stop with a clear recovery failure. Do not synthesize a passing report through Main-Agent self-review.
258
257
 
259
258
  Read `review-report.md` and check the Verdict:
260
259
  - `PASS` → proceed to next phase
@@ -507,7 +506,6 @@ Rules for writing completion notes:
507
506
  |----------|------|
508
507
  | Feature Artifacts Dir | `.prizmkit/specs/{{FEATURE_SLUG}}/` |
509
508
  | Context Snapshot | `.prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md` |
510
- | Team Config | `{{TEAM_CONFIG_PATH}}` |
511
509
  | Project Root | {{PROJECT_ROOT}} |
512
510
  | Feature List Path | {{FEATURE_LIST_PATH}} |
513
511
 
@@ -180,6 +180,7 @@ After implement completes, verify:
180
180
  If `FAST_PATH=true` (≤ 2 tasks, obvious root cause), skip this phase entirely and mark checkpoint step `prizmkit-code-review` as `skipped` before continuing.
181
181
 
182
182
  Run `/prizmkit-code-review` with `artifact_dir=.prizmkit/bugfix/{{BUG_ID}}/`:
183
+ - The skill chooses a platform-supported independent Reviewer strategy and verifies a workspace-equivalent snapshot under its skill-owned protocol
183
184
  - The skill runs an internal review-fix loop (Reviewer → filter → orchestrator fix, max 3 rounds) and writes `review-report.md`
184
185
  - `review-report.md` must contain `## Verdict`
185
186
 
@@ -191,7 +192,7 @@ After `/prizmkit-code-review` returns, verify the review report:
191
192
  If GATE:MISSING:
192
193
  - Do not re-run `/prizmkit-code-review` in an unbounded report-repair loop.
193
194
  - Perform one bounded status check; retry `/prizmkit-code-review` at most once only if the missing report appears caused by a transient team/config/lock error.
194
- - If the report is still missing after that single check/retry, write `failure-log.md` with the spawn/skill error and last observable state, then either perform a safe inline fallback review (spec/plan/diff/tests write `review-report.md` with `## Verdict`) or stop with a clear recovery failure.
195
+ - If the report is still missing after that single check/retry, write `failure-log.md` with the spawn/skill error and last observable state, then stop with a clear recovery failure. Do not replace the independent Reviewer with Main-Agent self-review.
195
196
 
196
197
  Read `review-report.md` and check the Verdict:
197
198
  - `PASS` → proceed
@@ -139,7 +139,7 @@ Apply the browser behavior preservation protocol where UI behavior can be affect
139
139
 
140
140
  ### Phase 4: Review — Code Review & Behavior Verification
141
141
 
142
- Run `/prizmkit-code-review` with `artifact_dir=.prizmkit/refactor/{{REFACTOR_ID}}/` directly from the main orchestrator.
142
+ Run `/prizmkit-code-review` with `artifact_dir=.prizmkit/refactor/{{REFACTOR_ID}}/` directly from the main orchestrator. The skill loads its skill-owned `references/reviewer-agent-prompt.md` and `references/reviewer-workspace-protocol.md`, chooses a platform-supported independent Reviewer strategy, and verifies a workspace-equivalent snapshot.
143
143
 
144
144
  Review requirements:
145
145
  - verify refactor quality against spec.md and plan.md;
@@ -147,7 +147,7 @@ Review requirements:
147
147
  - run or confirm relevant tests;
148
148
  - write `.prizmkit/refactor/{{REFACTOR_ID}}/review-report.md` with `## Verdict`.
149
149
 
150
- If the report is missing after one bounded status check, write `failure-log.md` and either perform a safe inline fallback review or stop with a clear recovery failure.
150
+ If the report is missing after one bounded status check, write `failure-log.md` and stop with a clear recovery failure. Do not replace the independent Reviewer with Main-Agent self-review.
151
151
 
152
152
  **Checkpoint update**: set step `prizmkit-code-review` to `completed` in `{{CHECKPOINT_PATH}}`.
153
153
 
@@ -12,9 +12,9 @@ If `FAST_PATH=true`, skip this phase intentionally:
12
12
 
13
13
  Then continue to the next checkpoint step.
14
14
 
15
- Otherwise, run `/prizmkit-code-review` with `artifact_dir=.prizmkit/bugfix/{{BUG_ID}}/`.
15
+ Otherwise, run `/prizmkit-code-review` with `artifact_dir=.prizmkit/bugfix/{{BUG_ID}}/`. The skill loads its skill-owned Reviewer prompt and workspace protocol, chooses a platform-supported subagent strategy, and verifies that the Reviewer's snapshot is equivalent to the current workspace before review.
16
16
 
17
- The skill runs its internal Reviewer Agent → filter → orchestrator fix loop and writes `review-report.md`.
17
+ The skill runs its internal Reviewer Agent → filter → orchestrator fix loop and writes `review-report.md`. Do not prescribe Agent launch parameters from this pipeline template; the review skill owns strategy selection and workspace-equivalence verification.
18
18
 
19
19
  **Gate Check — Review Report**:
20
20
 
@@ -24,6 +24,6 @@ The skill runs its internal Reviewer Agent → filter → orchestrator fix loop
24
24
 
25
25
  - `PASS` → proceed.
26
26
  - `NEEDS_FIXES` → the skill exhausted its internal rounds; log remaining findings and proceed only when they do not block acceptance criteria.
27
- - Missing report → one bounded retry or safe inline fallback review, then write `failure-log.md` if still blocked.
27
+ - Missing report → one bounded retry, then write `failure-log.md` and stop if the independent review protocol remains blocked; do not replace it with Main-Agent self-review.
28
28
 
29
29
  **Checkpoint update**: Set step `prizmkit-code-review` to `completed` when review is complete, or `skipped` for FAST_PATH.
@@ -4,7 +4,7 @@ You are running in **headless non-interactive mode** with a FINITE context windo
4
4
 
5
5
  0. **NON-INTERACTIVE MODE** — There is NO human on the other end. NEVER ask for user confirmation, NEVER wait for user input, NEVER use interactive prompts (e.g. "Would you like me to…"). If a skill has an interactive step (e.g. offer remediation, ask for approval), skip it and proceed autonomously. Make decisions based on the data available and move forward.
6
6
 
7
- 1. **context-snapshot.md is your single source of truth** — After it is built, ALWAYS read context-snapshot.md instead of re-reading individual source files
7
+ 1. **context-snapshot.md is your single source of truth** — After it is available, use it instead of re-reading individual source files. If you just created or updated it in this session, continue from the in-context content; read it only when resuming/continuing, after context compaction/loss, or when handing work to a subagent.
8
8
  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.
9
9
  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.
10
10
  4. **Stay focused** — Do NOT explore code unrelated to this feature. No curiosity-driven reads.
@@ -4,5 +4,4 @@
4
4
  |----------|------|
5
5
  | Feature Artifacts Dir | `.prizmkit/specs/{{FEATURE_SLUG}}/` |
6
6
  | Context Snapshot | `.prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md` |
7
- | Reviewer Agent Def | {{REVIEWER_SUBAGENT_PATH}} |
8
7
  | Project Root | {{PROJECT_ROOT}} |
@@ -4,7 +4,5 @@
4
4
  |----------|------|
5
5
  | Feature Artifacts Dir | `.prizmkit/specs/{{FEATURE_SLUG}}/` |
6
6
  | Context Snapshot | `.prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md` |
7
- | Team Config | `{{TEAM_CONFIG_PATH}}` |
8
- | Reviewer Agent Def | {{REVIEWER_SUBAGENT_PATH}} |
9
7
  | Project Root | {{PROJECT_ROOT}} |
10
8
  | Feature List Path | {{FEATURE_LIST_PATH}} |
@@ -1,12 +1,17 @@
1
1
  ### Architecture Sync & Commit (SINGLE COMMIT) — DO NOT SKIP
2
2
 
3
- **a.** Check if feature already committed:
3
+ **a.** Check if feature already committed by inspecting recent git history for `{{FEATURE_ID}}`:
4
4
  ```bash
5
5
  git log --oneline
6
6
  ```
7
7
  - If a commit for `{{FEATURE_ID}}` already exists → **skip d** (do NOT run /prizmkit-committer, do NOT run git reset, do NOT stage or unstage anything). Proceed directly to e Final verification.
8
8
  - If no existing commit → proceed normally with b–d.
9
9
 
10
+ **Feature Documentation Policy**:
11
+ - Run `/prizmkit-retrospective` before commit to update `.prizmkit/prizm-docs/` with durable structural knowledge from this feature.
12
+ - Capture architecture knowledge when the feature adds interfaces, dependencies, observable behavior, modules, or durable TRAPS/RULES/DECISIONS.
13
+ - Commit prefix: `feat({{FEATURE_ID}}):`.
14
+
10
15
  **b.** Run `/prizmkit-retrospective` (**before commit**, maintains `.prizmkit/prizm-docs/` architecture index):
11
16
  1. **Structural sync**: update KEY_FILES/INTERFACES/DEPENDENCIES/file counts for changed modules
12
17
  2. **Architecture knowledge**: extract TRAPS, RULES, DECISIONS from completed work into `.prizmkit/prizm-docs/`
@@ -32,6 +37,8 @@ git status --short
32
37
  ```
33
38
  Working tree MUST be clean after this step. If any feature-related files remain, stage them explicitly and amend the SAME commit with `git commit --amend --no-edit`; do NOT create a separate commit.
34
39
 
40
+ **Exception**: `session-summary.md` in the artifact directory is a local cross-session artifact generated by `/prizmkit-committer` — it is NOT committed to git. Ignore it in the clean-tree check.
41
+
35
42
  **f.** Write completion summary for downstream dependency context:
36
43
 
37
44
  Write `.prizmkit/specs/{{FEATURE_SLUG}}/completion-summary.json` with the key changes from this session. This file is NOT committed to git — the pipeline runner reads it to propagate context to dependent features.
@@ -11,14 +11,13 @@ Before starting, check plan.md Tasks:
11
11
 
12
12
  **Build artifacts rule**: After any build/compile command, ensure output is in `.gitignore`. Never commit binaries/build output.
13
13
 
14
- **3a.** Run `/prizmkit-implement` directly — you (the orchestrator) execute the full cycle:
15
- - Read plan.md Tasks from `.prizmkit/specs/{{FEATURE_SLUG}}/`
16
- - Use context-snapshot.md Section 4 File Manifest for targeted reads do NOT re-read files already summarized there
14
+ **3a.** Run `/prizmkit-implement` directly:
15
+ - Continue from the `spec.md` / `plan.md` / `context-snapshot.md` content you created in Phase 1-2; do not re-read self-authored artifacts just because implementation starts
16
+ - Re-read `plan.md` or `context-snapshot.md` only when resuming/continuing, when current context was compacted or lost, or when task checkbox state may have changed outside this session
17
+ - If implementation is delegated to a Dev subagent, the subagent must read `spec.md` if the artifact exists, plus `plan.md` and `context-snapshot.md`, before editing
18
+ - Use context-snapshot.md Section 4 File Manifest for targeted source reads; avoid re-reading source files already summarized there unless they changed after the snapshot
17
19
  - Implements task-by-task, marking each `[x]` immediately
18
- - Creates/updates L2 `.prizm` docs when creating new modules
19
- - Defers scoped/full test execution until after the code-review loop completes
20
- - Preserves Reviewer behavior; only the top-level implementation Dev handoff is removed
21
- - If plan.md has >5 tasks: update checkpoints after every 3 tasks
20
+ - Remeber to update checkpoints after finishing a series of tasks
22
21
 
23
22
  **3b. Focused checks only (no test gate here)**:
24
23
  - During implementation, do not run mandatory periodic or full-suite tests.
@@ -11,14 +11,13 @@ Before starting, check plan.md Tasks:
11
11
 
12
12
  **Build artifacts rule**: After any build/compile command, ensure output is in `.gitignore`. Never commit binaries/build output.
13
13
 
14
- **3a.** Run `/prizmkit-implement` directly — you (the orchestrator) execute the full cycle:
15
- - Read plan.md Tasks from `.prizmkit/specs/{{FEATURE_SLUG}}/`
16
- - Use context-snapshot.md Section 4 File Manifest for targeted reads do NOT re-read files already summarized there
14
+ **3a.** Run `/prizmkit-implement` directly:
15
+ - Continue from the `spec.md` / `plan.md` / `context-snapshot.md` content you created in Phase 1-2; do not re-read self-authored artifacts just because implementation starts
16
+ - Re-read `plan.md` or `context-snapshot.md` only when resuming/continuing, when current context was compacted or lost, or when task checkbox state may have changed outside this session
17
+ - If implementation is delegated to a Dev subagent, the subagent must read `spec.md` if the artifact exists, plus `plan.md` and `context-snapshot.md`, before editing
18
+ - Use context-snapshot.md Section 4 File Manifest for targeted source reads; avoid re-reading source files already summarized there unless they changed after the snapshot
17
19
  - Implements task-by-task, marking each `[x]` immediately
18
- - Creates/updates L2 `.prizm` docs when creating new modules
19
- - Defers scoped/full test execution until after the code-review loop completes
20
- - Preserves Reviewer behavior; only the top-level implementation Dev handoff is removed
21
- - If plan.md has >5 tasks: update checkpoints after every 3 tasks
20
+ - Remeber to update checkpoints after finishing a series of tasks
22
21
 
23
22
  **3b. Focused checks only (no test gate here)**:
24
23
  - During implementation, do not run mandatory periodic or full-suite tests.
@@ -6,8 +6,10 @@
6
6
  - Follow Context Budget Rules §10 after build/compile commands.
7
7
 
8
8
  **3a.** Run `/prizmkit-implement` — this handles the implementation cycle:
9
- - Reads plan.md Tasks section from `.prizmkit/specs/{{FEATURE_SLUG}}/`
10
- - Reads context from `context-snapshot.md` (Prizm docs, TRAPS, file manifest)
9
+ - Continue from the plan/context you just created; do not re-read self-authored artifacts just because implementation starts
10
+ - Re-read plan.md or `context-snapshot.md` only when resuming/continuing, when current context was compacted or lost, or when task checkbox state may have changed outside this session
11
+ - If implementation is delegated to a subagent, the subagent must read `plan.md` and `context-snapshot.md` before editing
12
+ - Uses context from `context-snapshot.md` (Prizm docs, TRAPS, file manifest) for targeted source reads; avoid re-reading source files already summarized there unless they changed after the snapshot
11
13
  - Implements task-by-task, marking each `[x]` immediately
12
14
  - Creates/updates L2 `.prizm` docs when creating new modules or significantly modifying existing ones — AI selectively decides which modules warrant L2 based on complexity and importance
13
15
  - Does not run the scoped/full test gate; testing happens after code review in the PrizmKit Test phase