prizmkit 1.1.91 → 1.1.93

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 (46) hide show
  1. package/bundled/VERSION.json +3 -3
  2. package/bundled/dev-pipeline/.env.example +0 -4
  3. package/bundled/dev-pipeline/README.md +9 -39
  4. package/bundled/dev-pipeline/SCHEMA_ANALYSIS.md +0 -4
  5. package/bundled/dev-pipeline/assets/prizm-dev-team-integration.md +0 -2
  6. package/bundled/dev-pipeline/launch-bugfix-daemon.sh +0 -1
  7. package/bundled/dev-pipeline/launch-feature-daemon.sh +2 -3
  8. package/bundled/dev-pipeline/launch-refactor-daemon.sh +0 -1
  9. package/bundled/dev-pipeline/lib/branch.sh +8 -5
  10. package/bundled/dev-pipeline/lib/common.sh +122 -0
  11. package/bundled/dev-pipeline/lib/heartbeat.sh +13 -3
  12. package/bundled/dev-pipeline/run-bugfix.sh +149 -98
  13. package/bundled/dev-pipeline/run-feature.sh +90 -103
  14. package/bundled/dev-pipeline/run-recovery.sh +1 -32
  15. package/bundled/dev-pipeline/run-refactor.sh +148 -99
  16. package/bundled/dev-pipeline/scripts/update-bug-status.py +39 -4
  17. package/bundled/dev-pipeline/scripts/update-feature-status.py +43 -6
  18. package/bundled/dev-pipeline/scripts/update-refactor-status.py +36 -4
  19. package/bundled/dev-pipeline/tests/test-deploy-safety.sh +3 -3
  20. package/bundled/dev-pipeline/tests/test_auto_skip.py +92 -3
  21. package/bundled/dev-pipeline-windows/.env.example +0 -4
  22. package/bundled/dev-pipeline-windows/SCHEMA_ANALYSIS.md +0 -4
  23. package/bundled/dev-pipeline-windows/assets/prizm-dev-team-integration.md +0 -2
  24. package/bundled/dev-pipeline-windows/lib/branch.ps1 +17 -4
  25. package/bundled/dev-pipeline-windows/lib/common.ps1 +9 -0
  26. package/bundled/dev-pipeline-windows/lib/pipeline.ps1 +89 -108
  27. package/bundled/dev-pipeline-windows/run-recovery.ps1 +4 -19
  28. package/bundled/dev-pipeline-windows/scripts/update-bug-status.py +39 -4
  29. package/bundled/dev-pipeline-windows/scripts/update-feature-status.py +43 -6
  30. package/bundled/dev-pipeline-windows/scripts/update-refactor-status.py +36 -4
  31. package/bundled/skills/_metadata.json +1 -1
  32. package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +1 -1
  33. package/bundled/skills/bugfix-pipeline-launcher/references/configuration.md +5 -15
  34. package/bundled/skills/feature-pipeline-launcher/SKILL.md +4 -4
  35. package/bundled/skills/feature-pipeline-launcher/references/configuration.md +3 -13
  36. package/bundled/skills/refactor-pipeline-launcher/SKILL.md +3 -3
  37. package/bundled/skills/refactor-pipeline-launcher/references/configuration.md +4 -14
  38. package/bundled/skills-windows/bugfix-pipeline-launcher/SKILL.md +1 -1
  39. package/bundled/skills-windows/bugfix-pipeline-launcher/references/configuration.md +4 -14
  40. package/bundled/skills-windows/feature-pipeline-launcher/SKILL.md +4 -4
  41. package/bundled/skills-windows/feature-pipeline-launcher/references/configuration.md +2 -12
  42. package/bundled/skills-windows/refactor-pipeline-launcher/SKILL.md +3 -3
  43. package/bundled/skills-windows/refactor-pipeline-launcher/references/configuration.md +4 -14
  44. package/package.json +1 -1
  45. package/bundled/dev-pipeline/scripts/cleanup-logs.py +0 -192
  46. package/bundled/dev-pipeline-windows/scripts/cleanup-logs.py +0 -192
@@ -17,7 +17,7 @@ Usage:
17
17
  --feature-list <path> --state-dir <path> \
18
18
  --action <get_next|start|update|status|pause|reset|clean|complete|unskip> \
19
19
  [--feature-id <id>] [--session-status <status>] \
20
- [--session-id <id>] [--max-retries <n>] \
20
+ [--session-id <id>] [--max-retries <n>] [--max-infra-retries <n>] \
21
21
  [--features <filter>]
22
22
  """
23
23
 
@@ -94,7 +94,13 @@ def parse_args():
94
94
  "--max-retries",
95
95
  type=int,
96
96
  default=3,
97
- help="Maximum retry count before marking as failed (default: 3)",
97
+ help="Maximum code retry count before marking as failed (default: 3)",
98
+ )
99
+ parser.add_argument(
100
+ "--max-infra-retries",
101
+ type=int,
102
+ default=3,
103
+ help="Maximum infrastructure retry count before marking as failed (default: 3)",
98
104
  )
99
105
  parser.add_argument(
100
106
  "--feature-slug",
@@ -170,6 +176,9 @@ def load_feature_status(state_dir, feature_id):
170
176
  "feature_id": feature_id,
171
177
  "retry_count": 0,
172
178
  "max_retries": 3,
179
+ "max_infra_retries": 3,
180
+ "infra_error_count": 0,
181
+ "last_infra_error_session_id": None,
173
182
  "sessions": [],
174
183
  "last_session_id": None,
175
184
  "resume_from_phase": None,
@@ -183,6 +192,9 @@ def load_feature_status(state_dir, feature_id):
183
192
  "feature_id": feature_id,
184
193
  "retry_count": 0,
185
194
  "max_retries": 3,
195
+ "max_infra_retries": 3,
196
+ "infra_error_count": 0,
197
+ "last_infra_error_session_id": None,
186
198
  "sessions": [],
187
199
  "last_session_id": None,
188
200
  "resume_from_phase": None,
@@ -565,6 +577,7 @@ def action_get_next(feature_list_data, state_dir, feature_filter=None):
565
577
  "feature_id": chosen_id,
566
578
  "title": chosen.get("title", ""),
567
579
  "retry_count": chosen_status_data.get("retry_count", 0),
580
+ "infra_error_count": chosen_status_data.get("infra_error_count", 0),
568
581
  "resume_from_phase": chosen_status_data.get("resume_from_phase", None),
569
582
  }
570
583
  print(json.dumps(result, indent=2, ensure_ascii=False))
@@ -585,6 +598,7 @@ def action_update(args, feature_list_path, state_dir):
585
598
  session_status = args.session_status
586
599
  session_id = args.session_id
587
600
  max_retries = args.max_retries
601
+ max_infra_retries = args.max_infra_retries
588
602
 
589
603
  if not feature_id:
590
604
  error_out("--feature-id is required for 'update' action")
@@ -600,6 +614,8 @@ def action_update(args, feature_list_path, state_dir):
600
614
  new_status = current_list_status
601
615
 
602
616
  if session_status == "success":
617
+ fs["infra_error_count"] = 0
618
+ fs["last_infra_error_session_id"] = None
603
619
  # No-op guard: if this exact successful session was already recorded,
604
620
  # avoid rewriting state files again (prevents post-commit dirty changes).
605
621
  existing_sessions = fs.get("sessions", [])
@@ -616,6 +632,8 @@ def action_update(args, feature_list_path, state_dir):
616
632
  "session_status": session_status,
617
633
  "new_status": "completed",
618
634
  "retry_count": fs.get("retry_count", 0),
635
+ "infra_error_count": fs.get("infra_error_count", 0),
636
+ "max_infra_retries": max_infra_retries,
619
637
  "resume_from_phase": fs.get("resume_from_phase"),
620
638
  "updated_at": fs.get("updated_at"),
621
639
  "no_op": True,
@@ -654,15 +672,24 @@ def action_update(args, feature_list_path, state_dir):
654
672
  return
655
673
  elif session_status == "infra_error":
656
674
  # AI CLI/provider outage, auth failure, gateway error, etc.
657
- # This is outside the code's control, so keep the item pending without
658
- # consuming the task's retry budget.
659
- new_status = "pending"
660
- fs["infra_error_count"] = fs.get("infra_error_count", 0) + 1
675
+ # Infra failures do not consume the code retry budget, but they still
676
+ # need their own bounded budget so a flaky provider cannot loop forever.
677
+ infra_error_count = fs.get("infra_error_count", 0) + 1
678
+ fs["infra_error_count"] = infra_error_count
661
679
  fs["last_infra_error_session_id"] = session_id
680
+ fs["max_infra_retries"] = max_infra_retries
681
+ fs["degraded_reason"] = "infra_error"
662
682
  if session_id:
663
683
  fs["last_session_id"] = session_id
664
684
  fs["resume_from_phase"] = None
665
685
 
686
+ if infra_error_count >= max_infra_retries:
687
+ new_status = "failed"
688
+ if session_id:
689
+ fs["last_failed_session_id"] = session_id
690
+ else:
691
+ new_status = "pending"
692
+
666
693
  err = update_feature_in_list(feature_list_path, feature_id, new_status)
667
694
  if err:
668
695
  error_out("Failed to update .prizmkit/plans/feature-list.json: {}".format(err))
@@ -714,6 +741,8 @@ def action_update(args, feature_list_path, state_dir):
714
741
  "session_status": session_status,
715
742
  "new_status": new_status,
716
743
  "retry_count": fs["retry_count"],
744
+ "infra_error_count": fs.get("infra_error_count", 0),
745
+ "max_infra_retries": max_infra_retries,
717
746
  "resume_from_phase": fs.get("resume_from_phase"),
718
747
  "updated_at": fs["updated_at"],
719
748
  }
@@ -1143,6 +1172,8 @@ def action_start(args, feature_list_path, state_dir):
1143
1172
  "feature_id": feature_id,
1144
1173
  "old_status": old_status,
1145
1174
  "new_status": "in_progress",
1175
+ "retry_count": fs.get("retry_count", 0),
1176
+ "infra_error_count": fs.get("infra_error_count", 0),
1146
1177
  "updated_at": fs["updated_at"],
1147
1178
  }
1148
1179
  print(json.dumps(result, indent=2, ensure_ascii=False))
@@ -1171,6 +1202,8 @@ def action_reset(args, feature_list_path, state_dir):
1171
1202
 
1172
1203
  # Reset runtime fields
1173
1204
  fs["retry_count"] = 0
1205
+ fs["infra_error_count"] = 0
1206
+ fs["last_infra_error_session_id"] = None
1174
1207
  fs["sessions"] = []
1175
1208
  fs["last_session_id"] = None
1176
1209
  fs["resume_from_phase"] = None
@@ -1264,6 +1297,8 @@ def action_clean(args, feature_list_path, state_dir):
1264
1297
  old_retry = fs.get("retry_count", 0)
1265
1298
 
1266
1299
  fs["retry_count"] = 0
1300
+ fs["infra_error_count"] = 0
1301
+ fs["last_infra_error_session_id"] = None
1267
1302
  fs["sessions"] = []
1268
1303
  fs["last_session_id"] = None
1269
1304
  fs["resume_from_phase"] = None
@@ -1423,6 +1458,8 @@ def action_unskip(args, feature_list_path, state_dir):
1423
1458
  for fid in to_reset:
1424
1459
  fs = load_feature_status(state_dir, fid)
1425
1460
  fs["retry_count"] = 0
1461
+ fs["infra_error_count"] = 0
1462
+ fs["last_infra_error_session_id"] = None
1426
1463
  fs["sessions"] = []
1427
1464
  fs["last_session_id"] = None
1428
1465
  fs["resume_from_phase"] = None
@@ -16,7 +16,7 @@ Usage:
16
16
  --refactor-list <path> --state-dir <path> \
17
17
  --action <get_next|start|update|status|pause|reset|clean|unskip> \
18
18
  [--refactor-id <id>] [--session-status <status>] \
19
- [--session-id <id>] [--max-retries <n>]
19
+ [--session-id <id>] [--max-retries <n>] [--max-infra-retries <n>]
20
20
  """
21
21
 
22
22
  import argparse
@@ -87,7 +87,8 @@ def parse_args():
87
87
  help="Session outcome status (required for 'update' action)",
88
88
  )
89
89
  parser.add_argument("--session-id", default=None, help="Session ID (optional, for 'update' action)")
90
- parser.add_argument("--max-retries", type=int, default=3, help="Maximum retry count (default: 3)")
90
+ parser.add_argument("--max-retries", type=int, default=3, help="Maximum code retry count (default: 3)")
91
+ parser.add_argument("--max-infra-retries", type=int, default=3, help="Maximum infrastructure retry count (default: 3)")
91
92
  parser.add_argument("--project-root", default=None, help="Project root directory. Required for 'clean' action.")
92
93
  return parser.parse_args()
93
94
 
@@ -103,6 +104,9 @@ def _default_status(refactor_id):
103
104
  "refactor_id": refactor_id,
104
105
  "retry_count": 0,
105
106
  "max_retries": 3,
107
+ "max_infra_retries": 3,
108
+ "infra_error_count": 0,
109
+ "last_infra_error_session_id": None,
106
110
  "sessions": [],
107
111
  "last_session_id": None,
108
112
  "resume_from_phase": None,
@@ -268,6 +272,7 @@ def action_get_next(refactor_list_data, state_dir):
268
272
  "priority": chosen.get("priority", "medium"),
269
273
  "complexity": chosen.get("complexity", "medium"),
270
274
  "retry_count": chosen_status_data.get("retry_count", 0),
275
+ "infra_error_count": chosen_status_data.get("infra_error_count", 0),
271
276
  "resume_from_phase": chosen_status_data.get("resume_from_phase", None),
272
277
  }
273
278
  print(json.dumps(result, indent=2, ensure_ascii=False))
@@ -282,6 +287,7 @@ def action_update(args, refactor_list_path, state_dir):
282
287
  session_status = args.session_status
283
288
  session_id = args.session_id
284
289
  max_retries = args.max_retries
290
+ max_infra_retries = args.max_infra_retries
285
291
 
286
292
  if not refactor_id:
287
293
  error_out("--refactor-id is required for 'update' action")
@@ -296,6 +302,8 @@ def action_update(args, refactor_list_path, state_dir):
296
302
  new_status = get_refactor_status_from_list(refactor_list_path, refactor_id)
297
303
 
298
304
  if session_status == "success":
305
+ rs["infra_error_count"] = 0
306
+ rs["last_infra_error_session_id"] = None
299
307
  new_status = "completed"
300
308
  rs["resume_from_phase"] = None
301
309
  err = update_refactor_in_list(refactor_list_path, refactor_id, "completed")
@@ -320,11 +328,25 @@ def action_update(args, refactor_list_path, state_dir):
320
328
  error_out("Failed to update .prizmkit/plans/refactor-list.json: {}".format(err))
321
329
  return
322
330
  elif session_status == "infra_error":
323
- new_status = "pending"
324
- rs["infra_error_count"] = rs.get("infra_error_count", 0) + 1
331
+ # AI CLI/provider outage, auth failure, gateway error, etc.
332
+ # Infra failures do not consume the code retry budget, but they still
333
+ # need their own bounded budget so a flaky provider cannot loop forever.
334
+ infra_error_count = rs.get("infra_error_count", 0) + 1
335
+ rs["infra_error_count"] = infra_error_count
325
336
  rs["last_infra_error_session_id"] = session_id
337
+ rs["max_infra_retries"] = max_infra_retries
338
+ rs["degraded_reason"] = "infra_error"
339
+ if session_id:
340
+ rs["last_session_id"] = session_id
326
341
  rs["resume_from_phase"] = None
327
342
 
343
+ if infra_error_count >= max_infra_retries:
344
+ new_status = "failed"
345
+ if session_id:
346
+ rs["last_failed_session_id"] = session_id
347
+ else:
348
+ new_status = "pending"
349
+
328
350
  err = update_refactor_in_list(refactor_list_path, refactor_id, new_status)
329
351
  if err:
330
352
  error_out("Failed to update .prizmkit/plans/refactor-list.json: {}".format(err))
@@ -379,6 +401,8 @@ def action_update(args, refactor_list_path, state_dir):
379
401
  "session_status": session_status,
380
402
  "new_status": new_status,
381
403
  "retry_count": rs["retry_count"],
404
+ "infra_error_count": rs.get("infra_error_count", 0),
405
+ "max_infra_retries": max_infra_retries,
382
406
  "resume_from_phase": rs.get("resume_from_phase"),
383
407
  "updated_at": rs["updated_at"],
384
408
  }
@@ -728,6 +752,8 @@ def action_reset(args, refactor_list_path, state_dir):
728
752
  old_retry = rs.get("retry_count", 0)
729
753
 
730
754
  rs["retry_count"] = 0
755
+ rs["infra_error_count"] = 0
756
+ rs["last_infra_error_session_id"] = None
731
757
  rs["sessions"] = []
732
758
  rs["last_session_id"] = None
733
759
  rs["resume_from_phase"] = None
@@ -799,6 +825,8 @@ def action_clean(args, refactor_list_path, state_dir):
799
825
  old_retry = rs.get("retry_count", 0)
800
826
 
801
827
  rs["retry_count"] = 0
828
+ rs["infra_error_count"] = 0
829
+ rs["last_infra_error_session_id"] = None
802
830
  rs["sessions"] = []
803
831
  rs["last_session_id"] = None
804
832
  rs["resume_from_phase"] = None
@@ -887,6 +915,8 @@ def action_start(args, refactor_list_path, state_dir):
887
915
  "refactor_id": refactor_id,
888
916
  "old_status": old_status,
889
917
  "new_status": "in_progress",
918
+ "retry_count": rs.get("retry_count", 0),
919
+ "infra_error_count": rs.get("infra_error_count", 0),
890
920
  "updated_at": rs["updated_at"],
891
921
  }
892
922
  print(json.dumps(result, indent=2, ensure_ascii=False))
@@ -1025,6 +1055,8 @@ def action_unskip(args, refactor_list_path, state_dir):
1025
1055
  for rid in to_reset:
1026
1056
  rs = load_refactor_status(state_dir, rid)
1027
1057
  rs["retry_count"] = 0
1058
+ rs["infra_error_count"] = 0
1059
+ rs["last_infra_error_session_id"] = None
1028
1060
  rs["sessions"] = []
1029
1061
  rs["last_session_id"] = None
1030
1062
  rs["resume_from_phase"] = None
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.91",
2
+ "version": "1.1.93",
3
3
  "skills": {
4
4
  "prizm-kit": {
5
5
  "description": "Full-lifecycle dev toolkit. Covers spec-driven development, Prizm context docs, code quality, debugging, deployment, and knowledge management.",
@@ -129,7 +129,7 @@ Detect user intent from their message, then follow the corresponding workflow:
129
129
  ```
130
130
  With all options:
131
131
  ```bash
132
- VERBOSE=1 MAX_RETRIES=5 SESSION_TIMEOUT=3600 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
132
+ VERBOSE=1 MAX_RETRIES=5 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
133
133
  .prizmkit/dev-pipeline/run-bugfix.sh run .prizmkit/plans/bug-fix-list.json
134
134
  ```
135
135
 
@@ -12,7 +12,6 @@ Translating user responses to env vars:
12
12
  | Verbose: On | `VERBOSE=1` |
13
13
  | Max retries: N | `MAX_RETRIES=N` |
14
14
  | Critic: On | `ENABLE_CRITIC=1` |
15
- | Timeout: value | `SESSION_TIMEOUT=<seconds>` |
16
15
  | Stop on failure: On | `STOP_ON_FAILURE=1` |
17
16
  | Deploy: Yes | `ENABLE_DEPLOY=1` |
18
17
  | Effort: value | `PRIZMKIT_EFFORT=<value>` |
@@ -28,9 +27,6 @@ Not exposed in interactive menu, pass via `--env`:
28
27
  | `DEV_BRANCH` | auto-generated | Custom dev branch name (default: `bugfix/pipeline-{run_id}`) |
29
28
  | `HEARTBEAT_INTERVAL` | `30` | Heartbeat log interval in seconds |
30
29
  | `HEARTBEAT_STALE_THRESHOLD` | `600` | Max seconds without heartbeat before marking stale |
31
- | `LOG_CLEANUP_ENABLED` | `1` | Run periodic log cleanup (`0` to disable) |
32
- | `LOG_RETENTION_DAYS` | `14` | Delete logs older than N days |
33
- | `LOG_MAX_TOTAL_MB` | `1024` | Keep total logs under N MB via oldest-first cleanup |
34
30
 
35
31
  ## Interactive Configuration Options
36
32
 
@@ -52,28 +48,22 @@ Present these via `AskUserQuestion` in step 5. Round 1 is one `AskUserQuestion`
52
48
  - On — Enable adversarial critic review (`ENABLE_CRITIC=1`): an independent AI agent reviews the diagnosis/plan for completeness and the fix for defects, edge cases, and regression risks. Adds ~5-10 min per bug.
53
49
 
54
50
  **Question 4 — Advanced config?** (multiSelect: false):
55
- - No (default) — Use defaults for session timeout and failure behavior
56
- - Yes — Configure session timeout, stop-on-failure, deploy, and reasoning effort options
51
+ - No (default) — Use defaults for failure behavior
52
+ - Yes — Configure stop-on-failure, deploy, and reasoning effort options
57
53
 
58
54
  Note: Bug filter defaults to all bugs (by severity order). Default Critic to Off unless bugs have `severity: "critical"` or `severity: "high"` (in which case default to On). If the user selects "Other" on any option, handle their custom input.
59
55
 
60
56
  ### Round 2 (only if Advanced config = Yes)
61
57
 
62
- **Question 1 — Session timeout** (multiSelect: false):
63
- - None (default) — No timeout
64
- - 30 min — `SESSION_TIMEOUT=1800`
65
- - 1 hour — `SESSION_TIMEOUT=3600`
66
- - 2 hours — `SESSION_TIMEOUT=7200`
67
-
68
- **Question 2 — Stop on failure** (multiSelect: false):
58
+ **Question 1 — Stop on failure** (multiSelect: false):
69
59
  - Off (default) — Pipeline continues to next task after failure
70
60
  - On — Pipeline halts immediately when a task exhausts all retries (`STOP_ON_FAILURE=1`)
71
61
 
72
- **Question 3 — Deploy after completion?** (multiSelect: false):
62
+ **Question 2 — Deploy after completion?** (multiSelect: false):
73
63
  - No (default) — Skip deployment after pipeline completes
74
64
  - Yes — Run /prizmkit-deploy automatically after all bugs fixed successfully (`ENABLE_DEPLOY=1`). Deployment is blocked if any bug was not fixed (status not 'completed', 'skipped', or 'needs_info').
75
65
 
76
- **Question 4 — Reasoning effort** (multiSelect: false):
66
+ **Question 3 — Reasoning effort** (multiSelect: false):
77
67
  - Default (none) — Use CLI default
78
68
  - low — Minimize reasoning, fastest output (`PRIZMKIT_EFFORT=low`)
79
69
  - medium — Moderate reasoning (`PRIZMKIT_EFFORT=medium`)
@@ -150,12 +150,12 @@ Detect user intent from their message, then follow the corresponding workflow:
150
150
  - 5
151
151
 
152
152
  **Question 4 — Advanced config?** (multiSelect: false):
153
- - No (default) — Use defaults for session timeout and failure behavior
154
- - Yes — Configure session timeout, stop-on-failure, deploy-after-completion, and reasoning effort options
153
+ - No (default) — Use defaults for failure behavior
154
+ - Yes — Configure stop-on-failure, deploy-after-completion, and reasoning effort options
155
155
 
156
156
  Default Critic to Off unless features have `estimated_complexity: "high"` or above (in which case default to On).
157
157
 
158
- **If user chose "Yes" to Advanced config**, ask a second round of `AskUserQuestion` — see the advanced config questions (session timeout, stop-on-failure, deploy-after-completion, reasoning effort) in `${SKILL_DIR}/references/configuration.md`.
158
+ **If user chose "Yes" to Advanced config**, ask a second round of `AskUserQuestion` — see the advanced config questions (stop-on-failure, deploy-after-completion, reasoning effort) in `${SKILL_DIR}/references/configuration.md`.
159
159
 
160
160
  **Environment variable mapping** and **advanced environment variables** tables — read `${SKILL_DIR}/references/configuration.md` for the full translation tables (8 config→env mappings + 9 advanced variables).
161
161
 
@@ -168,7 +168,7 @@ Detect user intent from their message, then follow the corresponding workflow:
168
168
  ```
169
169
  With all options:
170
170
  ```bash
171
- VERBOSE=1 ENABLE_CRITIC=true MAX_RETRIES=5 SESSION_TIMEOUT=3600 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
171
+ VERBOSE=1 ENABLE_CRITIC=true MAX_RETRIES=5 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
172
172
  .prizmkit/dev-pipeline/run-feature.sh run .prizmkit/plans/feature-list.json --features F-001:F-005
173
173
  ```
174
174
 
@@ -6,21 +6,15 @@ Environment variable mappings for the feature launcher.
6
6
 
7
7
  Asked only when the user chose "Yes" to Advanced config in step 6.
8
8
 
9
- **Question 1 — Session timeout** (multiSelect: false):
10
- - None (default) — No timeout
11
- - 30 min — `SESSION_TIMEOUT=1800`
12
- - 1 hour — `SESSION_TIMEOUT=3600`
13
- - 2 hours — `SESSION_TIMEOUT=7200`
14
-
15
- **Question 2 — Stop on failure** (multiSelect: false):
9
+ **Question 1 — Stop on failure** (multiSelect: false):
16
10
  - Off (default) — Pipeline continues to next task after failure
17
11
  - On — Pipeline halts immediately when a task exhausts all retries (`STOP_ON_FAILURE=1`)
18
12
 
19
- **Question 3 — Deploy after completion?** (multiSelect: false):
13
+ **Question 2 — Deploy after completion?** (multiSelect: false):
20
14
  - No (default) — Skip deployment after pipeline completes
21
15
  - Yes — Run /prizmkit-deploy automatically after all features complete successfully (`ENABLE_DEPLOY=1`). Deployment is blocked if any feature did not complete successfully (status not 'completed' or manually 'skipped').
22
16
 
23
- **Question 4 — Reasoning effort** (multiSelect: false):
17
+ **Question 3 — Reasoning effort** (multiSelect: false):
24
18
  - Default (none) — Use CLI default
25
19
  - low — Minimize reasoning, fastest output (`PRIZMKIT_EFFORT=low`)
26
20
  - medium — Moderate reasoning (`PRIZMKIT_EFFORT=medium`)
@@ -38,7 +32,6 @@ Translating user responses to env vars:
38
32
  | Verbose: Off | `VERBOSE=0` |
39
33
  | Verbose: On | `VERBOSE=1` |
40
34
  | Max retries: N | `MAX_RETRIES=N` |
41
- | Timeout: value | `SESSION_TIMEOUT=<seconds>` |
42
35
  | Stop on failure: On | `STOP_ON_FAILURE=1` |
43
36
  | Deploy: Yes | `ENABLE_DEPLOY=1` |
44
37
  | Effort: value | `PRIZMKIT_EFFORT=<value>` |
@@ -55,9 +48,6 @@ Not exposed in interactive menu, pass via `--env`:
55
48
  | `HEARTBEAT_INTERVAL` | `30` | Heartbeat log interval in seconds |
56
49
  | `HEARTBEAT_STALE_THRESHOLD` | `600` | Max seconds without heartbeat before marking stale |
57
50
  | `PIPELINE_MODE` | (none) | Override mode for all features: `lite`\|`standard`\|`full` |
58
- | `LOG_CLEANUP_ENABLED` | `1` | Run periodic log cleanup (`0` to disable) |
59
- | `LOG_RETENTION_DAYS` | `14` | Delete logs older than N days |
60
- | `LOG_MAX_TOTAL_MB` | `1024` | Keep total logs under N MB via oldest-first cleanup |
61
51
 
62
52
  ## Error Handling
63
53
 
@@ -154,8 +154,8 @@ Detect user intent from their message, then follow the corresponding workflow:
154
154
  - Off — Skip post-task test verification (faster but riskier)
155
155
 
156
156
  **Question 4 — Advanced config?** (multiSelect: false):
157
- - No (default) — Use defaults for critic review, session timeout, and failure behavior
158
- - Yes — Configure critic review, session timeout, stop-on-failure, and reasoning effort options
157
+ - No (default) — Use defaults for critic review and failure behavior
158
+ - Yes — Configure critic review, stop-on-failure, and reasoning effort options
159
159
 
160
160
  Note: Refactor filter defaults to all refactor items (by priority order). If the user selects "Other" on any option, handle their custom input.
161
161
 
@@ -172,7 +172,7 @@ Detect user intent from their message, then follow the corresponding workflow:
172
172
  ```
173
173
  With all options:
174
174
  ```bash
175
- VERBOSE=1 STRICT_BEHAVIOR_CHECK=1 MAX_RETRIES=5 SESSION_TIMEOUT=3600 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
175
+ VERBOSE=1 STRICT_BEHAVIOR_CHECK=1 MAX_RETRIES=5 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
176
176
  .prizmkit/dev-pipeline/run-refactor.sh run .prizmkit/plans/refactor-list.json
177
177
  ```
178
178
 
@@ -14,7 +14,6 @@ Translating user responses to env vars:
14
14
  | Strict behavior: On | `STRICT_BEHAVIOR_CHECK=1` |
15
15
  | Strict behavior: Off | `STRICT_BEHAVIOR_CHECK=0` |
16
16
  | Critic: On | `ENABLE_CRITIC=true` |
17
- | Timeout: value | `SESSION_TIMEOUT=<seconds>` |
18
17
  | Stop on failure: On | `STOP_ON_FAILURE=1` |
19
18
  | Deploy: Yes | `ENABLE_DEPLOY=1` |
20
19
  | Effort: value | `PRIZMKIT_EFFORT=<value>` |
@@ -30,9 +29,6 @@ Not exposed in interactive menu, pass via `--env`:
30
29
  | `DEV_BRANCH` | auto-generated | Custom dev branch name (default: `refactor/pipeline-{run_id}`) |
31
30
  | `HEARTBEAT_INTERVAL` | `30` | Heartbeat log interval in seconds |
32
31
  | `HEARTBEAT_STALE_THRESHOLD` | `600` | Max seconds without heartbeat before marking stale |
33
- | `LOG_CLEANUP_ENABLED` | `1` | Run periodic log cleanup (`0` to disable) |
34
- | `LOG_RETENTION_DAYS` | `14` | Delete logs older than N days |
35
- | `LOG_MAX_TOTAL_MB` | `1024` | Keep total logs under N MB via oldest-first cleanup |
36
32
 
37
33
  ## Error Handling
38
34
 
@@ -57,23 +53,17 @@ Not exposed in interactive menu, pass via `--env`:
57
53
 
58
54
  Only run this when the user answered "Yes" to the **Advanced config?** question in step 6. It applies to a minority of sessions.
59
55
 
60
- Ask a second round of `AskUserQuestion` with these 4 questions:
56
+ Ask a second round of `AskUserQuestion` with these 3 questions:
61
57
 
62
- **Question 1 — Session timeout** (multiSelect: false):
63
- - None (default) — No timeout
64
- - 30 min — `SESSION_TIMEOUT=1800`
65
- - 1 hour — `SESSION_TIMEOUT=3600`
66
- - 2 hours — `SESSION_TIMEOUT=7200`
67
-
68
- **Question 2 — Stop on failure** (multiSelect: false):
58
+ **Question 1 — Stop on failure** (multiSelect: false):
69
59
  - Off (default) — Pipeline continues to next task after failure
70
60
  - On — Pipeline halts immediately when a task exhausts all retries (`STOP_ON_FAILURE=1`)
71
61
 
72
- **Question 3 — Critic review** (multiSelect: false):
62
+ **Question 2 — Critic review** (multiSelect: false):
73
63
  - Off (default) — Skip adversarial review
74
64
  - On — Enable adversarial critic review: an independent AI agent reviews the refactor plan for completeness and the implementation for regressions, missed edge cases, and behavior violations. Adds ~5-10 min per refactor task.
75
65
 
76
- **Question 4 — Deploy after completion?** (multiSelect: false):
66
+ **Question 3 — Deploy after completion?** (multiSelect: false):
77
67
  - No (default) — Skip deployment after pipeline completes
78
68
  - Yes — Run /prizmkit-deploy automatically after all refactors complete successfully (`ENABLE_DEPLOY=1`). Deployment is blocked if any refactor did not complete successfully (status not 'completed' or manually 'skipped').
79
69
 
@@ -155,7 +155,7 @@ Detect user intent from their message, then follow the corresponding workflow:
155
155
  ```
156
156
  With all options:
157
157
  ```powershell
158
- $env:VERBOSE = "1"; $env:MAX_RETRIES = "5"; $env:SESSION_TIMEOUT = "3600"; $env:PRIZMKIT_EFFORT = "high"
158
+ $env:VERBOSE = "1"; $env:MAX_RETRIES = "5"; $env:PRIZMKIT_EFFORT = "high"
159
159
  .\.prizmkit\dev-pipeline\run-bugfix.ps1 run .prizmkit/plans/bug-fix-list.json
160
160
  ```
161
161
 
@@ -12,7 +12,6 @@ Translating user responses to env vars:
12
12
  | Verbose: On | `VERBOSE=1` |
13
13
  | Max retries: N | `MAX_RETRIES=N` |
14
14
  | Critic: On | `ENABLE_CRITIC=1` |
15
- | Timeout: value | `SESSION_TIMEOUT=<seconds>` |
16
15
  | Stop on failure: On | `STOP_ON_FAILURE=1` |
17
16
  | Deploy: Yes | `ENABLE_DEPLOY=1` |
18
17
  | Effort: value | `PRIZMKIT_EFFORT=<value>` |
@@ -28,9 +27,6 @@ Not exposed in interactive menu, pass via `--env`:
28
27
  | `DEV_BRANCH` | auto-generated | Custom dev branch name (default: `bugfix/pipeline-{run_id}`) |
29
28
  | `HEARTBEAT_INTERVAL` | `30` | Heartbeat log interval in seconds |
30
29
  | `HEARTBEAT_STALE_THRESHOLD` | `600` | Max seconds without heartbeat before marking stale |
31
- | `LOG_CLEANUP_ENABLED` | `1` | Run periodic log cleanup (`0` to disable) |
32
- | `LOG_RETENTION_DAYS` | `14` | Delete logs older than N days |
33
- | `LOG_MAX_TOTAL_MB` | `1024` | Keep total logs under N MB via oldest-first cleanup |
34
30
 
35
31
  ## Interactive Configuration Options
36
32
 
@@ -52,24 +48,18 @@ Present these via `AskUserQuestion` in step 5. Round 1 is one `AskUserQuestion`
52
48
  - On — Enable adversarial critic review (`ENABLE_CRITIC=1`): an independent AI agent reviews the diagnosis/plan for completeness and the fix for defects, edge cases, and regression risks. Adds ~5-10 min per bug.
53
49
 
54
50
  **Question 4 — Advanced config?** (multiSelect: false):
55
- - No (default) — Use defaults for session timeout and failure behavior
56
- - Yes — Configure session timeout, stop-on-failure, and reasoning effort options
51
+ - No (default) — Use defaults for failure behavior
52
+ - Yes — Configure stop-on-failure, and reasoning effort options
57
53
 
58
54
  Note: Bug filter defaults to all bugs (by severity order). Default Critic to Off unless bugs have `severity: "critical"` or `severity: "high"` (in which case default to On). If the user selects "Other" on any option, handle their custom input.
59
55
 
60
56
  ### Round 2 (only if Advanced config = Yes)
61
57
 
62
- **Question 1 — Session timeout** (multiSelect: false):
63
- - None (default) — No timeout
64
- - 30 min — `SESSION_TIMEOUT=1800`
65
- - 1 hour — `SESSION_TIMEOUT=3600`
66
- - 2 hours — `SESSION_TIMEOUT=7200`
67
-
68
- **Question 2 — Stop on failure** (multiSelect: false):
58
+ **Question 1 — Stop on failure** (multiSelect: false):
69
59
  - Off (default) — Pipeline continues to next task after failure
70
60
  - On — Pipeline halts immediately when a task exhausts all retries (`STOP_ON_FAILURE=1`)
71
61
 
72
- **Question 3 — Reasoning effort** (multiSelect: false):
62
+ **Question 2 — Reasoning effort** (multiSelect: false):
73
63
  - Default (none) — Use CLI default
74
64
  - low — Minimize reasoning, fastest output (`PRIZMKIT_EFFORT=low`)
75
65
  - medium — Moderate reasoning (`PRIZMKIT_EFFORT=medium`)
@@ -176,12 +176,12 @@ Detect user intent from their message, then follow the corresponding workflow:
176
176
  - 5
177
177
 
178
178
  **Question 4 — Advanced config?** (multiSelect: false):
179
- - No (default) — Use defaults for session timeout and failure behavior
180
- - Yes — Configure session timeout, stop-on-failure, and reasoning effort options
179
+ - No (default) — Use defaults for failure behavior
180
+ - Yes — Configure stop-on-failure, and reasoning effort options
181
181
 
182
182
  Default Critic to Off unless features have `estimated_complexity: "high"` or above (in which case default to On).
183
183
 
184
- **If user chose "Yes" to Advanced config**, ask a second round of `AskUserQuestion` — see the advanced config questions (session timeout, stop-on-failure, reasoning effort) in `${SKILL_DIR}/references/configuration.md`.
184
+ **If user chose "Yes" to Advanced config**, ask a second round of `AskUserQuestion` — see the advanced config questions (stop-on-failure, reasoning effort) in `${SKILL_DIR}/references/configuration.md`.
185
185
 
186
186
  **Environment variable mapping** and **advanced environment variables** tables — read `${SKILL_DIR}/references/configuration.md` for the full translation tables (8 config→env mappings + 9 advanced variables).
187
187
 
@@ -195,7 +195,7 @@ Detect user intent from their message, then follow the corresponding workflow:
195
195
  ```
196
196
  With all options:
197
197
  ```powershell
198
- $env:VERBOSE = "1"; $env:ENABLE_CRITIC = "true"; $env:MAX_RETRIES = "5"; $env:SESSION_TIMEOUT = "3600"; $env:PRIZMKIT_EFFORT = "high"
198
+ $env:VERBOSE = "1"; $env:ENABLE_CRITIC = "true"; $env:MAX_RETRIES = "5"; $env:PRIZMKIT_EFFORT = "high"
199
199
  .\.prizmkit\dev-pipeline\run-feature.ps1 run .prizmkit/plans/feature-list.json --features F-001:F-005
200
200
  ```
201
201
 
@@ -6,17 +6,11 @@ Environment variable mappings for the feature launcher.
6
6
 
7
7
  Asked only when the user chose "Yes" to Advanced config in step 6.
8
8
 
9
- **Question 1 — Session timeout** (multiSelect: false):
10
- - None (default) — No timeout
11
- - 30 min — `SESSION_TIMEOUT=1800`
12
- - 1 hour — `SESSION_TIMEOUT=3600`
13
- - 2 hours — `SESSION_TIMEOUT=7200`
14
-
15
- **Question 2 — Stop on failure** (multiSelect: false):
9
+ **Question 1 — Stop on failure** (multiSelect: false):
16
10
  - Off (default) — Pipeline continues to next task after failure
17
11
  - On — Pipeline halts immediately when a task exhausts all retries (`STOP_ON_FAILURE=1`)
18
12
 
19
- **Question 3 — Reasoning effort** (multiSelect: false):
13
+ **Question 2 — Reasoning effort** (multiSelect: false):
20
14
  - Default (none) — Use CLI default
21
15
  - low — Minimize reasoning, fastest output (`PRIZMKIT_EFFORT=low`)
22
16
  - medium — Moderate reasoning (`PRIZMKIT_EFFORT=medium`)
@@ -34,7 +28,6 @@ Translating user responses to env vars:
34
28
  | Verbose: Off | `VERBOSE=0` |
35
29
  | Verbose: On | `VERBOSE=1` |
36
30
  | Max retries: N | `MAX_RETRIES=N` |
37
- | Timeout: value | `SESSION_TIMEOUT=<seconds>` |
38
31
  | Stop on failure: On | `STOP_ON_FAILURE=1` |
39
32
  | Deploy: Yes | `ENABLE_DEPLOY=1` |
40
33
  | Effort: value | `PRIZMKIT_EFFORT=<value>` |
@@ -51,9 +44,6 @@ Not exposed in interactive menu, pass via `--env`:
51
44
  | `HEARTBEAT_INTERVAL` | `30` | Heartbeat log interval in seconds |
52
45
  | `HEARTBEAT_STALE_THRESHOLD` | `600` | Max seconds without heartbeat before marking stale |
53
46
  | `PIPELINE_MODE` | (none) | Override mode for all features: `lite`\|`standard`\|`full` |
54
- | `LOG_CLEANUP_ENABLED` | `1` | Run periodic log cleanup (`0` to disable) |
55
- | `LOG_RETENTION_DAYS` | `14` | Delete logs older than N days |
56
- | `LOG_MAX_TOTAL_MB` | `1024` | Keep total logs under N MB via oldest-first cleanup |
57
47
 
58
48
  ## Error Handling
59
49
 
@@ -176,8 +176,8 @@ Detect user intent from their message, then follow the corresponding workflow:
176
176
  - 5
177
177
 
178
178
  **Question 3 — Advanced config?** (multiSelect: false):
179
- - No (default) — Use defaults for critic review, session timeout, and failure behavior
180
- - Yes — Configure critic review, session timeout, stop-on-failure, and reasoning effort options
179
+ - No (default) — Use defaults for critic review and failure behavior
180
+ - Yes — Configure critic review, stop-on-failure, and reasoning effort options
181
181
 
182
182
  Note: Refactor filter defaults to all refactor items (by priority order). If the user selects "Other" on any option, handle their custom input.
183
183
 
@@ -195,7 +195,7 @@ Detect user intent from their message, then follow the corresponding workflow:
195
195
  ```
196
196
  With all options:
197
197
  ```powershell
198
- $env:VERBOSE = "1"; $env:MAX_RETRIES = "5"; $env:SESSION_TIMEOUT = "3600"; $env:PRIZMKIT_EFFORT = "high"
198
+ $env:VERBOSE = "1"; $env:MAX_RETRIES = "5"; $env:PRIZMKIT_EFFORT = "high"
199
199
  .\.prizmkit\dev-pipeline\run-refactor.ps1 run .prizmkit/plans/refactor-list.json
200
200
  ```
201
201