diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index c423282a..92aac771 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -2200,12 +2200,17 @@ "groupCount": "{count} 次", "status": { "green": "已回綠", - "sealed_waiting_window": "已封口,等待視窗", + "sealed_waiting_window": "已封口,觀察中", "needs_investigation": "仍需調查", "insufficient_diagnostics": "診斷不足", "diagnostics_unavailable": "診斷不可用", "unknown": "狀態待查" }, + "observation": { + "title": "處置結論:觀察中,不需人工介入", + "detail": "已知失敗來源已封口,待查群組為 0;W-1 不再升級 META,預估 {greenAt} 回綠。", + "greenAtFallback": "rolling window" + }, "stat": { "successRate": "成功率", "successRateDetail": "{success}/{total} 目前樣本", diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index c423282a..92aac771 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -2200,12 +2200,17 @@ "groupCount": "{count} 次", "status": { "green": "已回綠", - "sealed_waiting_window": "已封口,等待視窗", + "sealed_waiting_window": "已封口,觀察中", "needs_investigation": "仍需調查", "insufficient_diagnostics": "診斷不足", "diagnostics_unavailable": "診斷不可用", "unknown": "狀態待查" }, + "observation": { + "title": "處置結論:觀察中,不需人工介入", + "detail": "已知失敗來源已封口,待查群組為 0;W-1 不再升級 META,預估 {greenAt} 回綠。", + "greenAtFallback": "rolling window" + }, "stat": { "successRate": "成功率", "successRateDetail": "{success}/{total} 目前樣本", diff --git a/apps/web/src/app/[locale]/governance/tabs/slo-tab.tsx b/apps/web/src/app/[locale]/governance/tabs/slo-tab.tsx index e1b9987f..68637325 100644 --- a/apps/web/src/app/[locale]/governance/tabs/slo-tab.tsx +++ b/apps/web/src/app/[locale]/governance/tabs/slo-tab.tsx @@ -281,6 +281,7 @@ function closureStatusKey(value?: string | null): string { function diagnosticTone(status?: string | null, openGroups = 0): string { if (openGroups > 0 || status === 'needs_investigation') return '#FF3300' if (status === 'green') return '#22C55E' + if (status === 'sealed_waiting_window' && openGroups === 0) return '#0EA5E9' if (status === 'diagnostics_unavailable') return '#87867f' return '#F59E0B' } @@ -451,6 +452,7 @@ function AutoExecuteDiagnosticsPanel({ diagnostics }: { diagnostics?: AutoExecut const projectedAt = formatShortDate(diagnostics?.projected_green_at) const rateLabel = rate == null ? '--' : `${(rate * 100).toFixed(1)}%` const thresholdLabel = `${(threshold * 100).toFixed(0)}%` + const observationOnly = diagnostics?.status === 'sealed_waiting_window' && openGroups === 0 const statItems = [ { key: 'successRate', icon: CheckCircle2, value: rateLabel, detail: t('stat.successRateDetail', { success, total }) }, @@ -498,6 +500,29 @@ function AutoExecuteDiagnosticsPanel({ diagnostics }: { diagnostics?: AutoExecut + {observationOnly && ( +