79a461f79d
Финальная ступень #351: генератор ЦЕЛЫХ вложенных документов (random walk по ContentMatch схемы, min-depth fixpoint для терминирования, глубина/размер ограничены) + инвариант P4 (фазз парсера: для ЛЮБОЙ строки markdownToProseMirror не бросает и результат валиден по схеме). Инварианты P1 (семантический round-trip), P2 (байтовый fixpoint со 2-го прохода), P3 (тотальность) — строгие. Генератор сразу нашёл классы реальных багов конвертера; все починены (инварианты НЕ ослаблялись — чинился конвертер): - loose (много-блочные) контейнеры (listItem/taskItem/callout/detailsContent) склеивали блоки при реимпорте — ТИХАЯ ПОТЕРЯ ДАННЫХ; теперь blank-line разделитель между блок-детьми (по образцу blockquote). - соседние sibling-списки одного marker-family (task+bullet и т.п.) сливались в один список с ПОТЕРЕЙ чекбокса — теперь между ними эмитится инертный `<!-- -->` разделитель (byte-stable round-trip). - paragraph textAlign терялся во вложенных li/td/th. - вложенный codeBlock терял хвостовой перевод строки. - pageBreak/pageEmbed/subpages/transclusion дропались во вложении (blockquote/callout/details/li). - медиа в columns: number→string ширины/высоты и лишний data-align (churn). - callout `> [!type]`, вложенный в список/цитату, парсился неверно (prefix-aware regex). Golden-обновления (6) — прямые следствия loose-container фикса, каждое round-trip'ится. 2100+ сгенерированных документов (3 seed) — 0 падений P1/P2. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>