Решили: все scripts/*.ps1 обязаны иметь UTF-8 BOM; инвариант держит EditMode-тест
ToolingScriptEncodingTests, а не комментарий в скрипте.
Почему: девять скриптов из одиннадцати не парсились в Windows PowerShell 5.1 — той оболочке,
которая у Макса по умолчанию. Отвергли альтернативу «переписать под 5.1»: она была бы работой не по
адресу. Ровно те два файла, у которых BOM уже был, парсились нормально — значит дело не в синтаксисе
седьмой версии, а в сигнатуре. Настоящих 7-only конструкций во всех одиннадцати нашлась одна:
Set-Content -Encoding utf8NoBOM в ветке -Meta у compile-check.ps1. Имени utf8NoBOM в 5.1 нет
вовсе, а её utf8 — это UTF-8 с сигнатурой, которой в .meta быть не должно; поэтому замена не
на другое имя кодировки, а на явный UTF8Encoding($false) через System.IO.File — он даёт
одинаковый байт в обеих оболочках.
Дом инварианта выбран по правилу «инвариант между файлами идёт в тест»: нарушается он снаружи и молча. Любой агент или редактор, сохранивший файл «просто в UTF-8», ломает консоль Макса, а в pwsh 7 всё продолжает работать — автор правки ничего не замечает. Комментарий внутри скрипта такую правку не остановит, потому что её делает тот, кто скрипт не читал.
Грабли: ошибка не называет кодировку. 5.1 без сигнатуры читает файл как ANSI, кириллица в
комментариях превращается в мусор, в мусоре разъезжаются кавычки — и падает парсер, до первой строки
логики. В консоль при этом уезжает «отсутствует закрывающий знак )» с номером случайной строки.
Чинить по такому сообщению можно долго и не туда; диагноз даёт не чтение кода, а сравнение: у кого
BOM есть — работает.
Второе: цена ошибки была выше, чем кажется по списку файлов. Среди девяти — compile-check.ps1,
которым по HARD-правилу проверяется каждая правка .cs. Инструмент, введённый чтобы не морозить
редактор, у Макса не запускался вообще.
Третье: тест на первом прогоне поймал вендорные Activate.ps1 из Python-venv аудио-пайплайна
(scripts/audio/.venv*/). Область сузили до путей без скрытых папок — venv в .gitignore, и его
кодировка не наша забота.
Четвёртое, и оно оказалось второй половиной той же болезни: BOM чинит только чтение самого
скрипта, но не чтение данных. Get-Content без -Encoding UTF8 в 5.1 читает уже .md и .xml
как ANSI. check-wiki-links.ps1 после починки BOM запустился — и выдал битые ссылки с кракозябрами
там, где в pwsh 7 гейт зелёный на 415 файлах. Гейт, который врёт красным, хуже незапускающегося:
первому верят. Явная кодировка проставлена во всех местах чтения текста.
Отдельно оставлены check-journal-quotes.ps1 и journals.ps1: у них в шапке #Requires -Version 7.0. Это не дефект — оба работают с архивом диалогов агента, Макс их руками не гоняет, и падают
они внятным сообщением про версию, а не мусором.
Владелец правды: тест Guildmaster.Tests.EditMode.ToolingScriptEncodingTests,
scripts/compile-check.ps1 (ветка -Meta), scripts/check-wiki-links.ps1 (чтение .md).