Расхождение JSON между портами было 26 макетов из 40, стало 5. Расхождение
собранного XML — 20 из 40, стало 7. Причин оказалось четыре, и три из них
дефекты, а не просто разнобой.
1. ps1 грузил XML с PreserveWhitespace = $false, и текст ячейки из одних
пробелов схлопывался в пустой. Молчаливая потеря данных в каноничном
порте, 25 макетов пилота.
2. Стили обнаруживались обходом хэш-таблицы строк, а её порядок в PowerShell
НЕ определён. Платформа же кладёт записи палитры в порядке документа, так
что порядок обхода — часть верности вывода, а не деталь. Обход теперь по
возрастанию номера строки. ([ordered] тут не годится: с целочисленными
ключами он индексируется по позиции, а не по ключу.)
3. Именованные области сортировались нестабильным Sort-Object (-Stable
появился только в PowerShell 6.2), поэтому области с одинаковыми границами
получали произвольный порядок. Добавлен явный ключ исходного порядка —
в оба порта, чтобы совпадение было по построению, а не по совпадению.
4. containsValue / valueType / controlType протекали в styles сквозным
пробросом неизвестных тегов. Это свойства ЗНАЧЕНИЯ ячейки, а не оформления,
и компилятор таких ключей не знает — в DSL они были чистым шумом. Заодно
вложенный элемент больше не читается как скаляр: ps1 брал InnerText и
получал склейку поддерева, py брал .text и получал пустоту.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>