You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: store structured checkpoint context on all error checkpoints
Record failureKind and metadata (touchSetViolations, touchSetPatterns)
when setting on_error checkpoints. This replaces error-string parsing
with structured data for accept/relaunch/retry decision-making.
Update touchSet violation notification to present all three options:
accept, relaunch (agent fixes), or retry (user fixes, re-validate).
` You fix, re-check: mc_plan_approve(checkpoint: "on_error", retry: "${job.name}")`,
514
+
);
515
+
awaitthis.setCheckpoint('on_error',plan,{
516
+
jobName: job.name,
517
+
failureKind: 'touchset',
518
+
touchSetViolations: validation.violations,
519
+
touchSetPatterns: job.touchSet,
520
+
});
506
521
return;
507
522
}
508
523
}
@@ -539,7 +554,10 @@ export class Orchestrator {
539
554
540
555
this.showToast('Mission Control',`Job "${job.name}" has merge conflicts. Plan paused.`,'error');
541
556
this.notify(`❌ Job "${job.name}" would conflict with the integration branch.\n Files: ${mergeCheck.conflicts?.join(', ')??'unknown'}\nRebase the job branch and retry with mc_plan_approve(checkpoint: "on_error", retry: "${job.name}").`);
542
-
awaitthis.setCheckpoint('on_error',plan);
557
+
awaitthis.setCheckpoint('on_error',plan,{
558
+
jobName: job.name,
559
+
failureKind: 'merge_conflict',
560
+
});
543
561
return;
544
562
}
545
563
}
@@ -590,7 +608,10 @@ export class Orchestrator {
590
608
591
609
this.showToast('Mission Control',`Merge conflict in job "${nextJob.name}". Plan paused.`,'error');
592
610
this.notify(`❌ Merge conflict in job "${nextJob.name}". Files: ${mergeResult.files?.join(', ')??'unknown'}. Fix the branch and retry with mc_plan_approve(checkpoint: "on_error", retry: "${nextJob.name}").`);
593
-
awaitthis.setCheckpoint('on_error',plan);
611
+
awaitthis.setCheckpoint('on_error',plan,{
612
+
jobName: nextJob.name,
613
+
failureKind: 'merge_conflict',
614
+
});
594
615
return;
595
616
}else{
596
617
awaitupdatePlanJob(plan.id,nextJob.name,{
@@ -605,7 +626,10 @@ export class Orchestrator {
605
626
606
627
this.showToast('Mission Control',`Job "${nextJob.name}" failed merge tests. Plan paused.`,'error');
607
628
this.notify(`❌ Job "${nextJob.name}" failed merge tests. Fix the branch and retry with mc_plan_approve(checkpoint: "on_error", retry: "${nextJob.name}").`);
608
-
awaitthis.setCheckpoint('on_error',plan);
629
+
awaitthis.setCheckpoint('on_error',plan,{
630
+
jobName: nextJob.name,
631
+
failureKind: 'test_failure',
632
+
});
609
633
return;
610
634
}
611
635
}
@@ -893,7 +917,10 @@ If your work needs human review before it can proceed: mc_report(status: "needs_
893
917
894
918
this.showToast('Mission Control',`Job "${job.name}" failed. Plan paused.`,'error');
895
919
this.notify(`❌ Job "${job.name}" failed. Fix and retry with mc_plan_approve(checkpoint: "on_error", retry: "${job.name}").`);
896
-
awaitthis.setCheckpoint('on_error',plan);
920
+
awaitthis.setCheckpoint('on_error',plan,{
921
+
jobName: job.name,
922
+
failureKind: 'job_failed',
923
+
});
897
924
})
898
925
.catch(()=>{})
899
926
.finally(()=>{
@@ -945,6 +972,7 @@ If your work needs human review before it can proceed: mc_report(status: "needs_
0 commit comments