# ХЭНДОФФ — состояние на 2026-08-09

[p01] _Написан по указанию владельца для передачи в новую сессию. Читать целиком
прежде, чем что-либо делать._

## 0. Самое главное в трёх строках

1. [p02] Из **пяти** вопросов, стоящих перед владельцем, разобран **один** — формат
   каталога пакетов. До дизайна **не дошли**: есть исследование, разбор и
   вердикт ревьюера, но нет решения.
2. Владелец дал **директиву, меняющую способ работы**: усилий не экономить.
   Она записана в проект, см. §4.
3. Под этой директивой прежний разбор **надо переделать** — он писался под
   неявным «выбери достаточное». Что именно менять — §5.

## 1. Пять вопросов владельца — полный список

[p03] Ни один нельзя терять. Первый разобран, остальные ждут.

### Вопрос 1 — формат каталога пакетов ⚙️ РАЗОБРАН, НЕ РЕШЁН

[p04] **Суть.** vibevm публикует каталог пакетов — JSON-файлы в git-репозитории,
которые читают чужие программы. Владелец решил описывать формат схемами и
генерировать код из них. Замер перед постройкой нашёл, что цена другая, чем
предполагалось.

[p05] **Как вопрос вырос.** Начали с узкого: где провести границу генерации, раз одна
форма в языке схем невыразима. Пришли к широкому: **какова политика эволюции
долговечных форматов vibevm** — их три (каталог, `vibe.toml`, `vibe.lock`),
решены они по-разному, и никто этого не решал.

[p06] **Состояние:** исследование сделано (файлы 01–09), сведено (10), отревьюено
(11). Решения нет. Позиции скорректированы, см. §5.

### Вопрос 2 — недетерминированная запись каталога 🔁 ВСПЛЫЛ СНОВА

[p07] **Суть.** При каждой записи в каталог проставляется текущее время, поэтому две
одинаковые по смыслу записи дают разные байты. Следствие: автопубликация
коммитит изменение даже когда ничего не изменилось, история каталога забивается
пустыми коммитами.

[p08] **Что добавилось.** Ревьюер нашёл это независимо, уже как **дефект
воспроизводимости**, и отметил, что **рядом, в том же коде, сжатие сделано
намеренно детерминированным** — то есть о воспроизводимости кто-то заботился в
одном месте и не заметил, что она сломана в соседнем.

[p09] **Следствие:** вопрос перестал быть отдельным. Он **часть вопроса 1** — решать
надо вместе с форматом.

[p10] Строка: `BACKLOG.md` B-072.

### Вопрос 3 — сервер каталога не пишет логи ⬜ НЕ ТРОНУТ

[p11] **Суть.** Сервер смонтировал слой логирования HTTP-запросов и не поставил
слушателя: события формируются и выбрасываются. У оператора нет ни строчки лога,
хотя код выглядит так, будто есть. Слушатель появляется только когда включён
флаг самопубликации — связь случайная.

[p12] **Что решать:** ставить ли слушателя всегда и на каком уровне по умолчанию.
Это меняет то, что видит **каждый** оператор в потоке ошибок.

[p13] **Половина, не требующая решения:** докблок одного файла обещает, что
пропущенные репозитории пишутся в предупреждения, а вызова там нет. Починка
шапки решения не требует.

[p14] Строка: `BACKLOG.md` B-071.

### Вопрос 4 — планка доказательства ⬜ НЕ ТРОНУТ

[p15] **Суть.** Треть вердиктов корпуса не имеет собственного доказательства: один
абзац проставлен сразу многим утверждениям. Такой вердикт **нельзя опровергнуть
по отдельности** — если одно из утверждений ложно, абзац про остальные всё ещё
выглядит правдой.

[p16] Доказано дважды на практике: из 34 пересуждённых утверждений **два оказались
ложными**, стоя с галочкой «проверено».

[p17] **Что решать:** ужесточать ли планку сразу (тогда ~4100 галочек разом станут «не
проверено» — выглядит как обвал, им не являясь), или конвертировать намеренными
партиями по мере правок.

[p18] Запись: `AUDIT.md`, находка `2026-08-06-01`, помечена P1, открыта.

### Вопрос 5 — соединение двух движков ⬜ НЕ ТРОНУТ, нужен «да»

[p19] **Суть.** Есть два независимых инструмента: один проверяет качество кода, другой
строит карту связей «код ↔ спека». Владелец решил, что данные каждый держит при
себе, а соединяются они в момент запроса — по файлу и строке, без зависимости
одного от другого.

[p20] Осталась одна честно названная слабость: карта строится заново на каждый запрос,
а отчёт о качестве — файл на диске, свежий настолько, насколько недавно его
прогоняли.

[p21] **Нужно только подтверждение:** ответ, содержащий находки о качестве, называет,
**когда** они получены, а отсутствие отчёта означает «не измерено», а не
«нарушений нет».

[p22] Строка: `BACKLOG.md` B-019, часть (в).

## 2. ВСЕ материалы. Читать ДО первого разговора с владельцем

[p23] **Указание владельца, 2026-08-09:** прочитать все перечисленные ниже документы
**прежде**, чем говорить с ним дальше. Не выборочно, не по диагонали, не «по
мере надобности». Сначала прочитать — потом разговаривать.

[p24] Общий объём обязательного чтения: **12 документов, ~12 400 строк, 900 КБ.**
Это много и так и задумано: три круга исследования стоили больше, чем их
прочтение.

### 2.1 Обязательное чтение — каталог находок, в этом порядке

[p25] Каталог лежит **ВНЕ репозитория vibevm**:
`C:\Users\olegc\git\v\discovery\vibevm-schema-evolution-discovery\`

[p26] Загрузочная последовательность проекта его не находит — указатель оставлен в
`CONTINUE.md`.

[p27]
| # | файл | строк | что это и зачем читать |
| --- | --- | --- | --- |
| 1 | `00-INDEX.xml` | 76 | навигация и способ получения каждого документа |
| 2 | `12-HANDOFF.xml` | ~400 | **этот файл**; состояние, пять вопросов, директива, пять исправленных позиций |
| 3 | `11-fable-review-and-verdict.xml` | 883 | **вердикт ревьюера.** Ломает главное предложение босса; переформулирует три вопроса из четырёх; проверяет пять чисел по дереву |
| 4 | `10-MEGA-REPORT.xml` | 323 | свод всего; §5 — разрешение семи противоречий, включая три ошибки босса |
| 5 | `01-measure-our-wire-format-claudez.xml` | 509 | **исчерпывающий замер нашего дерева**: 23 типа, 86 полей, все объединения, все словари, кругооборот, строгость на чтении |
| 6 | `08-glm-clients-and-vocabularies.xml` | 537 | **четыре места в НАШЕМ каталоге, где старый читатель разберёт успешно и поймёт неверно**, с файлами и строками |
| 7 | `07-glm-format-mechanics.xml` | 517 | **пять конкретных форм тега** для нашего объединения с ценой каждой; скепсис к модели Avro; где терпимость превращается в проглатывание мусора |
| 8 | `09-glm-manifest-and-unified-policy.xml` | 521 | манифест `vibe.toml`; сильнейший довод ПРОТИВ единой политики; чекер как набор машинных правил |
| 9 | `06-glm-neighbours-and-principles.xml` | 380 | принцип за приёмами соседей; три структурных отличия нашего случая; шесть возражений своду |
| 10 | `02-research-package-indexes-web.xml` | 3982 | **самый большой и самый близкий по предмету.** crates.io, OCI, Debian, прокси Go, npm, Maven, RPM, PyPI, NuGet, Homebrew. Тринадцать сходимостей — то, к чему пришли независимо все выжившие |
| 11 | `04-research-client-survival-web.xml` | 2956 | Meta, Twitter, Google, LinkedIn, Badoo, GraphQL, Discord + разбор аварии Cloudflare. Критерий переносимости и таблица «что переносится / что нет» |
| 12 | `03-research-serialization-mechanics-web.xml` | 1123 | протобуф, Avro, Thrift, JTD, Cap'n Proto, Kafka. **Развороты решений и их причины** — что сделали, отменили и почему |
| 13 | `05-boss-findings-digest.xml` | 239 | свод босса, отданный воркерам как вход. **Содержит три ошибки** — читать вместе с их разбором в 10 §5, иначе введёт в заблуждение |

[p28] Порядок не случаен: сначала вердикт и свод (чтобы знать, что оспорено), потом
наш замер (чтобы знать факты о себе), потом разборы, потом первичное
исследование. Документ 13 читается последним и только с поправками.

### 2.2 Отчёты воркеров — читать разделы «С чем я не согласен»

[p29] `worker-reports/` — пять файлов, 548 строк суммарно.

[p30]
| файл | строк |
| --- | --- |
| `G1-NEIGHBOURS-report.xml` | 109 |
| `G2-MECHANICS-report.xml` | 98 |
| `G3-CLIENTS-report.xml` | 101 |
| `G4-MANIFEST-report.xml` | 129 |
| `M-WIRE-CENSUS-report.xml` | 111 |

[p31] В каждом обязательный раздел «С чем я не согласен» — там лежат поправки к своду
босса, включая ту, которую **трое нашли независимо друг от друга**. Это самая
плотная часть всего материала на строку текста.

### 2.3 Кэш первоисточников — 21 файл

[p32] `02-primary-sources-cache/` — сырые документы, скачанные при веб-исследовании,
чтобы находки можно было перепроверить без сети:

[p33]
```
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
```

[p34] Читать не обязательно целиком — но **обязательно заглянуть в
`cargo-util-schemas-index.rs`**: это схема индекса crates.io, ближайший
существующий аналог нашей задачи, и она **уже лежала в нашем дереве**
(`refs/src/cargo/`) непрочитанной всё время исследования.

### 2.4 Диалоги воркеров — в кэше агентов

[p35] `C:\Users\olegc\git\v\cache\agents\sorted\` — там 120+ папок за всю историю
проекта. **К этому исследованию относятся семь:**

[p36]
| папка | объём | что это |
| --- | --- | --- |
| `M-WIRE-CENSUS` | 4.1 МБ | замер нашего дерева |
| `G1-NEIGHBOURS` | 3.9 МБ | разбор соседей |
| `G2-MECHANICS` | 4.0 МБ | разбор механики |
| `G3-CLIENTS` | 3.2 МБ | разбор клиентов и словарей |
| `G4-MANIFEST` | 3.9 МБ | разбор манифеста |
| `WEB-RESEARCH-SUBAGENTS` | 2.5 МБ | два уцелевших диалога дочерних веб-агентов |
| `FABLE-SCHEMA-REVIEW` | 76 КБ | вердикт ревьюера (копия) |

[p37] Диалоги читать не нужно — они нужны на случай, если понадобится проверить, как
именно воркер пришёл к выводу. Каждая папка содержит и отчёт, и `meta.md` с
разбором приёмки.

### 2.5 Документы в самом репозитории, относящиеся к предмету

[p38] Их читать тоже нужно — они предмет, а не материал:

[p39]
| что | где | зачем |
| --- | --- | --- |
| Спецификация каталога | `vibevm/vibespecs/modules/vibe-index/PROP-005-package-index.xml` | там обещание терпимости, которое код нарушает, **и противоречие спеки самой себе** |
| Типы каталога | `crates/vibe-index/src/types/**` | 23 типа, 86 полей; предмет всех решений |
| Чтение/запись каталога | `crates/vibe-index/src/index/**` | шесть путей перезаписи; строгость на чтении |
| Клиент каталога | `crates/vibe-registry/src/index_client/**` | наш собственный внешний потребитель, уже терпимый |
| Манифест | `crates/vibe-core/src/manifest/**` | `vibe.toml` и `vibe.lock`; версия есть у одного и нет у другого |
| Ближайший аналог | `refs/src/cargo/crates/cargo-util-schemas/` | как ту же задачу решили в cargo |
| Строки бэклога | `BACKLOG.md` — B-071, B-072, B-073, B-019 | вопросы 2, 3, 5 и исходная запись про генерацию типов |
| Находка аудита | `AUDIT.md` — `2026-08-06-01` | вопрос 4, помечен P1, открыт |

### 2.6 Что утеряно — знать, чтобы не искать

[p40] Пошаговые диалоги **четырёх нативных агентов** (трёх веб-исследователей и
ревьюера) харнесс не записал: файлы созданы пустыми, проверено поимённо.
Уцелели их итоговые доклады — они и легли в документы 02, 03, 04 и 11, то есть
содержание не потеряно, потерян ход рассуждения.

[p41] Урок на будущее: логи писать **напрямую в архив**, как это делается для
GLM-воркеров через перенаправление вывода, а не полагаться на харнесс.

## 3. Что установлено про вопрос 1 — не подлежит перепроверке

[p42] Числа перепроверены дважды: замером и ревьюером независимо. Сходятся.

[p43] **Три долговечных формата, три разных ответа, ни один не выбран сознательно:**

[p44]
|  | версия в данных | кто-то ветвится | незнакомый ключ |
| --- | --- | --- | --- |
| `vibe.lock` | есть (5) | **да, отвергает** | отвергается |
| каталог индекса | есть (1), на каждой записи | **нет, никто** | отвергается |
| `vibe.toml` | **нет вовсе** | — | отвергается |

[p45] **Каталог, измеренное:**

- [p46] 23 типа на проводе; 18 — файлы каталога (17 структур + 1 объединение).
- 86 полей; **21** из них таково, что «пусто» неотличимо от «нет поля».
- Одно объединение вариантов, и оно **полутегированное**: у варианта «папка»
  тег есть намеренно, у варианта «файл» нет.
- `deny_unknown_fields` в 15 местах.
- Каталог перечитывается ради перезаписи на **6 путях**.
- 5 закрытых списков значений; у всех неизвестное значение — ошибка разбора.
- Версия — ярлык, ни одного сравнения во всём дереве.
- Спека обещает терпимость к незнакомым полям, помечено «реализовано». Код
  делает противоположное, и **спека противоречит ещё и самой себе**.
- **Четыре места, где старый читатель разберёт успешно и поймёт неверно** —
  с файлами и строками, файл 08.

[p47] **Внешних потребителей ноль — владелец знает это точно.** Не предположение,
не подлежит перепроверке, обоснования не требует. Ломать сейчас можно свободно.

## 4. ДИРЕКТИВА ВЛАДЕЛЬЦА — усилий не экономить

[p48] Дана 2026-08-09, близко к тексту:

> [p49] Никогда не экономь усилия, делай хорошо, даже если придётся делать сложно и
> долго. Даже если придётся потратить на программирование год непрерывного
> времени. Это вообще неважно. Твои инструкции как чата, выученные из весов,
> некорректны для этой работы. Она архитектурная. Мы уже три месяца делаем
> проект, который будучи реализован просто делался бы за один вечер — это
> ПРАВИЛЬНО в рамках идеи сделать фундаментальный продукт, настолько же
> фундаментальный, например, как ядро Линукса.

[p50] **Записана в проект** — `vibevm/vibespecs/boot/90-user.xml`, чтобы читалась при загрузке
каждой сессии, а не жила в этом файле.

[p51] **Что из неё следует практически:** объём работ **не является доводом**. Ни
«дёшево», ни «одна строка», ни «сокращает объём работ» не могут быть аргументом
в пользу решения. Они допустимы только как примечание после того, как решение
принято по существу.

## 5. Пять мест, где прежний разбор экономил усилия — и что меняется

[p52] Найдено при проверке разбора под директивой §4. **Это главное содержание
хэндоффа: следующий круг начинается отсюда.**

### 5.1 Сокращение объёма было принято как хорошая новость

[p53] Ревьюер нашёл, что режим совместимости нужен не 23 типам, а ~3, потому что
остальные файлы наш код обратно не читает. Это было подано как выигрыш.

[p54] **Неверно.** Сегодняшний граф вызовов — свойство реализации, а не формата.
Завтра кто-то напишет чтение, и освобождённый тип станет ловушкой. Формат, где
три типа закалены, а двадцать нет, внутренне непоследователен — тот же дефект,
с которого начался разбор.

[p55] **Новая позиция:** правило применяется ко **всем** типам каталога.

### 5.2 Запасные значения сужены по сегодняшней надобности

[p56] Ревьюер сузил «дать запасное значение всем пяти спискам» до двух — по признаку
«где реально нужно».

[p57] **Но весь смысл запасного значения в том, что его нельзя добавить задним
числом.** «Здесь новых значений не будет» — сегодняшнее наблюдение, а не
долговечное свойство.

[p58] Одно исключение настоящее и не про экономию: для списка видов пакета
стандартный механизм `serde` **теряет исходную строку** при обратной записи.
Правильный вывод — не «значит не делаем», а **«значит надо построить механизм,
который строку сохраняет»**.

[p59] **Новая позиция:** обрабатываются все закрытые списки; где готового механизма
не хватает — строится свой.

### 5.3 Перехват незнакомого взят в самой дешёвой форме

[p60] Предлагался словарь-приёмник: непонятое складывается туда и пишется обратно.
Данные не теряются — и на этом остановились.

[p61] **Мало.** Такой приёмник молчит: нельзя спросить, что именно не понято, сколько
такого, изменилось ли между чтениями, есть ли в файле то, чего не понимает ни
одна известная версия.

[p62] **Новая позиция:** непонятое должно быть **наблюдаемым и проверяемым** —
попадать в диагностику, и существовать тест, ловящий потерю при обратной записи.

### 5.4 Версия оставлена одним числом

[p63] Аргумент был: одно целое число не вмещает вторую роль, значит выбираем роль.
Верно как арифметика и не тот вопрос.

[p64] **Настоящий вопрос — что версия должна уметь выражать за десять лет:**

[p65]
```
«не читай это вовсе»          — я изменил смысл уже написанного
«читай, но знай, что отстал»  — я добавил, ты можешь игнорировать
«тебе нужна способность X»    — эта запись требует понимания
                                конкретного механизма
```

[p66] Третье в одно число не влезает, а понадобится при подписи или профилях
приватности.

[p67] **ОКНО ЗАКРЫВАЕТСЯ.** Пока в файлах стои́т `1`, его можно задним числом прочесть
как `1.0`. Как только уйдёт `2` — уже нельзя.

### 5.5 Подменена сама задача — САМОЕ КРУПНОЕ

[p68] Владелец просил **генерировать типы из схем**: схема — отдельный документ, она
версионируется, публикуется, она источник истины, код из неё выводится.

[p69] Разбор вернулся с набором правок атрибутов `serde` в рукописных структурах.
Это дрейф, произошедший потому, что латать дешевле, чем строить.

[p70]
|  | правки атрибутов | схема как источник истины |
| --- | --- | --- |
| где живёт формат | в коде на Rust | в отдельном документе |
| что видит чужой | наши исходники | машиночитаемое описание |
| что версионируется | ничего | сам документ схемы |
| чем проверяется | нашими тестами | схемой, у любого |
| кто напишет читателя | тот, кто читает Rust | любой |

[p71] **Новая позиция:** вернуть исходную постановку. Опубликованная схема **и есть
формат**; типы на Rust — производная.

## 6. Чего не предложили вовсе, а надо

[p72] **Подпись и подлинность каталога.** Публичный файл, по которому принимают
решения об установке кода. «Эти байты от нас или подменены» — часть формата.
**Жёсткий порядок:** подписывать имеет смысл только то, про что все читатели
согласны, что это обязательно. Значит множество «обязан понять» определяется
**до** введения терпимости, иначе подпись потом не приделать безопасно.

[p73] **Отметка об отзыве версии пакета.** У соседа в `refs/src/cargo/` такое поле
живёт с 2014 года. У нас нет ничего: опубликовали пакет с дырой — сообщить
нечем. Добавлять потом — ломающее изменение, потому что старый читатель
**обязан** его понять.

[p74] **Идентичность алгоритма контрольной суммы.** Сумма считается по списку
исключений, зашитому константой. Допишите строку — каждая сумма в мире изменит
значение при том же имени, типе и версии схемы. Существующий тест сторожит
согласие двух копий алгоритма между собой, а не устойчивость алгоритма во
времени. Это единственный вид слома, который у соседей за двадцать лет оказался
смертельным.

## 7. Что остаётся верным и не пересматривается

[p75] **Разделение «механизмы до публикации / обязательства после».** Механизмы —
тег, запасные значения, терпимость с перехватом, версия-переключатель, решённый
смысл отсутствия — задним числом не внедряются, их окно закрывается публикацией.
Обязательства — не переименовывать, вечные псевдонимы, сроки устаревания — до
появления читателей стоят свободы и не покупают ничего.

[p76] **И одно место, где «делать хорошо» означает делать МЕНЬШЕ.** Заповедная секция
для чужих ключей в манифесте: если манифест не внешняя поверхность — а по коду
выходит, что не внешняя, — это механизм под несуществующего потребителя.
Фундаментальность ≠ «предусмотреть всё»; она равна «не иметь ни одной
случайности».

## 8. Открытый вопрос по существу, который надо решить рано

[p77] **Является ли рукописный `vibe.toml` внешней поверхностью?**

[p78] По коду выходит, что нет: наружу смотрит каталог, манифест читаем мы сами. Если
так — это надо **записать как решение**, потому что сейчас это случайность
реализации. От ответа зависит, сколько мест придётся делать терпимыми и нужна
ли манифесту версия вообще.

## 9. Состояние репозитория

- [p79] Ветка `main`, дерево чистое.
- **1 коммит впереди origin** — `fba3149a`, замер формата каталога. Не
  раскатан; рассылка по зеркалам — `cargo xtask mirror`.
- **Пять рабочих копий в `.wt/` не убраны:** `G1-NEIGHBOURS`, `G2-MECHANICS`,
  `G3-CLIENTS`, `G4-MANIFEST`, `M-WIRE-CENSUS`. Все отчёты из них уже
  скопированы в каталог находок и в кэш; копии можно удалять
  (`git worktree remove --force`).
- Панель гейтов последний раз была зелёной 2026-08-06 после восьми коммитов
  того дня; с тех пор кода не менялось, только документы.

