From 7b851b01692f70989ebe46b51b7e77373b7d5af3 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 24 May 2026 14:10:20 +0800 Subject: [PATCH] feat(web): add security entry role map --- apps/web/messages/en.json | 47 +++++ apps/web/messages/zh-TW.json | 47 +++++ apps/web/src/app/[locale]/iwooos/page.tsx | 160 ++++++++++++++++++ docs/LOGBOOK.md | 14 ++ .../security/SECURITY-MIRROR-STATUS-ROLLUP.md | 2 + .../SECURITY-SUPPLY-CHAIN-PROGRESS.md | 4 +- ...ecurity-mirror-status-rollup.snapshot.json | 28 +++ .../security-mirror-progress-guard.py | 89 ++++++++++ 8 files changed, 390 insertions(+), 1 deletion(-) diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index 6b01749bf..07f227c06 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -4639,6 +4639,53 @@ } } }, + "frontstageEntryRoles": { + "title": "前台資安入口角色分流", + "subtitle": "S2.108 把前台會看到的資安入口拆成清楚角色:IwoooS 看總覽,安全合規給熟悉入口,安全 / 合規保留原始資料頁,AwoooP 審批顯示人控等待。這只降低使用者困惑,不新增執行控制。", + "routeLabel": "路由", + "boundaryTitle": "入口分流邊界", + "boundaryIntro": "以下鍵值固定:這是前台導覽與理解成本收斂,不是掃描、修復、批准、部署、GitHub 主要來源切換或任何執行期入口。", + "summary": { + "entries": { + "label": "入口數", + "detail": "五個入口各有角色,不互相取代。" + }, + "primary": { + "label": "總覽來源", + "detail": "資安網總覽與邊界以 IwoooS 為準。" + }, + "familiar": { + "label": "熟悉入口", + "detail": "安全合規保留給前台使用者。" + }, + "execution": { + "label": "執行入口", + "detail": "維持 0,不從前台入口執行。" + } + }, + "items": { + "iwooosOverview": { + "title": "IwoooS 資安總覽", + "body": "閱讀整體進度、Kali 主機、開發主機、原始碼版本來源、負責人回覆與執行期閘門邊界。" + }, + "securityComplianceHub": { + "title": "安全合規前台入口", + "body": "保留既有安全監控與合規統計頁籤,讓使用者不用改變既有操作路徑。" + }, + "securityMonitor": { + "title": "安全事件監控", + "body": "查看錯誤與議題類安全訊號,仍只保留原資料來源與只讀橋接。" + }, + "complianceStats": { + "title": "合規統計", + "body": "查看事件摘要、處置劇本與自動修復統計,不把合規統計升成批准。" + }, + "awooopApprovals": { + "title": "AwoooP 人控等待", + "body": "查看負責人回覆與審批等待狀態;這仍不是資安執行期閘門或執行入口。" + } + } + }, "s49OwnerResponseWorkOrder": { "title": "S4.9 Owner Response 人工收件工作單", "subtitle": "S2.101 把第一個真正能推動 58% 的 S4.9 回覆收件格式放到 IwoooS:每項都要包含 owner role/team、decision、decision reason、受影響 scope、脫敏 evidence refs 與 follow-up owner。這裡只是人工收件工作單,不送出 request、不收件、不標記 received / accepted。", diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index 3a1bde73b..2573a083f 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -4640,6 +4640,53 @@ } } }, + "frontstageEntryRoles": { + "title": "前台資安入口角色分流", + "subtitle": "S2.108 把前台會看到的資安入口拆成清楚角色:IwoooS 看總覽,安全合規給熟悉入口,安全 / 合規保留原始資料頁,AwoooP 審批顯示人控等待。這只降低使用者困惑,不新增執行控制。", + "routeLabel": "路由", + "boundaryTitle": "入口分流邊界", + "boundaryIntro": "以下鍵值固定:這是前台導覽與理解成本收斂,不是掃描、修復、批准、部署、GitHub 主要來源切換或任何執行期入口。", + "summary": { + "entries": { + "label": "入口數", + "detail": "五個入口各有角色,不互相取代。" + }, + "primary": { + "label": "總覽來源", + "detail": "資安網總覽與邊界以 IwoooS 為準。" + }, + "familiar": { + "label": "熟悉入口", + "detail": "安全合規保留給前台使用者。" + }, + "execution": { + "label": "執行入口", + "detail": "維持 0,不從前台入口執行。" + } + }, + "items": { + "iwooosOverview": { + "title": "IwoooS 資安總覽", + "body": "閱讀整體進度、Kali 主機、開發主機、原始碼版本來源、負責人回覆與執行期閘門邊界。" + }, + "securityComplianceHub": { + "title": "安全合規前台入口", + "body": "保留既有安全監控與合規統計頁籤,讓使用者不用改變既有操作路徑。" + }, + "securityMonitor": { + "title": "安全事件監控", + "body": "查看錯誤與議題類安全訊號,仍只保留原資料來源與只讀橋接。" + }, + "complianceStats": { + "title": "合規統計", + "body": "查看事件摘要、處置劇本與自動修復統計,不把合規統計升成批准。" + }, + "awooopApprovals": { + "title": "AwoooP 人控等待", + "body": "查看負責人回覆與審批等待狀態;這仍不是資安執行期閘門或執行入口。" + } + } + }, "s49OwnerResponseWorkOrder": { "title": "S4.9 Owner Response 人工收件工作單", "subtitle": "S2.101 把第一個真正能推動 58% 的 S4.9 回覆收件格式放到 IwoooS:每項都要包含 owner role/team、decision、decision reason、受影響 scope、脫敏 evidence refs 與 follow-up owner。這裡只是人工收件工作單,不送出 request、不收件、不標記 received / accepted。", diff --git a/apps/web/src/app/[locale]/iwooos/page.tsx b/apps/web/src/app/[locale]/iwooos/page.tsx index 774aa326e..446565bd0 100644 --- a/apps/web/src/app/[locale]/iwooos/page.tsx +++ b/apps/web/src/app/[locale]/iwooos/page.tsx @@ -150,6 +150,15 @@ type SecurityComplianceFrontStageDecision = { tone: 'steady' | 'warn' | 'locked' } +type FrontstageSecurityEntryRole = { + key: string + href: string + route: string + mode: string + icon: typeof ShieldCheck + tone: 'steady' | 'warn' | 'locked' +} + type Pillar = { key: string icon: typeof ShieldCheck @@ -921,6 +930,34 @@ const securityComplianceFrontStageBoundaries = [ 'gitea_disablement_authorized=false', ] +const frontstageSecurityEntryRoles: FrontstageSecurityEntryRole[] = [ + { key: 'iwooosOverview', href: '/iwooos', route: 'IwoooS', mode: '總覽', icon: ShieldCheck, tone: 'steady' }, + { key: 'securityComplianceHub', href: '/security-compliance', route: '安全合規', mode: '前台', icon: Radar, tone: 'warn' }, + { key: 'securityMonitor', href: '/security', route: '安全', mode: '事件', icon: Activity, tone: 'warn' }, + { key: 'complianceStats', href: '/compliance', route: '合規', mode: '統計', icon: ClipboardCheck, tone: 'steady' }, + { key: 'awooopApprovals', href: '/awooop/approvals', route: 'AwoooP', mode: '人控', icon: Lock, tone: 'locked' }, +] + +const frontstageSecurityEntryRoleBoundaries = [ + 'frontstage_security_entry_role_count=5', + 'frontstage_security_primary_entry=iwooos', + 'frontstage_security_familiar_entry=security_compliance', + 'frontstage_security_execution_entry_count=0', + 'frontstage_security_links_read_only=true', + 'frontstage_security_operator_confusion_reduction=true', + 'frontstage_security_action_buttons_allowed=false', + 'runtime_execution_authorized=false', + 'active_runtime_gate_count=0', + 'action_buttons_allowed=false', + 'not_authorization=true', + 'secret_value_collection_allowed=false', + 'repo_creation_authorized=false', + 'refs_sync_authorized=false', + 'workflow_modification_authorized=false', + 'github_primary_switch_authorized=false', + 'gitea_disablement_authorized=false', +] + const posturePillars: Pillar[] = [ { key: 'exposure', icon: Radar, tone: 'warn' }, { key: 'sourceControl', icon: GitBranch, tone: 'warn' }, @@ -3263,6 +3300,127 @@ function SecurityComplianceFrontStageBoard() { ) } +function FrontstageSecurityEntryRolesBoard({ locale }: { locale: string }) { + const t = useTranslations('iwooos.frontstageEntryRoles') + const summaryItems = [ + { key: 'entries', value: '5', tone: 'warn' as const }, + { key: 'primary', value: 'IwoooS', tone: 'steady' as const }, + { key: 'familiar', value: '安全合規', tone: 'warn' as const }, + { key: 'execution', value: '0', tone: 'locked' as const }, + ] + const textWrap = { overflowWrap: 'anywhere' as const, wordBreak: 'break-word' as const } + + return ( +
+
+
+
+
+

{t('title')}

+

+ {t('subtitle')} +

+
+
+ {summaryItems.map(item => ( +
+
+ {t(`summary.${item.key}.label` as never)} + +
+
+ {item.value} +
+

+ {t(`summary.${item.key}.detail` as never)} +

+
+ ))} +
+
+ {frontstageSecurityEntryRoles.map(item => { + const Icon = item.icon + return ( + +
+ {t('routeLabel')} {item.route} + +
+
+ + {item.mode} + + {item.href} +
+

+ {t(`items.${item.key}.title` as never)} +

+

+ {t(`items.${item.key}.body` as never)} +

+ + ) + })} +
+
+
+
+ +

{t('boundaryTitle')}

+
+

+ {t('boundaryIntro')} +

+
+ {frontstageSecurityEntryRoleBoundaries.map(item => ( + + {item} + + ))} +
+
+
+
+
+ ) +} + function PillarCard({ item }: { item: Pillar }) { const t = useTranslations('iwooos.pillars') const Icon = item.icon @@ -7003,6 +7161,8 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) { + + diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index e1413edf3..29a3a472f 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,17 @@ +## 2026-05-24 | 資安供應鏈 S2.108:IwoooS 前台資安入口角色分流 + +**背景**:S2.107 已決定「安全合規」保留並整合到 IwoooS;本階段補上更專業的入口角色分流,避免使用者看到多個資安相關入口時不知道該從哪裡理解。 + +**完成**: +- `/iwooos` 新增「前台資安入口角色分流」看板,將 IwoooS、`/security-compliance`、`/security`、`/compliance`、`/awooop/approvals` 五個入口的用途拆清楚。 +- 看板固定顯示入口數=5、總覽來源=IwoooS、熟悉入口=安全合規、執行入口=0,並標示 `frontstage_security_entry_role_count=5`、`frontstage_security_primary_entry=iwooos`、`frontstage_security_familiar_entry=security_compliance`、`frontstage_security_execution_entry_count=0`、`frontstage_security_action_buttons_allowed=false`、`runtime_execution_authorized=false`、`active_runtime_gate_count=0`、`not_authorization=true`。 +- `security_mirror_status_rollup_v1` 新增 `s2_108_iwooos_frontstage_security_entry_roles` 與 `show_iwooos_frontstage_security_entry_roles`。 +- `security-mirror-progress-guard.py` 已納入前台入口角色分流看板、i18n 鍵、五個入口與 false 邊界檢查。 + +**仍禁止**: +- S2.108 只做前台導覽與理解成本收斂,不代表 runtime 授權、人工審批、掃描、修復、部署、blocking control、專案庫建立、refs sync、workflow / secret 修改、GitHub primary 切換、Gitea 停用、Kali / SSH / 主機更新。 +- 整體資安網百分比仍是 58%;這是 framework detail 可見進展,不是 runtime landing。 + ## 2026-05-24 | 資安供應鏈 S2.107:前台安全合規 IwoooS 整合入口 **背景**:使用者詢問前台頁面的「安全合規」應整合或移除;本階段做專業判定與前台呈現。 diff --git a/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md b/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md index a34cabd9d..8e78c8b23 100644 --- a/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md +++ b/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md @@ -51,6 +51,7 @@ | IwoooS S4.9 送件請求草稿 | S2.105 已在 `/iwooos` 顯示 S4.9 負責人回覆送件請求草稿;草稿項=6、可送件=0、已送出=0、稽核事件=0;`s4_9_owner_response_request_draft_item_count=6`、`s4_9_owner_response_request_draft_ready_count=0`、`s4_9_owner_response_request_dispatch_authorized=false`、`s4_9_owner_response_request_sent=false`、`s4_9_owner_response_request_sent_count=0`、`s4_9_owner_response_request_audit_events_emitted=0`、`runtime_execution_authorized=false`、`active_runtime_gate_count=0`、`action_buttons_allowed=false`、`not_authorization=true`,仍不代表 request sent、owner response received / accepted、audit event emitted、人工批准、GitHub 主要來源切換、Gitea 停用、Kali / SSH / 主機更新或執行期授權 | | IwoooS S4.9 送件鏈路摘要 | S2.106 已在 `/iwooos` 顯示 S4.9 負責人回覆送件鏈路摘要;鏈路步驟=6、目前焦點=request draft、已送出=0、已接受=0;`s4_9_owner_response_dispatch_flow_step_count=6`、`s4_9_owner_response_dispatch_flow_current_step=request_draft`、`s4_9_owner_response_dispatch_flow_completed_count=0`、`s4_9_owner_response_request_sent=false`、`s4_9_owner_response_request_dispatch_authorized=false`、`runtime_execution_authorized=false`、`active_runtime_gate_count=0`、`action_buttons_allowed=false`、`not_authorization=true`,仍不代表 request sent、owner response received / accepted、audit event emitted、人工批准、GitHub 主要來源切換、Gitea 停用、Kali / SSH / 主機更新或執行期授權 | | 前台安全合規 IwoooS 整合入口 | S2.107 已保留 `/security-compliance` 並把它整合成 IwoooS 前台友善入口;`security_compliance_route_preserved=true`、`security_compliance_removed=false`、`security_compliance_integration_mode=iwooos_frontstage_bridge`、`iwooos_authoritative_security_entry=true`、`runtime_execution_authorized=false`、`active_runtime_gate_count=0`、`action_buttons_allowed=false`、`not_authorization=true`,仍不代表 runtime 授權、審批、掃描、修復、部署、GitHub 主要來源切換、Gitea 停用、Kali / SSH / 主機更新或執行期授權 | +| 前台資安入口角色分流 | S2.108 已在 `/iwooos` 顯示 IwoooS、`/security-compliance`、`/security`、`/compliance`、`/awooop/approvals` 五個入口角色;`frontstage_security_entry_role_count=5`、`frontstage_security_primary_entry=iwooos`、`frontstage_security_familiar_entry=security_compliance`、`frontstage_security_execution_entry_count=0`、`frontstage_security_action_buttons_allowed=false`、`runtime_execution_authorized=false`、`active_runtime_gate_count=0`、`not_authorization=true`,仍不代表 runtime 授權、審批、掃描、修復、部署、GitHub 主要來源切換、Gitea 停用、Kali / SSH / 主機更新或執行期授權 | | AwoooP approvals IwoooS owner response focus | S2.55 已把 S4.9-S4.12 owner response 下一個人工收件焦點放進 `/awooop/approvals` 只讀面板;received=0、accepted=0、active runtime gates=0、headline=58%、approval_record_created=false;仍不新增 approve、execute、deploy、primary switch、refs action 或 runtime gate | | AwoooP contracts IwoooS security contract candidate | S2.56 已把四個 security mirror contract refs 放進 `/awooop/contracts` 只讀面板;total contracts=36、ready=33、partial=2、active runtime gates=0、contract_publish_authorized=false;仍不發布 contract revision、不改 lifecycle、不寫 platform contracts API、不新增 action button | | AwoooP tenants IwoooS tenant scope candidate | S2.57 已把 AWOOOI first tenant、IwoooS security mirror、Kali 112 / Dev 168 / Dev 111 與 S4.9-S4.12 owner response waiting 放進 `/awooop/tenants` 只讀面板;host coverage=3、tenant policy changes=0、tenant_migration_mode_changed=false;仍不改 migration mode、不改 tenant policy、不寫 platform tenants API、不新增 action button | @@ -243,6 +244,7 @@ | S2.105 IwoooS S4.9 負責人回覆送件請求草稿 | framework detail | 0 | 只在 `/iwooos` 顯示 S4.9 負責人回覆送件請求草稿,呈現收件範圍對應草稿、負責人收件對象草稿、脫敏證據參照草稿、禁止變更條款草稿、稽核事件範本草稿與人工送件閘門草稿六個草稿項;s4_9_owner_response_request_draft_item_count=6、s4_9_owner_response_request_draft_ready_count=0、s4_9_owner_response_request_dispatch_authorized=false、s4_9_owner_response_request_sent=false、s4_9_owner_response_request_sent_count=0、s4_9_owner_response_request_recipients_confirmed_count=0、s4_9_owner_response_request_audit_events_emitted=0、s4_9_owner_response_received_count=0、s4_9_owner_response_accepted_count=0、owner_response_acceptance_gate_open=false、runtime_execution_authorized=false、active_runtime_gate_count=0、action_buttons_allowed=false、not_authorization=true,不把送件請求草稿當 request sent、owner response received / accepted、audit event emitted、人工批准、審批紀錄、專案庫建立、分支 / 標籤參照同步、工作流程 / 機密設定修改、主要來源切換、Gitea 停用、Kali / SSH / 主機更新或執行期授權 | | S2.106 IwoooS S4.9 負責人回覆送件鏈路摘要 | framework detail | 0 | 只在 `/iwooos` 顯示 S4.9 負責人回覆送件鏈路摘要,將人工收件工作單、回覆封套欄位、送件前檢查、結果分流、送件請求草稿與人工送件閘門整理成六段專業只讀流程;s4_9_owner_response_dispatch_flow_step_count=6、s4_9_owner_response_dispatch_flow_current_step=request_draft、s4_9_owner_response_dispatch_flow_completed_count=0、s4_9_owner_response_dispatch_flow_blocked_count=0、s4_9_owner_response_request_sent=false、s4_9_owner_response_request_dispatch_authorized=false、s4_9_owner_response_received_count=0、s4_9_owner_response_accepted_count=0、runtime_execution_authorized=false、active_runtime_gate_count=0、action_buttons_allowed=false、not_authorization=true,不把送件鏈路摘要當 request sent、owner response received / accepted、audit event emitted、人工批准、審批紀錄、專案庫建立、分支 / 標籤參照同步、工作流程 / 機密設定修改、主要來源切換、Gitea 停用、Kali / SSH / 主機更新或執行期授權 | | S2.107 前台安全合規 IwoooS 整合入口 | framework detail | 0 | 只保留 `/security-compliance` 並把它整合成 IwoooS 前台友善入口,讓前台使用者仍從安全合規看到既有安全監控與合規統計,IwoooS 則成為資安網總覽與唯一姿態來源;security_compliance_route_preserved=true、security_compliance_removed=false、security_compliance_integration_mode=iwooos_frontstage_bridge、iwooos_authoritative_security_entry=true、security_compliance_runtime_execution_authorized=false、runtime_execution_authorized=false、active_runtime_gate_count=0、action_buttons_allowed=false、not_authorization=true,不把前台入口整合當 runtime 授權、審批、掃描、修復、部署、blocking control、專案庫建立、分支 / 標籤參照同步、工作流程 / 機密設定修改、主要來源切換、Gitea 停用、Kali / SSH / 主機更新或執行期授權 | +| S2.108 IwoooS 前台資安入口角色分流 | framework detail | 0 | 只在 `/iwooos` 顯示前台資安入口角色分流,將 IwoooS、`/security-compliance`、`/security`、`/compliance`、`/awooop/approvals` 五個入口的使用情境與邊界說清楚;frontstage_security_entry_role_count=5、frontstage_security_primary_entry=iwooos、frontstage_security_familiar_entry=security_compliance、frontstage_security_execution_entry_count=0、frontstage_security_links_read_only=true、frontstage_security_action_buttons_allowed=false、runtime_execution_authorized=false、active_runtime_gate_count=0、action_buttons_allowed=false、not_authorization=true,不把入口角色分流當 runtime 授權、審批、掃描、修復、部署、blocking control、專案庫建立、分支 / 標籤參照同步、工作流程 / 機密設定修改、主要來源切換、Gitea 停用、Kali / SSH / 主機更新或執行期授權 | headline 進度要再往上,至少需要下列任一高層 gate 有實質 evidence: diff --git a/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md b/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md index 2f01f36f3..a0978cf10 100644 --- a/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md +++ b/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md @@ -28,7 +28,7 @@ python3 scripts/security/security-mirror-progress-guard.py ### 0.2 Headline 58% 不代表停滯 -近期 S4.10 請求包、範本狀態台帳、稽核事件範本、脫敏範例、收件檢查、收件預檢,S4.11 請求包 / 範本狀態台帳 / 稽核事件範本 / 脫敏範例 / 收件檢查 / 收件預檢,S4.12 請求包 / 範本狀態台帳 / 稽核事件範本 / 脫敏範例 / 收件檢查 / 收件預檢,S4.13 證據路由規則 / 顯示區塊 / 狀態轉移規則 / 審查清單 / 審查結果分流 / 審查稽核事件範本 / 審查稽核顯示區塊 / 審查稽核收件檢查 / 審查稽核脫敏範例 / 審查稽核保留規則 / 審查稽核保留檢查 / 審查稽核交接包 / 交接檢查 / 平行 Session 同步檢查 / 衝突分流 / 復原檢查 / 復原結果分流,S1.3 低摩擦非阻擋升級分流、S2.8 IwoooS 前端態勢入口,以及 S2.9-S2.107 IwoooS / AwoooP 資安投影契約都是有效進展,但它們是框架細節,不是負責人回覆、執行期閘門、生產匯入或 GitHub 主要來源就緒。因此整體百分比仍維持 58%,避免把只讀框架誤算成已落地執行。 +近期 S4.10 請求包、範本狀態台帳、稽核事件範本、脫敏範例、收件檢查、收件預檢,S4.11 請求包 / 範本狀態台帳 / 稽核事件範本 / 脫敏範例 / 收件檢查 / 收件預檢,S4.12 請求包 / 範本狀態台帳 / 稽核事件範本 / 脫敏範例 / 收件檢查 / 收件預檢,S4.13 證據路由規則 / 顯示區塊 / 狀態轉移規則 / 審查清單 / 審查結果分流 / 審查稽核事件範本 / 審查稽核顯示區塊 / 審查稽核收件檢查 / 審查稽核脫敏範例 / 審查稽核保留規則 / 審查稽核保留檢查 / 審查稽核交接包 / 交接檢查 / 平行 Session 同步檢查 / 衝突分流 / 復原檢查 / 復原結果分流,S1.3 低摩擦非阻擋升級分流、S2.8 IwoooS 前端態勢入口,以及 S2.9-S2.108 IwoooS / AwoooP 資安投影契約都是有效進展,但它們是框架細節,不是負責人回覆、執行期閘門、生產匯入或 GitHub 主要來源就緒。因此整體百分比仍維持 58%,避免把只讀框架誤算成已落地執行。 S2.50 也把「為什麼 58% 還不動」拆成五個可見 gate:owner response accepted、redacted payload ingestion、active runtime gate、GitHub primary ready、AwoooP read-only landing。這五個 gate 目前仍全部是 0 / false,所以 headline 不應被灌水提高。 @@ -170,6 +170,7 @@ S2.50 也把「為什麼 58% 還不動」拆成五個可見 gate:owner respons | S2.105 IwoooS S4.9 負責人回覆送件請求草稿 | 已完成草案,在 `/iwooos` 顯示六個送件請求草稿項、可送件=0、已送出=0、稽核事件=0;仍不把送件請求草稿當成 request sent、owner response received / accepted、audit event emitted、人工批准、主要來源切換或執行期閘門 | 0 | | S2.106 IwoooS S4.9 負責人回覆送件鏈路摘要 | 已完成草案,在 `/iwooos` 以專業摘要帶顯示工作單、封套、送件前檢查、結果分流、請求草稿、人工送件閘門六段鏈路,目前焦點=request draft、已送出=0、已接受=0;仍不把送件鏈路摘要當成 request sent、owner response received / accepted、audit event emitted、人工批准、主要來源切換或執行期閘門 | 0 | | S2.107 前台安全合規 IwoooS 整合入口 | 已完成草案,保留 `/security-compliance` 並新增前台整合說明;`/iwooos` 同步顯示「前台安全合規整合判定」,確認安全合規整合、不移除、runtime gate 0、action button 0;仍不把前台入口整合當成 runtime 授權、審批、掃描、修復、部署、主要來源切換或執行期閘門 | 0 | +| S2.108 IwoooS 前台資安入口角色分流 | 已完成草案,在 `/iwooos` 顯示五個前台資安入口角色:IwoooS、`/security-compliance`、`/security`、`/compliance`、`/awooop/approvals`;仍不把入口分流當成 runtime 授權、審批、掃描、修復、部署、主要來源切換或執行期閘門 | 0 | headline 要再往上,需要 S4.9 / S4.10 / S4.11 / S4.12 任一 owner response 收到並通過脫敏驗收,或人工批准後出現 active runtime gate、redacted payload ingestion、GitHub primary readiness 這類落地 evidence。 @@ -296,6 +297,7 @@ headline 要再往上,需要 S4.9 / S4.10 / S4.11 / S4.12 任一 owner respons | S2.105 IwoooS S4.9 負責人回覆送件請求草稿 | 完成草案 | `/iwooos` 新增 S4.9 負責人回覆送件請求草稿看板,列出收件範圍對應草稿、負責人收件對象草稿、脫敏證據參照草稿、禁止變更條款草稿、稽核事件範本草稿、人工送件閘門草稿六個草稿項 | 使用者與另一個 AwoooP Session 能直接知道封套通過預檢後仍需要人工整理與批准送件;送件請求草稿仍不是 request sent、owner response received / accepted、audit event emitted、人工批准、主要來源切換或執行期閘門 | | S2.106 IwoooS S4.9 負責人回覆送件鏈路摘要 | 完成草案 | `/iwooos` 新增 S4.9 負責人回覆送件鏈路摘要帶,以六段流程顯示人工收件工作單、回覆封套欄位、送件前檢查、結果分流、送件請求草稿、人工送件閘門,並把目前焦點固定為 request draft | 使用者與另一個 AwoooP Session 能用更專業的視覺摘要理解 S4.9 不是卡住,而是仍停在只讀送件前準備;送件鏈路摘要仍不是 request sent、owner response received / accepted、audit event emitted、人工批准、主要來源切換或執行期閘門 | | S2.107 前台安全合規 IwoooS 整合入口 | 完成草案 | `/security-compliance` 保留既有 SecurityPanel / CompliancePanel 頁籤並新增 IwoooS 前台整合說明;`/iwooos` 新增前台安全合規整合判定看板 | 專業判定是整合而非移除:安全合規維持前台熟悉入口,IwoooS 統一資安總覽與姿態來源;此整合仍不是 runtime 授權、審批、掃描、修復、部署、主要來源切換或執行期閘門 | +| S2.108 IwoooS 前台資安入口角色分流 | 完成草案 | `/iwooos` 新增前台資安入口角色分流看板,列出 IwoooS、`/security-compliance`、`/security`、`/compliance`、`/awooop/approvals` 五個入口 | 使用者能快速理解每個資安入口該看什麼:總覽、熟悉入口、事件、合規統計、人控等待;此分流仍不是 runtime 授權、審批、掃描、修復、部署、主要來源切換或執行期閘門 | | S3 approval gate | 進行中 | `security_approval_gate_v1` 已建立 8 個人工 gate items:7 pending、1 block candidate、0 approved | 不得繞過人工批准;批准後仍需 follow-up runtime gate | | S3.0 人工批准 Gate 契約 | 完成草案 | 定義批准範圍、決策選項、required reviewers、still forbidden 與 follow-up runtime gate | AwoooP 可記錄決策,不可執行 gate item | | S3.1 人工決策紀錄契約 | 完成草案 | `security_approval_decision_record_v1` 已建立;目前 0 筆 decision records、0 個 runtime action 授權 | AwoooP 可稽核決策,不可把決策當執行 | diff --git a/docs/security/security-mirror-status-rollup.snapshot.json b/docs/security/security-mirror-status-rollup.snapshot.json index e08ac92fd..cf28be066 100644 --- a/docs/security/security-mirror-status-rollup.snapshot.json +++ b/docs/security/security-mirror-status-rollup.snapshot.json @@ -1754,6 +1754,18 @@ "runtime_delta": false, "execution_authorized": false, "not_authorization": true + }, + { + "delta_id": "s2_108_iwooos_frontstage_security_entry_roles", + "display_order": 137, + "completed_stage": "S2.108 IwoooS 前台資安入口角色分流", + "progress_axis": "framework_detail", + "headline_percent_delta": 0, + "framework_delta_visible": true, + "why_headline_unchanged": "IwoooS 只新增前台資安入口角色分流,將 IwoooS、/security-compliance、/security、/compliance、/awooop/approvals 五個入口的使用情境與邊界說清楚;frontstage_security_entry_role_count=5、frontstage_security_primary_entry=iwooos、frontstage_security_familiar_entry=security_compliance、frontstage_security_execution_entry_count=0、frontstage_security_action_buttons_allowed=false、runtime_execution_authorized=false、active_runtime_gate_count=0,不把入口分流當 runtime 授權、審批、掃描、修復、部署、專案庫建立、refs sync、workflow 修改、GitHub primary 切換或 Gitea 停用。", + "runtime_delta": false, + "execution_authorized": false, + "not_authorization": true } ], "next_safe_actions": [ @@ -2622,6 +2634,22 @@ "從安全合規入口呼叫 Kali、開 SSH、更新主機、切 GitHub 主要來源、停用 Gitea 或收機密明文值" ] }, + { + "action_id": "show_iwooos_frontstage_security_entry_roles", + "title": "IwoooS 顯示前台資安入口角色分流", + "mode": "observe", + "source_contract": "iwooos_posture_projection_v1", + "allowed_processing": [ + "在 /iwooos 顯示 S2.108 前台資安入口角色分流", + "說明 IwoooS、/security-compliance、/security、/compliance、/awooop/approvals 五個入口各自用途", + "固定前台入口只做只讀導覽與理解成本收斂,frontstage_security_execution_entry_count=0、action_buttons_allowed=false、runtime_execution_authorized=false" + ], + "blocked_processing": [ + "把前台入口角色分流當成 runtime 授權、審批、掃描、修復、部署或 blocking control", + "從前台入口角色分流建立專案庫、改可見性、同步 / 刪除 / 強制推送 refs,或修改工作流程 / 機密設定", + "從前台入口角色分流呼叫 Kali、開 SSH、更新主機、切 GitHub 主要來源、停用 Gitea 或收機密明文值" + ] + }, { "action_id": "enforce_traditional_chinese_security_surface_wording", "title": "IwoooS / AwoooP 資安可視區塊維持繁體中文呈現", diff --git a/scripts/security/security-mirror-progress-guard.py b/scripts/security/security-mirror-progress-guard.py index 5ff77070f..798f9a050 100755 --- a/scripts/security/security-mirror-progress-guard.py +++ b/scripts/security/security-mirror-progress-guard.py @@ -359,6 +359,7 @@ def validate(root: Path) -> None: "s2_105_iwooos_s49_owner_response_request_draft_board", "s2_106_iwooos_s49_owner_response_dispatch_flow_board", "s2_107_security_compliance_iwooos_frontstage_bridge", + "s2_108_iwooos_frontstage_security_entry_roles", ] assert_equal( "progress_delta_ledger.delta_ids", @@ -618,6 +619,11 @@ def validate(root: Path) -> None: [item["action_id"] for item in rollup["next_safe_actions"] if isinstance(item, dict)], "show_iwooos_security_compliance_frontstage_bridge", ) + assert_contains( + "rollup.next_safe_actions.action_ids", + [item["action_id"] for item in rollup["next_safe_actions"] if isinstance(item, dict)], + "show_iwooos_frontstage_security_entry_roles", + ) assert_contains( "rollup.next_safe_actions.action_ids", [item["action_id"] for item in rollup["next_safe_actions"] if isinstance(item, dict)], @@ -8110,6 +8116,89 @@ def validate(root: Path) -> None: list(web_messages_en["iwooos"]["securityComplianceFrontStage"]["items"].keys()), key, ) + assert_text_contains( + "iwooos_page.frontstage_security_entry_roles_testid", + iwooos_projection_page, + 'data-testid="iwooos-frontstage-security-entry-roles-board"', + ) + assert_text_contains( + "iwooos_page.frontstage_security_entry_roles_component", + iwooos_projection_page, + "FrontstageSecurityEntryRolesBoard", + ) + for text in [ + "frontstage_security_entry_role_count=5", + "frontstage_security_primary_entry=iwooos", + "frontstage_security_familiar_entry=security_compliance", + "frontstage_security_execution_entry_count=0", + "frontstage_security_links_read_only=true", + "frontstage_security_operator_confusion_reduction=true", + "frontstage_security_action_buttons_allowed=false", + "runtime_execution_authorized=false", + "active_runtime_gate_count=0", + "action_buttons_allowed=false", + "not_authorization=true", + "secret_value_collection_allowed=false", + "repo_creation_authorized=false", + "refs_sync_authorized=false", + "workflow_modification_authorized=false", + "github_primary_switch_authorized=false", + "gitea_disablement_authorized=false", + ]: + assert_text_contains( + "iwooos_page.frontstage_security_entry_roles_boundary", + iwooos_projection_page, + text, + ) + assert_contains( + "web_messages.zh-TW.iwooos.frontstageEntryRoles", + list(web_messages_zh["iwooos"].keys()), + "frontstageEntryRoles", + ) + assert_contains( + "web_messages.en.iwooos.frontstageEntryRoles", + list(web_messages_en["iwooos"].keys()), + "frontstageEntryRoles", + ) + for key in ["title", "subtitle", "summary", "items", "routeLabel", "boundaryTitle", "boundaryIntro"]: + assert_contains( + "web_messages.zh-TW.iwooos.frontstageEntryRoles.keys", + list(web_messages_zh["iwooos"]["frontstageEntryRoles"].keys()), + key, + ) + assert_contains( + "web_messages.en.iwooos.frontstageEntryRoles.keys", + list(web_messages_en["iwooos"]["frontstageEntryRoles"].keys()), + key, + ) + for key in ["entries", "primary", "familiar", "execution"]: + assert_contains( + "web_messages.zh-TW.iwooos.frontstageEntryRoles.summary", + list(web_messages_zh["iwooos"]["frontstageEntryRoles"]["summary"].keys()), + key, + ) + assert_contains( + "web_messages.en.iwooos.frontstageEntryRoles.summary", + list(web_messages_en["iwooos"]["frontstageEntryRoles"]["summary"].keys()), + key, + ) + for key in [ + "iwooosOverview", + "securityComplianceHub", + "securityMonitor", + "complianceStats", + "awooopApprovals", + ]: + assert_contains( + "web_messages.zh-TW.iwooos.frontstageEntryRoles.items", + list(web_messages_zh["iwooos"]["frontstageEntryRoles"]["items"].keys()), + key, + ) + assert_contains( + "web_messages.en.iwooos.frontstageEntryRoles.items", + list(web_messages_en["iwooos"]["frontstageEntryRoles"]["items"].keys()), + key, + ) for key in [ "title", "subtitle",