WORKER-REPORT
Task
01G2-MECHANICS — вторым независимым взглядом разобрать механику эволюции формата
(каталог vibevm) против свода FINDINGS-DIGEST.md; результат — G2-MECHANICS.md.
Задача на размышление, не на правку кода; git и cargo не запускались.
Changed files (each with why)
- 02
G2-MECHANICS.md— основной результат: скептический разбор шести вопросов (Avro, пусто/отсутствует, тегированное объединение, граница терпимости, механика protobuf, номера полей) с пятью предложенными формами объединения. WORKER-REPORT-G2-MECHANICS.md— этот отчёт.- (Код не правился — задача проектировочная.)
Acceptance, point by point
- 03
G2-MECHANICS.mdсуществует -> DONE — evidence: файл создан в корне worktree. - Модель Avro разобрана скептически, с ответом «дешевле/дороже терпимого
читателя» и обоснованием -> DONE — evidence:
G2-MECHANICS.md§1, вердикт «ДОРОЖЕ»; обоснование — две разных истории git (каталог-реестр vs исходный репозиторий), внешний читатель без репо, скопированная наружу запись; контраргумент-пересмотр «настоящий урок Avro — опубликовать артефакт схемы». - Вопрос про списки разобран с ответом «нужна ли нам различимость» -> DONE —
evidence:
G2-MECHANICS.md§2, ответ «для каталога НЕ нужна» (машинные поля не бывают legitimately неизвестными); нужна только человеко-написанному манифесту. - Для нашего объединения предложено минимум три формы с ценой каждой -> DONE —
evidence:
G2-MECHANICS.md§3 дано пять форм (A — тег-поле; B — разделённые карты; C — вывод по обязательному полю/baseline; D — вложенная обёртка, нет в своде; E — тег в ключе, отбраковано), у каждой цена и «чем платим». - Граница терпимости разобрана минимум по четырём видам «незнакомого» -> DONE —
evidence:
G2-MECHANICS.md§4 разобрано пять видов (незнакомое поле, незнакомое значение enum, незнакомый тип значения, лишний элемент списка, незнакомый ключ карты) с вердиктом по каждому. - Каждое утверждение о внешнем мире несёт метку источника -> DONE — evidence:
по всему
G2-MECHANICS.mdиспользованы[ИЗ СВОДА],[ИЗ ДЕРЕВА]сфайл:строка,[ПО ПАМЯТИ, НЕ ПРОВЕРЕНО]; правило разметки оглашено вверху.
Self-verify
- 04
grep -c 'ИЗ ДЕРЕВА\|ИЗ СВОДА\|ПО ПАМЯТИ' G2-MECHANICS.md-> метки источника присутствуют повсеместно; каждое внешнее утверждение помечено. - Числа свода перепроверены чтением кода:
deny_unknown_fields= 15 вcrates/vibe-index/src(1+6+1+5+2) -> СОВПАЛО.#[serde(other)]-> 0 в дереве -> СОВПАЛО.- сравнение версии каталога -> 0; единственное сравнение версии во всём
.rs—vibe-core/src/manifest/lockfile.rs:430(lockfile) -> СОВПАЛО со сводом. skip_serializing_if = "...is_empty"-> 21, не 14 -> РАСХОЖДЕНИЕ со сводом (зафиксировано как находка): 12Vec::is_empty+ 2BTreeMap::is_empty- 7 структурных
*Entry::is_empty; свод считал только сырые коллекции (14). - (cargo/git не запускались по условию задачи; верификация — чтением исходников и grep.)
Decisions taken (each with why)
- 05Avro признан ДОРОЖЕ -> предпосылка «схема и данные в одной истории git» неверна (каталог и Rust-типы — два репозитория), а внешний читатель без репо и скопированная запись ломают разрешение схем целиком.
- Различимость списков признана ненужной для каталога -> машинные поля детерминированно вычисляются, «отсутствует» не бывает легитимным состоянием.
- Форма A (тег-поле) выбрана рекомендованной -> один атрибут от нынешнего
состояния, выразима во всех языках схем, и устраняет блокер А6, который держит
только
#[serde(untagged)]. - Несоответствие типа отнесено к твёрдому отказу -> коэрция = патология «будь либерален» (RFC 9413); это порча, не эволюция.
- Rename-безопасность через
#[serde(alias)]-> бесплатна в serde, работает и в JSON, и в TOML; один список отставленных имён (рекомендация свода) недостаточен.
Deviations and resolved ambiguities
- 06Свод неточно описал объединение («угадывает по набору ключей»): в дереве у
Directoryесть позитивный тегkind:"directory"(repomd.rs:44-50). Реальный дефект —untagged, не «отсутствие тега». Учтено в §0 и §3. - Периметр «14» пересмотрен до 21 (структурные
*Entry::is_emptyколлапсируют пусто≡отсутствует так же). Зафиксировано, не подано как «свод ошибся в лоб» — периметр сырых коллекций оправдан, но релевантное языку схемы число = 21. - Не перепроверял «23 типа / 18 каталожных / 86 полей» — не нагрузко-несущие для выводов; честно отмечено в §0.
Not done / leftovers
- 07Не строил и не выполнял код (запрещено условием и не нужно для задачи).
- Числа «23/18/86» оставлены на доверии своду.
С чем я не согласен
- 08Avro «почти бесплатно» — не согласен (предпосылка ложна). Каталог и схема
в двух разных репозиториях/историях; внешний читатель без репо и
скопированная запись ломают модель; Avro ДОРОЖЕ терпимого читателя, который уже
написан (
wire.rs). - «Угадывание по набору ключей» — не согласен с фактикой.
Directoryуже несётkind:"directory"(repomd.rs:44-50); дефект —untagged, не отсутствие дискриминанта. - «14 полей» — не согласен с периметром. Живое число — 21; структурные поля
с
*Entry::is_emptyколлапсируют пусто≡отсутствует так же; решение А6 принято по заниженному числу. - «Невосстановление присутствия списков = незавершённость» — не согласен. Это осознанный отказ; для каталога различимость не нужна (машинные поля не бывают «неизвестными»).
- «Наследуем проблемы JSON-protobuf без выхода» — не согласен с рамкой.
Наш выход — убрать
deny_unknown_fields(один атрибут), а не двоичный формат; скалярного коллапса proto3 у нас в JSON нет вовсе. - Поле-имя — возмещаемо полностью, а свод назвал только полумеру. Список
отставленных имён необходим, но rename-безопасность даёт
#[serde(alias)], которого свод не упомянул.