fix(iwooos): scope aggregate same-run status
All checks were successful
CD Pipeline / workflow-shape (push) Successful in 1s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 2m22s
CD Pipeline / build-and-deploy (push) Successful in 14m50s
CD Pipeline / post-deploy-checks (push) Successful in 2m5s

This commit is contained in:
ogt
2026-07-15 18:18:55 +08:00
parent bd6a8a839a
commit 8450c989aa

View File

@@ -37,6 +37,10 @@ type Copy = {
nist: string; nist: string;
siem: string; siem: string;
strictRun: string; strictRun: string;
aggregateVerified: string;
aggregateOpen: string;
aggregateScopeNote: string;
aggregateCountsTitle: string;
verified: string; verified: string;
functions: string; functions: string;
framework: string; framework: string;
@@ -88,7 +92,11 @@ const COPY: Record<"zh" | "en", Copy> = {
assetTypes: "資產類型", assetTypes: "資產類型",
nist: "NIST 控制", nist: "NIST 控制",
siem: "SIEM 閉環", siem: "SIEM 閉環",
strictRun: " run 閉環", strictRun: "全域 AI run",
aggregateVerified: "全域已驗證",
aggregateOpen: "全域未閉環",
aggregateScopeNote: "不代表目前 Wazuh lane",
aggregateCountsTitle: "全域 AI run 階段收據",
verified: "24h 已驗證", verified: "24h 已驗證",
functions: "治理六功能", functions: "治理六功能",
framework: "完整資安框架", framework: "完整資安框架",
@@ -121,8 +129,8 @@ const COPY: Record<"zh" | "en", Copy> = {
failed: "失敗", failed: "失敗",
failedCollectors: "失敗 Collector", failedCollectors: "失敗 Collector",
failedCollectorsUnavailable: "失敗原因待安全分類", failedCollectorsUnavailable: "失敗原因待安全分類",
sameRunMissing: "尚無同 run 閉環證據", sameRunMissing: "全域 AI run 尚未閉環;不代表目前 Wazuh lane",
sameRunVerified: "18 段同 run 閉環已驗證", sameRunVerified: "全域 AI run 已驗證;不代表目前 Wazuh lane",
loading: "正在載入資安控制平面", loading: "正在載入資安控制平面",
unavailable: "Live readback 無法取得", unavailable: "Live readback 無法取得",
refresh: "重新整理資安控制平面", refresh: "重新整理資安控制平面",
@@ -138,7 +146,11 @@ const COPY: Record<"zh" | "en", Copy> = {
assetTypes: "Asset types", assetTypes: "Asset types",
nist: "NIST control", nist: "NIST control",
siem: "SIEM closure", siem: "SIEM closure",
strictRun: "Same-run closure", strictRun: "Aggregate AI run",
aggregateVerified: "Aggregate verified",
aggregateOpen: "Aggregate open",
aggregateScopeNote: "Does not represent the current Wazuh lane",
aggregateCountsTitle: "Aggregate AI run stage receipts",
verified: "Verified 24h", verified: "Verified 24h",
functions: "Six functions", functions: "Six functions",
framework: "Security framework", framework: "Security framework",
@@ -171,8 +183,8 @@ const COPY: Record<"zh" | "en", Copy> = {
failed: "Failed", failed: "Failed",
failedCollectors: "Failed collectors", failedCollectors: "Failed collectors",
failedCollectorsUnavailable: "Failure detail awaiting safe classification", failedCollectorsUnavailable: "Failure detail awaiting safe classification",
sameRunMissing: "No same-run closure evidence", sameRunMissing: "Aggregate AI run is open; this is not the current Wazuh lane",
sameRunVerified: "18-stage same-run closure verified", sameRunVerified: "Aggregate AI run is verified; this is not the current Wazuh lane",
loading: "Loading security control plane", loading: "Loading security control plane",
unavailable: "Live readback unavailable", unavailable: "Live readback unavailable",
refresh: "Refresh security control plane", refresh: "Refresh security control plane",
@@ -230,20 +242,42 @@ function MetricCell({
label, label,
value, value,
icon: Icon, icon: Icon,
detail,
testId,
title,
}: { }: {
label: string; label: string;
value: string | number; value: string | number;
icon: typeof ShieldCheck; icon: typeof ShieldCheck;
detail?: string;
testId?: string;
title?: string;
}) { }) {
return ( return (
<div className="min-w-0 bg-white px-3 py-3"> <div
className="min-w-0 bg-white px-3 py-3"
data-testid={testId}
title={title}
aria-label={title}
>
<div className="flex items-center gap-2 text-[11px] font-medium text-[#6f6d66]"> <div className="flex items-center gap-2 text-[11px] font-medium text-[#6f6d66]">
<Icon className="h-3.5 w-3.5 shrink-0" aria-hidden="true" /> <Icon className="h-3.5 w-3.5 shrink-0" aria-hidden="true" />
<span className="truncate">{label}</span> <span className="truncate">{label}</span>
</div> </div>
<div className="mt-2 font-mono text-xl font-semibold tracking-normal text-[#141413]"> <div
className="mt-2 font-mono text-xl font-semibold tracking-normal text-[#141413]"
data-testid={testId ? `${testId}-primary` : undefined}
>
{value} {value}
</div> </div>
{detail ? (
<div
className="mt-1 text-[9px] font-medium leading-4 text-[#9f2f25]"
data-testid={testId ? `${testId}-scope-note` : undefined}
>
{detail}
</div>
) : null}
</div> </div>
); );
} }
@@ -563,10 +597,19 @@ export function SecurityAssetControlPlaneCockpit({
label={copy.strictRun} label={copy.strictRun}
value={ value={
payload payload
? `${payload.ai_automation.strict_runtime_completion.present_stage_count}/${payload.ai_automation.strict_runtime_completion.required_stage_count}` ? payload.ai_automation.strict_runtime_completion.closed
? copy.aggregateVerified
: copy.aggregateOpen
: "--" : "--"
} }
icon={Bot} icon={Bot}
detail={payload ? copy.aggregateScopeNote : undefined}
testId="security-aggregate-ai-run-status"
title={
payload
? `${copy.strictRun}: ${payload.ai_automation.strict_runtime_completion.closed ? copy.aggregateVerified : copy.aggregateOpen}. ${copy.aggregateCountsTitle}: ${payload.ai_automation.strict_runtime_completion.present_stage_count}/${payload.ai_automation.strict_runtime_completion.required_stage_count}. ${copy.aggregateScopeNote}`
: undefined
}
/> />
<MetricCell <MetricCell
label={copy.verified} label={copy.verified}