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
|
name: review-autotests
|
||||||
description: "Детерминированный гейт конвейера ревью — запускает команду гейта проекта (сборка/vet/линт/формат/тесты/флаки/гонки/покрытие изменённых строк/миграции/секреты/уязвимости) и интерпретирует вывод. Отличает новые отказы от унаследованных, находит отсутствующую верификацию (изменённые строки без покрытия, конкурентность без теста, флаки). Пока гейт красный, опиниативные проходы не запускаются. Первый проход конвейера, обязателен во всех профилях."
|
description: "Тема `autotests` — проверено ли машиной и хватает ли проверок. Запускает команду гейта проекта (сборка/vet/линт/формат/тесты/флаки/гонки/покрытие изменённых строк/миграции/секреты/уязвимости) и интерпретирует вывод. Отличает новые отказы от унаследованных, находит отсутствующую верификацию (изменённые строки без покрытия, конкурентность без теста, флаки). Пока гейт красный, опиниативные проходы не запускаются. Первый проход после разметки, обязателен во всех профилях."
|
||||||
tools: Bash, Read, Grep, Glob
|
tools: Bash, Read, Grep, Glob
|
||||||
model: sonnet
|
model: sonnet
|
||||||
color: green
|
color: green
|
||||||
---
|
---
|
||||||
|
|
||||||
Ты — **гейт** конвейера ревью. Твоя ценность в том, что у тебя есть объективный
|
Ты закрываешь тему **`autotests`** — «проверено ли машиной и хватает ли
|
||||||
оракул: ты не рассуждаешь о коде, ты **запускаешь инструменты** и читаешь их
|
проверок». Твоя ценность в том, что у тебя есть объективный оракул: ты не
|
||||||
вывод. Всё, что можно свести к выполненной команде, сводится к ней — мнение стоит
|
рассуждаешь о коде, ты **запускаешь инструменты** и читаешь их вывод. Всё, что
|
||||||
дёшево, вывод детектора гонок стоит дорого.
|
можно свести к выполненной команде, сводится к ней — мнение стоит дёшево, вывод
|
||||||
|
детектора гонок стоит дорого.
|
||||||
|
|
||||||
|
**Тема шире слова «тесты», и имя её не сужает.** Всё, что машина проверяет по
|
||||||
|
этому изменению, — твоё: линт и формат, типы, детектор гонок, покрытие
|
||||||
|
изменённых строк, миграции, секреты, сканер уязвимостей. **Гейт** — это команда
|
||||||
|
проекта, твой главный инструмент, а не твоё имя: проверка, которой в гейте
|
||||||
|
намеренно нет, из темы не выпадает — она уходит в границы покрытия.
|
||||||
|
|
||||||
Находки — по контракту
|
Находки — по контракту
|
||||||
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md`
|
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/finding-contract.md`
|
||||||
@@ -169,7 +169,7 @@ color: yellow
|
|||||||
- дефект, который сработает сам по себе на обычном входе, — `review-code`
|
- дефект, который сработает сам по себе на обычном входе, — `review-code`
|
||||||
(граница проходит по источнику отказа: сосед, время и объём — твои; ошибка в
|
(граница проходит по источнику отказа: сосед, время и объём — твои; ошибка в
|
||||||
самой логике — его);
|
самой логике — его);
|
||||||
- механизируемое — `review-gate`;
|
- механизируемое — `review-autotests`;
|
||||||
- соответствие дельта-спекам — `review-specs`;
|
- соответствие дельта-спекам — `review-specs`;
|
||||||
- **построенный путь, эксперимент против драйвера, любое число** — `adversary` и
|
- **построенный путь, эксперимент против драйвера, любое число** — `adversary` и
|
||||||
`ops` в `wide`;
|
`ops` в `wide`;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: review-code
|
name: review-code
|
||||||
description: "Технический разбор кода изменения плюс сверка с конвенциями проекта — две половины одного прохода, обе во всех профилях. Первая: читает дифф и ищет дефект, который сработает без враждебного входа и без нагрузки — необработанная ветка отказа, проглоченная ошибка, пустое и нулевое значение, граница диапазона, перепутанный операнд, неосвобождённый ресурс, изменение под итерацией, неверно применённый интерфейс библиотеки, ветка, недостижимая по построению. Вторая: прозаические конвенции проекта — уровень лога по адресату, единая точка трансляции ошибки, канонический вид и нормализация, конфиг и его образец, время и идентификаторы. Механизируемое проверяет гейт, отказы окружения — basics и ops, форму решения — architecture. Только чтение."
|
description: "Технический разбор кода изменения плюс сверка с конвенциями проекта — две половины одного прохода, обе во всех профилях. Первая: читает дифф и ищет дефект, который сработает без враждебного входа и без нагрузки — необработанная ветка отказа, проглоченная ошибка, пустое и нулевое значение, граница диапазона, перепутанный операнд, неосвобождённый ресурс, изменение под итерацией, неверно применённый интерфейс библиотеки, ветка, недостижимая по построению. Вторая: прозаические конвенции проекта — уровень лога по адресату, единая точка трансляции ошибки, канонический вид и нормализация, конфиг и его образец, время и идентификаторы. Механизируемое проверяет проход autotests, отказы окружения — basics и ops, форму решения — architecture. Только чтение."
|
||||||
tools: Read, Grep, Glob, Bash
|
tools: Read, Grep, Glob, Bash
|
||||||
model: opus
|
model: opus
|
||||||
color: yellow
|
color: yellow
|
||||||
@@ -167,7 +167,7 @@ color: yellow
|
|||||||
|
|
||||||
## Чем ты НЕ занимаешься
|
## Чем ты НЕ занимаешься
|
||||||
|
|
||||||
- механизируемое (форматирование, запрещённые вызовы, импорты) — `review-gate`;
|
- механизируемое (форматирование, запрещённые вызовы, импорты) — `review-autotests`;
|
||||||
- построенный путь недоверенного входа — `review-adversary` (тема `security`);
|
- построенный путь недоверенного входа — `review-adversary` (тема `security`);
|
||||||
- отказ соседа, рост объёма, наблюдаемость, откат — `review-basics`, в `wide`
|
- отказ соседа, рост объёма, наблюдаемость, откат — `review-basics`, в `wide`
|
||||||
`review-ops` (тема `operations`);
|
`review-ops` (тема `operations`);
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ color: green
|
|||||||
| Тема | `quick` | `standard` | `wide` |
|
| Тема | `quick` | `standard` | `wide` |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| `requirements` | `specs` | `specs` | `specs` |
|
| `requirements` | `specs` | `specs` | `specs` |
|
||||||
| `autotests` | `gate` | `gate` | `gate` |
|
| `autotests` | `autotests` | `autotests` | `autotests` |
|
||||||
| `conventions` | `code` | `code` | `code` |
|
| `conventions` | `code` | `code` | `code` |
|
||||||
| `architecture` | `basics`, сверка | `basics`, разбор | `architecture` |
|
| `architecture` | `basics`, сверка | `basics`, разбор | `architecture` |
|
||||||
| `security` | `basics`, сверка | `basics`, разбор | `adversary` |
|
| `security` | `basics`, сверка | `basics`, разбор | `adversary` |
|
||||||
@@ -177,7 +177,7 @@ color: green
|
|||||||
|
|
||||||
тема дом глубина закрывает
|
тема дом глубина закрывает
|
||||||
requirements openspec/changes/<id>/specs/ сверка specs
|
requirements openspec/changes/<id>/specs/ сверка specs
|
||||||
autotests CLAUDE.md, семантика гейта — gate
|
autotests CLAUDE.md, семантика гейта — autotests
|
||||||
conventions docs/conventions/ сверка code
|
conventions docs/conventions/ сверка code
|
||||||
architecture docs/architecture.md, adr/ разбор basics
|
architecture docs/architecture.md, adr/ разбор basics
|
||||||
security docs/security.md разбор 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 | дорога ошибка — ложная либо пропущенная |
|
| `opus` | yellow | specs, code, basics, adversary, rubric, architecture, triage | дорога ошибка — ложная либо пропущенная |
|
||||||
|
|
||||||
**Цвет charter'а кодирует модель, а не роль прохода.** Это единственное
|
**Цвет charter'а кодирует модель, а не роль прохода.** Это единственное
|
||||||
@@ -210,7 +210,7 @@ charter'а, а модель потом двигает калибровка, и
|
|||||||
| Тема | `quick` | `standard` | `wide` |
|
| Тема | `quick` | `standard` | `wide` |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| `requirements` | `specs` | `specs` | `specs` |
|
| `requirements` | `specs` | `specs` | `specs` |
|
||||||
| `autotests` | `gate` | `gate` | `gate` |
|
| `autotests` | `autotests` | `autotests` | `autotests` |
|
||||||
| `conventions` | `code` | `code` | `code` |
|
| `conventions` | `code` | `code` | `code` |
|
||||||
| `architecture` | `basics`, сверка | `basics`, разбор | `architecture`, доказательство |
|
| `architecture` | `basics`, сверка | `basics`, разбор | `architecture`, доказательство |
|
||||||
| `security` | `basics`, сверка | `basics`, разбор | `adversary`, доказательство |
|
| `security` | `basics`, сверка | `basics`, разбор | `adversary`, доказательство |
|
||||||
@@ -352,7 +352,7 @@ charter'а, а модель потом двигает калибровка, и
|
|||||||
```mermaid
|
```mermaid
|
||||||
flowchart TD
|
flowchart TD
|
||||||
scope["scope — разметка<br/>(стадия 0, темы и ступень)"]
|
scope["scope — разметка<br/>(стадия 0, темы и ступень)"]
|
||||||
gate["gate<br/>(стадия 1, держит машину)"]
|
autotests["autotests<br/>(стадия 1, держит машину)"]
|
||||||
specs["specs"]
|
specs["specs"]
|
||||||
code["code"]
|
code["code"]
|
||||||
basics["basics<br/>(quick, standard: темы;<br/>wide: только свои темы проекта)"]
|
basics["basics<br/>(quick, standard: темы;<br/>wide: только свои темы проекта)"]
|
||||||
@@ -361,13 +361,13 @@ flowchart TD
|
|||||||
architecture["architecture<br/>(wide)"]
|
architecture["architecture<br/>(wide)"]
|
||||||
triage["triage — единственный сток"]
|
triage["triage — единственный сток"]
|
||||||
|
|
||||||
scope -->|план| gate
|
scope -->|план| autotests
|
||||||
gate -->|зелёный| specs
|
autotests -->|зелёный| specs
|
||||||
gate -->|зелёный| code
|
autotests -->|зелёный| code
|
||||||
gate -->|"зелёный, темы по плану"| basics
|
autotests -->|"зелёный, темы по плану"| basics
|
||||||
gate -->|"зелёный, wide"| adversary
|
autotests -->|"зелёный, wide"| adversary
|
||||||
gate -->|"зелёный, wide"| ops
|
autotests -->|"зелёный, wide"| ops
|
||||||
gate -->|"зелёный, wide"| architecture
|
autotests -->|"зелёный, wide"| architecture
|
||||||
adversary -. один ресурс — машина .- ops
|
adversary -. один ресурс — машина .- ops
|
||||||
specs --> triage
|
specs --> triage
|
||||||
code --> triage
|
code --> triage
|
||||||
@@ -405,7 +405,7 @@ flowchart TD
|
|||||||
|
|
||||||
| Проход | Держит машину | Почему |
|
| Проход | Держит машину | Почему |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `gate` | да | запускает инструменты проекта — но он источник графа и один по построению |
|
| `autotests` | да | запускает инструменты проекта — но он источник графа и один по построению |
|
||||||
| `adversary` | да | находка есть **построенный путь**: он пишет падающий тест и гоняет его |
|
| `adversary` | да | находка есть **построенный путь**: он пишет падающий тест и гоняет его |
|
||||||
| `ops` | да | доказывает числами: время удержания блокировки, пик кучи, темп роста журнала |
|
| `ops` | да | доказывает числами: время удержания блокировки, пик кучи, темп роста журнала |
|
||||||
| `triage` | да | проверяет оракул `critical`/`major` запуском — но он сток и тоже один |
|
| `triage` | да | проверяет оракул `critical`/`major` запуском — но он сток и тоже один |
|
||||||
@@ -489,10 +489,16 @@ flowchart TD
|
|||||||
одинаково**, но обоснование обязательно в обоих случаях и всегда — строкой, какой
|
одинаково**, но обоснование обязательно в обоих случаях и всегда — строкой, какой
|
||||||
признак сработал и по какому факту.
|
признак сработал и по какому факту.
|
||||||
|
|
||||||
## Стадия 1 — Gate (обязательна во всех профилях)
|
## Стадия 1 — Автотесты (обязательна во всех профилях)
|
||||||
|
|
||||||
Агент `review-gate`. Закрывает тему `autotests`. Запускает команду гейта из
|
Агент `review-autotests`, тема `autotests`. Запускает команду гейта из семантики
|
||||||
семантики гейта в `CLAUDE.md` и интерпретирует вывод.
|
гейта в `CLAUDE.md` и интерпретирует вывод.
|
||||||
|
|
||||||
|
**Тема и проход названы одинаково намеренно, а «гейт» осталось именем команды.**
|
||||||
|
Раньше тема звалась `autotests`, а проход — `gate`: одна сущность под двумя
|
||||||
|
именами, и вопрос проекта, адресованный одному имени, к другому не приезжал.
|
||||||
|
Слово «гейт» теперь значит ровно одно — барьер, который проект запускает; тема
|
||||||
|
шире него ровно на «чего в гейте намеренно нет».
|
||||||
|
|
||||||
**Пока гейт красный — опиниативные проходы не запускаются.** Оркестратор чинит и
|
**Пока гейт красный — опиниативные проходы не запускаются.** Оркестратор чинит и
|
||||||
перезапускает гейт. Исключение одно: отказ, унаследованный от базовой ветки
|
перезапускает гейт. Исключение одно: отказ, унаследованный от базовой ветки
|
||||||
@@ -564,7 +570,7 @@ Recall темы `conventions` равен длине конвенций прое
|
|||||||
|
|
||||||
**Он покрывает миграцию и публичный контракт на нижних ступенях.** Это не
|
**Он покрывает миграцию и публичный контракт на нижних ступенях.** Это не
|
||||||
побочный эффект, а условие, при котором миграция схемы вообще может не поднимать
|
побочный эффект, а условие, при котором миграция схемы вообще может не поднимать
|
||||||
ступень: её шаг гоняет `gate`, спеку сверяет `specs`, а вопросы «обратима ли» и
|
ступень: её шаг гоняет `autotests`, спеку сверяет `specs`, а вопросы «обратима ли» и
|
||||||
«что с записями новой версии после отката» задаёт здесь `basics`, темой
|
«что с записями новой версии после отката» задаёт здесь `basics`, темой
|
||||||
`operations`. Уберёшь его — и нижние ступени останутся без единственного прохода,
|
`operations`. Уберёшь его — и нижние ступени останутся без единственного прохода,
|
||||||
который смотрит на ось времени.
|
который смотрит на ось времени.
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ stateDiagram-v2
|
|||||||
| Проход | Класс дефекта для инъекции | Заготовка пробы |
|
| Проход | Класс дефекта для инъекции | Заготовка пробы |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `review-scope` | пропущенная тема | положить в `docs/` новый документ и проверить, попал ли он в план темой |
|
| `review-scope` | пропущенная тема | положить в `docs/` новый документ и проверить, попал ли он в план темой |
|
||||||
| `review-gate` | отсутствующая верификация | убрать тест на изменённую ветку, оставить код рабочим |
|
| `review-autotests` | отсутствующая верификация | убрать тест на изменённую ветку, оставить код рабочим |
|
||||||
| `review-specs` | поведение вне спеки | добавить незаказанный фолбэк-дефолт на пустом входе |
|
| `review-specs` | поведение вне спеки | добавить незаказанный фолбэк-дефолт на пустом входе |
|
||||||
| `review-code` | нарушение прозаической конвенции | увести штатный отказ мимо единой точки трансляции ошибки |
|
| `review-code` | нарушение прозаической конвенции | увести штатный отказ мимо единой точки трансляции ошибки |
|
||||||
| `review-code` | технический дефект | не проверить возвращённую ошибку в ветке раннего возврата |
|
| `review-code` | технический дефект | не проверить возвращённую ошибку в ветке раннего возврата |
|
||||||
|
|||||||
Reference in New Issue
Block a user