$ErrorActionPreference = 'Stop' $root = Split-Path -Parent $PSScriptRoot $page = Get-Content -LiteralPath (Join-Path $root 'pages/tree/t01-tree-overview.vue') -Raw -Encoding utf8 foreach ($required in @( 'a01-primary-button-v2.png', 'a01-secondary-button-v2.png', 't01-member-node-standard.png', 't01-member-node-selected.png', 't01-state-panel.png', 't01-member-drawer.png', 'lineage-connector--root', 'lineage-pan-cue' )) { if ($page -notmatch [regex]::Escape($required)) { throw "T01 member action asset missing: $required" } } foreach ($rule in @( '(?s)\.tree-toolbar__title text:last-child\s*\{[^}]*font-size:\s*22rpx;', '(?s)\.tree-toolbar__actions\s*\{[^}]*font-size:\s*23rpx;', '(?s)\.generation-band\s*\{[^}]*font-size:\s*22rpx;', '(?s)\.node-relation\s*\{[^}]*font-size:\s*21rpx;', '(?s)\.node-years\s*\{[^}]*font-size:\s*20rpx;', '(?s)\.tree-state-card__copy\s*\{[^}]*font-size:\s*24rpx;', '(?s)\.sheet-meta\s*\{[^}]*font-size:\s*22rpx;', '(?s)\.sheet-action text\s*\{[^}]*font-family:\s*''Microsoft YaHei''[^}]*font-size:\s*22rpx;' )) { if ($page -notmatch $rule) { throw "T01 readable visual rule missing: $rule" } } Write-Output 'T01-ALL-STATES-VISUAL-CONTRACT PASS'