diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json
index ec263187a..76b2c4cae 100644
--- a/apps/web/messages/en.json
+++ b/apps/web/messages/en.json
@@ -21829,6 +21829,7 @@
"domainStatusLabel": "狀態",
"p0Title": "P0 優先順序",
"p0Intro": "以下是下一階段真正能降低即時風險的順序;每一項都需要脫敏證據與 owner acceptance,不能靠 UI 可見或一般批准跳過。",
+ "p0More": "Show remaining {count} P0 items and evidence requirements",
"requiredEvidenceLabel": "需要證據",
"boundaryTitle": "不可假綠燈規則",
"status": {
@@ -21876,6 +21877,16 @@
},
"review": {
"title": "為什麼還沒有完成資安管理閉環",
+ "p0Queue": "Next P0 queue",
+ "toolRail": "External security tools",
+ "aiLoop": "AI automation loop",
+ "rootCauseDetails": "Show root causes and closure gates",
+ "cockpit": {
+ "findingCount": "Findings",
+ "p0Count": "P0",
+ "toolCount": "Tools",
+ "aiStageCount": "AI stages"
+ },
"diagnosis": {
"controlPlaneRuntimeGap": "控制面已建立,runtime 防護閉環未完成",
"unknown": "需要重新讀回診斷狀態"
diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json
index cd6d47e6a..2e82ae560 100644
--- a/apps/web/messages/zh-TW.json
+++ b/apps/web/messages/zh-TW.json
@@ -21829,6 +21829,7 @@
"domainStatusLabel": "狀態",
"p0Title": "P0 優先順序",
"p0Intro": "以下是下一階段真正能降低即時風險的順序;每一項都需要脫敏證據與 owner acceptance,不能靠 UI 可見或一般批准跳過。",
+ "p0More": "展開其餘 {count} 個 P0 與證據要求",
"requiredEvidenceLabel": "需要證據",
"boundaryTitle": "不可假綠燈規則",
"status": {
@@ -21876,6 +21877,16 @@
},
"review": {
"title": "為什麼還沒有完成資安管理閉環",
+ "p0Queue": "下一步 P0 queue",
+ "toolRail": "外部資安工具軌",
+ "aiLoop": "AI 自動化閉環",
+ "rootCauseDetails": "展開根因與 closure 條件",
+ "cockpit": {
+ "findingCount": "根因",
+ "p0Count": "P0",
+ "toolCount": "工具",
+ "aiStageCount": "AI 階段"
+ },
"diagnosis": {
"controlPlaneRuntimeGap": "控制面已建立,runtime 防護閉環未完成",
"unknown": "需要重新讀回診斷狀態"
diff --git a/apps/web/src/app/[locale]/iwooos/page.tsx b/apps/web/src/app/[locale]/iwooos/page.tsx
index dd141ba42..93668bf5c 100644
--- a/apps/web/src/app/[locale]/iwooos/page.tsx
+++ b/apps/web/src/app/[locale]/iwooos/page.tsx
@@ -8770,6 +8770,37 @@ function IwoooSSecurityControlCoverageBoard() {
]
const domains = data?.domains ?? []
const p0Actions = data?.p0_next_actions ?? []
+ const orderedP0Actions = review?.priority_work_items ?? p0Actions
+ const p0Preview = orderedP0Actions.slice(0, 4)
+ const p0Remainder = orderedP0Actions.slice(4)
+ const toolTracks = review?.security_tool_integration_matrix ?? []
+ const aiLoopStages = review?.ai_automation_closure_loop ?? []
+ const cockpitStats = review ? [
+ {
+ key: 'findingCount',
+ value: String(review.root_cause_summary.length),
+ icon: FileWarning,
+ tone: 'warn' as const,
+ },
+ {
+ key: 'p0Count',
+ value: String(review.priority_work_items.length),
+ icon: ListChecks,
+ tone: 'warn' as const,
+ },
+ {
+ key: 'toolCount',
+ value: String(toolTracks.length),
+ icon: SearchCheck,
+ tone: 'steady' as const,
+ },
+ {
+ key: 'aiStageCount',
+ value: String(aiLoopStages.length),
+ icon: Workflow,
+ tone: 'steady' as const,
+ },
+ ] : []
return (
+
{finding.required_closure}
+ {t('review.rootCauseDetails')}
+
+
- {t('requiredEvidenceLabel')}:{action.required_evidence} -
-+ {t('requiredEvidenceLabel')}:{action.required_evidence} +
+