Ветка отведена от 522ba89, где последним был ADR-063, и заняла
064–072. Тем временем в main через #3 и #4 пришли свои 064
(строка ввода — div вместо form), 065 (стороны сообщений)
и 066 (серверного перца нет).
Переезжают три ADR этой ветки, 067–072 остаются на месте:
их номера свободны, а внутренние ссылки менять незачем.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QR8uS3zGkybzWRW4GEY1oz
2.9 KiB
ADR-057: bare version помечает сборку из изменённого дерева
Уточняет ADR-022: проверка подлинности бинаря опирается на ревизию, значит ревизия обязана быть честной.
Уточнён ADR-074: чтение build info переехало в internal/build, ревизия печатается короткой и рядом с временем коммита; +dirty и unknown — как здесь. Формат стал проверяемым тестом — разбор build info отделён от debug.ReadBuildInfo; сама простановка vcs.* по-прежнему проверяется руками.
Контекст
docs/threat-model.md называет единственное смягчение против активно-злонамеренного оператора: «статика внутри бинаря, хеш которого сверяется со сборкой из тега: подмену можно заметить». docs/deploy.md доводит это до двух проверок после деплоя — sha256sum на сервере и bare version.
revision() брала из debug.ReadBuildInfo() первое значение vcs.revision и печатала его как есть. Рядом лежит vcs.modified, и его никто не читал: бинарь, собранный из дерева с правками, печатал чистый хеш коммита, к которому его содержимое отношения не имеет. При этом scripts/deploy.sh собирает именно рабочее дерево — штатный путь деплоя такие бинари и порождает.
Решение
revision()читаетvcs.modifiedвместе сvcs.revision. Приvcs.modified = trueк хешу дописывается+dirty.- Ревизии нет вовсе — прежнее
unknown. - Строка про версию бинаря в
docs/deploy.mdговорит то же.
Следствия
- Сверка «хеш файла на сервере против сборки из тега» перестаёт молча проходить для бинаря из грязного дерева:
bare versionназывает его грязным раньше, чем сойдётся или не сойдётсяsha256sum. - Релиз, собранный из чистого тега, печатает прежнюю строку — привычка не ломается.
- Проверять это в тесте нечем:
vcs.*появляется только у собранного бинаря, аgo testих не проставляет. Проверка ручная, она вdocs/deploy.md.