ревью: ступень wide, цвета по модели, проверка фронтматтеров
Прыжок standard → deep стоил самого дорогого прохода конвейера, а платить приходилось за одну архитектурную находку: изменений, которые трогают публичный контракт, но не вводят нового правила слияния, — большинство. Ступень wide это standard плюс architecture (вход шире диффа, отсюда имя), семь проходов против восьми. Заодно вычистилась давняя неровность: триггер reimpl стоял внутри deep, и профиль означал то семь проходов, то восемь — реестр состава, который «сверяется взглядом до коммита», проверять было нечем. Теперь условие «новое правило идентичности, слияния или разбора» выбирает профиль, reimpl в deep безусловен и есть единственное отличие от wide. Барьер стоимости остался только в deep: в wide за ним стоял бы один дешёвый проход с потолком в 3 находки, а барьер сериализует то, что могло идти разом. Цвет charter'а теперь кодирует модель, а не роль: sonnet → green, opus → yellow, fable → red. Роль видна из имени, стоимость прогона — ниоткуда, а список агентов читается взглядом. scripts/frontmatter.py ловит три класса ошибок, невидимых при чтении: - двоеточие с пробелом в незакавыченном описании — для YAML это вложенное отображение, а не текст. Так было написано три описания из четырнадцати, и читались они правильно; - name, разошедшееся с именем каталога скилла или файла charter'а; - цвет, не отвечающий модели: он ставится один раз при заведении charter'а, а модель потом двигает калибровка. Обе ветки проверены, коды выхода — общий словарь. Триггеры профиля в canon.md и skeletons.md подтянуты под wide. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: review-pipeline
|
||||
description: Конвейер ревью изменения — детерминированный гейт, сверка с дельта-спеками в обе стороны, враждебные постановки и эксплуатационный постмортем, независимая реализация по триггеру, архитектура и обязательный триаж. Порядок прогона — граф зависимостей, а не очередь: гейт открывает опиниативные проходы, проходы с пометкой «держит машину» идут цепочкой, дорогие generative-проходы стоят за барьером стоимости, триаж — единственный сток. Линейный прогон — по слову оператора или на занятой машине. Проектная специфика приходит из документов канона av-dev-pm. Вызывается из task-pipeline (чекпоинты ревью), из task-batch (финальная сверка) и отдельно — профилем design на предложении ДО кода.
|
||||
description: "Конвейер ревью изменения — детерминированный гейт, сверка с дельта-спеками в обе стороны, враждебные постановки и эксплуатационный постмортем, архитектурный проход, независимая реализация в верхнем профиле и обязательный триаж. Четыре ступени стоимости: quick, standard, wide, deep. Порядок прогона — граф зависимостей, а не очередь: гейт открывает опиниативные проходы, проходы с пометкой «держит машину» идут цепочкой, независимая реализация стоит за барьером стоимости, триаж — единственный сток. Линейный прогон — по слову оператора или на занятой машине. Проектная специфика приходит из документов канона av-dev-pm. Вызывается из task-pipeline (чекпоинты ревью), из task-batch (финальная сверка) и отдельно — профилем design на предложении ДО кода."
|
||||
---
|
||||
|
||||
# Конвейер ревью
|
||||
@@ -103,11 +103,18 @@ description: Конвейер ревью изменения — детермин
|
||||
тем дешевле может быть модель; чем больше проход **порождает** критерий, тем
|
||||
дороже. Модель задана во frontmatter каждого агента, менять её здесь не нужно.
|
||||
|
||||
| Модель | Проходы | Почему |
|
||||
|---|---|---|
|
||||
| `sonnet` | gate, code, ops | вход структурный, критерий записан заранее |
|
||||
| `opus` | specs, adversary, rubric, reimpl | суждение без опоры на инструмент |
|
||||
| `fable` | triage, architecture | ошибка распространяется дальше самой находки |
|
||||
| Модель | Цвет | Проходы | Почему |
|
||||
|---|---|---|---|
|
||||
| `sonnet` | green | gate, code, ops | вход структурный, критерий записан заранее |
|
||||
| `opus` | yellow | specs, adversary, rubric, reimpl | суждение без опоры на инструмент |
|
||||
| `fable` | red | triage, architecture | ошибка распространяется дальше самой находки |
|
||||
|
||||
**Цвет charter'а кодирует модель, а не роль прохода.** Это единственное
|
||||
назначение цвета: список агентов читается взглядом, и по нему сразу видно, чем
|
||||
платит прогон. Роль прохода из имени и так понятна, а цвет, розданный по ролям,
|
||||
не отвечает ни на один вопрос, который задают во время прогона. Раскладка живёт
|
||||
здесь и **проверяется механически** — цвет ставится один раз при заведении
|
||||
charter'а, а модель потом двигает калибровка, и разъезжаются они молча.
|
||||
|
||||
**Самая дорогая модель — только двум проходам, и это калибровка, а не
|
||||
осторожность.** Замер: на первом же прогоне конвейера самые ценные находки дали
|
||||
@@ -122,9 +129,9 @@ description: Конвейер ревью изменения — детермин
|
||||
- `triage` — через него проходит всё, что оркестратор реализует **молча**:
|
||||
ложноположительная находка становится кодом, потерянный `critical` — дефектом.
|
||||
Ошибка триажа дороже ошибки любого отдельного прохода.
|
||||
- `architecture` — запускается редко (только `deep` и `design`), потолок в
|
||||
3 находки делает его дешёвым по выходу, а находка на предложении стоит абзаца
|
||||
против переписывания на готовом коде. Дёшево × высокое плечо.
|
||||
- `architecture` — запускается не на каждой задаче (`wide`, `deep` и `design`),
|
||||
потолок в 3 находки делает его дешёвым по выходу, а находка на предложении
|
||||
стоит абзаца против переписывания на готовом коде. Дёшево × высокое плечо.
|
||||
|
||||
`reimpl` намеренно **не** в этом списке, хотя он самый ценный из generative: его
|
||||
стоимость определяется объёмом вывода (он пишет реализацию целиком), так что
|
||||
@@ -139,8 +146,8 @@ description: Конвейер ревью изменения — детермин
|
||||
Дешёвому проходу просто не осталось работы.
|
||||
|
||||
Экономия достигается не понижением модели, а **непуском прохода**: `quick` —
|
||||
четыре прохода, `deep` — семь-восемь. Правило выбора профиля и есть главный
|
||||
рычаг стоимости.
|
||||
четыре прохода, `deep` — восемь. Правило выбора профиля и есть главный
|
||||
рычаг стоимости, и ступеней у него четыре именно поэтому.
|
||||
|
||||
## Профили
|
||||
|
||||
@@ -148,10 +155,18 @@ description: Конвейер ревью изменения — детермин
|
||||
|---|---|---|---|
|
||||
| `quick` | багфикс, локальная правка, доки | 0, 1, 5 | 4 |
|
||||
| `standard` | новая функциональность в существующем пакете | 0, 1, 2, 5 | 6 |
|
||||
| `deep` | новый пакет, изменение публичного контракта, миграция схемы, трогает инварианты проекта | 0, 1, 2, 3, 4, 5 | 7–8 |
|
||||
| `wide` | новый пакет, изменение публичного контракта, миграция схемы, трогает инварианты проекта | 0, 1, 2, 4, 5 | 7 |
|
||||
| `deep` | изменение вводит новое правило идентичности, слияния или разбора | 0, 1, 2, 3, 4, 5 | 8 |
|
||||
| `design` | **до кода**, на предложении | specs + rubric + architecture (см. ниже) | 3 |
|
||||
|
||||
**Состав сверяется по этой таблице до коммита.** Реестр из трёх-восьми пунктов
|
||||
**`wide` назван по тому, что он добавляет: вход шире диффа.** Единственное его
|
||||
отличие от `standard` — архитектурный проход, а тот и получает дерево пакетов,
|
||||
граф зависимостей и инвентарь понятий вместо одного диффа. Ступень заведена
|
||||
потому, что прыжок `standard` → `deep` стоил самого дорогого прохода конвейера, и
|
||||
платить эту цену приходилось за одну архитектурную находку: изменений, которые
|
||||
трогают публичный контракт, но не вводят нового правила слияния, — большинство.
|
||||
|
||||
**Состав сверяется по этой таблице до коммита.** Реестр из трёх-восьми проходов
|
||||
проверяется взглядом — и это единственная защита от промаха, который уже
|
||||
случился: пропуск прохода **не отличим от прохода без находок** (гейт зелёный,
|
||||
спеки сошлись, отчёт выглядит полным), а заметить его мог бы только триаж,
|
||||
@@ -162,16 +177,24 @@ description: Конвейер ревью изменения — детермин
|
||||
|
||||
Правило выбора профиля — **по факту изменения, не по ощущению важности**:
|
||||
|
||||
- есть миграция схемы, новый пакет, изменение публичного контракта (API,
|
||||
протокол, формат на диске) или трогается правило, определяющее идентичность и
|
||||
слияние данных → `deep`;
|
||||
- трогается правило, определяющее **идентичность, слияние или разбор** данных →
|
||||
`deep`;
|
||||
- иначе есть миграция схемы, новый пакет, изменение публичного контракта (API,
|
||||
протокол, формат на диске) или затронут инвариант проекта → `wide`;
|
||||
- иначе меняется поведение, видимое снаружи (эндпоинт, форма ответа, код ответа,
|
||||
формат лога) → `standard`;
|
||||
- иначе → `quick`.
|
||||
|
||||
Что именно в этом проекте считается публичным контрактом и какие пути означают
|
||||
`deep`, проект может уточнить в `docs/review.md`, разделе настройки конвейера. Это
|
||||
**уточнение**, а не отмена: не записано — работает список выше.
|
||||
**Верхняя ступень и есть триггер независимой реализации** — раньше он был
|
||||
условием *внутри* `deep`, и профиль от этого распадался на два разных прогона под
|
||||
одним именем. Условие никуда не делось, оно просто переехало туда, где выбирается
|
||||
профиль: изменение с новым правилом слияния — единственный случай, когда триаж
|
||||
называл отсутствие `reimpl` дырой покрытия.
|
||||
|
||||
Что именно в этом проекте считается публичным контрактом, какие пути означают
|
||||
`wide` и что здесь считается правилом идентичности, проект может уточнить в
|
||||
`docs/review.md`, разделе настройки конвейера. Это **уточнение**, а не отмена: не
|
||||
записано — работает список выше.
|
||||
|
||||
Профиль объявляется в отчёте. Понижение профиля — решение оркестратора, и оно
|
||||
попадает в границы покрытия строкой «профиль понижен до X, потому что …».
|
||||
@@ -200,23 +223,23 @@ flowchart TD
|
||||
code["code"]
|
||||
adversary["adversary<br/>(держит машину)"]
|
||||
ops["ops<br/>(держит машину)"]
|
||||
architecture["architecture<br/>(wide, deep)"]
|
||||
barrier{{"форма изменения выживает?"}}
|
||||
reimpl["reimpl<br/>(по триггеру)"]
|
||||
architecture["architecture"]
|
||||
reimpl["reimpl"]
|
||||
triage["triage — единственный сток"]
|
||||
|
||||
gate -->|зелёный| specs
|
||||
gate -->|зелёный| code
|
||||
gate -->|зелёный| adversary
|
||||
gate -->|зелёный| ops
|
||||
gate -->|"зелёный, wide и deep"| architecture
|
||||
adversary -. один ресурс — машина .- ops
|
||||
specs --> barrier
|
||||
code --> barrier
|
||||
adversary --> barrier
|
||||
ops --> barrier
|
||||
barrier -->|"deep"| reimpl
|
||||
barrier -->|"deep"| architecture
|
||||
barrier -->|"quick, standard: барьера нет"| triage
|
||||
barrier -->|"quick, standard, wide: барьера нет"| triage
|
||||
reimpl --> triage
|
||||
architecture --> triage
|
||||
```
|
||||
@@ -224,7 +247,8 @@ flowchart TD
|
||||
Читается граф так: **всё, у чего входящие рёбра закрыты, уходит одним
|
||||
сообщением**. В `standard` после зелёного гейта это три узла разом — `specs`,
|
||||
`code` и первый из меряющей пары, — а второй меряющий идёт следом за первым. В
|
||||
`quick` — `specs` и `code` разом, и сразу триаж.
|
||||
`wide` к этой тройке добавляется четвёртым `architecture`. В `quick` — `specs` и
|
||||
`code` разом, и сразу триаж.
|
||||
|
||||
**Схема здесь старше прозы.** Она не иллюстрация к тексту, а сам алгоритм
|
||||
планировщика; проза ниже объясняет рёбра и называет их цену. Разошлись — прав
|
||||
@@ -269,12 +293,11 @@ flowchart TD
|
||||
### Барьер стоимости — вместо раннего выхода
|
||||
|
||||
Барьер существует ровно там, где ранний выход зарабатывал: `reimpl` пишет
|
||||
реализацию целиком и потому самый дорогой проход конвейера, `architecture`
|
||||
смотрит вход шире диффа. Если дешёвая часть нашла, что **форму изменения** надо
|
||||
переделывать, оба будут читать код, которого через час не станет.
|
||||
реализацию целиком и потому самый дорогой проход конвейера. Если дешёвая часть
|
||||
нашла, что **форму изменения** надо переделывать, он будет писать её против кода,
|
||||
которого через час не станет.
|
||||
|
||||
- **прошло без находок «переделать форму»** — барьер открыт, дорогие проходы
|
||||
уходят разом;
|
||||
- **прошло без находок «переделать форму»** — барьер открыт, `reimpl` уходит;
|
||||
- **есть такая находка** — прогон останавливается, находка чинится, конвейер
|
||||
запускается **заново с нулевой стадии**, а не «доезжает» остатком по старому
|
||||
коду. Незапущенные проходы идут в границы покрытия строкой «не запускался:
|
||||
@@ -285,8 +308,16 @@ flowchart TD
|
||||
барьер не срабатывает: дешевле дособрать все находки и починить пачкой, чем
|
||||
гонять конвейер дважды.
|
||||
|
||||
В `quick` и `standard` барьера нет — за ним нечего защищать: стадий 3–4 в этих
|
||||
профилях не бывает, и граф там плоский от гейта до триажа. Находка «переделать
|
||||
**`architecture` стоит за барьером только там, где барьер и так есть.** В `deep`
|
||||
он уходит вместе с `reimpl` — ждать ему всё равно нечего. В `wide` он стартует
|
||||
сразу после зелёного гейта, в одном ряду со стадиями 1 и 2: своего барьера он не
|
||||
заслуживает. Потолок в 3 находки делает его дешёвым, а барьер не бесплатен — он
|
||||
сериализует то, что могло идти разом, и платить сериализацией за один дешёвый
|
||||
проход не за что. Есть и вторая причина, помельче: барьер спрашивает «выживает ли
|
||||
форма изменения», а `architecture` — как раз тот, кто на этот вопрос отвечает.
|
||||
|
||||
В `quick`, `standard` и `wide` барьера нет — за ним нечего защищать: стадии 3 в
|
||||
этих профилях не бывает, и граф там плоский от гейта до триажа. Находка «переделать
|
||||
форму» ловится в них триажем, а прогон после починки повторяется целиком: платить
|
||||
за это нечем, дорогих проходов в этих профилях нет. В `design` его тоже
|
||||
нет, и по другой причине: там предметом и является форма, а все три прохода
|
||||
@@ -352,7 +383,7 @@ flowchart TD
|
||||
Recall обоих равен длине их источника — это и есть предел applicative-проходов,
|
||||
ради которого существует стадия 2.
|
||||
|
||||
## Стадия 2 — Adversarial и operational (`standard`, `deep`)
|
||||
## Стадия 2 — Adversarial и operational (`standard`, `wide`, `deep`)
|
||||
|
||||
Два прохода:
|
||||
|
||||
@@ -368,8 +399,8 @@ Recall обоих равен длине их источника — это и е
|
||||
её только прямое слово оператора про эту пару, и тогда в границы покрытия идёт
|
||||
строка, что числа прогона сняты под соседней нагрузкой.
|
||||
|
||||
**Эта стадия зарабатывает больше всех остальных вместе, и потому стоит в
|
||||
`standard`, а не только в `deep`.** Измерено на пяти задачах подряд: враждебный
|
||||
**Эта стадия зарабатывает больше всех остальных вместе, и потому стоит уже в
|
||||
`standard`, а не только в верхних профилях.** Измерено на пяти задачах подряд: враждебный
|
||||
проход дал пять из семи выживших находок дозапуска (включая обе верхние);
|
||||
эксплуатационный — единственный, кто нашёл, что откат бинаря поверх новой схемы
|
||||
стартует молча. Оба несут внешний оракул по построению: один обязан путь
|
||||
@@ -382,26 +413,32 @@ Recall обоих равен длине их источника — это и е
|
||||
раздел «Сшивать обязаны проходы». Без этих документов стадия вырождается в общие
|
||||
места.
|
||||
|
||||
## Стадия 3 — Independent reimplementation (`deep`, по триггеру)
|
||||
## Стадия 3 — Independent reimplementation (только `deep`)
|
||||
|
||||
Стоит **за барьером стоимости** вместе со стадией 4 — она ради этих двух проходов
|
||||
и существует.
|
||||
Единственный проход, ради которого существует **барьер стоимости**, и
|
||||
единственное, что отличает `deep` от `wide`.
|
||||
|
||||
- `review-reimpl` — пишет свою реализацию, не открывая существующую, затем
|
||||
диффит по решениям. **Запускается по триггеру, а не всегда:** изменение вводит
|
||||
новое правило идентичности, слияния или разбора (проектная формулировка
|
||||
триггера — в `docs/review.md`, если записана). Это самый дорогой проход конвейера
|
||||
(его счёт определяется объёмом вывода — он пишет реализацию целиком), а вне
|
||||
этого триггера независимый взгляд в значительной мере уже дал профиль `design`:
|
||||
код писался под его находки. Триггер выбран по факту: единственный раз, когда
|
||||
триаж назвал отсутствие `reimpl` дырой покрытия, — это была задача с новым
|
||||
правилом слияния сущностей.
|
||||
диффит по решениям. **Профиль и есть его условие:** `deep` выбирается ровно
|
||||
тогда, когда изменение вводит новое правило идентичности, слияния или разбора
|
||||
(проектная формулировка — в `docs/review.md`, если записана). Это самый дорогой
|
||||
проход конвейера (его счёт определяется объёмом вывода — он пишет реализацию
|
||||
целиком), а вне этого случая независимый взгляд в значительной мере уже дал
|
||||
профиль `design`: код писался под его находки. Условие выбрано по факту:
|
||||
единственный раз, когда триаж назвал отсутствие `reimpl` дырой покрытия, — это
|
||||
была задача с новым правилом слияния сущностей.
|
||||
|
||||
## Стадия 4 — Global (`deep`, `design`)
|
||||
Раньше это условие стояло **внутри** профиля, и `deep` означал то семь проходов,
|
||||
то восемь. Реестр состава, который «проверяется взглядом», проверять было нечем:
|
||||
у профиля не было одного правильного ответа. Теперь ступеней две — `wide` и
|
||||
`deep`, — и у каждой состав ровно один.
|
||||
|
||||
Агент `review-architecture`. В `deep` стоит **за барьером стоимости**, в `design`
|
||||
— в одном ряду с двумя другими проходами. Машину не держит, с `reimpl` конфликта
|
||||
не имеет: за барьером они уходят разом.
|
||||
## Стадия 4 — Global (`wide`, `deep`, `design`)
|
||||
|
||||
Агент `review-architecture`. В `deep` стоит **за барьером стоимости** (ждать ему
|
||||
там всё равно нечего), в `wide` и `design` — в первой волне, сразу после старта
|
||||
профиля. Машину не держит, с `reimpl` конфликта не имеет: за барьером они уходят
|
||||
разом.
|
||||
|
||||
Получает **вход шире диффа**: дерево пакетов с
|
||||
назначением, граф внутренних зависимостей, инвентарь существующих концепций.
|
||||
|
||||
Reference in New Issue
Block a user