fix: bound codex supervisor diagnostics

This commit is contained in:
Codex
2026-05-22 15:18:14 +00:00
parent 2ed9e79d67
commit 03c98c83ef
4 changed files with 119 additions and 24 deletions
+79 -18
View File
@@ -16,6 +16,8 @@ const supervisorRecentCompletedLimit = 5;
const supervisorPromptPreviewChars = 160;
const supervisorBodyPreviewChars = 180;
const supervisorRecentBodyPreviewChars = 80;
const diagnosticsIdPreviewLimit = 12;
const diagnosticsReasonPreviewLimit = 6;
const steerPromptPreviewChars = 320;
const minimaxSubmitModel = "minimax-m2.7";
const deepseekSubmitModel = "deepseek-chat";
@@ -1013,42 +1015,101 @@ function recommendedActionFromDiagnostics(record: Record<string, unknown>): stri
return "none";
}
function boundedUniqueStringList(value: unknown, limit = diagnosticsIdPreviewLimit): { items: string[]; count: number; omitted: number; truncated: boolean } {
const all = Array.from(new Set(stringList(value))).sort();
const items = all.slice(0, limit);
return {
items,
count: all.length,
omitted: Math.max(0, all.length - items.length),
truncated: all.length > items.length,
};
}
function boundedInlineString(value: unknown, maxChars: number): { text: string | null; chars: number; truncated: boolean; omittedChars: number } {
const text = asString(value).replace(/\s+/gu, " ").trim();
const truncated = text.length > maxChars;
return {
text: text.length === 0 ? null : truncated ? text.slice(0, maxChars) : text,
chars: text.length,
truncated,
omittedChars: truncated ? text.length - maxChars : 0,
};
}
function compactExecutionDiagnostics(value: unknown): Record<string, unknown> | null {
const record = asRecord(value);
if (record === null) return null;
const heartbeatRiskTaskIds = Array.from(new Set([
const fullHeartbeatRiskTaskIds = Array.from(new Set([
...stringList(record.heartbeatRiskTaskIds),
...stringList(record.heartbeatExpiredTaskIds),
...stringList(record.heartbeatMissingTaskIds),
...stringList(record.staleRecoveryCandidateTaskIds),
])).sort();
const databaseActiveTaskIds = boundedUniqueStringList(record.databaseActiveTaskIds);
const schedulerActiveTaskIds = boundedUniqueStringList(record.schedulerActiveTaskIds);
const activeHeartbeatTaskIds = boundedUniqueStringList(record.activeHeartbeatTaskIds);
const heartbeatFreshTaskIds = boundedUniqueStringList(record.heartbeatFreshTaskIds);
const heartbeatExpiredTaskIds = boundedUniqueStringList(record.heartbeatExpiredTaskIds);
const heartbeatMissingTaskIds = boundedUniqueStringList(record.heartbeatMissingTaskIds);
const staleRecoveryCandidateTaskIds = boundedUniqueStringList(record.staleRecoveryCandidateTaskIds);
const heartbeatRiskTaskIds = boundedUniqueStringList(fullHeartbeatRiskTaskIds);
const traceGapTaskIds = boundedUniqueStringList(record.traceGapTaskIds);
const traceGapNotStaleTaskIds = boundedUniqueStringList(record.traceGapNotStaleTaskIds);
const allReasons = stringList(record.reasons);
const reasons = allReasons.slice(0, diagnosticsReasonPreviewLimit).map((reason) => boundedInlineString(reason, 240).text).filter((reason): reason is string => reason !== null);
const livenessSummary = boundedInlineString(record.livenessSummary, 420);
const omittedCounts = {
databaseActiveTaskIds: databaseActiveTaskIds.omitted,
schedulerActiveTaskIds: schedulerActiveTaskIds.omitted,
activeHeartbeatTaskIds: activeHeartbeatTaskIds.omitted,
heartbeatFreshTaskIds: heartbeatFreshTaskIds.omitted,
heartbeatExpiredTaskIds: heartbeatExpiredTaskIds.omitted,
heartbeatMissingTaskIds: heartbeatMissingTaskIds.omitted,
staleRecoveryCandidateTaskIds: staleRecoveryCandidateTaskIds.omitted,
heartbeatRiskTaskIds: heartbeatRiskTaskIds.omitted,
traceGapTaskIds: traceGapTaskIds.omitted,
traceGapNotStaleTaskIds: traceGapNotStaleTaskIds.omitted,
reasons: Math.max(0, allReasons.length - reasons.length),
livenessSummaryChars: livenessSummary.omittedChars,
};
return {
state: record.state ?? record.health ?? null,
degraded: record.degraded ?? null,
splitBrain: record.splitBrain ?? null,
splitBrainLive: splitBrainLiveFromDiagnostics(record),
effectiveLiveness: effectiveLivenessFromDiagnostics({ ...record, heartbeatRiskTaskIds }),
recommendedAction: recommendedActionFromDiagnostics({ ...record, heartbeatRiskTaskIds }),
livenessSummary: record.livenessSummary ?? null,
effectiveLiveness: effectiveLivenessFromDiagnostics({ ...record, heartbeatRiskTaskIds: fullHeartbeatRiskTaskIds }),
recommendedAction: recommendedActionFromDiagnostics({ ...record, heartbeatRiskTaskIds: fullHeartbeatRiskTaskIds }),
livenessSummary: livenessSummary.text,
livenessSummaryChars: livenessSummary.chars,
livenessSummaryTruncated: livenessSummary.truncated,
executionStateSource: record.executionStateSource ?? null,
controlPlane: record.controlPlane ?? null,
databaseActiveTaskCount: record.databaseActiveTaskCount ?? null,
databaseActiveTaskIds: record.databaseActiveTaskIds ?? [],
controlPlane: boundedInlineString(record.controlPlane, 120).text,
databaseActiveTaskCount: record.databaseActiveTaskCount ?? databaseActiveTaskIds.count,
databaseActiveTaskIds: databaseActiveTaskIds.items,
schedulerActiveRunSlotCount: record.schedulerActiveRunSlotCount ?? null,
schedulerActiveTaskIds: record.schedulerActiveTaskIds ?? [],
activeHeartbeatTaskIds: record.activeHeartbeatTaskIds ?? [],
heartbeatFreshTaskIds: record.heartbeatFreshTaskIds ?? [],
heartbeatExpiredTaskIds: record.heartbeatExpiredTaskIds ?? [],
heartbeatMissingTaskIds: record.heartbeatMissingTaskIds ?? [],
staleRecoveryCandidateTaskIds: record.staleRecoveryCandidateTaskIds ?? [],
heartbeatRiskTaskIds,
traceGapTaskIds: record.traceGapTaskIds ?? [],
traceGapNotStaleTaskIds: record.traceGapNotStaleTaskIds ?? [],
schedulerActiveTaskIds: schedulerActiveTaskIds.items,
activeHeartbeatCount: record.activeHeartbeatCount ?? activeHeartbeatTaskIds.count,
activeHeartbeatTaskIds: activeHeartbeatTaskIds.items,
heartbeatFreshTaskIds: heartbeatFreshTaskIds.items,
heartbeatExpiredTaskIds: heartbeatExpiredTaskIds.items,
heartbeatMissingTaskIds: heartbeatMissingTaskIds.items,
staleRecoveryCandidateTaskIds: staleRecoveryCandidateTaskIds.items,
heartbeatRiskTaskIds: heartbeatRiskTaskIds.items,
traceGapTaskIds: traceGapTaskIds.items,
traceGapNotStaleTaskIds: traceGapNotStaleTaskIds.items,
lastSchedulerHeartbeatAt: record.lastSchedulerHeartbeatAt ?? null,
lastObservedAgentEventAt: record.lastObservedAgentEventAt ?? null,
lastPersistedTraceAt: record.lastPersistedTraceAt ?? null,
oaPublisher: record.oaPublisher ?? null,
reasons: record.reasons ?? [],
oaPublisher: previewJson(record.oaPublisher ?? null, { maxDepth: 3, maxArrayItems: 4, maxObjectKeys: 12, maxStringLength: 240 }),
reasons,
listBudget: {
idPreviewLimit: diagnosticsIdPreviewLimit,
reasonPreviewLimit: diagnosticsReasonPreviewLimit,
truncated: Object.values(omittedCounts).some((count) => count > 0),
omittedCounts,
rawCommand: "bun scripts/cli.ts microservice proxy code-queue /api/tasks/overview?limit=30 --raw --full",
},
};
}