# 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](72-writing-delegated-to-agents.md), Р270), и вот почему.** На слово здесь не верят никому: гейт — вывод инструмента, а не проза агента, логи шагов проход открывает сам, и отпечаток отвечает ровно на тот вопрос, который делает чужой прогон доказательством, — **относится ли этот вывод к этому дереву**. Правило Р270 запрещает верить пересказу; засчитывается же не пересказ, а воспроизводимый артефакт с проверенной привязкой. **Р277. Отказ безопасен по построению.** Любое расхождение — отпечатки не совпали, отпечатка в задании нет, логи недоступны — ведёт к полному прогону, и проход не спрашивает разрешения. Лишний прогон стоит минут, засчитанный чужой — красноты, которой никто не увидел; асимметрия цены и задаёт направление отказа. **Р278. Временный каталог из отпечатка выпадает сам.** `--exclude-standard` отбрасывает игнорируемое, а логи шагов гейт пишет туда же. Проект, держащий временный каталог под git, отпечатками не совпадёт никогда — и получит честный прогон вместо тихого засчитывания. Настройки у этого нет намеренно: выключатель здесь стал бы способом засчитать прогон, который засчитывать нельзя. **Р279. Переиспользование объявляется строкой** — в сводке прохода и в границах покрытия: чем гейт прогнан, когда и на каком отпечатке. Молчащее переиспользование неотличимо от собственного прогона, а разница между ними в том, кто видел вывод своими глазами. ## Следствия **С254. Возврат агента письма пополнился отпечатком.** К исходу гейта и тому, чем он прогнан ([тема 72](72-writing-delegated-to-agents.md), Р269), добавились путь к логам шагов и отпечаток дерева. Возврат от этого не удлинился на экран: обе вещи — строки, а не содержимое. **С255. Оркестратор передаёт исход гейта в ревью.** Шаг 7 решения и шаг 4 обслуживания несут его вместе с планом, базой диффа и режимом. Не передал — конвейер прогонит гейт сам, и это стоит минут, а не корректности. **С256. Экономия названа замером, а не обещанием.** Снятый повтор — минуты одного прогона из шестидесяти двух; остальное время ревью держат проход враждебных постановок, цепочка за машину и триаж, и они разбираются отдельно.