fix: clarify codex submit queue summary disclosure

This commit is contained in:
Codex
2026-05-23 09:08:05 +00:00
parent 5f463eba7c
commit 49dfbc0b3d
5 changed files with 232 additions and 42 deletions
+142 -39
View File
@@ -34,6 +34,7 @@ const diagnosticsIdPreviewLimit = 3;
const diagnosticsReasonPreviewLimit = 2;
const mutationQueueIdPreviewLimit = 15;
const steerPromptPreviewChars = 320;
const rawCodeQueueOverviewCommand = "bun scripts/cli.ts microservice proxy code-queue /api/tasks/overview?limit=30 --raw --full";
const sandboxLikeExecutionModes = new Set(["full-access", "danger-full-access", "workspace-write", "read-only"]);
const detailAttemptReturnedLimit = 3;
const detailInitialPromptPreviewChars = 1200;
@@ -4208,15 +4209,32 @@ function compactIdPreview(knownIds: string[], totalCount: number, limit: number,
const count = Math.max(0, totalCount, all.length);
const items = all.slice(0, limit);
const omitted = Math.max(0, count - items.length);
return {
items,
const idsUnavailable = count > 0 && items.length === 0;
const result: Record<string, unknown> = {
count,
returned: items.length,
omitted,
truncated: omitted > 0 || all.length > items.length,
source,
countsAreAuthoritative: true,
idsUnavailable,
itemsMeaning: idsUnavailable
? "not-enumerated-in-default-submit-output"
: count === 0
? "authoritative-empty"
: omitted > 0 || all.length > items.length
? "bounded-preview"
: "complete-known-list",
rawCommand: rawCodeQueueOverviewCommand,
...(note === null ? {} : { note }),
};
if (idsUnavailable) {
result.itemsOmitted = true;
result.note = note ?? "Count is nonzero, but the default submit response did not enumerate ids for this list; use rawCommand for drill-down.";
} else {
result.items = items;
}
return result;
}
function idPreviewInputItems(value: unknown): string[] {
@@ -4249,6 +4267,35 @@ function taskIdsForStatuses(tasks: Record<string, unknown>[], statuses: Set<stri
});
}
function submittedTaskState(task: Record<string, unknown>): Record<string, unknown> {
const id = asString(task.id);
const status = asString(task.status) || "unknown";
const queueId = asString(task.queueId) || null;
const state = status === "queued" || status === "retry_wait"
? "queued"
: status === "running" || status === "judging"
? "running"
: isTerminalTaskStatus(status)
? "terminal"
: "unknown";
return {
id: id || null,
queueId,
status,
state,
source: "response.tasks[].status",
};
}
function submittedTaskStatusCounts(tasks: Record<string, unknown>[]): Record<string, number> {
const counts: Record<string, number> = {};
for (const task of tasks) {
const status = asString(task.status) || "unknown";
counts[status] = (counts[status] ?? 0) + 1;
}
return counts;
}
function previewSource(parts: string[], fallback: string): string {
const unique = orderedUniqueStringList(parts.filter((part) => part.length > 0));
return unique.length > 0 ? unique.join("+") : fallback;
@@ -4269,17 +4316,25 @@ function compactSubmitQueueConfirmation(value: unknown, options: CompactSubmitQu
const queuedKnownIds = orderedUniqueStringList([...submittedQueuedTaskIds, ...upstreamQueuedTaskIds]);
const queuedStatusCount = countForStatus(counts, "queued") + countForStatus(counts, "retry_wait");
const queuedCount = Math.max(queuedKnownIds.length, idPreviewInputCount(record.queuedTaskIds), queuedStatusCount);
const queuedPreview = compactIdPreview(
queuedKnownIds,
queuedCount,
idPreviewLimit,
previewSource([
submittedQueuedTaskIds.length > 0 ? "submittedTaskIds" : "",
upstreamQueuedTaskIds.length > 0 ? "upstreamQueuedTaskIds" : "",
queuedKnownIds.length === 0 && queuedCount > 0 ? "aggregateCountsOnly" : "",
], "none"),
queuedCount > queuedKnownIds.length ? "Upstream did not enumerate every queued id in this low-noise mutation response; count remains authoritative." : null,
);
const queuedPreview: Record<string, unknown> = {
...compactIdPreview(
queuedKnownIds,
queuedCount,
idPreviewLimit,
previewSource([
submittedQueuedTaskIds.length > 0 ? "submittedTaskIds" : "",
upstreamQueuedTaskIds.length > 0 ? "upstreamQueuedTaskIds" : "",
queuedKnownIds.length === 0 && queuedCount > 0 ? "aggregateCountsOnly" : "",
], "none"),
queuedCount > queuedKnownIds.length ? "Upstream did not enumerate every queued id in this low-noise mutation response; count remains authoritative." : null,
),
sourceCounts: {
queued: countForStatus(counts, "queued"),
retryWait: countForStatus(counts, "retry_wait"),
upstreamQueuedTaskIds: idPreviewInputCount(record.queuedTaskIds),
submittedQueuedTaskIds: submittedQueuedTaskIds.length,
},
};
const upstreamActiveTaskIds = idPreviewInputItems(record.activeTaskIds);
const databaseActiveTaskIds = idPreviewInputItems(record.databaseActiveTaskIds);
@@ -4305,30 +4360,49 @@ function compactSubmitQueueConfirmation(value: unknown, options: CompactSubmitQu
databaseActiveTaskCount,
statusActiveCount,
]);
const activePreview = compactIdPreview(
activeKnownIds,
activeCount,
idPreviewLimit,
previewSource([
submittedActiveTaskIds.length > 0 ? "submittedTaskIds" : "",
upstreamActiveTaskIds.length > 0 ? "upstreamActiveTaskIds" : "",
databaseActiveTaskIds.length > 0 ? "databaseActiveTaskIds" : "",
diagnosticsDatabaseActiveTaskIds.length > 0 ? "executionDiagnostics.databaseActiveTaskIds" : "",
diagnosticsHeartbeatTaskIds.length > 0 ? "executionDiagnostics.heartbeatFreshTaskIds" : "",
activeKnownIds.length === 0 && activeCount > 0 ? "aggregateCountsOnly" : "",
], "none"),
activeCount > activeKnownIds.length ? "Upstream only exposed aggregate active counts for part of the running set; count remains authoritative." : null,
);
const databaseActivePreview = compactIdPreview(
orderedUniqueStringList([...databaseActiveTaskIds, ...diagnosticsDatabaseActiveTaskIds]),
maxFiniteNumber([databaseActiveTaskCount, idPreviewInputCount(record.databaseActiveTaskIds), idPreviewInputCount(diagnosticsRecord.databaseActiveTaskIds)]),
idPreviewLimit,
previewSource([
databaseActiveTaskIds.length > 0 ? "databaseActiveTaskIds" : "",
diagnosticsDatabaseActiveTaskIds.length > 0 ? "executionDiagnostics.databaseActiveTaskIds" : "",
databaseActiveTaskCount > 0 && databaseActiveTaskIds.length === 0 && diagnosticsDatabaseActiveTaskIds.length === 0 ? "aggregateCountsOnly" : "",
], "none"),
);
const activePreview: Record<string, unknown> = {
...compactIdPreview(
activeKnownIds,
activeCount,
idPreviewLimit,
previewSource([
submittedActiveTaskIds.length > 0 ? "submittedTaskIds" : "",
upstreamActiveTaskIds.length > 0 ? "upstreamActiveTaskIds" : "",
databaseActiveTaskIds.length > 0 ? "databaseActiveTaskIds" : "",
diagnosticsDatabaseActiveTaskIds.length > 0 ? "executionDiagnostics.databaseActiveTaskIds" : "",
diagnosticsHeartbeatTaskIds.length > 0 ? "executionDiagnostics.heartbeatFreshTaskIds" : "",
activeKnownIds.length === 0 && activeCount > 0 ? "aggregateCountsOnly" : "",
], "none"),
activeCount > activeKnownIds.length ? "Upstream only exposed aggregate active counts for part of the running set; count remains authoritative." : null,
),
sourceCounts: {
running: countForStatus(counts, "running"),
judging: countForStatus(counts, "judging"),
upstreamActiveTaskIds: idPreviewInputCount(record.activeTaskIds),
databaseActiveTaskCount,
diagnosticsDatabaseActiveTaskIds: idPreviewInputCount(diagnosticsRecord.databaseActiveTaskIds),
diagnosticsHeartbeatFreshTaskIds: idPreviewInputCount(diagnosticsRecord.heartbeatFreshTaskIds),
submittedActiveTaskIds: submittedActiveTaskIds.length,
},
};
const databaseActivePreview: Record<string, unknown> = {
...compactIdPreview(
orderedUniqueStringList([...databaseActiveTaskIds, ...diagnosticsDatabaseActiveTaskIds]),
maxFiniteNumber([databaseActiveTaskCount, idPreviewInputCount(record.databaseActiveTaskIds), idPreviewInputCount(diagnosticsRecord.databaseActiveTaskIds)]),
idPreviewLimit,
previewSource([
databaseActiveTaskIds.length > 0 ? "databaseActiveTaskIds" : "",
diagnosticsDatabaseActiveTaskIds.length > 0 ? "executionDiagnostics.databaseActiveTaskIds" : "",
databaseActiveTaskCount > 0 && databaseActiveTaskIds.length === 0 && diagnosticsDatabaseActiveTaskIds.length === 0 ? "aggregateCountsOnly" : "",
], "none"),
),
sourceCounts: {
queueDatabaseActiveTaskCount: asNumber(record.databaseActiveTaskCount, Number.NaN),
diagnosticsDatabaseActiveTaskCount: asNumber(diagnosticsRecord.databaseActiveTaskCount, Number.NaN),
queueDatabaseActiveTaskIds: idPreviewInputCount(record.databaseActiveTaskIds),
diagnosticsDatabaseActiveTaskIds: idPreviewInputCount(diagnosticsRecord.databaseActiveTaskIds),
},
};
const submittedPreview = compactIdPreview(submittedTaskIds, submittedTaskIds.length, idPreviewLimit, "response.tasks");
const omittedCounts = {
activeTaskIds: asNumber(activePreview.omitted, 0),
@@ -4341,6 +4415,15 @@ function compactSubmitQueueConfirmation(value: unknown, options: CompactSubmitQu
|| databaseActivePreview.truncated === true
|| queuedPreview.truncated === true
|| submittedPreview.truncated === true;
const diagnostics = compactQueueExecutionDiagnostics(record.executionDiagnostics);
const activity = compactCodeQueueActivity(record, diagnostics);
const commanderConcurrency = asRecord(activity.commanderConcurrency) ?? {};
const unavailableIdLists = {
activeTaskIds: activePreview.idsUnavailable === true,
databaseActiveTaskIds: databaseActivePreview.idsUnavailable === true,
queuedTaskIds: queuedPreview.idsUnavailable === true,
submittedTaskIds: submittedPreview.idsUnavailable === true,
};
return {
total: record.total ?? null,
queueCount: record.queueCount ?? null,
@@ -4350,7 +4433,9 @@ function compactSubmitQueueConfirmation(value: unknown, options: CompactSubmitQu
databaseActiveTaskCount,
databaseActiveTaskIds: databaseActivePreview,
queuedTaskIds: queuedPreview,
executionDiagnostics: compactQueueExecutionDiagnostics(record.executionDiagnostics),
activity,
commanderConcurrency,
executionDiagnostics: diagnostics,
runnerPermissions: compactRunnerPermissions(record.runnerPermissions),
...(submittedTasks.length === 0 ? {} : { submittedTaskIds: submittedPreview }),
countContext: {
@@ -4368,10 +4453,22 @@ function compactSubmitQueueConfirmation(value: unknown, options: CompactSubmitQu
countsAreAuthoritative: true,
truncated: listsTruncated,
omittedCounts,
unavailableIdLists,
emptyItemsSemantics: "items=[] is only emitted for an authoritative empty list or a nonempty bounded preview result; if count is nonzero and ids were not enumerated, the preview omits items and sets idsUnavailable=true.",
note: listsTruncated
? "Low-noise mutation output omits additional task ids from one or more previews; use the raw command for full upstream queue detail."
: "Low-noise mutation output includes all known task ids returned for these previews.",
rawCommand: "bun scripts/cli.ts microservice proxy code-queue /api/tasks/overview?limit=30 --raw --full",
rawCommand: rawCodeQueueOverviewCommand,
},
stateDisclosure: {
submittedStatusSource: "response.tasks[].status",
queueCountsSource: "response.queue.counts",
activeCountField: "queue.countContext.active",
commanderActiveRunnerCountField: "queue.activity.effectiveActiveTaskCount",
splitBrainLive: diagnostics?.splitBrainLive ?? false,
splitBrainDisposition: diagnostics?.splitBrainLive === true ? "live-counts-remain-active; continue supervision unless commanderConcurrency.interventionRequired=true" : "not-split-brain-live",
idsUnavailableMeaning: "A nonzero count with idsUnavailable=true means ids were omitted or unavailable in the bounded submit summary, not that there are no tasks.",
rawCommand: rawCodeQueueOverviewCommand,
},
byQueue: Array.isArray(record.byQueue) ? record.byQueue : undefined,
};
@@ -4392,6 +4489,8 @@ function compactSubmitSuccessResponse(body: Record<string, unknown>, upstream: R
const submittedTasks = rawTasks.map((task) => asRecord(task)).filter((task): task is Record<string, unknown> => task !== null);
const allTasks = rawTasks.map(compactSubmitTaskConfirmation);
const tasks = allTasks.slice(0, defaultTasksLimit);
const allTaskStates = submittedTasks.map(submittedTaskState);
const taskStates = allTaskStates.slice(0, defaultTasksLimit);
const allTaskIds = allTasks.map((task) => asString(task.id)).filter(Boolean);
const taskIds = allTaskIds.slice(0, defaultTasksLimit);
const queueIds = Array.from(new Set(tasks.map((task) => asString(task.queueId)).filter(Boolean))).sort();
@@ -4413,6 +4512,10 @@ function compactSubmitSuccessResponse(body: Record<string, unknown>, upstream: R
taskIdsCount: allTaskIds.length,
taskIdsTruncated: allTaskIds.length > taskIds.length,
queueIds,
statusCounts: submittedTaskStatusCounts(submittedTasks),
taskStates,
taskStatesTruncated: allTaskStates.length > taskStates.length,
stateSource: "response.tasks[].status is authoritative for the submitted task state at submit-confirmation time.",
tasks,
tasksTruncated: allTasks.length > tasks.length,
promptOmitted: true,
+6
View File
@@ -281,6 +281,12 @@ function codexHelp(): unknown {
boundary: "--execution-mode selects Code Queue runtime placement, not Codex sandbox permissions.",
permissionVisibility: "Submit dry-runs show requested/effective mode; real submit responses include service runnerPermissions.sandbox and approvalPolicy.",
},
submitSummary: {
default: "Real codex submit is a compact write confirmation: accepted status, submitted task ids, submitted status/source, queue ids, promptOmitted=true, queue counts, activity and drill-down commands.",
listSemantics: "Task id previews are bounded objects; if a count is nonzero but ids are omitted or unavailable, the field sets idsUnavailable=true and does not print items=[] as if the list were empty.",
splitBrainLive: "When split-brain-live heartbeat evidence is present, submit summaries keep the live disposition visible and continue to count heartbeat/database active tasks as active.",
rawDrillDown: "Use queue.listPreviewPolicy.rawCommand or bun scripts/cli.ts microservice proxy code-queue /api/tasks/overview?limit=30 --raw --full for raw queue detail.",
},
readOutput: {
default: "codex read marks a terminal task read and returns terminal metadata, final response, last error/judge, counts, and drill-down commands.",
disclosure: "Full prompt, tool logs, and feedback prompts are not printed by codex read; use codex task/detail/trace/output for progressive disclosure.",