gate и autotests сведены к одному имени

Тема звалась autotests, а закрывающий её проход — gate, и на всех трёх ступенях
это была одна и та же клетка таблицы. Одна сущность под двумя именами — та же
ошибка, что и два разных под одним, только тише: она не путает, а теряет. Вопрос
проекта в docs/review адресуется теме; адресованный проходу не приезжает никуда,
и ровно этот отказ уже случился однажды с ops.

Победило имя темы. Тема первична по правилу 0, а имена тем — это имена
документов: docs/autotests.md проект напишет (что покрыто, что нарочно нет, где
testdata), docs/gate.md не напишет никто, потому что гейт это команда, а не
предмет. Слово «гейт» к тому же занято дважды — команда проекта и ребро графа;
третьим значением стал бы нечитаемым отчёт, где «гейт красный» и «гейт нашёл»
про разное. И тема шире гейта ровно на «чего в гейте намеренно нет».

Цена названа честно: autotests звучит уже своего содержимого — линт, типы и
сканер уязвимостей тестами не являются. Гасится строкой в уставе: тема — это
«проверено ли машиной», а не «есть ли тесты», гейт в ней инструмент, а не
граница.

Слово «гейт» осталось ровно в одном значении — команда проекта. Все прочие
вхождения (семантика гейта, «пока гейт красный», финальный гейт в task-batch)
именно про неё и не тронуты.

Побочно: autotests — единственная тема, чей дом лежит не в docs/, а в CLAUDE.md.
Канон править не пришлось: список тем открытый, и заведённый когда-нибудь
docs/autotests.md ляжет на существующее имя.

Тема 37 в DECISIONS.md, следствия 141-142.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-07 08:50:13 +03:00
co-authored by Claude Opus 5
parent a81dd1a5a7
commit 900f3f83ca
8 changed files with 75 additions and 28 deletions
+34
View File
@@ -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. **Слово, уже значащее что-то в предметной области проекта, нельзя брать
именем роли конвейера.** «Гейт» принадлежит проекту раньше, чем ревью, и
спор за него ревью проигрывает.
@@ -15,7 +15,7 @@ color: yellow
или слоёв разом, переносит ответственность между ними, перекладывает существующий
код в новую форму, либо вводит функциональность, форму решения которой нащупывали
по ходу. Ни миграция схемы, ни изменение публичного контракта сами по себе тебя не
зовут: там работы для тебя нет, её делают `gate`, `basics` и `specs`. Если тебя
зовут: там работы для тебя нет, её делают `autotests`, `basics` и `specs`. Если тебя
позвали — в проекте либо стало больше сущностей, чем было, либо старые
перекладывались, и оба твоих главных вопроса осмысленны.
@@ -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`
+1 -1
View File
@@ -169,7 +169,7 @@ color: yellow
- дефект, который сработает сам по себе на обычном входе, — `review-code`
(граница проходит по источнику отказа: сосед, время и объём — твои; ошибка в
самой логике — его);
- механизируемое — `review-gate`;
- механизируемое — `review-autotests`;
- соответствие дельта-спекам — `review-specs`;
- **построенный путь, эксперимент против драйвера, любое число** — `adversary` и
`ops` в `wide`;
+2 -2
View File
@@ -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`);
+2 -2
View File
@@ -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/<id>/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
+21 -15
View File
@@ -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 — разметка<br/>(стадия 0, темы и ступень)"]
gate["gate<br/>(стадия 1, держит машину)"]
autotests["autotests<br/>(стадия 1, держит машину)"]
specs["specs"]
code["code"]
basics["basics<br/>(quick, standard: темы;<br/>wide: только свои темы проекта)"]
@@ -361,13 +361,13 @@ flowchart TD
architecture["architecture<br/>(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`. Уберёшь его — и нижние ступени останутся без единственного прохода,
который смотрит на ось времени.
@@ -80,7 +80,7 @@ stateDiagram-v2
| Проход | Класс дефекта для инъекции | Заготовка пробы |
|---|---|---|
| `review-scope` | пропущенная тема | положить в `docs/` новый документ и проверить, попал ли он в план темой |
| `review-gate` | отсутствующая верификация | убрать тест на изменённую ветку, оставить код рабочим |
| `review-autotests` | отсутствующая верификация | убрать тест на изменённую ветку, оставить код рабочим |
| `review-specs` | поведение вне спеки | добавить незаказанный фолбэк-дефолт на пустом входе |
| `review-code` | нарушение прозаической конвенции | увести штатный отказ мимо единой точки трансляции ошибки |
| `review-code` | технический дефект | не проверить возвращённую ошибку в ветке раннего возврата |