fix(web): clarify IwoooS first screen depth
All checks were successful
CD Pipeline / tests (push) Successful in 1m20s
Code Review / ai-code-review (push) Successful in 12s
CD Pipeline / build-and-deploy (push) Successful in 3m36s
CD Pipeline / post-deploy-checks (push) Successful in 2m1s

This commit is contained in:
Your Name
2026-06-01 17:09:29 +08:00
parent 990203f517
commit 3d8b0ee704
7 changed files with 514 additions and 7 deletions

View File

@@ -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": "資安關聯視覺模型",

View File

@@ -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": "資安關聯視覺模型",

View File

@@ -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 (
<section
data-testid="iwooos-first-screen-depth-map-board"
style={{ marginBottom: 14, maxWidth: '100%', overflow: 'hidden' }}
>
<div style={{ ...band, padding: 14, background: '#fbfbf7', borderColor: '#ded8c8' }}>
<div
style={{
display: 'grid',
gridTemplateColumns: 'repeat(auto-fit, minmax(min(100%, 250px), 1fr))',
gap: 10,
alignItems: 'stretch',
}}
>
<div
style={{
border: '0.5px solid #d9d2c4',
borderRadius: 8,
background: '#fff',
padding: 13,
display: 'grid',
alignContent: 'start',
gap: 7,
minWidth: 0,
}}
>
<div style={{ display: 'flex', alignItems: 'center', gap: 8, color: '#5c543f', fontSize: 12, fontWeight: 700 }}>
<Route size={16} color="#b66a2d" />
{t('eyebrow')}
</div>
<h2 style={{ fontSize: 17, lineHeight: 1.25, margin: 0, color: '#141413' }}>{t('title')}</h2>
<p style={{ fontSize: 12, lineHeight: 1.55, color: '#6f6d66', margin: 0, ...textWrap }}>
{t('subtitle')}
</p>
</div>
<div
data-testid="iwooos-first-screen-depth-map-layers"
style={{
display: 'grid',
gridTemplateColumns: 'repeat(auto-fit, minmax(min(100%, 150px), 1fr))',
gap: 8,
minWidth: 0,
}}
>
{firstScreenDepthLayers.map((item, index) => {
const Icon = item.icon
const content = (
<>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>
<Icon size={16} color={toneColors[item.tone]} />
<span style={{ color: toneColors[item.tone], fontSize: 17, fontWeight: 700 }}>{item.value}</span>
</div>
<div style={{ marginTop: 8, fontSize: 10.5, color: '#8a867c', fontWeight: 700 }}>
{String(index + 1).padStart(2, '0')}
</div>
<h3 style={{ margin: '4px 0 0', fontSize: 13, lineHeight: 1.25, color: '#141413', ...textWrap }}>
{t(`layers.${item.key}.title` as never)}
</h3>
<p style={{ margin: '6px 0 0', fontSize: 11, lineHeight: 1.45, color: '#6f6d66', ...textWrap }}>
{t(`layers.${item.key}.body` as never)}
</p>
</>
)
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 ? (
<a key={item.key} href={item.href} data-testid={`iwooos-first-screen-depth-map-layer-${item.key}`} style={style}>
{content}
</a>
) : (
<div key={item.key} data-testid={`iwooos-first-screen-depth-map-layer-${item.key}`} style={style}>
{content}
</div>
)
})}
</div>
</div>
<div
data-testid="iwooos-first-screen-depth-map-flow"
style={{
marginTop: 10,
display: 'grid',
gridTemplateColumns: 'repeat(4, minmax(0, 1fr))',
gap: 6,
}}
>
{firstScreenDepthLayers.map(item => (
<div
key={item.key}
style={{
height: 7,
borderRadius: 8,
background: toneColors[item.tone],
opacity: item.key === 'runtime' ? 0.38 : 0.86,
}}
/>
))}
</div>
<details
data-testid="iwooos-first-screen-depth-map-boundaries"
style={{
marginTop: 10,
border: '0.5px solid #e7e1d3',
borderRadius: 8,
background: '#fff',
padding: '7px 10px',
}}
>
<summary style={{ cursor: 'pointer', fontSize: 12, fontWeight: 700, color: '#5c543f' }}>
{t('boundaryTitle')}
</summary>
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(230px, 1fr))', gap: 6, marginTop: 9 }}>
{firstScreenDepthBoundaries.map(item => (
<code
key={item}
style={{
border: '0.5px solid #ede4d4',
borderRadius: 8,
padding: '6px 8px',
color: '#5c543f',
fontSize: 11,
lineHeight: 1.4,
background: '#fbfbf7',
overflowWrap: 'anywhere',
}}
>
{item}
</code>
))}
</div>
</details>
</div>
</section>
)
}
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 } }) {
<IwoooSExecutiveSnapshotBoard />
<IwoooSFocusDeckBoard />
<IwoooSFirstScreenDepthMapBoard />
<IwoooSImmediateVisualMeshBoard />
<IwoooSTopologyAtlasBoard />

View File

@@ -1,3 +1,22 @@
## 2026-06-01IwoooS 首屏深度地圖與證據語義校正
**背景**
- 前一階段已把 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-01truth-chain quality summary 納入 AI 自健診 SLO
**背景**

View File

@@ -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,

View File

@@ -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": [

View File

@@ -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,
"<IwoooSFocusDeckBoard />",
"<IwoooSFirstScreenDepthMapBoard />",
)
assert_text_before(
"iwooos_page.first_screen_depth_map_before_immediate_visual_mesh",
iwooos_projection_page,
"<IwoooSFirstScreenDepthMapBoard />",
"<IwoooSImmediateVisualMeshBoard />",
)
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,