diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index 88a528fd..83ceccd0 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -5521,6 +5521,30 @@ } } }, + "firstScreenDepthMap": { + "eyebrow": "首屏深度地圖", + "title": "哪些內容直接可見,哪些需要下鑽", + "subtitle": "把 IwoooS 分成首屏可見、進階圖表、深層台帳與執行期邊界四層;預設呈現態勢,需要查證時再展開細節。", + "boundaryTitle": "深度地圖邊界", + "layers": { + "visible": { + "title": "首屏直接可見", + "body": "高層快照、焦點導覽、資安網模型與拓樸圖譜固定顯示。" + }, + "advanced": { + "title": "進階圖表收合", + "body": "決策跑道、執行閘雷達、命令地圖與解鎖路徑需要時再展開。" + }, + "ledger": { + "title": "證據台帳下鑽", + "body": "產品範圍、主機工具鏈、VibeWork 與交付明細集中在進階證據區。" + }, + "runtime": { + "title": "執行期仍鎖定", + "body": "掃描、SSH、主機更新、修復、部署與版本來源變更都不是前端操作。" + } + } + }, "immediateVisualMesh": { "eyebrow": "首屏資安網視覺模型", "title": "資安關聯視覺模型", diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index 88a528fd..83ceccd0 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -5521,6 +5521,30 @@ } } }, + "firstScreenDepthMap": { + "eyebrow": "首屏深度地圖", + "title": "哪些內容直接可見,哪些需要下鑽", + "subtitle": "把 IwoooS 分成首屏可見、進階圖表、深層台帳與執行期邊界四層;預設呈現態勢,需要查證時再展開細節。", + "boundaryTitle": "深度地圖邊界", + "layers": { + "visible": { + "title": "首屏直接可見", + "body": "高層快照、焦點導覽、資安網模型與拓樸圖譜固定顯示。" + }, + "advanced": { + "title": "進階圖表收合", + "body": "決策跑道、執行閘雷達、命令地圖與解鎖路徑需要時再展開。" + }, + "ledger": { + "title": "證據台帳下鑽", + "body": "產品範圍、主機工具鏈、VibeWork 與交付明細集中在進階證據區。" + }, + "runtime": { + "title": "執行期仍鎖定", + "body": "掃描、SSH、主機更新、修復、部署與版本來源變更都不是前端操作。" + } + } + }, "immediateVisualMesh": { "eyebrow": "首屏資安網視覺模型", "title": "資安關聯視覺模型", diff --git a/apps/web/src/app/[locale]/iwooos/page.tsx b/apps/web/src/app/[locale]/iwooos/page.tsx index e9b48f5d..82ff5b34 100644 --- a/apps/web/src/app/[locale]/iwooos/page.tsx +++ b/apps/web/src/app/[locale]/iwooos/page.tsx @@ -40,6 +40,14 @@ type PostureMetric = { tone: 'steady' | 'warn' | 'locked' } +type FirstScreenDepthLayer = { + key: string + value: string + icon: typeof ShieldCheck + tone: 'steady' | 'warn' | 'locked' + href?: string +} + type FastProgressItem = { key: string value: string @@ -880,6 +888,26 @@ const postureMetrics: PostureMetric[] = [ { key: 'activeGates', value: '0', tone: 'locked' }, ] +const firstScreenDepthLayers: FirstScreenDepthLayer[] = [ + { key: 'visible', value: '4', icon: ShieldCheck, tone: 'steady' }, + { key: 'advanced', value: '2', icon: SearchCheck, tone: 'warn', href: '#iwooos-decision-gate-visuals' }, + { key: 'ledger', value: '4', icon: ListChecks, tone: 'warn', href: '#iwooos-scope-evidence-visuals' }, + { key: 'runtime', value: '0', icon: Lock, tone: 'locked' }, +] + +const firstScreenDepthBoundaries = [ + 'iwooos_first_screen_depth_map_visible_layer_count=4', + 'iwooos_first_screen_depth_map_advanced_group_count=2', + 'iwooos_first_screen_depth_map_ledger_group_count=4', + 'iwooos_first_screen_depth_map_runtime_gate_count=0', + 'iwooos_first_screen_depth_map_advanced_default_visible=false', + 'iwooos_first_screen_depth_map_scope_evidence_default_visible=false', + 'runtime_execution_authorized=false', + 'active_runtime_gate_count=0', + 'action_buttons_allowed=false', + 'not_authorization=true', +] + const fastProgressItems: FastProgressItem[] = [ { key: 'done', value: '7 頁', icon: CheckCircle2, tone: 'steady' }, { key: 'kali112', value: '只讀通過', icon: ShieldCheck, tone: 'warn' }, @@ -9912,6 +9940,159 @@ function IwoooSFocusDeckBoard() { ) } +function IwoooSFirstScreenDepthMapBoard() { + const t = useTranslations('iwooos.firstScreenDepthMap') + const textWrap = { overflowWrap: 'anywhere' as const, wordBreak: 'break-word' as const } + + return ( +
+
+
+
+
+ + {t('eyebrow')} +
+

{t('title')}

+

+ {t('subtitle')} +

+
+ +
+ {firstScreenDepthLayers.map((item, index) => { + const Icon = item.icon + const content = ( + <> +
+ + {item.value} +
+
+ {String(index + 1).padStart(2, '0')} +
+

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

+

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

+ + ) + const style = { + border: `0.5px solid ${item.tone === 'steady' ? '#cfe2d8' : item.tone === 'warn' ? '#e6c8b8' : '#dad7ce'}`, + borderRadius: 8, + background: '#fff', + padding: 11, + minHeight: 126, + minWidth: 0, + color: '#141413', + textDecoration: 'none', + display: 'block', + } + + return item.href ? ( + + {content} + + ) : ( +
+ {content} +
+ ) + })} +
+
+ +
+ {firstScreenDepthLayers.map(item => ( +
+ ))} +
+ +
+ + {t('boundaryTitle')} + +
+ {firstScreenDepthBoundaries.map(item => ( + + {item} + + ))} +
+
+
+
+ ) +} + function IwoooSImmediateVisualMeshBoard() { const t = useTranslations('iwooos.immediateVisualMesh') const textWrap = { overflowWrap: 'anywhere' as const, wordBreak: 'break-word' as const } @@ -16388,6 +16569,7 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) { + diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index ca454205..f0a59f9a 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,22 @@ +## 2026-06-01|IwoooS 首屏深度地圖與證據語義校正 + +**背景**: + +- 前一階段已把 IwoooS 長內容收進可展開區,但 snapshot 仍有部分歷史欄位以 `first_layer=true` 描述已收合的面板,容易讓人誤解「首屏固定可見」與「首層可下鑽」的差異。 +- 使用者要求前端呈現要更專業,不只堆文字;本輪把資訊架構邊界直接做成可視化深度地圖。 + +**本次調整**: + +- `apps/web/src/app/[locale]/iwooos/page.tsx`:新增 `IwoooSFirstScreenDepthMapBoard`,用四層視覺卡呈現「首屏直接可見」、「進階圖表收合」、「證據台帳下鑽」、「執行期仍鎖定」。 +- `apps/web/messages/zh-TW.json` / `en.json`:新增首屏深度地圖繁中文案;英文語系維持繁中鏡像。 +- `docs/security/iwooos-posture-projection.snapshot.json`:新增 `first_screen_depth_map_layers`,並補上多個 `default_visible=false` 欄位,讓收合區不再被誤讀為預設展開。 +- `scripts/security/security-mirror-progress-guard.py`:新增 S2.156 guard,鎖住深度地圖、四層語義、收合區 default visible 狀態與 runtime gate 0 邊界。 +- `docs/security/security-mirror-status-rollup.snapshot.json`:新增 `s2_156_iwooos_first_screen_depth_map` 進度台帳。 + +**進度邊界**: + +- 整體維持 `61%`;這是 UI/UX 與證據語義校正,不是 Kali SSH、掃描、主機更新、修復、部署或 GitHub primary 切換。 + ## 2026-06-01|truth-chain quality summary 納入 AI 自健診 SLO **背景**: diff --git a/docs/security/iwooos-posture-projection.snapshot.json b/docs/security/iwooos-posture-projection.snapshot.json index 649223ce..fcbf7ede 100644 --- a/docs/security/iwooos-posture-projection.snapshot.json +++ b/docs/security/iwooos-posture-projection.snapshot.json @@ -36,17 +36,28 @@ "approval_queue_total": 8, "pending_approval_count": 7, "block_candidate_count": 1, + "first_screen_depth_map_first_layer": true, + "first_screen_depth_map_layer_count": 4, + "first_screen_depth_map_visible_layer_count": 4, + "first_screen_depth_map_advanced_group_count": 2, + "first_screen_depth_map_ledger_group_count": 4, + "first_screen_depth_map_runtime_gate_count": 0, + "first_screen_depth_map_advanced_default_visible": false, + "first_screen_depth_map_scope_evidence_default_visible": false, "visual_command_dashboard_widget_count": 14, "visual_command_dashboard_first_layer": true, + "visual_command_dashboard_default_visible": false, "professional_security_experience_first_layer": true, + "professional_security_experience_default_visible": false, "professional_security_experience_tab_count": 3, "professional_security_experience_attack_path_node_count": 6, "professional_security_experience_asset_heat_cell_count": 9, "professional_security_experience_response_flow_step_count": 5, "concrete_work_snapshot_first_layer": true, + "concrete_work_snapshot_default_visible": false, "concrete_work_snapshot_workstream_count": 6, "first_progress_unlock_path_first_layer": true, - "first_progress_unlock_path_default_visible": true, + "first_progress_unlock_path_default_visible": false, "first_progress_unlock_path_above_visual_dashboard": true, "first_progress_unlock_path_step_count": 5, "first_progress_unlock_path_boundary_details_collapsed": true, @@ -54,6 +65,7 @@ "first_progress_unlock_path_owner_response_accepted_count": 0, "first_progress_unlock_path_runtime_gate_count": 0, "command_map_first_layer": true, + "command_map_default_visible": false, "command_map_mode_count": 6, "command_map_default_mode": "unlock", "command_map_above_first_progress_unlock_path": true, @@ -72,6 +84,7 @@ "immediate_visual_mesh_above_command_map": true, "immediate_visual_mesh_runtime_gate_count": 0, "gate_radar_first_layer": true, + "gate_radar_default_visible": false, "gate_radar_lane_count": 4, "gate_radar_default_lane": "visible", "gate_radar_above_command_map": true, @@ -97,14 +110,17 @@ "all_product_coverage_snapshot_default_summary_mode": "compact_first", "all_product_coverage_snapshot_detail_ledger_collapsed": true, "global_security_mesh_matrix_first_layer": true, + "global_security_mesh_matrix_default_visible": false, "global_security_mesh_matrix_asset_count": 8, "global_security_mesh_matrix_read_only_count": 8, "global_security_mesh_matrix_runtime_gate_count": 0, "host_tool_evidence_chain_first_layer": true, + "host_tool_evidence_chain_default_visible": false, "host_tool_evidence_chain_host_count": 3, "host_tool_evidence_chain_tool_lane_count": 6, "host_tool_evidence_chain_step_count": 5, "vibework_security_onboarding_first_layer": true, + "vibework_security_onboarding_default_visible": false, "vibework_security_onboarding_item_count": 6, "vibework_security_onboarding_runtime_gate_count": 0, "existing_frontend_surface_count": 10, @@ -175,6 +191,7 @@ "topology_path_explorer_runtime_gate_count": 0, "topology_intelligence_runtime_gate_count": 0, "decision_runway_first_layer": true, + "decision_runway_default_visible": false, "decision_runway_step_count": 5, "decision_runway_default_step": "ownerEvidence", "decision_runway_dependency_count": 6, @@ -278,6 +295,57 @@ "not_authorization": true } ], + "first_screen_depth_map_layers": [ + { + "layer_id": "visible", + "display_order": 1, + "display_mode": "first_screen_depth_map", + "surface_count": 4, + "default_visible": true, + "runtime_gate_count": 0, + "runtime_execution_authorized": false, + "action_buttons_allowed": false, + "not_authorization": true + }, + { + "layer_id": "advanced", + "display_order": 2, + "display_mode": "first_screen_depth_map", + "surface_count": 2, + "target_anchor": "#iwooos-decision-gate-visuals", + "default_visible": false, + "runtime_gate_count": 0, + "runtime_execution_authorized": false, + "action_buttons_allowed": false, + "not_authorization": true + }, + { + "layer_id": "ledger", + "display_order": 3, + "display_mode": "first_screen_depth_map", + "surface_count": 4, + "target_anchor": "#iwooos-scope-evidence-visuals", + "default_visible": false, + "runtime_gate_count": 0, + "runtime_execution_authorized": false, + "action_buttons_allowed": false, + "not_authorization": true + }, + { + "layer_id": "runtime", + "display_order": 4, + "display_mode": "first_screen_depth_map", + "surface_count": 0, + "default_visible": false, + "runtime_gate_count": 0, + "runtime_execution_authorized": false, + "scan_authorized": false, + "host_change_authorized": false, + "source_control_mutation_authorized": false, + "action_buttons_allowed": false, + "not_authorization": true + } + ], "first_progress_unlock_path_steps": [ { "step_id": "owner_response_scope", @@ -442,7 +510,7 @@ { "item_id": "workMap", "display_order": 1, - "target_anchor": "#iwooos-command-map-board", + "target_anchor": "#iwooos-decision-gate-visuals", "display_mode": "first_layer_focus_deck", "anchor_navigation_allowed": true, "execution_action_button_allowed": false, @@ -453,7 +521,7 @@ { "item_id": "unlockPath", "display_order": 2, - "target_anchor": "#iwooos-first-progress-unlock-path-board", + "target_anchor": "#iwooos-decision-gate-visuals", "display_mode": "first_layer_focus_deck", "anchor_navigation_allowed": true, "execution_action_button_allowed": false, @@ -464,7 +532,7 @@ { "item_id": "productScope", "display_order": 3, - "target_anchor": "#iwooos-global-security-mesh-matrix-board", + "target_anchor": "#iwooos-scope-evidence-visuals", "display_mode": "first_layer_focus_deck", "anchor_navigation_allowed": true, "execution_action_button_allowed": false, @@ -475,7 +543,7 @@ { "item_id": "hostTools", "display_order": 4, - "target_anchor": "#iwooos-host-tool-evidence-chain-board", + "target_anchor": "#iwooos-scope-evidence-visuals", "display_mode": "first_layer_focus_deck", "anchor_navigation_allowed": true, "execution_action_button_allowed": false, @@ -486,7 +554,7 @@ { "item_id": "sourceControl", "display_order": 5, - "target_anchor": "#iwooos-command-map-source-control", + "target_anchor": "#iwooos-decision-gate-visuals", "display_mode": "first_layer_focus_deck", "anchor_navigation_allowed": true, "execution_action_button_allowed": false, diff --git a/docs/security/security-mirror-status-rollup.snapshot.json b/docs/security/security-mirror-status-rollup.snapshot.json index f5c45ec1..ae3a58c6 100644 --- a/docs/security/security-mirror-status-rollup.snapshot.json +++ b/docs/security/security-mirror-status-rollup.snapshot.json @@ -2341,6 +2341,18 @@ "runtime_delta": false, "execution_authorized": false, "not_authorization": true + }, + { + "delta_id": "s2_156_iwooos_first_screen_depth_map", + "display_order": 185, + "completed_stage": "S2.156 IwoooS 首屏深度地圖與證據語義校正", + "progress_axis": "framework_detail", + "headline_percent_delta": 0, + "framework_delta_visible": true, + "why_headline_unchanged": "IwoooS 只新增首屏深度地圖,把首屏可見、進階圖表、證據台帳與執行期邊界拆成四層,並補上 default_visible=false 的證據語義,避免把已收合的決策跑道、命令地圖、主機工具鏈或 VibeWork 區塊誤讀成預設展開;iwooos_first_screen_depth_map_layer_count=4、iwooos_first_screen_depth_map_visible_layer_count=4、iwooos_first_screen_depth_map_advanced_group_count=2、iwooos_first_screen_depth_map_ledger_group_count=4、iwooos_first_screen_depth_map_runtime_gate_count=0、runtime_execution_authorized=false、active_runtime_gate_count=0、action_buttons_allowed=false,不把深度地圖當掃描、修復、部署、主機更新、版本來源切換、GitHub primary 切換或 Gitea 停用。", + "runtime_delta": false, + "execution_authorized": false, + "not_authorization": true } ], "next_safe_actions": [ diff --git a/scripts/security/security-mirror-progress-guard.py b/scripts/security/security-mirror-progress-guard.py index c1f307ca..58f5c77e 100755 --- a/scripts/security/security-mirror-progress-guard.py +++ b/scripts/security/security-mirror-progress-guard.py @@ -744,6 +744,7 @@ def validate(root: Path) -> None: "s2_153_iwooos_executive_snapshot", "s2_154_iwooos_first_screen_language_polish", "s2_155_iwooos_first_layer_progressive_disclosure", + "s2_156_iwooos_first_screen_depth_map", ] assert_equal( "progress_delta_ledger.delta_ids", @@ -1613,6 +1614,43 @@ def validate(root: Path) -> None: iwooos_projection["summary"]["all_product_coverage_snapshot_runtime_ready_count"], 0, ) + assert_true( + "iwooos_projection.summary.first_screen_depth_map_first_layer", + iwooos_projection["summary"]["first_screen_depth_map_first_layer"], + ) + assert_equal( + "iwooos_projection.summary.first_screen_depth_map_layer_count", + iwooos_projection["summary"]["first_screen_depth_map_layer_count"], + 4, + ) + assert_equal( + "iwooos_projection.summary.first_screen_depth_map_visible_layer_count", + iwooos_projection["summary"]["first_screen_depth_map_visible_layer_count"], + 4, + ) + assert_equal( + "iwooos_projection.summary.first_screen_depth_map_advanced_group_count", + iwooos_projection["summary"]["first_screen_depth_map_advanced_group_count"], + 2, + ) + assert_equal( + "iwooos_projection.summary.first_screen_depth_map_ledger_group_count", + iwooos_projection["summary"]["first_screen_depth_map_ledger_group_count"], + 4, + ) + assert_equal( + "iwooos_projection.summary.first_screen_depth_map_runtime_gate_count", + iwooos_projection["summary"]["first_screen_depth_map_runtime_gate_count"], + 0, + ) + assert_false( + "iwooos_projection.summary.first_screen_depth_map_advanced_default_visible", + iwooos_projection["summary"]["first_screen_depth_map_advanced_default_visible"], + ) + assert_false( + "iwooos_projection.summary.first_screen_depth_map_scope_evidence_default_visible", + iwooos_projection["summary"]["first_screen_depth_map_scope_evidence_default_visible"], + ) assert_equal( "iwooos_projection.summary.all_product_coverage_snapshot_default_summary_mode", iwooos_projection["summary"]["all_product_coverage_snapshot_default_summary_mode"], @@ -1622,7 +1660,7 @@ def validate(root: Path) -> None: "iwooos_projection.summary.first_progress_unlock_path_first_layer", iwooos_projection["summary"]["first_progress_unlock_path_first_layer"], ) - assert_true( + assert_false( "iwooos_projection.summary.first_progress_unlock_path_default_visible", iwooos_projection["summary"]["first_progress_unlock_path_default_visible"], ) @@ -1658,6 +1696,10 @@ def validate(root: Path) -> None: "iwooos_projection.summary.command_map_first_layer", iwooos_projection["summary"]["command_map_first_layer"], ) + assert_false( + "iwooos_projection.summary.command_map_default_visible", + iwooos_projection["summary"]["command_map_default_visible"], + ) assert_equal( "iwooos_projection.summary.command_map_mode_count", iwooos_projection["summary"]["command_map_mode_count"], @@ -1832,6 +1874,10 @@ def validate(root: Path) -> None: "iwooos_projection.summary.decision_runway_first_layer", iwooos_projection["summary"]["decision_runway_first_layer"], ) + assert_false( + "iwooos_projection.summary.decision_runway_default_visible", + iwooos_projection["summary"]["decision_runway_default_visible"], + ) assert_equal( "iwooos_projection.summary.decision_runway_step_count", iwooos_projection["summary"]["decision_runway_step_count"], @@ -1879,6 +1925,10 @@ def validate(root: Path) -> None: "iwooos_projection.summary.gate_radar_first_layer", iwooos_projection["summary"]["gate_radar_first_layer"], ) + assert_false( + "iwooos_projection.summary.gate_radar_default_visible", + iwooos_projection["summary"]["gate_radar_default_visible"], + ) assert_equal( "iwooos_projection.summary.gate_radar_lane_count", iwooos_projection["summary"]["gate_radar_lane_count"], @@ -1910,6 +1960,10 @@ def validate(root: Path) -> None: "iwooos_projection.summary.global_security_mesh_matrix_first_layer", iwooos_projection["summary"]["global_security_mesh_matrix_first_layer"], ) + assert_false( + "iwooos_projection.summary.global_security_mesh_matrix_default_visible", + iwooos_projection["summary"]["global_security_mesh_matrix_default_visible"], + ) assert_equal( "iwooos_projection.summary.global_security_mesh_matrix_asset_count", iwooos_projection["summary"]["global_security_mesh_matrix_asset_count"], @@ -1929,6 +1983,10 @@ def validate(root: Path) -> None: "iwooos_projection.summary.host_tool_evidence_chain_first_layer", iwooos_projection["summary"]["host_tool_evidence_chain_first_layer"], ) + assert_false( + "iwooos_projection.summary.host_tool_evidence_chain_default_visible", + iwooos_projection["summary"]["host_tool_evidence_chain_default_visible"], + ) assert_equal( "iwooos_projection.summary.host_tool_evidence_chain_host_count", iwooos_projection["summary"]["host_tool_evidence_chain_host_count"], @@ -1948,6 +2006,10 @@ def validate(root: Path) -> None: "iwooos_projection.summary.vibework_security_onboarding_first_layer", iwooos_projection["summary"]["vibework_security_onboarding_first_layer"], ) + assert_false( + "iwooos_projection.summary.vibework_security_onboarding_default_visible", + iwooos_projection["summary"]["vibework_security_onboarding_default_visible"], + ) assert_equal( "iwooos_projection.summary.vibework_security_onboarding_item_count", iwooos_projection["summary"]["vibework_security_onboarding_item_count"], @@ -2326,10 +2388,18 @@ def validate(root: Path) -> None: "iwooos_projection.summary.visual_command_dashboard_first_layer", iwooos_projection["summary"]["visual_command_dashboard_first_layer"], ) + assert_false( + "iwooos_projection.summary.visual_command_dashboard_default_visible", + iwooos_projection["summary"]["visual_command_dashboard_default_visible"], + ) assert_true( "iwooos_projection.summary.professional_security_experience_first_layer", iwooos_projection["summary"]["professional_security_experience_first_layer"], ) + assert_false( + "iwooos_projection.summary.professional_security_experience_default_visible", + iwooos_projection["summary"]["professional_security_experience_default_visible"], + ) assert_equal( "iwooos_projection.summary.professional_security_experience_tab_count", iwooos_projection["summary"]["professional_security_experience_tab_count"], @@ -2354,6 +2424,10 @@ def validate(root: Path) -> None: "iwooos_projection.summary.concrete_work_snapshot_first_layer", iwooos_projection["summary"]["concrete_work_snapshot_first_layer"], ) + assert_false( + "iwooos_projection.summary.concrete_work_snapshot_default_visible", + iwooos_projection["summary"]["concrete_work_snapshot_default_visible"], + ) assert_equal( "iwooos_projection.summary.concrete_work_snapshot_workstream_count", iwooos_projection["summary"]["concrete_work_snapshot_workstream_count"], @@ -12329,6 +12403,110 @@ def validate(root: Path) -> None: iwooos_projection_page, text, ) + expected_first_screen_depth_map_layer_ids = [ + "visible", + "advanced", + "ledger", + "runtime", + ] + first_screen_depth_map_layers = iwooos_projection["first_screen_depth_map_layers"] + assert_equal( + "iwooos_projection.first_screen_depth_map_layers.ids", + [item["layer_id"] for item in first_screen_depth_map_layers], + expected_first_screen_depth_map_layer_ids, + ) + assert_equal( + "iwooos_projection.first_screen_depth_map_layers.display_order", + [item["display_order"] for item in first_screen_depth_map_layers], + list(range(1, len(expected_first_screen_depth_map_layer_ids) + 1)), + ) + first_screen_depth_surface_counts = { + item["layer_id"]: item["surface_count"] for item in first_screen_depth_map_layers + } + assert_equal("iwooos_projection.first_screen_depth_map_layers.visible.surface_count", first_screen_depth_surface_counts["visible"], 4) + assert_equal("iwooos_projection.first_screen_depth_map_layers.advanced.surface_count", first_screen_depth_surface_counts["advanced"], 2) + assert_equal("iwooos_projection.first_screen_depth_map_layers.ledger.surface_count", first_screen_depth_surface_counts["ledger"], 4) + assert_equal("iwooos_projection.first_screen_depth_map_layers.runtime.surface_count", first_screen_depth_surface_counts["runtime"], 0) + for item in first_screen_depth_map_layers: + layer_id = item["layer_id"] + assert_equal( + f"iwooos_projection.first_screen_depth_map_layers.{layer_id}.display_mode", + item["display_mode"], + "first_screen_depth_map", + ) + assert_equal( + f"iwooos_projection.first_screen_depth_map_layers.{layer_id}.default_visible", + item["default_visible"], + layer_id == "visible", + ) + assert_equal( + f"iwooos_projection.first_screen_depth_map_layers.{layer_id}.runtime_gate_count", + item["runtime_gate_count"], + 0, + ) + assert_false( + f"iwooos_projection.first_screen_depth_map_layers.{layer_id}.runtime_execution_authorized", + item["runtime_execution_authorized"], + ) + assert_false( + f"iwooos_projection.first_screen_depth_map_layers.{layer_id}.action_buttons_allowed", + item["action_buttons_allowed"], + ) + assert_true( + f"iwooos_projection.first_screen_depth_map_layers.{layer_id}.not_authorization", + item["not_authorization"], + ) + runtime_depth_layer = next(item for item in first_screen_depth_map_layers if item["layer_id"] == "runtime") + for flag in ["scan_authorized", "host_change_authorized", "source_control_mutation_authorized"]: + assert_false( + f"iwooos_projection.first_screen_depth_map_layers.runtime.{flag}", + runtime_depth_layer[flag], + ) + for text in [ + 'data-testid="iwooos-first-screen-depth-map-board"', + 'data-testid="iwooos-first-screen-depth-map-layers"', + 'data-testid="iwooos-first-screen-depth-map-flow"', + 'data-testid="iwooos-first-screen-depth-map-boundaries"', + "IwoooSFirstScreenDepthMapBoard", + "firstScreenDepthLayers", + "firstScreenDepthBoundaries", + "href: '#iwooos-decision-gate-visuals'", + "href: '#iwooos-scope-evidence-visuals'", + ]: + assert_text_contains( + "iwooos_page.first_screen_depth_map", + iwooos_projection_page, + text, + ) + assert_text_before( + "iwooos_page.focus_deck_before_first_screen_depth_map", + iwooos_projection_page, + "", + "", + ) + assert_text_before( + "iwooos_page.first_screen_depth_map_before_immediate_visual_mesh", + iwooos_projection_page, + "", + "", + ) + for text in [ + "iwooos_first_screen_depth_map_visible_layer_count=4", + "iwooos_first_screen_depth_map_advanced_group_count=2", + "iwooos_first_screen_depth_map_ledger_group_count=4", + "iwooos_first_screen_depth_map_runtime_gate_count=0", + "iwooos_first_screen_depth_map_advanced_default_visible=false", + "iwooos_first_screen_depth_map_scope_evidence_default_visible=false", + "runtime_execution_authorized=false", + "active_runtime_gate_count=0", + "action_buttons_allowed=false", + "not_authorization=true", + ]: + assert_text_contains( + "iwooos_page.first_screen_depth_map_boundary", + iwooos_projection_page, + text, + ) assert_text_contains( "iwooos_page.focus_deck_testid", iwooos_projection_page,