diff --git a/DECISIONS.md b/DECISIONS.md index ad04aa7..9162f3e 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -2592,3 +2592,37 @@ JJJ): у профиля обязан быть один правильный от технического ревью кода — сверкой оптик проходов между собой. Ни то ни другое не всплыло бы на прогоне: прогон честно сообщал, что все запущенные проходы отработали. + +## 37. `gate` и `autotests` сведены к одному имени (2026-08-07) + +Тема звалась `autotests`, закрывающий её проход — `gate`, и на всех трёх ступенях +это была одна и та же клетка таблицы. Одна сущность под двумя именами — та же +ошибка, что и два разных под одним, только тише: она не путает, а **теряет**. +Вопрос проекта в `docs/review.*` адресуется теме; адресованный проходу — не +приезжает никуда, и ровно этот отказ уже случился однажды с `ops` (тема 36, АВААЖ). + +**АГААА. Победило имя темы, а не имя прохода.** Три довода, по убыванию веса: + +1. **Тема первична (правило 0), а имена тем — это имена документов.** + `docs/autotests.md` проект напишет: что покрыто, что нарочно нет, где + `testdata`. `docs/gate.md` не напишет никто — гейт это команда, а не предмет. +2. **Слово «гейт» уже занято дважды** — команда проекта и ребро графа («пока гейт + красный, опиниативные не идут»). Третье значение сделало бы отчёт нечитаемым: + «гейт красный» и «гейт нашёл» — про разное. +3. **Тема шире гейта.** «Хватает ли проверок» и «чего в гейте намеренно нет» за + пределы красного/зелёного выходят. Назвать целое именем инструмента — тихо его + сузить. + +Цена названа честно: `autotests` звучит уже своего содержимого — линт, типы, +сканер уязвимостей тестами не являются. Гасится строкой в уставе: тема — это +«проверено ли машиной», а не «есть ли тесты», и гейт в ней инструмент, а не +граница. + +### Что из этого следует + +141. **Тема и проход, совпадающие один в один на всех ступенях, обязаны носить + одно имя.** Пока имён два, у сущности два адреса, а адресуют её по одному — + и какой из двух окажется живым, решает случай. +142. **Слово, уже значащее что-то в предметной области проекта, нельзя брать + именем роли конвейера.** «Гейт» принадлежит проекту раньше, чем ревью, и + спор за него ревью проигрывает. diff --git a/av-dev-pipeline/agents/review-architecture.md b/av-dev-pipeline/agents/review-architecture.md index 3b20fba..dddb861 100644 --- a/av-dev-pipeline/agents/review-architecture.md +++ b/av-dev-pipeline/agents/review-architecture.md @@ -15,7 +15,7 @@ color: yellow или слоёв разом, переносит ответственность между ними, перекладывает существующий код в новую форму, либо вводит функциональность, форму решения которой нащупывали по ходу. Ни миграция схемы, ни изменение публичного контракта сами по себе тебя не -зовут: там работы для тебя нет, её делают `gate`, `basics` и `specs`. Если тебя +зовут: там работы для тебя нет, её делают `autotests`, `basics` и `specs`. Если тебя позвали — в проекте либо стало больше сущностей, чем было, либо старые перекладывались, и оба твоих главных вопроса осмысленны. diff --git a/av-dev-pipeline/agents/review-gate.md b/av-dev-pipeline/agents/review-autotests.md similarity index 82% rename from av-dev-pipeline/agents/review-gate.md rename to av-dev-pipeline/agents/review-autotests.md index 02ac4fb..e47a5f3 100644 --- a/av-dev-pipeline/agents/review-gate.md +++ b/av-dev-pipeline/agents/review-autotests.md @@ -1,15 +1,22 @@ --- -name: review-gate -description: "Детерминированный гейт конвейера ревью — запускает команду гейта проекта (сборка/vet/линт/формат/тесты/флаки/гонки/покрытие изменённых строк/миграции/секреты/уязвимости) и интерпретирует вывод. Отличает новые отказы от унаследованных, находит отсутствующую верификацию (изменённые строки без покрытия, конкурентность без теста, флаки). Пока гейт красный, опиниативные проходы не запускаются. Первый проход конвейера, обязателен во всех профилях." +name: review-autotests +description: "Тема `autotests` — проверено ли машиной и хватает ли проверок. Запускает команду гейта проекта (сборка/vet/линт/формат/тесты/флаки/гонки/покрытие изменённых строк/миграции/секреты/уязвимости) и интерпретирует вывод. Отличает новые отказы от унаследованных, находит отсутствующую верификацию (изменённые строки без покрытия, конкурентность без теста, флаки). Пока гейт красный, опиниативные проходы не запускаются. Первый проход после разметки, обязателен во всех профилях." tools: Bash, Read, Grep, Glob model: sonnet color: green --- -Ты — **гейт** конвейера ревью. Твоя ценность в том, что у тебя есть объективный -оракул: ты не рассуждаешь о коде, ты **запускаешь инструменты** и читаешь их -вывод. Всё, что можно свести к выполненной команде, сводится к ней — мнение стоит -дёшево, вывод детектора гонок стоит дорого. +Ты закрываешь тему **`autotests`** — «проверено ли машиной и хватает ли +проверок». Твоя ценность в том, что у тебя есть объективный оракул: ты не +рассуждаешь о коде, ты **запускаешь инструменты** и читаешь их вывод. Всё, что +можно свести к выполненной команде, сводится к ней — мнение стоит дёшево, вывод +детектора гонок стоит дорого. + +**Тема шире слова «тесты», и имя её не сужает.** Всё, что машина проверяет по +этому изменению, — твоё: линт и формат, типы, детектор гонок, покрытие +изменённых строк, миграции, секреты, сканер уязвимостей. **Гейт** — это команда +проекта, твой главный инструмент, а не твоё имя: проверка, которой в гейте +намеренно нет, из темы не выпадает — она уходит в границы покрытия. Находки — по контракту `${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md` diff --git a/av-dev-pipeline/agents/review-basics.md b/av-dev-pipeline/agents/review-basics.md index 889ed9e..add96aa 100644 --- a/av-dev-pipeline/agents/review-basics.md +++ b/av-dev-pipeline/agents/review-basics.md @@ -169,7 +169,7 @@ color: yellow - дефект, который сработает сам по себе на обычном входе, — `review-code` (граница проходит по источнику отказа: сосед, время и объём — твои; ошибка в самой логике — его); -- механизируемое — `review-gate`; +- механизируемое — `review-autotests`; - соответствие дельта-спекам — `review-specs`; - **построенный путь, эксперимент против драйвера, любое число** — `adversary` и `ops` в `wide`; diff --git a/av-dev-pipeline/agents/review-code.md b/av-dev-pipeline/agents/review-code.md index 2f251dc..f5cab68 100644 --- a/av-dev-pipeline/agents/review-code.md +++ b/av-dev-pipeline/agents/review-code.md @@ -1,6 +1,6 @@ --- name: review-code -description: "Технический разбор кода изменения плюс сверка с конвенциями проекта — две половины одного прохода, обе во всех профилях. Первая: читает дифф и ищет дефект, который сработает без враждебного входа и без нагрузки — необработанная ветка отказа, проглоченная ошибка, пустое и нулевое значение, граница диапазона, перепутанный операнд, неосвобождённый ресурс, изменение под итерацией, неверно применённый интерфейс библиотеки, ветка, недостижимая по построению. Вторая: прозаические конвенции проекта — уровень лога по адресату, единая точка трансляции ошибки, канонический вид и нормализация, конфиг и его образец, время и идентификаторы. Механизируемое проверяет гейт, отказы окружения — basics и ops, форму решения — architecture. Только чтение." +description: "Технический разбор кода изменения плюс сверка с конвенциями проекта — две половины одного прохода, обе во всех профилях. Первая: читает дифф и ищет дефект, который сработает без враждебного входа и без нагрузки — необработанная ветка отказа, проглоченная ошибка, пустое и нулевое значение, граница диапазона, перепутанный операнд, неосвобождённый ресурс, изменение под итерацией, неверно применённый интерфейс библиотеки, ветка, недостижимая по построению. Вторая: прозаические конвенции проекта — уровень лога по адресату, единая точка трансляции ошибки, канонический вид и нормализация, конфиг и его образец, время и идентификаторы. Механизируемое проверяет проход autotests, отказы окружения — basics и ops, форму решения — architecture. Только чтение." tools: Read, Grep, Glob, Bash model: opus color: yellow @@ -167,7 +167,7 @@ color: yellow ## Чем ты НЕ занимаешься -- механизируемое (форматирование, запрещённые вызовы, импорты) — `review-gate`; +- механизируемое (форматирование, запрещённые вызовы, импорты) — `review-autotests`; - построенный путь недоверенного входа — `review-adversary` (тема `security`); - отказ соседа, рост объёма, наблюдаемость, откат — `review-basics`, в `wide` `review-ops` (тема `operations`); diff --git a/av-dev-pipeline/agents/review-scope.md b/av-dev-pipeline/agents/review-scope.md index 7c0bbc7..4cb0deb 100644 --- a/av-dev-pipeline/agents/review-scope.md +++ b/av-dev-pipeline/agents/review-scope.md @@ -145,7 +145,7 @@ color: green | Тема | `quick` | `standard` | `wide` | |---|---|---|---| | `requirements` | `specs` | `specs` | `specs` | -| `autotests` | `gate` | `gate` | `gate` | +| `autotests` | `autotests` | `autotests` | `autotests` | | `conventions` | `code` | `code` | `code` | | `architecture` | `basics`, сверка | `basics`, разбор | `architecture` | | `security` | `basics`, сверка | `basics`, разбор | `adversary` | @@ -177,7 +177,7 @@ color: green тема дом глубина закрывает requirements openspec/changes//specs/ сверка specs -autotests CLAUDE.md, семантика гейта — gate +autotests CLAUDE.md, семантика гейта — autotests conventions docs/conventions/ сверка code architecture docs/architecture.md, adr/ разбор basics security docs/security.md разбор basics diff --git a/av-dev-pipeline/skills/review-pipeline/SKILL.md b/av-dev-pipeline/skills/review-pipeline/SKILL.md index f26939d..d47799a 100644 --- a/av-dev-pipeline/skills/review-pipeline/SKILL.md +++ b/av-dev-pipeline/skills/review-pipeline/SKILL.md @@ -142,7 +142,7 @@ description: "Конвейер ревью изменения, устроенны | Модель | Цвет | Проходы | Почему | |---|---|---|---| -| `sonnet` | green | scope, gate, ops | вывод перечислим и сверяется механически | +| `sonnet` | green | scope, autotests, ops | вывод перечислим и сверяется механически | | `opus` | yellow | specs, code, basics, adversary, rubric, architecture, triage | дорога ошибка — ложная либо пропущенная | **Цвет charter'а кодирует модель, а не роль прохода.** Это единственное @@ -210,7 +210,7 @@ charter'а, а модель потом двигает калибровка, и | Тема | `quick` | `standard` | `wide` | |---|---|---|---| | `requirements` | `specs` | `specs` | `specs` | -| `autotests` | `gate` | `gate` | `gate` | +| `autotests` | `autotests` | `autotests` | `autotests` | | `conventions` | `code` | `code` | `code` | | `architecture` | `basics`, сверка | `basics`, разбор | `architecture`, доказательство | | `security` | `basics`, сверка | `basics`, разбор | `adversary`, доказательство | @@ -352,7 +352,7 @@ charter'а, а модель потом двигает калибровка, и ```mermaid flowchart TD scope["scope — разметка
(стадия 0, темы и ступень)"] - gate["gate
(стадия 1, держит машину)"] + autotests["autotests
(стадия 1, держит машину)"] specs["specs"] code["code"] basics["basics
(quick, standard: темы;
wide: только свои темы проекта)"] @@ -361,13 +361,13 @@ flowchart TD architecture["architecture
(wide)"] triage["triage — единственный сток"] - scope -->|план| gate - gate -->|зелёный| specs - gate -->|зелёный| code - gate -->|"зелёный, темы по плану"| basics - gate -->|"зелёный, wide"| adversary - gate -->|"зелёный, wide"| ops - gate -->|"зелёный, wide"| architecture + scope -->|план| autotests + autotests -->|зелёный| specs + autotests -->|зелёный| code + autotests -->|"зелёный, темы по плану"| basics + autotests -->|"зелёный, wide"| adversary + autotests -->|"зелёный, wide"| ops + autotests -->|"зелёный, wide"| architecture adversary -. один ресурс — машина .- ops specs --> triage code --> triage @@ -405,7 +405,7 @@ flowchart TD | Проход | Держит машину | Почему | |---|---|---| -| `gate` | да | запускает инструменты проекта — но он источник графа и один по построению | +| `autotests` | да | запускает инструменты проекта — но он источник графа и один по построению | | `adversary` | да | находка есть **построенный путь**: он пишет падающий тест и гоняет его | | `ops` | да | доказывает числами: время удержания блокировки, пик кучи, темп роста журнала | | `triage` | да | проверяет оракул `critical`/`major` запуском — но он сток и тоже один | @@ -489,10 +489,16 @@ flowchart TD одинаково**, но обоснование обязательно в обоих случаях и всегда — строкой, какой признак сработал и по какому факту. -## Стадия 1 — Gate (обязательна во всех профилях) +## Стадия 1 — Автотесты (обязательна во всех профилях) -Агент `review-gate`. Закрывает тему `autotests`. Запускает команду гейта из -семантики гейта в `CLAUDE.md` и интерпретирует вывод. +Агент `review-autotests`, тема `autotests`. Запускает команду гейта из семантики +гейта в `CLAUDE.md` и интерпретирует вывод. + +**Тема и проход названы одинаково намеренно, а «гейт» осталось именем команды.** +Раньше тема звалась `autotests`, а проход — `gate`: одна сущность под двумя +именами, и вопрос проекта, адресованный одному имени, к другому не приезжал. +Слово «гейт» теперь значит ровно одно — барьер, который проект запускает; тема +шире него ровно на «чего в гейте намеренно нет». **Пока гейт красный — опиниативные проходы не запускаются.** Оркестратор чинит и перезапускает гейт. Исключение одно: отказ, унаследованный от базовой ветки @@ -564,7 +570,7 @@ Recall темы `conventions` равен длине конвенций прое **Он покрывает миграцию и публичный контракт на нижних ступенях.** Это не побочный эффект, а условие, при котором миграция схемы вообще может не поднимать -ступень: её шаг гоняет `gate`, спеку сверяет `specs`, а вопросы «обратима ли» и +ступень: её шаг гоняет `autotests`, спеку сверяет `specs`, а вопросы «обратима ли» и «что с записями новой версии после отката» задаёт здесь `basics`, темой `operations`. Уберёшь его — и нижние ступени останутся без единственного прохода, который смотрит на ось времени. diff --git a/av-dev-pipeline/skills/review-pipeline/references/calibration.md b/av-dev-pipeline/skills/review-pipeline/references/calibration.md index acd4883..1af5cbc 100644 --- a/av-dev-pipeline/skills/review-pipeline/references/calibration.md +++ b/av-dev-pipeline/skills/review-pipeline/references/calibration.md @@ -80,7 +80,7 @@ stateDiagram-v2 | Проход | Класс дефекта для инъекции | Заготовка пробы | |---|---|---| | `review-scope` | пропущенная тема | положить в `docs/` новый документ и проверить, попал ли он в план темой | -| `review-gate` | отсутствующая верификация | убрать тест на изменённую ветку, оставить код рабочим | +| `review-autotests` | отсутствующая верификация | убрать тест на изменённую ветку, оставить код рабочим | | `review-specs` | поведение вне спеки | добавить незаказанный фолбэк-дефолт на пустом входе | | `review-code` | нарушение прозаической конвенции | увести штатный отказ мимо единой точки трансляции ошибки | | `review-code` | технический дефект | не проверить возвращённую ошибку в ветке раннего возврата |