ХЭНДОФФ — состояние на 2026-08-09
01Написан по указанию владельца для передачи в новую сессию. Читать целиком прежде, чем что-либо делать.
0. Самое главное в трёх строках
- 02Из пяти вопросов, стоящих перед владельцем, разобран один — формат каталога пакетов. До дизайна не дошли: есть исследование, разбор и вердикт ревьюера, но нет решения.
- Владелец дал директиву, меняющую способ работы: усилий не экономить. Она записана в проект, см. §4.
- Под этой директивой прежний разбор надо переделать — он писался под неявным «выбери достаточное». Что именно менять — §5.
1. Пять вопросов владельца — полный список
03Ни один нельзя терять. Первый разобран, остальные ждут.
Вопрос 1 — формат каталога пакетов ⚙️ РАЗОБРАН, НЕ РЕШЁН
04Суть. vibevm публикует каталог пакетов — JSON-файлы в git-репозитории, которые читают чужие программы. Владелец решил описывать формат схемами и генерировать код из них. Замер перед постройкой нашёл, что цена другая, чем предполагалось.
05Как вопрос вырос. Начали с узкого: где провести границу генерации, раз одна
форма в языке схем невыразима. Пришли к широкому: какова политика эволюции
долговечных форматов vibevm — их три (каталог, vibe.toml, vibe.lock),
решены они по-разному, и никто этого не решал.
06Состояние: исследование сделано (файлы 01–09), сведено (10), отревьюено (11). Решения нет. Позиции скорректированы, см. §5.
Вопрос 2 — недетерминированная запись каталога 🔁 ВСПЛЫЛ СНОВА
07Суть. При каждой записи в каталог проставляется текущее время, поэтому две одинаковые по смыслу записи дают разные байты. Следствие: автопубликация коммитит изменение даже когда ничего не изменилось, история каталога забивается пустыми коммитами.
08Что добавилось. Ревьюер нашёл это независимо, уже как дефект воспроизводимости, и отметил, что рядом, в том же коде, сжатие сделано намеренно детерминированным — то есть о воспроизводимости кто-то заботился в одном месте и не заметил, что она сломана в соседнем.
09Следствие: вопрос перестал быть отдельным. Он часть вопроса 1 — решать надо вместе с форматом.
10Строка: BACKLOG.md B-072.
Вопрос 3 — сервер каталога не пишет логи ⬜ НЕ ТРОНУТ
11Суть. Сервер смонтировал слой логирования HTTP-запросов и не поставил слушателя: события формируются и выбрасываются. У оператора нет ни строчки лога, хотя код выглядит так, будто есть. Слушатель появляется только когда включён флаг самопубликации — связь случайная.
12Что решать: ставить ли слушателя всегда и на каком уровне по умолчанию. Это меняет то, что видит каждый оператор в потоке ошибок.
13Половина, не требующая решения: докблок одного файла обещает, что пропущенные репозитории пишутся в предупреждения, а вызова там нет. Починка шапки решения не требует.
14Строка: BACKLOG.md B-071.
Вопрос 4 — планка доказательства ⬜ НЕ ТРОНУТ
15Суть. Треть вердиктов корпуса не имеет собственного доказательства: один абзац проставлен сразу многим утверждениям. Такой вердикт нельзя опровергнуть по отдельности — если одно из утверждений ложно, абзац про остальные всё ещё выглядит правдой.
16Доказано дважды на практике: из 34 пересуждённых утверждений два оказались ложными, стоя с галочкой «проверено».
17Что решать: ужесточать ли планку сразу (тогда ~4100 галочек разом станут «не проверено» — выглядит как обвал, им не являясь), или конвертировать намеренными партиями по мере правок.
18Запись: AUDIT.md, находка 2026-08-06-01, помечена P1, открыта.
Вопрос 5 — соединение двух движков ⬜ НЕ ТРОНУТ, нужен «да»
19Суть. Есть два независимых инструмента: один проверяет качество кода, другой строит карту связей «код ↔ спека». Владелец решил, что данные каждый держит при себе, а соединяются они в момент запроса — по файлу и строке, без зависимости одного от другого.
20Осталась одна честно названная слабость: карта строится заново на каждый запрос, а отчёт о качестве — файл на диске, свежий настолько, насколько недавно его прогоняли.
21Нужно только подтверждение: ответ, содержащий находки о качестве, называет, когда они получены, а отсутствие отчёта означает «не измерено», а не «нарушений нет».
22Строка: BACKLOG.md B-019, часть (в).
2. ВСЕ материалы. Читать ДО первого разговора с владельцем
23Указание владельца, 2026-08-09: прочитать все перечисленные ниже документы прежде, чем говорить с ним дальше. Не выборочно, не по диагонали, не «по мере надобности». Сначала прочитать — потом разговаривать.
24Общий объём обязательного чтения: 12 документов, ~12 400 строк, 900 КБ. Это много и так и задумано: три круга исследования стоили больше, чем их прочтение.
2.1 Обязательное чтение — каталог находок, в этом порядке
25Каталог лежит ВНЕ репозитория vibevm:
C:\Users\olegc\git\v\discovery\vibevm-schema-evolution-discovery\
26Загрузочная последовательность проекта его не находит — указатель оставлен в
CONTINUE.md.
| # | файл | строк | что это и зачем читать |
|---|---|---|---|
| 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, иначе введёт в заблуждение |
28Порядок не случаен: сначала вердикт и свод (чтобы знать, что оспорено), потом наш замер (чтобы знать факты о себе), потом разборы, потом первичное исследование. Документ 13 читается последним и только с поправками.
2.2 Отчёты воркеров — читать разделы «С чем я не согласен»
29worker-reports/ — пять файлов, 548 строк суммарно.
| файл | строк |
|---|---|
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 |
31В каждом обязательный раздел «С чем я не согласен» — там лежат поправки к своду босса, включая ту, которую трое нашли независимо друг от друга. Это самая плотная часть всего материала на строку текста.
2.3 Кэш первоисточников — 21 файл
3202-primary-sources-cache/ — сырые документы, скачанные при веб-исследовании,
чтобы находки можно было перепроверить без сети:
33cargo-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
34Читать не обязательно целиком — но обязательно заглянуть в
cargo-util-schemas-index.rs: это схема индекса crates.io, ближайший
существующий аналог нашей задачи, и она уже лежала в нашем дереве
(refs/src/cargo/) непрочитанной всё время исследования.
2.4 Диалоги воркеров — в кэше агентов
35C:\Users\olegc\git\v\cache\agents\sorted\ — там 120+ папок за всю историю
проекта. К этому исследованию относятся семь:
| папка | объём | что это |
|---|---|---|
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 КБ | вердикт ревьюера (копия) |
37Диалоги читать не нужно — они нужны на случай, если понадобится проверить, как
именно воркер пришёл к выводу. Каждая папка содержит и отчёт, и meta.md с
разбором приёмки.
2.5 Документы в самом репозитории, относящиеся к предмету
38Их читать тоже нужно — они предмет, а не материал:
| что | где | зачем |
|---|---|---|
| Спецификация каталога | 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 Что утеряно — знать, чтобы не искать
40Пошаговые диалоги четырёх нативных агентов (трёх веб-исследователей и ревьюера) харнесс не записал: файлы созданы пустыми, проверено поимённо. Уцелели их итоговые доклады — они и легли в документы 02, 03, 04 и 11, то есть содержание не потеряно, потерян ход рассуждения.
41Урок на будущее: логи писать напрямую в архив, как это делается для GLM-воркеров через перенаправление вывода, а не полагаться на харнесс.
3. Что установлено про вопрос 1 — не подлежит перепроверке
42Числа перепроверены дважды: замером и ревьюером независимо. Сходятся.
43Три долговечных формата, три разных ответа, ни один не выбран сознательно:
| версия в данных | кто-то ветвится | незнакомый ключ | |
|---|---|---|---|
vibe.lock |
есть (5) | да, отвергает | отвергается |
| каталог индекса | есть (1), на каждой записи | нет, никто | отвергается |
vibe.toml |
нет вовсе | — | отвергается |
45Каталог, измеренное:
- 4623 типа на проводе; 18 — файлы каталога (17 структур + 1 объединение).
- 86 полей; 21 из них таково, что «пусто» неотличимо от «нет поля».
- Одно объединение вариантов, и оно полутегированное: у варианта «папка» тег есть намеренно, у варианта «файл» нет.
deny_unknown_fieldsв 15 местах.- Каталог перечитывается ради перезаписи на 6 путях.
- 5 закрытых списков значений; у всех неизвестное значение — ошибка разбора.
- Версия — ярлык, ни одного сравнения во всём дереве.
- Спека обещает терпимость к незнакомым полям, помечено «реализовано». Код делает противоположное, и спека противоречит ещё и самой себе.
- Четыре места, где старый читатель разберёт успешно и поймёт неверно — с файлами и строками, файл 08.
47Внешних потребителей ноль — владелец знает это точно. Не предположение, не подлежит перепроверке, обоснования не требует. Ломать сейчас можно свободно.
4. ДИРЕКТИВА ВЛАДЕЛЬЦА — усилий не экономить
48Дана 2026-08-09, близко к тексту:
49Никогда не экономь усилия, делай хорошо, даже если придётся делать сложно и долго. Даже если придётся потратить на программирование год непрерывного времени. Это вообще неважно. Твои инструкции как чата, выученные из весов, некорректны для этой работы. Она архитектурная. Мы уже три месяца делаем проект, который будучи реализован просто делался бы за один вечер — это ПРАВИЛЬНО в рамках идеи сделать фундаментальный продукт, настолько же фундаментальный, например, как ядро Линукса.
50Записана в проект — vibevm/vibespecs/boot/90-user.xml, чтобы читалась при загрузке
каждой сессии, а не жила в этом файле.
51Что из неё следует практически: объём работ не является доводом. Ни «дёшево», ни «одна строка», ни «сокращает объём работ» не могут быть аргументом в пользу решения. Они допустимы только как примечание после того, как решение принято по существу.
5. Пять мест, где прежний разбор экономил усилия — и что меняется
52Найдено при проверке разбора под директивой §4. Это главное содержание хэндоффа: следующий круг начинается отсюда.
5.1 Сокращение объёма было принято как хорошая новость
53Ревьюер нашёл, что режим совместимости нужен не 23 типам, а ~3, потому что остальные файлы наш код обратно не читает. Это было подано как выигрыш.
54Неверно. Сегодняшний граф вызовов — свойство реализации, а не формата. Завтра кто-то напишет чтение, и освобождённый тип станет ловушкой. Формат, где три типа закалены, а двадцать нет, внутренне непоследователен — тот же дефект, с которого начался разбор.
55Новая позиция: правило применяется ко всем типам каталога.
5.2 Запасные значения сужены по сегодняшней надобности
56Ревьюер сузил «дать запасное значение всем пяти спискам» до двух — по признаку «где реально нужно».
57Но весь смысл запасного значения в том, что его нельзя добавить задним числом. «Здесь новых значений не будет» — сегодняшнее наблюдение, а не долговечное свойство.
58Одно исключение настоящее и не про экономию: для списка видов пакета
стандартный механизм serde теряет исходную строку при обратной записи.
Правильный вывод — не «значит не делаем», а «значит надо построить механизм,
который строку сохраняет».
59Новая позиция: обрабатываются все закрытые списки; где готового механизма не хватает — строится свой.
5.3 Перехват незнакомого взят в самой дешёвой форме
60Предлагался словарь-приёмник: непонятое складывается туда и пишется обратно. Данные не теряются — и на этом остановились.
61Мало. Такой приёмник молчит: нельзя спросить, что именно не понято, сколько такого, изменилось ли между чтениями, есть ли в файле то, чего не понимает ни одна известная версия.
62Новая позиция: непонятое должно быть наблюдаемым и проверяемым — попадать в диагностику, и существовать тест, ловящий потерю при обратной записи.
5.4 Версия оставлена одним числом
63Аргумент был: одно целое число не вмещает вторую роль, значит выбираем роль. Верно как арифметика и не тот вопрос.
64Настоящий вопрос — что версия должна уметь выражать за десять лет:
65«не читай это вовсе» — я изменил смысл уже написанного
«читай, но знай, что отстал» — я добавил, ты можешь игнорировать
«тебе нужна способность X» — эта запись требует понимания
конкретного механизма
66Третье в одно число не влезает, а понадобится при подписи или профилях приватности.
67ОКНО ЗАКРЫВАЕТСЯ. Пока в файлах стои́т 1, его можно задним числом прочесть
как 1.0. Как только уйдёт 2 — уже нельзя.
5.5 Подменена сама задача — САМОЕ КРУПНОЕ
68Владелец просил генерировать типы из схем: схема — отдельный документ, она версионируется, публикуется, она источник истины, код из неё выводится.
69Разбор вернулся с набором правок атрибутов serde в рукописных структурах.
Это дрейф, произошедший потому, что латать дешевле, чем строить.
| правки атрибутов | схема как источник истины | |
|---|---|---|
| где живёт формат | в коде на Rust | в отдельном документе |
| что видит чужой | наши исходники | машиночитаемое описание |
| что версионируется | ничего | сам документ схемы |
| чем проверяется | нашими тестами | схемой, у любого |
| кто напишет читателя | тот, кто читает Rust | любой |
71Новая позиция: вернуть исходную постановку. Опубликованная схема и есть формат; типы на Rust — производная.
6. Чего не предложили вовсе, а надо
72Подпись и подлинность каталога. Публичный файл, по которому принимают решения об установке кода. «Эти байты от нас или подменены» — часть формата. Жёсткий порядок: подписывать имеет смысл только то, про что все читатели согласны, что это обязательно. Значит множество «обязан понять» определяется до введения терпимости, иначе подпись потом не приделать безопасно.
73Отметка об отзыве версии пакета. У соседа в refs/src/cargo/ такое поле
живёт с 2014 года. У нас нет ничего: опубликовали пакет с дырой — сообщить
нечем. Добавлять потом — ломающее изменение, потому что старый читатель
обязан его понять.
74Идентичность алгоритма контрольной суммы. Сумма считается по списку исключений, зашитому константой. Допишите строку — каждая сумма в мире изменит значение при том же имени, типе и версии схемы. Существующий тест сторожит согласие двух копий алгоритма между собой, а не устойчивость алгоритма во времени. Это единственный вид слома, который у соседей за двадцать лет оказался смертельным.
7. Что остаётся верным и не пересматривается
75Разделение «механизмы до публикации / обязательства после». Механизмы — тег, запасные значения, терпимость с перехватом, версия-переключатель, решённый смысл отсутствия — задним числом не внедряются, их окно закрывается публикацией. Обязательства — не переименовывать, вечные псевдонимы, сроки устаревания — до появления читателей стоят свободы и не покупают ничего.
76И одно место, где «делать хорошо» означает делать МЕНЬШЕ. Заповедная секция для чужих ключей в манифесте: если манифест не внешняя поверхность — а по коду выходит, что не внешняя, — это механизм под несуществующего потребителя. Фундаментальность ≠ «предусмотреть всё»; она равна «не иметь ни одной случайности».
8. Открытый вопрос по существу, который надо решить рано
77Является ли рукописный vibe.toml внешней поверхностью?
78По коду выходит, что нет: наружу смотрит каталог, манифест читаем мы сами. Если так — это надо записать как решение, потому что сейчас это случайность реализации. От ответа зависит, сколько мест придётся делать терпимыми и нужна ли манифесту версия вообще.
9. Состояние репозитория
- 79Ветка
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 после восьми коммитов того дня; с тех пор кода не менялось, только документы.