Повтор той же команды на неизменившемся дереве снят: ступень автотестов засчитывает прогон, сделанный шагом opsx:apply или шагом гейта обслуживания. Признак — отпечаток рабочего дерева, снятый дважды; любое расхождение ведёт к честному прогону. Журнал — тема 73.
6.1 KiB
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. Экономия названа замером, а не обещанием. Снятый повтор — минуты одного прогона из шестидесяти двух; остальное время ревью держат проход враждебных постановок, цепочка за машину и триаж, и они разбираются отдельно.