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:
@@ -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`
|
||||
@@ -169,7 +169,7 @@ color: yellow
|
||||
- дефект, который сработает сам по себе на обычном входе, — `review-code`
|
||||
(граница проходит по источнику отказа: сосед, время и объём — твои; ошибка в
|
||||
самой логике — его);
|
||||
- механизируемое — `review-gate`;
|
||||
- механизируемое — `review-autotests`;
|
||||
- соответствие дельта-спекам — `review-specs`;
|
||||
- **построенный путь, эксперимент против драйвера, любое число** — `adversary` и
|
||||
`ops` в `wide`;
|
||||
|
||||
@@ -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`);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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` | технический дефект | не проверить возвращённую ошибку в ветке раннего возврата |
|
||||
|
||||
Reference in New Issue
Block a user