$ErrorActionPreference = 'Stop' $root = Split-Path -Parent $PSScriptRoot function Read-Utf8([string]$Path) { [System.IO.File]::ReadAllText((Join-Path $root $Path), [System.Text.Encoding]::UTF8) } $targets = @( 'pages/family/f02-publish-feed.vue', 'pages/tree/t03-member-profile.vue', 'pages/tree/t08-member-states.vue', 'pages/genealogy/g03-create-genealogy.vue', 'pages/genealogy/g08-join-application.vue', 'pages/genealogy/g09-my-applications.vue', 'pages/genealogy/g10-application-review.vue', 'pages/genealogy/g11-genealogy-settings.vue', 'pages/genealogy/g12-generation-poems.vue' ) foreach ($target in $targets) { $content = Read-Utf8 $target foreach ($forbidden in @('g03-create-flow-panel.png', 'g06-search-input-wide.png', 'application-status-card.png')) { if ($content.Contains($forbidden)) { throw "$target still uses obsolete opaque cross-module surface: $forbidden" } } } $modulePage = Read-Utf8 'components/ModulePage.vue' if ($modulePage.Contains('class="page-intro"')) { throw 'ModulePage must remove repeated numbered intro blocks' } foreach ($required in @('module-content-frame.png', 'module-field-frame.png', '