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

69 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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. Экономия названа замером, а не обещанием.** Снятый повтор — минуты одного
прогона из шестидесяти двух; остальное время ревью держат проход враждебных
постановок, цепочка за машину и триаж, и они разбираются отдельно.