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.
- package/bundled/VERSION.json +3 -3
- package/bundled/dev-pipeline/.env.example +0 -4
- package/bundled/dev-pipeline/README.md +9 -39
- package/bundled/dev-pipeline/SCHEMA_ANALYSIS.md +0 -4
- package/bundled/dev-pipeline/assets/prizm-dev-team-integration.md +0 -2
- package/bundled/dev-pipeline/launch-bugfix-daemon.sh +0 -1
- package/bundled/dev-pipeline/launch-feature-daemon.sh +2 -3
- package/bundled/dev-pipeline/launch-refactor-daemon.sh +0 -1
- package/bundled/dev-pipeline/lib/branch.sh +8 -5
- package/bundled/dev-pipeline/lib/common.sh +122 -0
- package/bundled/dev-pipeline/lib/heartbeat.sh +13 -3
- package/bundled/dev-pipeline/run-bugfix.sh +149 -98
- package/bundled/dev-pipeline/run-feature.sh +90 -103
- package/bundled/dev-pipeline/run-recovery.sh +1 -32
- package/bundled/dev-pipeline/run-refactor.sh +148 -99
- package/bundled/dev-pipeline/scripts/update-bug-status.py +39 -4
- package/bundled/dev-pipeline/scripts/update-feature-status.py +43 -6
- package/bundled/dev-pipeline/scripts/update-refactor-status.py +36 -4
- package/bundled/dev-pipeline/tests/test-deploy-safety.sh +3 -3
- package/bundled/dev-pipeline/tests/test_auto_skip.py +92 -3
- package/bundled/dev-pipeline-windows/.env.example +0 -4
- package/bundled/dev-pipeline-windows/SCHEMA_ANALYSIS.md +0 -4
- package/bundled/dev-pipeline-windows/assets/prizm-dev-team-integration.md +0 -2
- package/bundled/dev-pipeline-windows/lib/branch.ps1 +17 -4
- package/bundled/dev-pipeline-windows/lib/common.ps1 +9 -0
- package/bundled/dev-pipeline-windows/lib/pipeline.ps1 +89 -108
- package/bundled/dev-pipeline-windows/run-recovery.ps1 +4 -19
- package/bundled/dev-pipeline-windows/scripts/update-bug-status.py +39 -4
- package/bundled/dev-pipeline-windows/scripts/update-feature-status.py +43 -6
- package/bundled/dev-pipeline-windows/scripts/update-refactor-status.py +36 -4
- package/bundled/skills/_metadata.json +1 -1
- package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +1 -1
- package/bundled/skills/bugfix-pipeline-launcher/references/configuration.md +5 -15
- package/bundled/skills/feature-pipeline-launcher/SKILL.md +4 -4
- package/bundled/skills/feature-pipeline-launcher/references/configuration.md +3 -13
- package/bundled/skills/refactor-pipeline-launcher/SKILL.md +3 -3
- package/bundled/skills/refactor-pipeline-launcher/references/configuration.md +4 -14
- package/bundled/skills-windows/bugfix-pipeline-launcher/SKILL.md +1 -1
- package/bundled/skills-windows/bugfix-pipeline-launcher/references/configuration.md +4 -14
- package/bundled/skills-windows/feature-pipeline-launcher/SKILL.md +4 -4
- package/bundled/skills-windows/feature-pipeline-launcher/references/configuration.md +2 -12
- package/bundled/skills-windows/refactor-pipeline-launcher/SKILL.md +3 -3
- package/bundled/skills-windows/refactor-pipeline-launcher/references/configuration.md +4 -14
- package/package.json +1 -1
- package/bundled/dev-pipeline/scripts/cleanup-logs.py +0 -192
- 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
|
-
#
|
|
658
|
-
#
|
|
659
|
-
|
|
660
|
-
fs["infra_error_count"] =
|
|
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
|
-
|
|
324
|
-
|
|
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
|
|
@@ -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
|
|
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
|
|
56
|
-
- Yes — Configure
|
|
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 —
|
|
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
|
|
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
|
|
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
|
|
154
|
-
- Yes — Configure
|
|
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 (
|
|
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
|
|
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 —
|
|
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
|
|
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
|
|
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
|
|
158
|
-
- Yes — Configure critic review,
|
|
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
|
|
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
|
|
56
|
+
Ask a second round of `AskUserQuestion` with these 3 questions:
|
|
61
57
|
|
|
62
|
-
**Question 1 —
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
56
|
-
- Yes — Configure
|
|
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 —
|
|
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
|
|
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
|
|
180
|
-
- Yes — Configure
|
|
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 (
|
|
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:
|
|
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 —
|
|
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
|
|
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
|
|
180
|
-
- Yes — Configure critic review,
|
|
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:
|
|
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
|
|