Files
dev-skills/decisions/73-gate-run-reused-by-fingerprint.md
T
av 17be316634 ревью: гейт, прогнанный до ревью, засчитывается по отпечатку дерева
Повтор той же команды на неизменившемся дереве снят: ступень автотестов
засчитывает прогон, сделанный шагом opsx:apply или шагом гейта обслуживания.
Признак — отпечаток рабочего дерева, снятый дважды; любое расхождение ведёт
к честному прогону. Журнал — тема 73.
2026-08-23 13:42:58 +03:00

6.1 KiB
Raw Blame History

73. Гейт, прогнанный до ревью, не гоняется второй раз (2026-08-23)

Что было

Гейт проекта прогонялся дважды на одном и том же дереве. Сценарий решения доводит его до зелёного шагом opsx:apply, сценарий обслуживания — своим шагом гейта; следом ступень автотестов конвейера запускала ту же команду заново.

Замер по прогонам в проекте transcriber 23 августа: ступень автотестов заняла 5 минут 51 секунду при ревью кода в 62 минуты. Дерево между двумя прогонами не менялось ни разу — код писал агент, возвращал зелёный гейт, и до ревью его никто не трогал.

Повтор держался не на доводе, а на умолчании: проход запускает команду, потому что так написано в его уставе, и никто не спрашивал, откуда взялось дерево, на котором он её запускает.

Решено

Р274. Гейт, прогнанный до ревью, второй раз не гоняется. Переиспользуется команда, а не проход: тема autotests закрывается целиком — логи шагов проход читает сам, находки об отсутствующей верификации выдаёт как обычно. Дом правила — ступень 1 конвейера, av-dev:code-review.

Р275. Признак — отпечаток рабочего дерева, и он проверяемый. Отпечаток снимают дважды: тот, кто прогнал гейт, — сразу после прогона, проход — перед началом работы. Совпали — прогон засчитан, разошлись — проход гонит гейт сам. Команда живёт домом в ступени 1 и помеченной копией в уставе review-autotests; дословность держит copies.py, а не обещание.

Р276. Это не отмена правила «возврату на слово не верят» (тема 72, Р270), и вот почему. На слово здесь не верят никому: гейт — вывод инструмента, а не проза агента, логи шагов проход открывает сам, и отпечаток отвечает ровно на тот вопрос, который делает чужой прогон доказательством, — относится ли этот вывод к этому дереву. Правило Р270 запрещает верить пересказу; засчитывается же не пересказ, а воспроизводимый артефакт с проверенной привязкой.

Р277. Отказ безопасен по построению. Любое расхождение — отпечатки не совпали, отпечатка в задании нет, логи недоступны — ведёт к полному прогону, и проход не спрашивает разрешения. Лишний прогон стоит минут, засчитанный чужой — красноты, которой никто не увидел; асимметрия цены и задаёт направление отказа.

Р278. Временный каталог из отпечатка выпадает сам. --exclude-standard отбрасывает игнорируемое, а логи шагов гейт пишет туда же. Проект, держащий временный каталог под git, отпечатками не совпадёт никогда — и получит честный прогон вместо тихого засчитывания. Настройки у этого нет намеренно: выключатель здесь стал бы способом засчитать прогон, который засчитывать нельзя.

Р279. Переиспользование объявляется строкой — в сводке прохода и в границах покрытия: чем гейт прогнан, когда и на каком отпечатке. Молчащее переиспользование неотличимо от собственного прогона, а разница между ними в том, кто видел вывод своими глазами.

Следствия

С254. Возврат агента письма пополнился отпечатком. К исходу гейта и тому, чем он прогнан (тема 72, Р269), добавились путь к логам шагов и отпечаток дерева. Возврат от этого не удлинился на экран: обе вещи — строки, а не содержимое.

С255. Оркестратор передаёт исход гейта в ревью. Шаг 7 решения и шаг 4 обслуживания несут его вместе с планом, базой диффа и режимом. Не передал — конвейер прогонит гейт сам, и это стоит минут, а не корректности.

С256. Экономия названа замером, а не обещанием. Снятый повтор — минуты одного прогона из шестидесяти двух; остальное время ревью держат проход враждебных постановок, цепочка за машину и триаж, и они разбираются отдельно.