diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index a862f9dd6..eef73de8f 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -990,6 +990,9 @@ "routeRoleTitle": "前台入口角色對照", "routeRoleSubtitle": "從安全合規進來時,也能直接看懂每個資安入口該負責什麼;這些入口只導覽與說明,不提供執行按鈕。", "routeLabel": "入口", + "rolloutTitle": "低摩擦分階段收斂", + "rolloutSubtitle": "初期先建立框架、可視化與證據鏈;等負責人回覆、人工審查與執行期閘門都完成後,再逐步收嚴,不讓資安一開始拖慢產品流程。", + "phaseLabel": "階段", "items": { "routePreserved": { "label": "路由策略", @@ -1029,6 +1032,28 @@ "title": "AwoooP 看人控等待", "body": "查看審批與負責人回覆等待狀態;仍不代表資安執行期閘門已開。" } + }, + "rolloutPhases": { + "observe": { + "title": "觀測與盤點", + "body": "目前只整理入口、主機、專案、網站、監控與工具姿態,不阻擋使用者流程。" + }, + "evidence": { + "title": "補齊證據", + "body": "收斂脫敏證據、版本來源、負責人回覆與 AwoooP 只讀消費證明。" + }, + "humanReview": { + "title": "人工審查", + "body": "由負責人確認例外、風險接受、修復順序與是否進入執行期閘門。" + }, + "runtimeGate": { + "title": "批准後開閘", + "body": "只有明確批准後才允許掃描、修復、部署或主機變更的執行期流程。" + }, + "tightening": { + "title": "逐步收嚴", + "body": "依證據與影響範圍分批提高管控,不一次把整個產品流程鎖死。" + } } } }, diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index 268b8ac19..ecac7fe30 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -991,6 +991,9 @@ "routeRoleTitle": "前台入口角色對照", "routeRoleSubtitle": "從安全合規進來時,也能直接看懂每個資安入口該負責什麼;這些入口只導覽與說明,不提供執行按鈕。", "routeLabel": "入口", + "rolloutTitle": "低摩擦分階段收斂", + "rolloutSubtitle": "初期先建立框架、可視化與證據鏈;等負責人回覆、人工審查與執行期閘門都完成後,再逐步收嚴,不讓資安一開始拖慢產品流程。", + "phaseLabel": "階段", "items": { "routePreserved": { "label": "路由策略", @@ -1030,6 +1033,28 @@ "title": "AwoooP 看人控等待", "body": "查看審批與負責人回覆等待狀態;仍不代表資安執行期閘門已開。" } + }, + "rolloutPhases": { + "observe": { + "title": "觀測與盤點", + "body": "目前只整理入口、主機、專案、網站、監控與工具姿態,不阻擋使用者流程。" + }, + "evidence": { + "title": "補齊證據", + "body": "收斂脫敏證據、版本來源、負責人回覆與 AwoooP 只讀消費證明。" + }, + "humanReview": { + "title": "人工審查", + "body": "由負責人確認例外、風險接受、修復順序與是否進入執行期閘門。" + }, + "runtimeGate": { + "title": "批准後開閘", + "body": "只有明確批准後才允許掃描、修復、部署或主機變更的執行期流程。" + }, + "tightening": { + "title": "逐步收嚴", + "body": "依證據與影響範圍分批提高管控,不一次把整個產品流程鎖死。" + } } } }, diff --git a/apps/web/src/app/[locale]/security-compliance/page.tsx b/apps/web/src/app/[locale]/security-compliance/page.tsx index 0b95e6412..656943ac9 100644 --- a/apps/web/src/app/[locale]/security-compliance/page.tsx +++ b/apps/web/src/app/[locale]/security-compliance/page.tsx @@ -44,6 +44,26 @@ const routeRoleItems = [ { key: 'awooopApprovals', href: '/awooop/approvals', route: 'AwoooP', icon: Lock, color: '#6f6d66' }, ] as const +const rolloutPhaseItems = [ + { key: 'observe', phase: '01', state: '現在', icon: Radar, color: '#d97757' }, + { key: 'evidence', phase: '02', state: '補證', icon: ClipboardCheck, color: '#1f7a4d' }, + { key: 'humanReview', phase: '03', state: '人控', icon: CheckCircle2, color: '#1f7a4d' }, + { key: 'runtimeGate', phase: '04', state: '批准後', icon: ShieldCheck, color: '#6f6d66' }, + { key: 'tightening', phase: '05', state: '收斂', icon: Lock, color: '#6f6d66' }, +] as const + +const rolloutBoundaries = [ + 'security_compliance_rollout_phase_count=5', + 'security_compliance_rollout_current_phase=observe_first', + 'security_compliance_rollout_runtime_phase_enabled=false', + 'security_compliance_rollout_enforcement_enabled=false', + 'security_compliance_rollout_action_buttons_allowed=false', + 'runtime_execution_authorized=false', + 'active_runtime_gate_count=0', + 'action_buttons_allowed=false', + 'not_authorization=true', +] as const + function SecurityComplianceFrontStage({ locale }: { locale: string }) { const t = useTranslations('securityCompliance.frontStage') const textWrap = { overflowWrap: 'anywhere' as const, wordBreak: 'break-word' as const } @@ -167,6 +187,76 @@ function SecurityComplianceFrontStage({ locale }: { locale: string }) { })} +
+ {t('rolloutSubtitle')} +
++ {t(`rolloutPhases.${item.key}.body` as never)} +
+
+ {boundary}
+
+ ))}
+