Make the freeze gate able to fail: a binary built in a linked worktree carries no VCS stamp at all, so the refusal rule was asserting silence

This commit is contained in:
heaven 2026-09-11 03:51:55 +03:00
parent 9053dfdfb9
commit 7ba874473f

View file

@ -151,16 +151,32 @@
### 4.2 Фриз — **делай РОВНО так**
**Фриз = sha коммита ПЛЮС бинари, собранные из `git worktree add <путь> <sha>`.** Довод — не «дерево грязное»
(оно сейчас чистое), а **главное дерево движут параллельные сессии**: в нём прямо сейчас работают движковая и
платформенная. Драйвер перед каждым платным шагом печатает `go version -m` и ОТКАЗЫВАЕТ при `vcs.modified=true`
или чужом revision.
**Фриз = sha коммита ПЛЮС бинари, собранные из ЛОКАЛЬНОГО КЛОНА** (`git clone <репо> <путь>`). Довод — не
«дерево грязное», а **главное дерево движут параллельные сессии**: в нём прямо сейчас работают движковая и
платформенная. Драйвер перед каждым платным шагом печатает `go version -m` и ОТКАЗЫВАЕТ при `vcs.modified=true`,
чужом revision **или ОТСУТСТВИИ строк `vcs.*`**.
**ИСПР. 8 — ФРИЗ-ГЕЙТ УМЕЕТ ОБНУЛИТЬ СЕБЯ.** У линкованного воркри `.git` — ФАЙЛ, поиск корня VCS в Go его
пропускает и уходит выше; напоровшись на посторонний `/tmp/.git`, сборка падает с «error obtaining VCS status»,
и штатное лечение `GOFLAGS=-buildvcs=false` **стирает штамп целиком**, то есть убивает сам гейт
(эррата `D39.202`). ⇒ **перед сборкой `test ! -e /tmp/.git`; `-buildvcs=false` в фриз-сборке ЗАПРЕЩЁН;
воркри — вне репозитория и вне общего скретчпада.** ⚠ И штамп снимается **на КАЖДУЮ попытку**, а не один раз:
⛔ **ИСПР. 18 — МОЙ ЦЕНТРАЛЬНЫЙ ГЕЙТ БЫЛ ПИНОМ, УТВЕРЖДАЮЩИМ МОЛЧАНИЕ. Замерено полигоном 11.09, я
пере-проверил своим прибором.** Первая редакция велела собирать из `git worktree add`. Бинарь, собранный в
ЛИНКОВАННОМ воркри, не несёт VCS-штампа **ВООБЩЕ** — не `vcs.modified=true`, а НИ ОДНОЙ строки `vcs.*`
(24 строки `go version -m`, из них `vcs.*` — 0). Причина: у линкованного воркри `.git` — ФАЙЛ, и поиск корня
VCS в Go его пропускает; выше по дереву репозитория нет, поэтому сборка не падает, а **тихо выходит без
штампа** — тот же результат, что от запрещённого `-buildvcs=false`, только без единого предупреждения.
⇒ правило «отказывать при `vcs.modified=true`» на воркри-бинаре выполнялось ВСЕГДА и не проверяло ничего.
**Контроль, доказывающий, что механизм на этом хосте жив:** та же сборка из ГЛАВНОГО дерева даёт
`vcs.revision=…` и `vcs.modified=true`.
**Фриз-дерево — ЛОКАЛЬНЫЙ КЛОН:** у него `.git` настоящий КАТАЛОГ, и бинари несут
`vcs.revision=<sha> · vcs.modified=false` (проверено на всех трёх). Гейт получает зубы: «штампа нет» и
«штамп чужой» становятся отличимы от «штамп мой и чистый».
**И в клоне НЕТ `books/`** — внешний репозиторий держит их в `.gitignore`, книги версионируются ОТДЕЛЬНЫМ
репозиторием. Исходник читается из главного дерева как ФАЙЛ (read-only), а его провенанс — пара sha256
(срез и оригинал) в пре-реге. Артефакт контраста кладётся в КЛОН, рядом с его `pipeline.yaml`.
**ИСПР. 8 — ВТОРОЙ СПОСОБ ОБНУЛИТЬ ФРИЗ-ГЕЙТ, и он остаётся в силе для КЛОНА тоже.** Напоровшись на
посторонний `/tmp/.git`, сборка падает с «error obtaining VCS status», и штатное лечение
`GOFLAGS=-buildvcs=false` **стирает штамп целиком** (эррата `D39.202`). ⇒ **перед сборкой
`test ! -e /tmp/.git`; `-buildvcs=false` в фриз-сборке ЗАПРЕЩЁН; фриз-дерево — вне репозитория и вне общего
скретчпада.** ⚠ И штамп снимается **на КАЖДУЮ попытку**, а не один раз:
резюм может сменить бинарь под тем же прогоном (`TM_PLATFORM_RESUME_MAY_CHANGE_ENGINE`, колонка
`runs.engine_binary`) — сверяй по `run_attempts`, а не по тому, что лежит на PATH в конце.