prizmkit 1.1.7 → 1.1.9

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 (132) hide show
  1. package/bundled/VERSION.json +3 -3
  2. package/bundled/adapters/codebuddy/skill-adapter.js +21 -7
  3. package/bundled/agents/prizm-dev-team-reviewer.md +53 -173
  4. package/bundled/dev-pipeline/.env.example +45 -0
  5. package/bundled/dev-pipeline/README.md +64 -64
  6. package/bundled/dev-pipeline/SCHEMA_ANALYSIS.md +535 -0
  7. package/bundled/dev-pipeline/assets/feature-list-example.json +0 -1
  8. package/bundled/dev-pipeline/launch-bugfix-daemon.sh +64 -18
  9. package/bundled/dev-pipeline/launch-feature-daemon.sh +15 -12
  10. package/bundled/dev-pipeline/launch-refactor-daemon.sh +64 -18
  11. package/bundled/dev-pipeline/lib/branch.sh +6 -1
  12. package/bundled/dev-pipeline/lib/common.sh +71 -0
  13. package/bundled/dev-pipeline/lib/heartbeat.sh +2 -2
  14. package/bundled/dev-pipeline/reset-bug.sh +10 -9
  15. package/bundled/dev-pipeline/reset-feature.sh +9 -8
  16. package/bundled/dev-pipeline/reset-refactor.sh +10 -9
  17. package/bundled/dev-pipeline/retry-bugfix.sh +67 -29
  18. package/bundled/dev-pipeline/retry-feature.sh +54 -18
  19. package/bundled/dev-pipeline/retry-refactor.sh +112 -29
  20. package/bundled/dev-pipeline/run-bugfix.sh +281 -59
  21. package/bundled/dev-pipeline/run-feature.sh +53 -18
  22. package/bundled/dev-pipeline/run-refactor.sh +392 -66
  23. package/bundled/dev-pipeline/scripts/check-session-status.py +24 -1
  24. package/bundled/dev-pipeline/scripts/cleanup-logs.py +2 -2
  25. package/bundled/dev-pipeline/scripts/detect-stuck.py +195 -85
  26. package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +57 -33
  27. package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +25 -9
  28. package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +104 -17
  29. package/bundled/dev-pipeline/scripts/init-bugfix-pipeline.py +34 -9
  30. package/bundled/dev-pipeline/scripts/init-pipeline.py +10 -10
  31. package/bundled/dev-pipeline/scripts/init-refactor-pipeline.py +19 -8
  32. package/bundled/dev-pipeline/scripts/parse-stream-progress.py +1 -5
  33. package/bundled/dev-pipeline/scripts/patch-completion-notes.py +191 -0
  34. package/bundled/dev-pipeline/scripts/update-bug-status.py +167 -22
  35. package/bundled/dev-pipeline/scripts/update-feature-status.py +104 -62
  36. package/bundled/dev-pipeline/scripts/update-refactor-status.py +351 -21
  37. package/bundled/dev-pipeline/templates/agent-prompts/dev-fix.md +1 -1
  38. package/bundled/dev-pipeline/templates/agent-prompts/reviewer-review.md +7 -11
  39. package/bundled/dev-pipeline/templates/bootstrap-prompt.md +41 -7
  40. package/bundled/dev-pipeline/templates/bootstrap-tier1.md +27 -3
  41. package/bundled/dev-pipeline/templates/bootstrap-tier2.md +43 -19
  42. package/bundled/dev-pipeline/templates/bootstrap-tier3.md +54 -26
  43. package/bundled/dev-pipeline/templates/bug-fix-list-schema.json +6 -15
  44. package/bundled/dev-pipeline/templates/bugfix-bootstrap-prompt.md +36 -25
  45. package/bundled/dev-pipeline/templates/feature-list-schema.json +109 -31
  46. package/bundled/dev-pipeline/templates/refactor-bootstrap-prompt.md +270 -0
  47. package/bundled/dev-pipeline/templates/refactor-list-schema.json +11 -3
  48. package/bundled/dev-pipeline/templates/sections/context-budget-rules.md +3 -1
  49. package/bundled/dev-pipeline/templates/sections/critical-paths-agent.md +1 -0
  50. package/bundled/dev-pipeline/templates/sections/feature-context.md +2 -0
  51. package/bundled/dev-pipeline/templates/sections/phase-commit-full.md +29 -2
  52. package/bundled/dev-pipeline/templates/sections/phase-commit.md +22 -0
  53. package/bundled/dev-pipeline/templates/sections/phase-deploy-verification.md +2 -2
  54. package/bundled/dev-pipeline/templates/sections/phase-review-agent.md +8 -6
  55. package/bundled/dev-pipeline/templates/sections/phase-review-full.md +7 -5
  56. package/bundled/dev-pipeline/templates/sections/phase-specify-plan-full.md +3 -3
  57. package/bundled/skills/_metadata.json +5 -22
  58. package/bundled/skills/app-planner/SKILL.md +98 -72
  59. package/bundled/skills/app-planner/assets/app-design-guide.md +1 -1
  60. package/bundled/skills/app-planner/references/architecture-decisions.md +1 -1
  61. package/bundled/skills/app-planner/references/project-brief-guide.md +69 -66
  62. package/bundled/skills/bug-fix-workflow/SKILL.md +52 -9
  63. package/bundled/skills/bug-planner/SKILL.md +139 -197
  64. package/bundled/skills/bug-planner/assets/bug-confirmation-template.md +43 -0
  65. package/bundled/skills/bug-planner/references/critic-and-verification.md +44 -0
  66. package/bundled/skills/bug-planner/references/error-recovery.md +73 -0
  67. package/bundled/skills/bug-planner/references/input-formats.md +53 -0
  68. package/bundled/skills/bug-planner/references/schema-validation.md +25 -0
  69. package/bundled/skills/bug-planner/references/severity-rules.md +16 -0
  70. package/bundled/skills/bug-planner/scripts/validate-bug-list.py +4 -8
  71. package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +34 -39
  72. package/bundled/skills/feature-pipeline-launcher/SKILL.md +49 -36
  73. package/bundled/skills/feature-pipeline-launcher/scripts/preflight-check.py +3 -3
  74. package/bundled/skills/feature-planner/SKILL.md +53 -142
  75. package/bundled/skills/feature-planner/assets/evaluation-guide.md +1 -1
  76. package/bundled/skills/feature-planner/assets/planning-guide.md +21 -5
  77. package/bundled/skills/feature-planner/references/browser-interaction.md +2 -4
  78. package/bundled/skills/feature-planner/references/completeness-review.md +57 -0
  79. package/bundled/skills/feature-planner/references/error-recovery.md +16 -35
  80. package/bundled/skills/feature-planner/references/incremental-feature-planning.md +1 -1
  81. package/bundled/skills/feature-planner/references/new-project-planning.md +2 -2
  82. package/bundled/skills/feature-planner/scripts/validate-and-generate.py +19 -20
  83. package/bundled/skills/feature-workflow/SKILL.md +24 -25
  84. package/bundled/skills/prizm-kit/SKILL.md +39 -49
  85. package/bundled/skills/prizmkit-code-review/SKILL.md +51 -64
  86. package/bundled/skills/prizmkit-code-review/rules/dimensions.md +85 -0
  87. package/bundled/skills/prizmkit-code-review/rules/fix-strategy.md +11 -11
  88. package/bundled/skills/prizmkit-committer/SKILL.md +3 -31
  89. package/bundled/skills/prizmkit-deploy/SKILL.md +34 -31
  90. package/bundled/skills/prizmkit-deploy/assets/deploy-template.md +1 -1
  91. package/bundled/skills/prizmkit-implement/SKILL.md +35 -68
  92. package/bundled/skills/prizmkit-init/SKILL.md +112 -65
  93. package/bundled/skills/prizmkit-init/assets/project-brief-template.md +82 -0
  94. package/bundled/skills/prizmkit-plan/SKILL.md +120 -79
  95. package/bundled/skills/prizmkit-plan/assets/plan-template.md +28 -18
  96. package/bundled/skills/prizmkit-plan/assets/spec-template.md +28 -11
  97. package/bundled/skills/prizmkit-plan/references/clarify-guide.md +3 -3
  98. package/bundled/skills/prizmkit-plan/references/verification-checklist.md +60 -0
  99. package/bundled/skills/prizmkit-prizm-docs/SKILL.md +10 -81
  100. package/bundled/skills/prizmkit-prizm-docs/assets/{PRIZM-SPEC.md → prizm-docs-format.md} +41 -526
  101. package/bundled/skills/prizmkit-prizm-docs/references/op-init.md +46 -0
  102. package/bundled/skills/prizmkit-prizm-docs/references/op-rebuild.md +16 -0
  103. package/bundled/skills/prizmkit-prizm-docs/references/op-status.md +14 -0
  104. package/bundled/skills/prizmkit-prizm-docs/references/op-update.md +19 -0
  105. package/bundled/skills/prizmkit-prizm-docs/references/op-validate.md +17 -0
  106. package/bundled/skills/prizmkit-retrospective/SKILL.md +27 -65
  107. package/bundled/skills/prizmkit-retrospective/references/knowledge-injection-steps.md +3 -4
  108. package/bundled/skills/prizmkit-retrospective/references/structural-sync-steps.md +7 -25
  109. package/bundled/skills/recovery-workflow/SKILL.md +22 -22
  110. package/bundled/skills/recovery-workflow/evals/evals.json +5 -5
  111. package/bundled/skills/recovery-workflow/scripts/detect-recovery-state.py +43 -10
  112. package/bundled/skills/refactor-pipeline-launcher/SKILL.md +48 -40
  113. package/bundled/skills/refactor-planner/SKILL.md +43 -61
  114. package/bundled/skills/refactor-planner/scripts/validate-and-generate-refactor.py +17 -17
  115. package/bundled/skills/refactor-workflow/SKILL.md +23 -24
  116. package/bundled/team/prizm-dev-team.json +1 -1
  117. package/bundled/{skills/prizm-kit/assets → templates}/project-memory-template.md +1 -1
  118. package/package.json +1 -1
  119. package/src/clean.js +3 -4
  120. package/src/gitignore-template.js +7 -9
  121. package/src/scaffold.js +14 -5
  122. package/bundled/dev-pipeline/templates/agent-prompts/reviewer-analyze.md +0 -5
  123. package/bundled/dev-pipeline/templates/sections/phase-analyze-agent.md +0 -19
  124. package/bundled/dev-pipeline/templates/sections/phase-analyze-full.md +0 -19
  125. package/bundled/skills/app-planner/references/project-conventions.md +0 -93
  126. package/bundled/skills/prizmkit-analyze/SKILL.md +0 -207
  127. package/bundled/skills/prizmkit-code-review/rules/dimensions-bugfix.md +0 -25
  128. package/bundled/skills/prizmkit-code-review/rules/dimensions-feature.md +0 -43
  129. package/bundled/skills/prizmkit-code-review/rules/dimensions-refactor.md +0 -25
  130. package/bundled/skills/prizmkit-implement/references/deploy-guide-protocol.md +0 -69
  131. package/bundled/skills/prizmkit-verify/SKILL.md +0 -281
  132. package/bundled/skills/prizmkit-verify/scripts/verify-light.py +0 -402
@@ -5,12 +5,12 @@ set -euo pipefail
5
5
  # dev-pipeline/run-bugfix.sh - Autonomous Bug Fix Pipeline Runner
6
6
  #
7
7
  # Drives the prizm-dev-team through iterative AI CLI sessions to
8
- # fix bugs from a bug-fix-list.json specification.
8
+ # fix bugs from a .prizmkit/plans/bug-fix-list.json specification.
9
9
  #
10
10
  # Usage:
11
- # ./run-bugfix.sh run [bug-fix-list.json] Run all bugs
11
+ # ./run-bugfix.sh run [.prizmkit/plans/bug-fix-list.json] Run all bugs
12
12
  # ./run-bugfix.sh run <bug-id> [options] Run a single bug
13
- # ./run-bugfix.sh status [bug-fix-list.json] Show pipeline status
13
+ # ./run-bugfix.sh status [.prizmkit/plans/bug-fix-list.json] Show pipeline status
14
14
  # ./run-bugfix.sh reset Clear all state
15
15
  #
16
16
  # Environment Variables:
@@ -30,7 +30,8 @@ set -euo pipefail
30
30
  # ============================================================
31
31
 
32
32
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
33
- STATE_DIR="$SCRIPT_DIR/bugfix-state"
33
+ PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
34
+ STATE_DIR="${PROJECT_ROOT}/.prizmkit/state/bugfix"
34
35
  SCRIPTS_DIR="$SCRIPT_DIR/scripts"
35
36
 
36
37
  # Configuration
@@ -42,6 +43,7 @@ LOG_CLEANUP_ENABLED=${LOG_CLEANUP_ENABLED:-1}
42
43
  LOG_RETENTION_DAYS=${LOG_RETENTION_DAYS:-14}
43
44
  LOG_MAX_TOTAL_MB=${LOG_MAX_TOTAL_MB:-1024}
44
45
  VERBOSE=${VERBOSE:-0}
46
+ MODEL=${MODEL:-""}
45
47
  DEV_BRANCH=${DEV_BRANCH:-""}
46
48
  AUTO_PUSH=${AUTO_PUSH:-0}
47
49
 
@@ -76,7 +78,8 @@ spawn_and_wait_session() {
76
78
  local bootstrap_prompt="$4"
77
79
  local session_dir="$5"
78
80
  local max_retries="$6"
79
- local base_branch="${7:-main}"
81
+ local item_model="${7:-}"
82
+ local base_branch="${8:-main}"
80
83
 
81
84
  local session_log="$session_dir/logs/session.log"
82
85
  local progress_json="$session_dir/logs/progress.json"
@@ -94,7 +97,9 @@ spawn_and_wait_session() {
94
97
  fi
95
98
 
96
99
  local model_flag=""
97
- if [[ -n "${MODEL:-}" ]]; then
100
+ if [[ -n "$item_model" ]]; then
101
+ model_flag="--model $item_model"
102
+ elif [[ -n "${MODEL:-}" ]]; then
98
103
  model_flag="--model $MODEL"
99
104
  fi
100
105
 
@@ -102,6 +107,9 @@ spawn_and_wait_session() {
102
107
  # within an existing Claude Code session (e.g. via launch-bugfix-daemon.sh).
103
108
  unset CLAUDECODE 2>/dev/null || true
104
109
 
110
+ # Log bootstrap prompt in test mode
111
+ prizm_log_bootstrap_prompt "$bootstrap_prompt" "$bug_id"
112
+
105
113
  case "$CLI_CMD" in
106
114
  *claude*)
107
115
  # Claude Code: prompt via -p, --dangerously-skip-permissions for auto-accept
@@ -272,7 +280,7 @@ sys.exit(0)
272
280
  --max-retries "$max_retries" \
273
281
  --action update >/dev/null 2>&1 || true
274
282
 
275
- # Commit bug-fix-list.json status update (pipeline management commit)
283
+ # Commit .prizmkit/plans/bug-fix-list.json status update (pipeline management commit)
276
284
  if ! git -C "$project_root" diff --quiet "$bug_list" 2>/dev/null; then
277
285
  git -C "$project_root" add "$bug_list"
278
286
  git -C "$project_root" commit --no-verify -m "chore($bug_id): update bug status" 2>/dev/null || true
@@ -354,6 +362,8 @@ run_one() {
354
362
  local dry_run=false
355
363
  local do_clean=false
356
364
  local no_reset=false
365
+ local mode_override=""
366
+ local critic_override=""
357
367
 
358
368
  while [[ $# -gt 0 ]]; do
359
369
  case "$1" in
@@ -361,6 +371,20 @@ run_one() {
361
371
  --clean) do_clean=true; shift ;;
362
372
  --no-reset) no_reset=true; shift ;;
363
373
  --timeout) shift; SESSION_TIMEOUT="${1:-0}"; shift ;;
374
+ --mode)
375
+ shift
376
+ if [[ $# -eq 0 ]]; then
377
+ log_error "--mode requires a value (lite|standard|full)"
378
+ exit 1
379
+ fi
380
+ case "$1" in
381
+ lite|standard|full) mode_override="$1" ;;
382
+ *) log_error "Invalid mode: $1 (must be lite, standard, or full)"; exit 1 ;;
383
+ esac
384
+ shift
385
+ ;;
386
+ --critic) critic_override="true"; shift ;;
387
+ --no-critic) critic_override="false"; shift ;;
364
388
  B-*|b-*) bug_id="$1"; shift ;;
365
389
  *) bug_list="$1"; shift ;;
366
390
  esac
@@ -374,7 +398,7 @@ run_one() {
374
398
  fi
375
399
 
376
400
  if [[ -z "$bug_list" ]]; then
377
- bug_list="bug-fix-list.json"
401
+ bug_list=".prizmkit/plans/bug-fix-list.json"
378
402
  fi
379
403
  if [[ ! "$bug_list" = /* ]]; then
380
404
  bug_list="$(pwd)/$bug_list"
@@ -403,7 +427,7 @@ run_one() {
403
427
  local _gitignore_path
404
428
  _gitignore_path="$(cd "$SCRIPT_DIR/.." && pwd)/.gitignore"
405
429
  local _state_rel
406
- _state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo "dev-pipeline/bugfix-state")
430
+ _state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo ".prizmkit/state/bugfix")
407
431
  if [[ -f "$_gitignore_path" ]]; then
408
432
  if ! grep -qF "$_state_rel" "$_gitignore_path" 2>/dev/null; then
409
433
  printf '\n# Pipeline runtime state (auto-added by dev-pipeline)\n%s/\n' "$_state_rel" >> "$_gitignore_path"
@@ -493,16 +517,66 @@ sys.exit(1)
493
517
 
494
518
  bootstrap_prompt="$session_dir/bootstrap-prompt.md"
495
519
 
520
+ # Read retry count from status.json
521
+ local retry_count
522
+ retry_count=$(python3 -c "
523
+ import json, os
524
+ status_path = os.path.join('$STATE_DIR', 'bugs', '$bug_id', 'status.json')
525
+ if os.path.isfile(status_path):
526
+ with open(status_path) as f:
527
+ d = json.load(f)
528
+ print(d.get('retry_count', 0))
529
+ else:
530
+ print(0)
531
+ " 2>/dev/null || echo "0")
532
+ local resume_phase
533
+ resume_phase=$(python3 -c "
534
+ import json, os
535
+ status_path = os.path.join('$STATE_DIR', 'bugs', '$bug_id', 'status.json')
536
+ if os.path.isfile(status_path):
537
+ with open(status_path) as f:
538
+ d = json.load(f)
539
+ print(d.get('resume_from_phase') or 'null')
540
+ else:
541
+ print('null')
542
+ " 2>/dev/null || echo "null")
543
+
496
544
  log_info "Generating bugfix bootstrap prompt..."
497
- python3 "$SCRIPTS_DIR/generate-bugfix-prompt.py" \
498
- --bug-list "$bug_list" \
499
- --bug-id "$bug_id" \
500
- --session-id "$session_id" \
501
- --run-id "$run_id" \
502
- --retry-count 0 \
503
- --resume-phase "null" \
504
- --state-dir "$STATE_DIR" \
505
- --output "$bootstrap_prompt" >/dev/null 2>&1
545
+ local prompt_args=(
546
+ --bug-list "$bug_list"
547
+ --bug-id "$bug_id"
548
+ --session-id "$session_id"
549
+ --run-id "$run_id"
550
+ --retry-count "$retry_count"
551
+ --resume-phase "$resume_phase"
552
+ --state-dir "$STATE_DIR"
553
+ --output "$bootstrap_prompt"
554
+ )
555
+
556
+ if [[ -n "$mode_override" ]]; then
557
+ prompt_args+=(--mode "$mode_override")
558
+ elif [[ -n "${PIPELINE_MODE:-}" ]]; then
559
+ prompt_args+=(--mode "$PIPELINE_MODE")
560
+ fi
561
+
562
+ if [[ -n "${critic_override:-}" ]]; then
563
+ prompt_args+=(--critic "$critic_override")
564
+ elif [[ "${ENABLE_CRITIC:-}" == "true" || "${ENABLE_CRITIC:-}" == "1" ]]; then
565
+ prompt_args+=(--critic "true")
566
+ elif [[ "${ENABLE_CRITIC:-}" == "false" || "${ENABLE_CRITIC:-}" == "0" ]]; then
567
+ prompt_args+=(--critic "false")
568
+ fi
569
+
570
+ local gen_output
571
+ gen_output=$(python3 "$SCRIPTS_DIR/generate-bugfix-prompt.py" "${prompt_args[@]}" 2>/dev/null) || {
572
+ log_error "Failed to generate bootstrap prompt for $bug_id"
573
+ return 1
574
+ }
575
+ local bug_model pipeline_mode agent_count critic_enabled
576
+ bug_model=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('model',''))" 2>/dev/null || echo "")
577
+ pipeline_mode=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('pipeline_mode','standard'))" 2>/dev/null || echo "standard")
578
+ agent_count=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('agent_count',3))" 2>/dev/null || echo "3")
579
+ critic_enabled=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('critic_enabled','false'))" 2>/dev/null || echo "false")
506
580
 
507
581
  if [[ "$dry_run" == true ]]; then
508
582
  echo ""
@@ -511,6 +585,20 @@ sys.exit(1)
511
585
  echo -e "${BOLD} Severity: $bug_severity${NC}"
512
586
  echo -e "${BOLD}════════════════════════════════════════════════════${NC}"
513
587
  echo ""
588
+ log_info "Session ID: $session_id"
589
+ if [[ -n "$mode_override" ]]; then
590
+ log_info "Mode Override: $mode_override"
591
+ fi
592
+ log_info "Pipeline mode: $pipeline_mode"
593
+ log_info "Agents: $agent_count (critic: $([ "$critic_enabled" = "true" ] && echo "enabled" || echo "disabled"))"
594
+ if [[ -n "$bug_model" ]]; then
595
+ log_info "Bug Model: $bug_model"
596
+ elif [[ -n "$MODEL" ]]; then
597
+ log_info "Model (env): $MODEL"
598
+ else
599
+ log_info "Model: (CLI default)"
600
+ fi
601
+ echo ""
514
602
  log_info "Bootstrap prompt written to:"
515
603
  echo " $bootstrap_prompt"
516
604
  echo ""
@@ -527,6 +615,18 @@ sys.exit(1)
527
615
  log_info "Session ID: $session_id"
528
616
  log_info "Prompt: $bootstrap_prompt"
529
617
  log_info "Log: $session_dir/logs/session.log"
618
+ local _run_one_mode_desc
619
+ case "$pipeline_mode" in
620
+ lite) _run_one_mode_desc="Tier 1 — Single Agent" ;;
621
+ standard) _run_one_mode_desc="Tier 2 — Orchestrator + Dev + Reviewer" ;;
622
+ full) _run_one_mode_desc="Tier 3 — Full Team (+ Multi-Critic)" ;;
623
+ *) _run_one_mode_desc="$pipeline_mode" ;;
624
+ esac
625
+ log_info "Pipeline mode: ${BOLD}$pipeline_mode${NC} ($_run_one_mode_desc)"
626
+ log_info "Agents: $agent_count (critic: $([ "$critic_enabled" = "true" ] && echo "enabled" || echo "disabled"))"
627
+ if [[ -n "$bug_model" ]]; then
628
+ log_info "Bug model: $bug_model"
629
+ fi
530
630
  echo -e "${BOLD}════════════════════════════════════════════════════${NC}"
531
631
  echo ""
532
632
 
@@ -561,7 +661,7 @@ sys.exit(1)
561
661
 
562
662
  spawn_and_wait_session \
563
663
  "$bug_id" "$bug_list" "$session_id" \
564
- "$bootstrap_prompt" "$session_dir" 999 "$_ORIGINAL_BRANCH"
664
+ "$bootstrap_prompt" "$session_dir" 999 "$bug_model" "$_ORIGINAL_BRANCH"
565
665
  local session_status="$_SPAWN_RESULT"
566
666
 
567
667
  # Merge dev branch back to original on success
@@ -591,7 +691,7 @@ sys.exit(1)
591
691
  # ============================================================
592
692
 
593
693
  main() {
594
- local bug_list="${1:-bug-fix-list.json}"
694
+ local bug_list="${1:-.prizmkit/plans/bug-fix-list.json}"
595
695
 
596
696
  if [[ ! "$bug_list" = /* ]]; then
597
697
  bug_list="$(pwd)/$bug_list"
@@ -601,7 +701,7 @@ main() {
601
701
  if [[ ! -f "$bug_list" ]]; then
602
702
  log_error "Bug fix list not found: $bug_list"
603
703
  log_info "Create a bug fix list first using the bug-planner skill,"
604
- log_info "or provide a path: ./run-bugfix.sh run <path-to-bug-fix-list.json>"
704
+ log_info "or provide a path: ./run-bugfix.sh run <path-to-.prizmkit/plans/bug-fix-list.json>"
605
705
  exit 1
606
706
  fi
607
707
 
@@ -633,7 +733,7 @@ main() {
633
733
  local _gitignore_path
634
734
  _gitignore_path="$(cd "$SCRIPT_DIR/.." && pwd)/.gitignore"
635
735
  local _state_rel
636
- _state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo "dev-pipeline/bugfix-state")
736
+ _state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo ".prizmkit/state/bugfix")
637
737
  if [[ -f "$_gitignore_path" ]]; then
638
738
  if ! grep -qF "$_state_rel" "$_gitignore_path" 2>/dev/null; then
639
739
  printf '\n# Pipeline runtime state (auto-added by dev-pipeline)\n%s/\n' "$_state_rel" >> "$_gitignore_path"
@@ -664,23 +764,13 @@ main() {
664
764
  echo -e "${BOLD}════════════════════════════════════════════════════${NC}"
665
765
  echo ""
666
766
 
667
- # Branch lifecycle: create bugfix branch for this pipeline run
767
+ # Branch lifecycle: per-bug branches (like feature pipeline)
668
768
  local _proj_root
669
769
  _proj_root="$(cd "$SCRIPT_DIR/.." && pwd)"
670
770
  local _source_branch
671
771
  _source_branch=$(git -C "$_proj_root" rev-parse --abbrev-ref HEAD 2>/dev/null || echo "main")
672
772
  _ORIGINAL_BRANCH="$_source_branch"
673
773
 
674
- local run_id_for_branch
675
- run_id_for_branch=$(jq -r '.run_id' "$STATE_DIR/pipeline.json" 2>/dev/null || echo "$$")
676
- local _branch_name="${DEV_BRANCH:-bugfix/pipeline-${run_id_for_branch}}"
677
- if branch_create "$_proj_root" "$_branch_name" "$_source_branch"; then
678
- _DEV_BRANCH_NAME="$_branch_name"
679
- log_info "Dev branch: $_branch_name"
680
- else
681
- log_warn "Failed to create bugfix branch; running on current branch: $_source_branch"
682
- fi
683
-
684
774
  local session_count=0
685
775
  local total_subagent_calls=0
686
776
 
@@ -704,15 +794,6 @@ main() {
704
794
  log_success " Total subagent calls: $total_subagent_calls"
705
795
  log_success "════════════════════════════════════════════════════"
706
796
 
707
- # Merge dev branch back to original
708
- if [[ -n "$_DEV_BRANCH_NAME" ]]; then
709
- if branch_merge "$_proj_root" "$_DEV_BRANCH_NAME" "$_ORIGINAL_BRANCH" "$AUTO_PUSH"; then
710
- _DEV_BRANCH_NAME=""
711
- else
712
- log_warn "Auto-merge failed — dev branch preserved: $_DEV_BRANCH_NAME"
713
- log_warn "Merge manually: git checkout $_ORIGINAL_BRANCH && git rebase $_DEV_BRANCH_NAME"
714
- fi
715
- fi
716
797
  break
717
798
  fi
718
799
 
@@ -741,6 +822,23 @@ main() {
741
822
  fi
742
823
  echo -e "${BOLD}────────────────────────────────────────────────────${NC}"
743
824
 
825
+ # Pre-commit any dirty tree from previous iteration
826
+ if ! git -C "$_proj_root" diff --quiet HEAD 2>/dev/null || [ -n "$(git -C "$_proj_root" ls-files --others --exclude-standard 2>/dev/null)" ]; then
827
+ log_info "Dirty working tree detected — committing before $bug_id..."
828
+ git -C "$_proj_root" add -A 2>/dev/null || true
829
+ git -C "$_proj_root" commit --no-verify -m "chore: capture artifacts before $bug_id session" 2>/dev/null || true
830
+ fi
831
+
832
+ # Create per-bug dev branch
833
+ local _bug_branch="${DEV_BRANCH:-bugfix/${bug_id}-$(date +%Y%m%d%H%M)}"
834
+ if branch_create "$_proj_root" "$_bug_branch" "$_ORIGINAL_BRANCH"; then
835
+ _DEV_BRANCH_NAME="$_bug_branch"
836
+ log_info "Dev branch: $_bug_branch"
837
+ else
838
+ log_warn "Failed to create dev branch; running on current branch: $_ORIGINAL_BRANCH"
839
+ _DEV_BRANCH_NAME=""
840
+ fi
841
+
744
842
  # Generate session
745
843
  local session_id run_id
746
844
  run_id=$(jq -r '.run_id' "$STATE_DIR/pipeline.json")
@@ -750,19 +848,61 @@ main() {
750
848
  mkdir -p "$session_dir/logs"
751
849
 
752
850
  local bootstrap_prompt="$session_dir/bootstrap-prompt.md"
753
- python3 "$SCRIPTS_DIR/generate-bugfix-prompt.py" \
851
+
852
+ local main_prompt_args=(
853
+ --bug-list "$bug_list"
854
+ --bug-id "$bug_id"
855
+ --session-id "$session_id"
856
+ --run-id "$run_id"
857
+ --retry-count "$retry_count"
858
+ --resume-phase "$resume_phase"
859
+ --state-dir "$STATE_DIR"
860
+ --output "$bootstrap_prompt"
861
+ )
862
+
863
+ # Support PIPELINE_MODE env var (set by launch-bugfix-daemon.sh --mode)
864
+ if [[ -n "${PIPELINE_MODE:-}" ]]; then
865
+ main_prompt_args+=(--mode "$PIPELINE_MODE")
866
+ fi
867
+
868
+ # Support ENABLE_CRITIC env var (set by launch-bugfix-daemon.sh --critic)
869
+ if [[ "${ENABLE_CRITIC:-}" == "true" || "${ENABLE_CRITIC:-}" == "1" ]]; then
870
+ main_prompt_args+=(--critic "true")
871
+ elif [[ "${ENABLE_CRITIC:-}" == "false" || "${ENABLE_CRITIC:-}" == "0" ]]; then
872
+ main_prompt_args+=(--critic "false")
873
+ fi
874
+
875
+ local gen_output
876
+ gen_output=$(python3 "$SCRIPTS_DIR/generate-bugfix-prompt.py" "${main_prompt_args[@]}" 2>/dev/null) || {
877
+ log_error "Failed to generate bootstrap prompt for $bug_id"
878
+ continue
879
+ }
880
+ local bug_model pipeline_mode agent_count critic_enabled
881
+ bug_model=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('model',''))" 2>/dev/null || echo "")
882
+ pipeline_mode=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('pipeline_mode','standard'))" 2>/dev/null || echo "standard")
883
+ agent_count=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('agent_count',3))" 2>/dev/null || echo "3")
884
+ critic_enabled=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('critic_enabled','false'))" 2>/dev/null || echo "false")
885
+
886
+ # Log pipeline mode and agent configuration
887
+ local _mode_desc
888
+ case "$pipeline_mode" in
889
+ lite) _mode_desc="Tier 1 — Single Agent" ;;
890
+ standard) _mode_desc="Tier 2 — Orchestrator + Dev + Reviewer" ;;
891
+ full) _mode_desc="Tier 3 — Full Team (+ Multi-Critic)" ;;
892
+ *) _mode_desc="$pipeline_mode" ;;
893
+ esac
894
+ log_info "Pipeline mode: ${BOLD}$pipeline_mode${NC} ($_mode_desc)"
895
+ log_info "Agents: $agent_count (critic: $([ "$critic_enabled" = "true" ] && echo "enabled" || echo "disabled"))"
896
+ if [[ -n "$bug_model" ]]; then
897
+ log_info "Bug model: $bug_model"
898
+ fi
899
+
900
+ # Mark bug as in-progress before spawning session
901
+ python3 "$SCRIPTS_DIR/update-bug-status.py" \
754
902
  --bug-list "$bug_list" \
755
- --bug-id "$bug_id" \
756
- --session-id "$session_id" \
757
- --run-id "$run_id" \
758
- --retry-count "$retry_count" \
759
- --resume-phase "$resume_phase" \
760
903
  --state-dir "$STATE_DIR" \
761
- --output "$bootstrap_prompt" >/dev/null 2>&1
762
-
763
- # Log agent configuration (bugfix always uses dual-agent: Orchestrator + Dev + Reviewer)
764
- log_info "Pipeline mode: ${BOLD}standard${NC} (Dual Agent — Orchestrator + Dev + Reviewer)"
765
- log_info "Agents: 3 (critic: disabled)"
904
+ --bug-id "$bug_id" \
905
+ --action start >/dev/null 2>&1 || true
766
906
 
767
907
  # Spawn session
768
908
  log_info "Spawning AI CLI session: $session_id"
@@ -770,11 +910,53 @@ main() {
770
910
 
771
911
  spawn_and_wait_session \
772
912
  "$bug_id" "$bug_list" "$session_id" \
773
- "$bootstrap_prompt" "$session_dir" "$MAX_RETRIES" "$_ORIGINAL_BRANCH"
913
+ "$bootstrap_prompt" "$session_dir" "$MAX_RETRIES" "$bug_model" "$_ORIGINAL_BRANCH"
914
+
915
+ local session_status="$_SPAWN_RESULT"
916
+
917
+ # Merge per-bug dev branch back to original on success
918
+ if [[ "$session_status" == "success" && -n "$_DEV_BRANCH_NAME" ]]; then
919
+ if branch_merge "$_proj_root" "$_DEV_BRANCH_NAME" "$_ORIGINAL_BRANCH" "$AUTO_PUSH"; then
920
+ _DEV_BRANCH_NAME=""
921
+ else
922
+ log_warn "Auto-merge failed — dev branch preserved: $_DEV_BRANCH_NAME"
923
+ log_warn "Merge manually: git checkout $_ORIGINAL_BRANCH && git rebase $_DEV_BRANCH_NAME"
924
+ git -C "$_proj_root" checkout "$_ORIGINAL_BRANCH" 2>/dev/null || true
925
+ _DEV_BRANCH_NAME=""
926
+ fi
927
+ elif [[ -n "$_DEV_BRANCH_NAME" ]]; then
928
+ # Session failed — return to original branch, preserve dev branch for inspection
929
+ if ! git -C "$_proj_root" checkout "$_ORIGINAL_BRANCH" 2>/dev/null; then
930
+ log_warn "Failed to checkout $_ORIGINAL_BRANCH after session failure — staying on dev branch"
931
+ fi
932
+ log_warn "Session failed — dev branch preserved for inspection: $_DEV_BRANCH_NAME"
933
+ _DEV_BRANCH_NAME=""
934
+ fi
774
935
 
775
936
  session_count=$((session_count + 1))
776
937
  total_subagent_calls=$((total_subagent_calls + _SUBAGENT_COUNT))
777
938
 
939
+ # Stuck detection
940
+ if python3 "$SCRIPTS_DIR/detect-stuck.py" \
941
+ --state-dir "$STATE_DIR" \
942
+ --pipeline-type bugfix \
943
+ --bug-list "$bug_list" \
944
+ --max-retries "$MAX_RETRIES" \
945
+ 2>/dev/null | jq -e '.stuck_count > 0' >/dev/null 2>&1; then
946
+ log_warn "STUCK_DETECTED: Some bugs may be stuck — run detect-stuck.py for details"
947
+ fi
948
+
949
+ # Completion notes propagation (on success)
950
+ if [ "$_SPAWN_RESULT" = "success" ]; then
951
+ local _summary_path="$_proj_root/.prizmkit/bugfix/${bug_id}/completion-summary.json"
952
+ if [ -f "$_summary_path" ]; then
953
+ python3 "$SCRIPTS_DIR/patch-completion-notes.py" \
954
+ --bug-list "$bug_list" \
955
+ --bug-id "$bug_id" \
956
+ --summary "$_summary_path" 2>/dev/null || true
957
+ fi
958
+ fi
959
+
778
960
  log_info "Pausing 5s before next bug..."
779
961
  sleep 5
780
962
  done
@@ -788,9 +970,9 @@ show_help() {
788
970
  echo "Usage: $0 <command> [options]"
789
971
  echo ""
790
972
  echo "Commands:"
791
- echo " run [bug-fix-list.json] Run all bugs by severity/priority order"
973
+ echo " run [.prizmkit/plans/bug-fix-list.json] Run all bugs by severity/priority order"
792
974
  echo " run <bug-id> [options] Run a single bug fix"
793
- echo " status [bug-fix-list.json] Show bug fix pipeline status"
975
+ echo " status [.prizmkit/plans/bug-fix-list.json] Show bug fix pipeline status"
794
976
  echo " reset Clear all bugfix state"
795
977
  echo " help Show this help message"
796
978
  echo ""
@@ -799,10 +981,16 @@ show_help() {
799
981
  echo " --clean Delete artifacts and reset before running"
800
982
  echo " --no-reset Skip status reset (preserve retry count)"
801
983
  echo " --timeout N Session timeout in seconds (default: 0 = no limit)"
984
+ echo " --mode <lite|standard|full> Override pipeline mode"
985
+ echo " --critic Enable adversarial critic review"
986
+ echo " --no-critic Disable adversarial critic review"
802
987
  echo ""
803
988
  echo "Environment Variables:"
804
989
  echo " MAX_RETRIES Max retries per bug (default: 3)"
805
990
  echo " SESSION_TIMEOUT Session timeout in seconds (default: 0 = no limit)"
991
+ echo " MODEL Default AI model (overridden by per-bug model in bug list)"
992
+ echo " PIPELINE_MODE Default pipeline mode: lite|standard|full (overridden by --mode)"
993
+ echo " ENABLE_CRITIC Enable/disable critic: true|false|1|0 (overridden by --critic/--no-critic)"
806
994
  echo " AI_CLI AI CLI command name (auto-detected: cbc or claude)"
807
995
  echo " VERBOSE Set to 1 for verbose AI CLI output"
808
996
  echo " HEARTBEAT_INTERVAL Heartbeat log interval in seconds (default: 30)"
@@ -812,7 +1000,7 @@ show_help() {
812
1000
  echo ""
813
1001
  echo "Examples:"
814
1002
  echo " ./run-bugfix.sh run # Run all bugs"
815
- echo " ./run-bugfix.sh run bug-fix-list.json # Custom bug list"
1003
+ echo " ./run-bugfix.sh run .prizmkit/plans/bug-fix-list.json # Custom bug list"
816
1004
  echo " ./run-bugfix.sh run B-001 --dry-run # Inspect generated prompt"
817
1005
  echo " ./run-bugfix.sh run B-001 --clean # Clean artifacts + reset + run"
818
1006
  echo " ./run-bugfix.sh run B-001 --no-reset # Retry without resetting status"
@@ -827,7 +1015,7 @@ case "${1:-run}" in
827
1015
  if [[ "${1:-}" =~ ^[Bb]-[0-9]+ ]]; then
828
1016
  run_one "$@"
829
1017
  else
830
- main "${1:-bug-fix-list.json}"
1018
+ main "${1:-.prizmkit/plans/bug-fix-list.json}"
831
1019
  fi
832
1020
  ;;
833
1021
  status)
@@ -837,7 +1025,7 @@ case "${1:-run}" in
837
1025
  exit 1
838
1026
  fi
839
1027
  python3 "$SCRIPTS_DIR/update-bug-status.py" \
840
- --bug-list "${2:-bug-fix-list.json}" \
1028
+ --bug-list "${2:-.prizmkit/plans/bug-fix-list.json}" \
841
1029
  --state-dir "$STATE_DIR" \
842
1030
  --action status
843
1031
  ;;
@@ -846,6 +1034,40 @@ case "${1:-run}" in
846
1034
  rm -rf "$STATE_DIR"
847
1035
  log_success "Bugfix state cleared. Run './run-bugfix.sh run' to start fresh."
848
1036
  ;;
1037
+ unskip)
1038
+ check_dependencies
1039
+ if [[ ! -f "$STATE_DIR/pipeline.json" ]]; then
1040
+ log_error "No bugfix pipeline state found. Run './run-bugfix.sh run' first."
1041
+ exit 1
1042
+ fi
1043
+ _unskip_bug_list=".prizmkit/plans/bug-fix-list.json"
1044
+ _unskip_bug_id=""
1045
+ shift || true
1046
+ # Parse arguments: optional bug-id and bug-list path
1047
+ while [[ $# -gt 0 ]]; do
1048
+ if [[ "$1" =~ ^[Bb]-[0-9]+ ]]; then
1049
+ _unskip_bug_id="$1"
1050
+ else
1051
+ _unskip_bug_list="$1"
1052
+ fi
1053
+ shift
1054
+ done
1055
+ _unskip_args=(
1056
+ --bug-list "$_unskip_bug_list"
1057
+ --state-dir "$STATE_DIR"
1058
+ --action unskip
1059
+ )
1060
+ if [[ -n "$_unskip_bug_id" ]]; then
1061
+ _unskip_args+=(--bug-id "$_unskip_bug_id")
1062
+ fi
1063
+ python3 "$SCRIPTS_DIR/update-bug-status.py" "${_unskip_args[@]}"
1064
+
1065
+ # Commit the status change
1066
+ if ! git diff --quiet "$_unskip_bug_list" 2>/dev/null; then
1067
+ git add "$_unskip_bug_list"
1068
+ git commit -m "chore: unskip skipped bugs" 2>/dev/null || true
1069
+ fi
1070
+ ;;
849
1071
  help|--help|-h)
850
1072
  show_help
851
1073
  ;;