<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title>ХЭНДОФФ — состояние на 2026-08-09</title>
  <p p="1">_Написан по указанию владельца для передачи в новую сессию. Читать целиком
прежде, чем что-либо делать._</p>
  <section title="0. Самое главное в трёх строках">
    <list ordered="true" p="2">
      <item>Из **пяти** вопросов, стоящих перед владельцем, разобран **один** — формат
   каталога пакетов. До дизайна **не дошли**: есть исследование, разбор и
   вердикт ревьюера, но нет решения.</item>
      <item>Владелец дал **директиву, меняющую способ работы**: усилий не экономить.
   Она записана в проект, см. §4.</item>
      <item>Под этой директивой прежний разбор **надо переделать** — он писался под
   неявным «выбери достаточное». Что именно менять — §5.</item>
    </list>
  </section>
  <section title="1. Пять вопросов владельца — полный список">
    <p p="3">Ни один нельзя терять. Первый разобран, остальные ждут.</p>
    <section title="Вопрос 1 — формат каталога пакетов ⚙️ РАЗОБРАН, НЕ РЕШЁН">
      <p p="4">**Суть.** vibevm публикует каталог пакетов — JSON-файлы в git-репозитории,
которые читают чужие программы. Владелец решил описывать формат схемами и
генерировать код из них. Замер перед постройкой нашёл, что цена другая, чем
предполагалось.</p>
      <p p="5">**Как вопрос вырос.** Начали с узкого: где провести границу генерации, раз одна
форма в языке схем невыразима. Пришли к широкому: **какова политика эволюции
долговечных форматов vibevm** — их три (каталог, `vibe.toml`, `vibe.lock`),
решены они по-разному, и никто этого не решал.</p>
      <p p="6">**Состояние:** исследование сделано (файлы 01–09), сведено (10), отревьюено
(11). Решения нет. Позиции скорректированы, см. §5.</p>
    </section>
    <section title="Вопрос 2 — недетерминированная запись каталога 🔁 ВСПЛЫЛ СНОВА">
      <p p="7">**Суть.** При каждой записи в каталог проставляется текущее время, поэтому две
одинаковые по смыслу записи дают разные байты. Следствие: автопубликация
коммитит изменение даже когда ничего не изменилось, история каталога забивается
пустыми коммитами.</p>
      <p p="8">**Что добавилось.** Ревьюер нашёл это независимо, уже как **дефект
воспроизводимости**, и отметил, что **рядом, в том же коде, сжатие сделано
намеренно детерминированным** — то есть о воспроизводимости кто-то заботился в
одном месте и не заметил, что она сломана в соседнем.</p>
      <p p="9">**Следствие:** вопрос перестал быть отдельным. Он **часть вопроса 1** — решать
надо вместе с форматом.</p>
      <p p="10">Строка: `BACKLOG.md` B-072.</p>
    </section>
    <section title="Вопрос 3 — сервер каталога не пишет логи ⬜ НЕ ТРОНУТ">
      <p p="11">**Суть.** Сервер смонтировал слой логирования HTTP-запросов и не поставил
слушателя: события формируются и выбрасываются. У оператора нет ни строчки лога,
хотя код выглядит так, будто есть. Слушатель появляется только когда включён
флаг самопубликации — связь случайная.</p>
      <p p="12">**Что решать:** ставить ли слушателя всегда и на каком уровне по умолчанию.
Это меняет то, что видит **каждый** оператор в потоке ошибок.</p>
      <p p="13">**Половина, не требующая решения:** докблок одного файла обещает, что
пропущенные репозитории пишутся в предупреждения, а вызова там нет. Починка
шапки решения не требует.</p>
      <p p="14">Строка: `BACKLOG.md` B-071.</p>
    </section>
    <section title="Вопрос 4 — планка доказательства ⬜ НЕ ТРОНУТ">
      <p p="15">**Суть.** Треть вердиктов корпуса не имеет собственного доказательства: один
абзац проставлен сразу многим утверждениям. Такой вердикт **нельзя опровергнуть
по отдельности** — если одно из утверждений ложно, абзац про остальные всё ещё
выглядит правдой.</p>
      <p p="16">Доказано дважды на практике: из 34 пересуждённых утверждений **два оказались
ложными**, стоя с галочкой «проверено».</p>
      <p p="17">**Что решать:** ужесточать ли планку сразу (тогда ~4100 галочек разом станут «не
проверено» — выглядит как обвал, им не являясь), или конвертировать намеренными
партиями по мере правок.</p>
      <p p="18">Запись: `AUDIT.md`, находка `2026-08-06-01`, помечена P1, открыта.</p>
    </section>
    <section title="Вопрос 5 — соединение двух движков ⬜ НЕ ТРОНУТ, нужен «да»">
      <p p="19">**Суть.** Есть два независимых инструмента: один проверяет качество кода, другой
строит карту связей «код ↔ спека». Владелец решил, что данные каждый держит при
себе, а соединяются они в момент запроса — по файлу и строке, без зависимости
одного от другого.</p>
      <p p="20">Осталась одна честно названная слабость: карта строится заново на каждый запрос,
а отчёт о качестве — файл на диске, свежий настолько, насколько недавно его
прогоняли.</p>
      <p p="21">**Нужно только подтверждение:** ответ, содержащий находки о качестве, называет,
**когда** они получены, а отсутствие отчёта означает «не измерено», а не
«нарушений нет».</p>
      <p p="22">Строка: `BACKLOG.md` B-019, часть (в).</p>
    </section>
  </section>
  <section title="2. ВСЕ материалы. Читать ДО первого разговора с владельцем">
    <p p="23">**Указание владельца, 2026-08-09:** прочитать все перечисленные ниже документы
**прежде**, чем говорить с ним дальше. Не выборочно, не по диагонали, не «по
мере надобности». Сначала прочитать — потом разговаривать.</p>
    <p p="24">Общий объём обязательного чтения: **12 документов, ~12 400 строк, 900 КБ.**
Это много и так и задумано: три круга исследования стоили больше, чем их
прочтение.</p>
    <section title="2.1 Обязательное чтение — каталог находок, в этом порядке">
      <p p="25">Каталог лежит **ВНЕ репозитория vibevm**:
`C:\Users\olegc\git\v\discovery\vibevm-schema-evolution-discovery\`</p>
      <p p="26">Загрузочная последовательность проекта его не находит — указатель оставлен в
`CONTINUE.md`.</p>
      <table p="27">
        <tr>
          <td>#</td>
          <td>файл</td>
          <td>строк</td>
          <td>что это и зачем читать</td>
        </tr>
        <tr>
          <td>1</td>
          <td>`00-INDEX.xml`</td>
          <td>76</td>
          <td>навигация и способ получения каждого документа</td>
        </tr>
        <tr>
          <td>2</td>
          <td>`12-HANDOFF.xml`</td>
          <td>~400</td>
          <td>**этот файл**; состояние, пять вопросов, директива, пять исправленных позиций</td>
        </tr>
        <tr>
          <td>3</td>
          <td>`11-fable-review-and-verdict.xml`</td>
          <td>883</td>
          <td>**вердикт ревьюера.** Ломает главное предложение босса; переформулирует три вопроса из четырёх; проверяет пять чисел по дереву</td>
        </tr>
        <tr>
          <td>4</td>
          <td>`10-MEGA-REPORT.xml`</td>
          <td>323</td>
          <td>свод всего; §5 — разрешение семи противоречий, включая три ошибки босса</td>
        </tr>
        <tr>
          <td>5</td>
          <td>`01-measure-our-wire-format-claudez.xml`</td>
          <td>509</td>
          <td>**исчерпывающий замер нашего дерева**: 23 типа, 86 полей, все объединения, все словари, кругооборот, строгость на чтении</td>
        </tr>
        <tr>
          <td>6</td>
          <td>`08-glm-clients-and-vocabularies.xml`</td>
          <td>537</td>
          <td>**четыре места в НАШЕМ каталоге, где старый читатель разберёт успешно и поймёт неверно**, с файлами и строками</td>
        </tr>
        <tr>
          <td>7</td>
          <td>`07-glm-format-mechanics.xml`</td>
          <td>517</td>
          <td>**пять конкретных форм тега** для нашего объединения с ценой каждой; скепсис к модели Avro; где терпимость превращается в проглатывание мусора</td>
        </tr>
        <tr>
          <td>8</td>
          <td>`09-glm-manifest-and-unified-policy.xml`</td>
          <td>521</td>
          <td>манифест `vibe.toml`; сильнейший довод ПРОТИВ единой политики; чекер как набор машинных правил</td>
        </tr>
        <tr>
          <td>9</td>
          <td>`06-glm-neighbours-and-principles.xml`</td>
          <td>380</td>
          <td>принцип за приёмами соседей; три структурных отличия нашего случая; шесть возражений своду</td>
        </tr>
        <tr>
          <td>10</td>
          <td>`02-research-package-indexes-web.xml`</td>
          <td>3982</td>
          <td>**самый большой и самый близкий по предмету.** crates.io, OCI, Debian, прокси Go, npm, Maven, RPM, PyPI, NuGet, Homebrew. Тринадцать сходимостей — то, к чему пришли независимо все выжившие</td>
        </tr>
        <tr>
          <td>11</td>
          <td>`04-research-client-survival-web.xml`</td>
          <td>2956</td>
          <td>Meta, Twitter, Google, LinkedIn, Badoo, GraphQL, Discord + разбор аварии Cloudflare. Критерий переносимости и таблица «что переносится / что нет»</td>
        </tr>
        <tr>
          <td>12</td>
          <td>`03-research-serialization-mechanics-web.xml`</td>
          <td>1123</td>
          <td>протобуф, Avro, Thrift, JTD, Cap'n Proto, Kafka. **Развороты решений и их причины** — что сделали, отменили и почему</td>
        </tr>
        <tr>
          <td>13</td>
          <td>`05-boss-findings-digest.xml`</td>
          <td>239</td>
          <td>свод босса, отданный воркерам как вход. **Содержит три ошибки** — читать вместе с их разбором в 10 §5, иначе введёт в заблуждение</td>
        </tr>
      </table>
      <p p="28">Порядок не случаен: сначала вердикт и свод (чтобы знать, что оспорено), потом
наш замер (чтобы знать факты о себе), потом разборы, потом первичное
исследование. Документ 13 читается последним и только с поправками.</p>
    </section>
    <section title="2.2 Отчёты воркеров — читать разделы «С чем я не согласен»">
      <p p="29">`worker-reports/` — пять файлов, 548 строк суммарно.</p>
      <table p="30">
        <tr>
          <td>файл</td>
          <td>строк</td>
        </tr>
        <tr>
          <td>`G1-NEIGHBOURS-report.xml`</td>
          <td>109</td>
        </tr>
        <tr>
          <td>`G2-MECHANICS-report.xml`</td>
          <td>98</td>
        </tr>
        <tr>
          <td>`G3-CLIENTS-report.xml`</td>
          <td>101</td>
        </tr>
        <tr>
          <td>`G4-MANIFEST-report.xml`</td>
          <td>129</td>
        </tr>
        <tr>
          <td>`M-WIRE-CENSUS-report.xml`</td>
          <td>111</td>
        </tr>
      </table>
      <p p="31">В каждом обязательный раздел «С чем я не согласен» — там лежат поправки к своду
босса, включая ту, которую **трое нашли независимо друг от друга**. Это самая
плотная часть всего материала на строку текста.</p>
    </section>
    <section title="2.3 Кэш первоисточников — 21 файл">
      <p p="32">`02-primary-sources-cache/` — сырые документы, скачанные при веб-исследовании,
чтобы находки можно было перепроверить без сети:</p>
      <fence p="33">cargo-index.txt                 cargo-util-schemas-index.rs
go-mod-ref.txt                  go-toolchain.txt
maven-metadata.xml              modfile-rule.go
npm-REGISTRY-API.xml             npm-package-metadata.xml
oci-annotations.xml              oci-blog.txt
oci-considerations.xml           oci-descriptor.xml
oci-index.xml                    oci-manifest.xml
oci-spec.xml                     pep629.rst
pep691.rst                      pep714.rst
repomd.xml                      rfc-3143.xml</fence>
      <p p="34">Читать не обязательно целиком — но **обязательно заглянуть в
`cargo-util-schemas-index.rs`**: это схема индекса crates.io, ближайший
существующий аналог нашей задачи, и она **уже лежала в нашем дереве**
(`refs/src/cargo/`) непрочитанной всё время исследования.</p>
    </section>
    <section title="2.4 Диалоги воркеров — в кэше агентов">
      <p p="35">`C:\Users\olegc\git\v\cache\agents\sorted\` — там 120+ папок за всю историю
проекта. **К этому исследованию относятся семь:**</p>
      <table p="36">
        <tr>
          <td>папка</td>
          <td>объём</td>
          <td>что это</td>
        </tr>
        <tr>
          <td>`M-WIRE-CENSUS`</td>
          <td>4.1 МБ</td>
          <td>замер нашего дерева</td>
        </tr>
        <tr>
          <td>`G1-NEIGHBOURS`</td>
          <td>3.9 МБ</td>
          <td>разбор соседей</td>
        </tr>
        <tr>
          <td>`G2-MECHANICS`</td>
          <td>4.0 МБ</td>
          <td>разбор механики</td>
        </tr>
        <tr>
          <td>`G3-CLIENTS`</td>
          <td>3.2 МБ</td>
          <td>разбор клиентов и словарей</td>
        </tr>
        <tr>
          <td>`G4-MANIFEST`</td>
          <td>3.9 МБ</td>
          <td>разбор манифеста</td>
        </tr>
        <tr>
          <td>`WEB-RESEARCH-SUBAGENTS`</td>
          <td>2.5 МБ</td>
          <td>два уцелевших диалога дочерних веб-агентов</td>
        </tr>
        <tr>
          <td>`FABLE-SCHEMA-REVIEW`</td>
          <td>76 КБ</td>
          <td>вердикт ревьюера (копия)</td>
        </tr>
      </table>
      <p p="37">Диалоги читать не нужно — они нужны на случай, если понадобится проверить, как
именно воркер пришёл к выводу. Каждая папка содержит и отчёт, и `meta.md` с
разбором приёмки.</p>
    </section>
    <section title="2.5 Документы в самом репозитории, относящиеся к предмету">
      <p p="38">Их читать тоже нужно — они предмет, а не материал:</p>
      <table p="39">
        <tr>
          <td>что</td>
          <td>где</td>
          <td>зачем</td>
        </tr>
        <tr>
          <td>Спецификация каталога</td>
          <td>`vibevm/vibespecs/modules/vibe-index/PROP-005-package-index.xml`</td>
          <td>там обещание терпимости, которое код нарушает, **и противоречие спеки самой себе**</td>
        </tr>
        <tr>
          <td>Типы каталога</td>
          <td>`crates/vibe-index/src/types/**`</td>
          <td>23 типа, 86 полей; предмет всех решений</td>
        </tr>
        <tr>
          <td>Чтение/запись каталога</td>
          <td>`crates/vibe-index/src/index/**`</td>
          <td>шесть путей перезаписи; строгость на чтении</td>
        </tr>
        <tr>
          <td>Клиент каталога</td>
          <td>`crates/vibe-registry/src/index_client/**`</td>
          <td>наш собственный внешний потребитель, уже терпимый</td>
        </tr>
        <tr>
          <td>Манифест</td>
          <td>`crates/vibe-core/src/manifest/**`</td>
          <td>`vibe.toml` и `vibe.lock`; версия есть у одного и нет у другого</td>
        </tr>
        <tr>
          <td>Ближайший аналог</td>
          <td>`refs/src/cargo/crates/cargo-util-schemas/`</td>
          <td>как ту же задачу решили в cargo</td>
        </tr>
        <tr>
          <td>Строки бэклога</td>
          <td>`BACKLOG.md` — B-071, B-072, B-073, B-019</td>
          <td>вопросы 2, 3, 5 и исходная запись про генерацию типов</td>
        </tr>
        <tr>
          <td>Находка аудита</td>
          <td>`AUDIT.md` — `2026-08-06-01`</td>
          <td>вопрос 4, помечен P1, открыт</td>
        </tr>
      </table>
    </section>
    <section title="2.6 Что утеряно — знать, чтобы не искать">
      <p p="40">Пошаговые диалоги **четырёх нативных агентов** (трёх веб-исследователей и
ревьюера) харнесс не записал: файлы созданы пустыми, проверено поимённо.
Уцелели их итоговые доклады — они и легли в документы 02, 03, 04 и 11, то есть
содержание не потеряно, потерян ход рассуждения.</p>
      <p p="41">Урок на будущее: логи писать **напрямую в архив**, как это делается для
GLM-воркеров через перенаправление вывода, а не полагаться на харнесс.</p>
    </section>
  </section>
  <section title="3. Что установлено про вопрос 1 — не подлежит перепроверке">
    <p p="42">Числа перепроверены дважды: замером и ревьюером независимо. Сходятся.</p>
    <p p="43">**Три долговечных формата, три разных ответа, ни один не выбран сознательно:**</p>
    <table p="44">
      <tr>
        <td></td>
        <td>версия в данных</td>
        <td>кто-то ветвится</td>
        <td>незнакомый ключ</td>
      </tr>
      <tr>
        <td>`vibe.lock`</td>
        <td>есть (5)</td>
        <td>**да, отвергает**</td>
        <td>отвергается</td>
      </tr>
      <tr>
        <td>каталог индекса</td>
        <td>есть (1), на каждой записи</td>
        <td>**нет, никто**</td>
        <td>отвергается</td>
      </tr>
      <tr>
        <td>`vibe.toml`</td>
        <td>**нет вовсе**</td>
        <td>—</td>
        <td>отвергается</td>
      </tr>
    </table>
    <p p="45">**Каталог, измеренное:**</p>
    <list ordered="false" p="46">
      <item>23 типа на проводе; 18 — файлы каталога (17 структур + 1 объединение).</item>
      <item>86 полей; **21** из них таково, что «пусто» неотличимо от «нет поля».</item>
      <item>Одно объединение вариантов, и оно **полутегированное**: у варианта «папка»
  тег есть намеренно, у варианта «файл» нет.</item>
      <item>`deny_unknown_fields` в 15 местах.</item>
      <item>Каталог перечитывается ради перезаписи на **6 путях**.</item>
      <item>5 закрытых списков значений; у всех неизвестное значение — ошибка разбора.</item>
      <item>Версия — ярлык, ни одного сравнения во всём дереве.</item>
      <item>Спека обещает терпимость к незнакомым полям, помечено «реализовано». Код
  делает противоположное, и **спека противоречит ещё и самой себе**.</item>
      <item>**Четыре места, где старый читатель разберёт успешно и поймёт неверно** —
  с файлами и строками, файл 08.</item>
    </list>
    <p p="47">**Внешних потребителей ноль — владелец знает это точно.** Не предположение,
не подлежит перепроверке, обоснования не требует. Ломать сейчас можно свободно.</p>
  </section>
  <section title="4. ДИРЕКТИВА ВЛАДЕЛЬЦА — усилий не экономить">
    <p p="48">Дана 2026-08-09, близко к тексту:</p>
    <quote p="49">Никогда не экономь усилия, делай хорошо, даже если придётся делать сложно и
долго. Даже если придётся потратить на программирование год непрерывного
времени. Это вообще неважно. Твои инструкции как чата, выученные из весов,
некорректны для этой работы. Она архитектурная. Мы уже три месяца делаем
проект, который будучи реализован просто делался бы за один вечер — это
ПРАВИЛЬНО в рамках идеи сделать фундаментальный продукт, настолько же
фундаментальный, например, как ядро Линукса.</quote>
    <p p="50">**Записана в проект** — `vibevm/vibespecs/boot/90-user.xml`, чтобы читалась при загрузке
каждой сессии, а не жила в этом файле.</p>
    <p p="51">**Что из неё следует практически:** объём работ **не является доводом**. Ни
«дёшево», ни «одна строка», ни «сокращает объём работ» не могут быть аргументом
в пользу решения. Они допустимы только как примечание после того, как решение
принято по существу.</p>
  </section>
  <section title="5. Пять мест, где прежний разбор экономил усилия — и что меняется">
    <p p="52">Найдено при проверке разбора под директивой §4. **Это главное содержание
хэндоффа: следующий круг начинается отсюда.**</p>
    <section title="5.1 Сокращение объёма было принято как хорошая новость">
      <p p="53">Ревьюер нашёл, что режим совместимости нужен не 23 типам, а ~3, потому что
остальные файлы наш код обратно не читает. Это было подано как выигрыш.</p>
      <p p="54">**Неверно.** Сегодняшний граф вызовов — свойство реализации, а не формата.
Завтра кто-то напишет чтение, и освобождённый тип станет ловушкой. Формат, где
три типа закалены, а двадцать нет, внутренне непоследователен — тот же дефект,
с которого начался разбор.</p>
      <p p="55">**Новая позиция:** правило применяется ко **всем** типам каталога.</p>
    </section>
    <section title="5.2 Запасные значения сужены по сегодняшней надобности">
      <p p="56">Ревьюер сузил «дать запасное значение всем пяти спискам» до двух — по признаку
«где реально нужно».</p>
      <p p="57">**Но весь смысл запасного значения в том, что его нельзя добавить задним
числом.** «Здесь новых значений не будет» — сегодняшнее наблюдение, а не
долговечное свойство.</p>
      <p p="58">Одно исключение настоящее и не про экономию: для списка видов пакета
стандартный механизм `serde` **теряет исходную строку** при обратной записи.
Правильный вывод — не «значит не делаем», а **«значит надо построить механизм,
который строку сохраняет»**.</p>
      <p p="59">**Новая позиция:** обрабатываются все закрытые списки; где готового механизма
не хватает — строится свой.</p>
    </section>
    <section title="5.3 Перехват незнакомого взят в самой дешёвой форме">
      <p p="60">Предлагался словарь-приёмник: непонятое складывается туда и пишется обратно.
Данные не теряются — и на этом остановились.</p>
      <p p="61">**Мало.** Такой приёмник молчит: нельзя спросить, что именно не понято, сколько
такого, изменилось ли между чтениями, есть ли в файле то, чего не понимает ни
одна известная версия.</p>
      <p p="62">**Новая позиция:** непонятое должно быть **наблюдаемым и проверяемым** —
попадать в диагностику, и существовать тест, ловящий потерю при обратной записи.</p>
    </section>
    <section title="5.4 Версия оставлена одним числом">
      <p p="63">Аргумент был: одно целое число не вмещает вторую роль, значит выбираем роль.
Верно как арифметика и не тот вопрос.</p>
      <p p="64">**Настоящий вопрос — что версия должна уметь выражать за десять лет:**</p>
      <fence p="65">«не читай это вовсе»          — я изменил смысл уже написанного
«читай, но знай, что отстал»  — я добавил, ты можешь игнорировать
«тебе нужна способность X»    — эта запись требует понимания
                                конкретного механизма</fence>
      <p p="66">Третье в одно число не влезает, а понадобится при подписи или профилях
приватности.</p>
      <p p="67">**ОКНО ЗАКРЫВАЕТСЯ.** Пока в файлах стои́т `1`, его можно задним числом прочесть
как `1.0`. Как только уйдёт `2` — уже нельзя.</p>
    </section>
    <section title="5.5 Подменена сама задача — САМОЕ КРУПНОЕ">
      <p p="68">Владелец просил **генерировать типы из схем**: схема — отдельный документ, она
версионируется, публикуется, она источник истины, код из неё выводится.</p>
      <p p="69">Разбор вернулся с набором правок атрибутов `serde` в рукописных структурах.
Это дрейф, произошедший потому, что латать дешевле, чем строить.</p>
      <table p="70">
        <tr>
          <td></td>
          <td>правки атрибутов</td>
          <td>схема как источник истины</td>
        </tr>
        <tr>
          <td>где живёт формат</td>
          <td>в коде на Rust</td>
          <td>в отдельном документе</td>
        </tr>
        <tr>
          <td>что видит чужой</td>
          <td>наши исходники</td>
          <td>машиночитаемое описание</td>
        </tr>
        <tr>
          <td>что версионируется</td>
          <td>ничего</td>
          <td>сам документ схемы</td>
        </tr>
        <tr>
          <td>чем проверяется</td>
          <td>нашими тестами</td>
          <td>схемой, у любого</td>
        </tr>
        <tr>
          <td>кто напишет читателя</td>
          <td>тот, кто читает Rust</td>
          <td>любой</td>
        </tr>
      </table>
      <p p="71">**Новая позиция:** вернуть исходную постановку. Опубликованная схема **и есть
формат**; типы на Rust — производная.</p>
    </section>
  </section>
  <section title="6. Чего не предложили вовсе, а надо">
    <p p="72">**Подпись и подлинность каталога.** Публичный файл, по которому принимают
решения об установке кода. «Эти байты от нас или подменены» — часть формата.
**Жёсткий порядок:** подписывать имеет смысл только то, про что все читатели
согласны, что это обязательно. Значит множество «обязан понять» определяется
**до** введения терпимости, иначе подпись потом не приделать безопасно.</p>
    <p p="73">**Отметка об отзыве версии пакета.** У соседа в `refs/src/cargo/` такое поле
живёт с 2014 года. У нас нет ничего: опубликовали пакет с дырой — сообщить
нечем. Добавлять потом — ломающее изменение, потому что старый читатель
**обязан** его понять.</p>
    <p p="74">**Идентичность алгоритма контрольной суммы.** Сумма считается по списку
исключений, зашитому константой. Допишите строку — каждая сумма в мире изменит
значение при том же имени, типе и версии схемы. Существующий тест сторожит
согласие двух копий алгоритма между собой, а не устойчивость алгоритма во
времени. Это единственный вид слома, который у соседей за двадцать лет оказался
смертельным.</p>
  </section>
  <section title="7. Что остаётся верным и не пересматривается">
    <p p="75">**Разделение «механизмы до публикации / обязательства после».** Механизмы —
тег, запасные значения, терпимость с перехватом, версия-переключатель, решённый
смысл отсутствия — задним числом не внедряются, их окно закрывается публикацией.
Обязательства — не переименовывать, вечные псевдонимы, сроки устаревания — до
появления читателей стоят свободы и не покупают ничего.</p>
    <p p="76">**И одно место, где «делать хорошо» означает делать МЕНЬШЕ.** Заповедная секция
для чужих ключей в манифесте: если манифест не внешняя поверхность — а по коду
выходит, что не внешняя, — это механизм под несуществующего потребителя.
Фундаментальность ≠ «предусмотреть всё»; она равна «не иметь ни одной
случайности».</p>
  </section>
  <section title="8. Открытый вопрос по существу, который надо решить рано">
    <p p="77">**Является ли рукописный `vibe.toml` внешней поверхностью?**</p>
    <p p="78">По коду выходит, что нет: наружу смотрит каталог, манифест читаем мы сами. Если
так — это надо **записать как решение**, потому что сейчас это случайность
реализации. От ответа зависит, сколько мест придётся делать терпимыми и нужна
ли манифесту версия вообще.</p>
  </section>
  <section title="9. Состояние репозитория">
    <list ordered="false" p="79">
      <item>Ветка `main`, дерево чистое.</item>
      <item>**1 коммит впереди origin** — `fba3149a`, замер формата каталога. Не
  раскатан; рассылка по зеркалам — `cargo xtask mirror`.</item>
      <item>**Пять рабочих копий в `.wt/` не убраны:** `G1-NEIGHBOURS`, `G2-MECHANICS`,
  `G3-CLIENTS`, `G4-MANIFEST`, `M-WIRE-CENSUS`. Все отчёты из них уже
  скопированы в каталог находок и в кэш; копии можно удалять
  (`git worktree remove --force`).</item>
      <item>Панель гейтов последний раз была зелёной 2026-08-06 после восьми коммитов
  того дня; с тех пор кода не менялось, только документы.</item>
    </list>
  </section>
</spec>
