clementine-agent 1.0.16 → 1.0.17
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.
|
@@ -175,7 +175,20 @@ export function computeBrokenJobs(now = Date.now()) {
|
|
|
175
175
|
const lastRunMs = Date.parse(lastEntry.startedAt);
|
|
176
176
|
// Always consult the breaker state — a stuck breaker is the primary
|
|
177
177
|
// signal for "job has been silently broken for days".
|
|
178
|
-
|
|
178
|
+
let cb = lastCircuitBreakerEvent(jobName);
|
|
179
|
+
// Clear a "stuck" breaker flag if we see an ok run AFTER the last
|
|
180
|
+
// breaker engagement. The scheduler only logs a circuit-recovery
|
|
181
|
+
// event when consecutiveErrors >= 5 at recovery time — but a
|
|
182
|
+
// successful manual/probe run resets consecutiveErrors to 0 first,
|
|
183
|
+
// so the recovery branch never fires and the advisor log keeps the
|
|
184
|
+
// breaker appearing engaged forever. Fix: use run-log truth instead.
|
|
185
|
+
if (cb.engagedAt) {
|
|
186
|
+
const engagedMs = Date.parse(cb.engagedAt);
|
|
187
|
+
const hasOkSinceBreaker = entries.some(e => e.status === 'ok' && Date.parse(e.startedAt) > engagedMs);
|
|
188
|
+
if (hasOkSinceBreaker) {
|
|
189
|
+
cb = { engagedAt: null, lastOpinion: cb.lastOpinion };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
179
192
|
if (!cb.engagedAt && Number.isFinite(lastRunMs) && lastRunMs < dormantCutoffMs) {
|
|
180
193
|
continue;
|
|
181
194
|
}
|