После 6781bb3 компилятор кладёт в каждую группу структуры авто-поле выбора и
авто-порядок (SelectedItemAuto/OrderItemAuto), как делает платформа. decompile
сохранял их как selection:["Auto"]/order:["Auto"], из-за чего Try-StructureShorthand
не сворачивал цепочку и выдавал громоздкую объектную модель вместо строки
"A > B > details".
Теперь selection/order, состоящие ровно из одного "Auto" (предикат Is-AutoOnly /
is_auto_only), считаются дефолтом и не мешают свёртке. Round-trip снова bit-perfect:
shorthand перекомпилируется в идентичный XML (Parse-StructureShorthand сам добавляет
эти auto-поля). Отключённый auto ({auto,use}), смешанные списки и явные поля свёртку
не проходят и остаются в объектной форме.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Два бага PS-версии, незаметно роняли 9/30 отчётов sample30 в decompile-fail:
1. Get-Text без xpath → SelectSingleNode("", $ns) с .NET XPathException
"Результатом выражения должен быть NodeSet". Шесть call-sites в
dataSetLinks (sourceDataSet/destinationDataSet/sourceExpression/...)
передавали уже-выбранный узел без второго аргумента; [string]$xpath
дефолтился в "". Фикс: Get-Text возвращает $node.InnerText, если
xpath пустой.
2. $paramByName[$startMatch] при $startMatch=$null → "индекс массива
вычислен как NULL". Возникает на StandardPeriod-параметре, для
которого в отчёте нет companion expressions. Фикс: guard через if.
Python-порт #2 уже был защищён .get(); по #1 в py был обходной костыль
inline-через-inner_text — заменён на единый get_text(node) после
обновления сигнатуры до get_text(node, xpath=None).
verify-roundtrip sample30: 9 bit-perfect + 20 with-diff + 1 ring3 = 30
(до фикса 9 silently падали как decompile-fail, сумма не сходилась).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>