Files
bare/docs/decisions/057-version-marks-dirty-tree.md
T
mayatnikovandClaude Opus 5 f9ac83bef8 Развести номера ADR: 064/065/066 этой ветки → 073/074/075
Ветка отведена от 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
2026-08-24 11:23:12 +03:00

2.9 KiB
Raw Blame History

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.