fix: surface sentinel timing detail in reports

This commit is contained in:
Codex
2026-06-28 11:38:30 +00:00
parent 0ab0146d3e
commit 282d70f5ec
3 changed files with 52 additions and 4 deletions
+24 -1
View File
@@ -870,6 +870,9 @@ function dashboardFindings(config: WebProbeSentinelServiceConfig, db: Database,
rootCauseConfidence: stringOrNull(latestDetail?.rootCauseConfidence),
nextAction: stringOrNull(latestDetail?.nextAction),
evidenceSummary: stringOrNull(latestDetail?.evidenceSummary),
timingSourceOfTruth: stringOrNull(latestDetail?.timingSourceOfTruth),
timingStatus: stringOrNull(latestDetail?.timingStatus),
timingAlert: latestDetail?.timingAlert === true,
traceability: latestRun === null ? null : runTraceability(config, latestRun),
valuesRedacted: true,
});
@@ -1147,6 +1150,9 @@ function enrichFindingRowWithStoredDetail(config: WebProbeSentinelServiceConfig,
rootCauseConfidence: stringOrNull(detail?.rootCauseConfidence),
nextAction: stringOrNull(detail?.nextAction),
evidenceSummary: stringOrNull(detail?.evidenceSummary),
timingSourceOfTruth: stringOrNull(detail?.timingSourceOfTruth),
timingStatus: stringOrNull(detail?.timingStatus),
timingAlert: detail?.timingAlert === true,
valuesRedacted: true,
});
}
@@ -1184,6 +1190,9 @@ function compactStoredFinding(value: unknown): Record<string, unknown> {
rootCauseConfidence: stringOrNull(item.rootCauseConfidence),
nextAction: stringOrNull(item.nextAction),
evidenceSummary: stringOrNull(item.evidenceSummary) ?? compactFindingEvidenceSummary(item.evidence),
timingSourceOfTruth: stringOrNull(item.timingSourceOfTruth) ?? stringOrNull(item.expectedElapsedSource) ?? stringOrNull(item.evidenceKind),
timingStatus: stringOrNull(item.timingStatus),
timingAlert: item.timingAlert === true,
valuesRedacted: true,
};
}
@@ -1540,7 +1549,7 @@ function reportRunView(config: WebProbeSentinelServiceConfig, db: Database, view
const findings = findingsForRun(config, db, selectedRunId, 50);
const views = record(stored.views);
const storedView = record(views[view]);
const renderedText = typeof storedView.renderedText === "string" ? storedView.renderedText : view === "summary" ? renderStoredSummary(row, stored, findings) : view === "findings" ? renderStoredFindings(row, findings) : null;
const renderedText = view === "findings" ? renderStoredFindings(row, findings) : typeof storedView.renderedText === "string" ? storedView.renderedText : view === "summary" ? renderStoredSummary(row, stored, findings) : null;
if (renderedText === null) {
return { ok: false, error: "report-view-not-indexed", runId: selectedRunId, view, availableViews: Object.keys(views), valuesRedacted: true };
}
@@ -1564,14 +1573,28 @@ function formatStoredFindingLine(item: Record<string, unknown>): string {
const status = stringOrNull(item.rootCauseStatus);
const nextAction = stringOrNull(item.nextAction);
const evidence = stringOrNull(item.evidenceSummary);
const timing = formatStoredFindingTiming(item);
return [
`${item.severity ?? "-"} ${code} ${title} count=${item.count ?? "-"} ${summary}`,
timing,
rootCause === null ? null : `rootCause=${rootCause}${status === null ? "" : ` status=${status}`}`,
evidence === null ? null : `evidence=${evidence}`,
nextAction === null ? null : `next=${nextAction}`,
].filter((part) => part !== null).join(" | ");
}
function formatStoredFindingTiming(item: Record<string, unknown>): string | null {
const source = stringOrNull(item.timingSourceOfTruth);
const status = stringOrNull(item.timingStatus);
if (source === null && status === null) return null;
const pieces = [
status === null ? null : `status=${status}`,
source === null ? null : `source=${source}`,
item.timingAlert === true ? "alert=true" : null,
].filter((part): part is string => part !== null);
return `timing=${pieces.join(" ")}`;
}
function renderStoredSummary(row: Record<string, unknown>, stored: Record<string, unknown>, findings: readonly Record<string, unknown>[]): string {
const summary = record(stored.summary);
return [