fix: preserve skipped apply source reasons

This commit is contained in:
Peter Steinberger 2026-05-08 15:25:41 +01:00
parent 369aa42b79
commit 077a19caec
No known key found for this signature in database
2 changed files with 25 additions and 4 deletions

View File

@ -158,7 +158,8 @@ function applyAction({ job, result, action, dryRun, allowMissingUpdatedAt }) {
...base,
status: "skipped",
source_status: action.status ?? null,
reason: action.reason ?? `action status is ${action.status}`,
source_reason: action.reason ?? null,
reason: `action status is ${action.status ?? "missing"}`,
};
}
if (MERGE_ACTIONS.has(actionName)) {

View File

@ -569,6 +569,8 @@ function sanitizeApplyAction(action) {
candidate_fix: action.candidate_fix ?? null,
title: action.title ?? action.target_title ?? action.pr_title ?? null,
idempotency_key: action.idempotency_key ?? null,
source_status: action.source_status ?? null,
source_reason: action.source_reason ?? null,
reason: action.reason ?? null,
merged_at: action.merged_at ?? null,
merge_commit_sha: action.merge_commit_sha ?? null,
@ -676,7 +678,7 @@ function buildInspectionRows({ latestByCluster, latestFailedFixRows, latestBlock
addInspectionRow(byCluster, row.record, `fix ${row.action.status}`, actionReason(row.action));
}
for (const row of [...latestBlockedRows, ...latestSkippedRows]) {
addInspectionRow(byCluster, row.record, `apply ${row.action.status}`, actionReason(row.action));
addInspectionRow(byCluster, row.record, `apply ${row.action.status}`, actionReason(row.action, row.record));
}
return [...byCluster.values()].sort((left, right) =>
String(right.record.published_at ?? "").localeCompare(String(left.record.published_at ?? "")),
@ -737,7 +739,7 @@ function renderFixFailureRows(rows) {
function renderBlockedReasonRows(rows) {
const counts = new Map();
for (const row of rows) {
const reason = compactReason(actionReason(row.action) || "unknown");
const reason = compactReason(actionReason(row.action, row.record) || "unknown");
const current = counts.get(reason);
counts.set(reason, {
reason,
@ -779,7 +781,14 @@ function renderFinalizerRows(report) {
.join("\n");
}
function actionReason(action) {
function actionReason(action, record = null) {
const genericStatus = String(action?.reason ?? "").match(/^action status is (.+)$/);
if (genericStatus) {
const sourceAction = findSourceAction(record, action);
const sourceStatus = action?.source_status ?? sourceAction?.status;
const sourceReason = action?.source_reason ?? sourceAction?.reason;
if (sourceReason) return compactReason([sourceStatus, sourceReason].filter(Boolean).join(": "));
}
return compactReason(
[
action?.code,
@ -790,6 +799,17 @@ function actionReason(action) {
);
}
function findSourceAction(record, applyAction) {
if (!record || !Array.isArray(record.actions)) return null;
return record.actions.find(
(action) =>
action.target === applyAction?.target &&
action.action === applyAction?.action &&
action.status &&
action.status !== "planned",
);
}
function inspectionReason(item) {
if (typeof item === "string") return item;
if (!item || typeof item !== "object") return "";