раскладка av-dev повышена с канона 12 до версии 5
- три плагина слились в один `av-dev`: служебные `docs/.docs.json` и `tasks/.tasks.json` заменены на `.av-dev.toml` в корне, в гейте переехали пути трёх скриптов, вызовы скиллов переименованы по всему репозиторию - тип задачи `goal` и `ROADMAP.md` упразднены: семь целей закрыты с причинами, теги сняты, объявлена стадия `support` - метка `small`/`medium`/`large` снята из процесса — вместо «Триггеров метки» в review.md подраздел «Когда звать глубокое ревью»; следом разобран урожай doc-consistency: девять фактов сведены к одному дому
This commit is contained in:
+56
-75
@@ -1,8 +1,8 @@
|
||||
# Ревью: настройка и журнал
|
||||
|
||||
Проектная часть конвейера ревью: чем jellybit отличается от абстрактного
|
||||
Go-сервиса и что здесь уже проскакивало. Устройство самого конвейера (метки,
|
||||
стадии, контракт находок) живёт в скилле, а не здесь.
|
||||
Go-сервиса и что здесь уже проскакивало. Устройство самого конвейера (состав
|
||||
проходов, стадии, контракт находок) живёт в скилле, а не здесь.
|
||||
|
||||
## Как настроен конвейер
|
||||
|
||||
@@ -135,8 +135,8 @@ Go-сервиса и что здесь уже проскакивало. Устр
|
||||
|
||||
### Вопросы по темам
|
||||
|
||||
Форма: `<тема>: <вопрос> (<провенанс>)`. Адресуется теме, а не имени прохода:
|
||||
проход переезжает между метками и упраздняется, тема переезд переживает. Задаёт
|
||||
Форма: `<тема>: <вопрос> (<откуда>)`. Адресуется теме, а не имени прохода:
|
||||
проход переезжает между скиллами и упраздняется, тема переезд переживает. Задаёт
|
||||
вопрос тот, кто закрывает тему на текущем прогоне.
|
||||
|
||||
- `security`: можно ли, управляя только именами файлов в раздаче и текстом
|
||||
@@ -179,8 +179,8 @@ Go-сервиса и что здесь уже проскакивало. Устр
|
||||
- `requirements`: не завелось ли поведение, которого спека не заказывала — тихий
|
||||
дефолт, проглоченная ошибка, ретрай «на всякий случай», отброшенное поле?
|
||||
- `security`: читается ли тело ответа внешнего сервиса целиком без предела —
|
||||
у LLM (8 MiB) и метабаз (4 MiB) предел стоит, и новый исходящий вызов обязан
|
||||
заводить свой ([security.md](security.md) → «Что вне модели»)
|
||||
у LLM и метабаз предел стоит ([database.md](database.md) → «Пределы, зашитые
|
||||
константой кода»), и новый исходящий вызов обязан заводить свой?
|
||||
- `operations`: гарантия, которую вводит изменение, поставлена на запись или на
|
||||
чтение — и что будет с данными, записанными до деплоя, которые обычный путь
|
||||
не перезаписывает? (журнал, 2026-08-10: чистка названия стояла на записи, и
|
||||
@@ -201,75 +201,50 @@ Go-сервиса и что здесь уже проскакивало. Устр
|
||||
логика целевых имён мимо `naming`?
|
||||
([architecture.md](architecture.md) → «Единые точки проекта»)
|
||||
|
||||
### Триггеры метки
|
||||
### Когда звать глубокое ревью
|
||||
|
||||
Уточняет умолчания конвейера, не отменяет их. Рабочее умолчание — `medium`;
|
||||
миграция схемы и публичный контракт метку **не** поднимают: их проверяют
|
||||
проходы, которые в `medium` и так есть. Списка три: два поднимают до `large`,
|
||||
по одному на ось, третий опускает до `small`.
|
||||
Цикл задачи проверяет корректность и механику одним и тем же составом на всякой
|
||||
задаче. Глубину даёт только отдельный прогон по области —
|
||||
`av-dev:code-deep-review`, — и **зовёт его человек**. Списки ниже уточняют
|
||||
признаки, по которым его здесь зовут, а не заводят расписание.
|
||||
|
||||
**Крупное здесь** — про объём, сколько узлов и слоёв трогает изменение:
|
||||
**Области, которые смотрят целиком:**
|
||||
|
||||
- перенос ответственности между `worker`, `recognition`, `layout` и `store`;
|
||||
- новое состояние в графе переходов загрузки: оно тянет за собой воркер, спеку,
|
||||
отображение в веб-UI и боте и восстановление после рестарта;
|
||||
- правка, идущая насквозь по цепочке приём → распознавание → раскладка;
|
||||
- новый провайдер метабазы за существующим интерфейсом: клиент, поле конфига с
|
||||
образцом, слияние полей кандидата, ветка «провайдера нет».
|
||||
- **правила идентичности, слияния и разбора** — ключ владения раздачей и сверка
|
||||
с qBittorrent (`ident`, `internal/store`, `state-reconciliation`); построение
|
||||
целевых путей и санитизация имён (`internal/layout`, `naming`); разбор
|
||||
недоверенного входа — bencode, magnet, текст контекста, ответ LLM
|
||||
(`internal/torrent`, `internal/magnet`, `internal/tgbot/parse.go`); слияние
|
||||
кандидата метабазы и победитель при конфликте (`internal/metadata`,
|
||||
`metadata-match`). Сюда задачи возвращаются чаще всего: у одного правила здесь
|
||||
несколько домов, и правка одного из них молча расходится с остальными.
|
||||
- **удаление раздачи с файлами** — история инцидентов самая длинная: уборка
|
||||
своего торрента после отмены сносила чужие файлы (журнал, 2026-08-06), три
|
||||
дефекта поштучного удаления жили незамеченными до появления пачки и ещё
|
||||
четыре нашлись на групповой поверхности (журнал, 2026-08-10).
|
||||
- **граф состояний загрузки и восстановление после рестарта** — новое состояние
|
||||
тянет за собой воркер, спеку, отображение в веб-UI и боте; расхождение видно
|
||||
не на диффе, а на живом сервере.
|
||||
- **код под дорогое решение** — то, на что обопрётся ADR или новая capability:
|
||||
форму здесь нащупывают по ходу, и цена ошибки не в правке, а в переписывании
|
||||
решения.
|
||||
|
||||
**Незнакомое здесь** — про форму решения, которую предстоит нащупать по ходу:
|
||||
**Необратимое здесь** — **места кода**, которые после мерджа не откатываются
|
||||
обратной правкой. Находка в таком месте уходит человеку развилкой, а не чинится
|
||||
молча. Перечень **операций**, которые спрашиваются у человека всегда, — другой
|
||||
вопрос и другой дом: [CLAUDE.md](../CLAUDE.md) → «Работа» → «Необратимое».
|
||||
|
||||
- новый пакет `internal/*` или новая capability в `openspec/specs/`;
|
||||
- новый транспорт приёма или уведомлений рядом с REST, веб-UI, ботом и CLI;
|
||||
- заводится или меняется **правило идентичности, слияния или разбора**: ключ
|
||||
владения раздачей и сверка с qBittorrent (`ident`, `internal/store`,
|
||||
`state-reconciliation`); построение целевых путей и санитизация имён
|
||||
(`internal/layout`, `naming`); новый вид входа или новая ветка неоднозначности
|
||||
у разбора недоверенного — bencode, magnet, текст контекста, ответ LLM
|
||||
(`internal/torrent`, `internal/magnet`, `internal/tgbot/parse.go`); новый
|
||||
источник или новый победитель при конфликте в слиянии кандидата метабазы
|
||||
(`internal/metadata`, `metadata-match`); merge-раскладка при повторном
|
||||
добавлении раздачи.
|
||||
|
||||
- **новая поверхность поверх необратимой операции** — вторая точка входа в
|
||||
команду, которая удаляет файлы или снимает последнюю копию. Форма решения
|
||||
здесь нащупывается по ходу: подтверждение, порядок отказов, остаток,
|
||||
наблюдаемость. Выведено по факту на `bulk-delete-page` (журнал, 2026-08-10):
|
||||
метка `medium` не дала ни враждебного прохода, ни замера, а именно они нашли
|
||||
четыре дефекта класса «необратимо».
|
||||
|
||||
- «Поведение, видимое снаружи» здесь включает **тексты и карточки Telegram** —
|
||||
для единственного пользователя это и есть интерфейс.
|
||||
|
||||
**Место из перечня метку не поднимает — поднимает правило.** Перечни выше
|
||||
отвечают «здесь такие правила водятся», а не «любая правка здесь идёт в
|
||||
`large`». Метку поднимает то, что даёт работу новому проходу: заводится ключ
|
||||
сравнения или меняется его состав; у разбора появляется новый вид входа или
|
||||
новая ветка неоднозначности; в слияние добавляется источник или меняется
|
||||
победитель при конфликте.
|
||||
|
||||
**Мелкое здесь** — опускает до `small`. Перечень закрытый, каждый пункт
|
||||
проверяется взглядом на дифф и дельта-спеку, любое сработавшее держит метку
|
||||
внизу:
|
||||
|
||||
- **дельта-спека называет исход поимённо** — сценарий уже говорит, что даёт
|
||||
вырожденный вход, и решать в коде нечего;
|
||||
- **новых сценариев в дельта-спеке нет** — изменение уточняет уже описанное
|
||||
поведение, а не заказывает новое;
|
||||
- **правка сообщения, комментария, записи журнала, имени или теста** в узле из
|
||||
перечней выше;
|
||||
- **сужение уже существующей нормализации** без нового вида входа: вход остался
|
||||
тот же, изменился исход на одном его значении.
|
||||
|
||||
Отрицательный тест поверх перечня: что после мерджа не откатывается обратной
|
||||
правкой — миграция, формат на диске, публичный контракт, имя, — **не** `small`,
|
||||
каким бы маленьким ни был дифф.
|
||||
|
||||
**Ориентир частоты.** `medium` закрывает большинство задач, `large` рассчитана
|
||||
на 5–10% и приходится на крупную функциональность, а не на уборку: задача типа
|
||||
`chore` или `fix`, собранная из нитей прошлого ревью, идёт в `small` или
|
||||
`medium`, даже когда трогает файл из перечней выше. `large` чаще одной задачи из
|
||||
десяти означает ошибку в критерии, а не полосу сложных задач подряд.
|
||||
- **миграция схемы**, уже накатанная на боевую БД umbar;
|
||||
- **операции, снимающие данные** — `torrents/delete` с `deleteFiles=true` и
|
||||
снятие последней жёсткой ссылки: обе исключены из гарда сознательно, и второй
|
||||
точки входа в них не бывает дешёвой (журнал, 2026-08-10);
|
||||
- **раскладка в библиотеке Jellyfin** — переименование или перезапись файла,
|
||||
на который уже смотрят клиенты и закладки;
|
||||
- **публичный контракт** — форма ответа REST, имена полей конфига,
|
||||
идентификаторы в ссылках: их держат чужие потребители, и переименование
|
||||
расходится по базе;
|
||||
- **формат на диске** — раскладка `paths.movies`/`paths.series` и имена, по
|
||||
которым Jellyfin узнаёт тайтл.
|
||||
|
||||
### Недоступно проверке
|
||||
|
||||
@@ -283,7 +258,7 @@ Go-сервиса и что здесь уже проскакивало. Устр
|
||||
ссылки) на текущее поведение.
|
||||
- `architecture`: суждение «этой функциональности не должно существовать».
|
||||
- `requirements`: качество распознавания как таковое — правильно ли LLM
|
||||
определил фильм. Это вопрос тюнинга модели и промпта, а не ревью кода;
|
||||
определил фильм. Это вопрос настройки модели и промпта, а не ревью кода;
|
||||
размеченный корпус, по которому это можно было бы судить числом, решено не
|
||||
собирать (`tasks/REJECTED.md`, 2026-08-06).
|
||||
|
||||
@@ -299,10 +274,10 @@ Go-сервиса и что здесь уже проскакивало. Устр
|
||||
что уже есть в библиотеке»). **Различение «идиоматично против
|
||||
распространено» теперь не спрашивает никто.** Класс обратимый: портит форму
|
||||
кода, не данные. Пересмотр — задача `quality-review-agents`.
|
||||
- `security`, `operations`, `architecture`: на метках `small` и `medium` не
|
||||
проверяется ничто, требующее запуска, — построенных путей атаки, замеров и
|
||||
- `security`, `operations`, `architecture`: в цикле задачи не проверяется
|
||||
ничто, требующее запуска, — построенных путей атаки, замеров и
|
||||
эксплуатационного постмортема там нет по устройству конвейера. Их даёт только
|
||||
`large`, а она приходится на 5–10% задач.
|
||||
отдельный прогон `av-dev:code-deep-review`, который зовёт человек.
|
||||
|
||||
## Журнал дефектов
|
||||
|
||||
@@ -312,7 +287,7 @@ Go-сервиса и что здесь уже проскакивало. Устр
|
||||
|
||||
Форма:
|
||||
|
||||
<!-- копия: журнал-дефектов-форма из av-dev-pipeline/skills/review-pipeline/references/review-journal.md -->
|
||||
<!-- копия: журнал-дефектов-форма из av-dev/skills/code-review/references/review-journal.md -->
|
||||
## ГГГГ-ММ-ДД — <краткое последствие> [проскочил|пойман]
|
||||
|
||||
- **Где:** путь:строка либо «конвейер, а не код»
|
||||
@@ -351,6 +326,9 @@ Go-сервиса и что здесь уже проскакивало. Устр
|
||||
удержания общего замка воркера (`280.450631ms` при задержке соседа `300ms`)
|
||||
- **Что меняем:** в «Триггеры метки», ось «незнакомое», добавлен пункт про новую
|
||||
поверхность поверх необратимой операции
|
||||
- **Отменено 2026-09-02:** метка упразднена вместе с переходом на постоянный
|
||||
состав прогона. Признак живёт в «Когда звать глубокое ревью» → «Области,
|
||||
которые смотрят целиком»
|
||||
|
||||
## 2026-08-10 — три дефекта поштучного удаления жили незамеченными, пока рядом не появилась пачка [проскочил]
|
||||
|
||||
@@ -374,6 +352,9 @@ Go-сервиса и что здесь уже проскакивало. Устр
|
||||
- **Что меняем:** три записи в беклоге со ссылкой на оракулы; триггер метки
|
||||
дополнен (см. запись выше), чтобы следующая поверхность над необратимой
|
||||
операцией шла сразу с доказательными проходами
|
||||
- **Отменено 2026-09-02:** метки нет; вывод перенесён в «Когда звать глубокое
|
||||
ревью» — удаление раздачи с файлами названо там областью, которую смотрят
|
||||
целиком
|
||||
|
||||
## 2026-08-10 — тест остался зелёным навсегда, потому что проверял снятый атрибут [пойман]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user