раскладка av-dev поднята до версии 5: метка прогона ушла из процесса

- docs/review.md: подраздел «Триггеры метки» заменён на «Когда звать глубокое
  ревью» — областями кода и перечнем необратимых мест проекта
- дубли инвариантов и перечня необратимого сведены к ссылкам на CLAUDE.md, а в
  database.md убрано разошедшееся число мест правки колонки
- шапка раздела перестала называть самый поздний артефакт ревью: строка
  протухала каждым прогоном
This commit is contained in:
av
2026-08-23 20:11:48 +03:00
parent 404be2bdd5
commit 1385dd3f5d
3 changed files with 56 additions and 42 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
# Раскладка av-dev в этом проекте: версия и настройки проверок. # Раскладка av-dev в этом проекте: версия и настройки проверок.
# Файл ведут скиллы плагина, править руками можно — комментарии свои. # Файл ведут скиллы плагина, править руками можно — комментарии свои.
version = 4 # версия раскладки; обратной совместимости нет, есть «приведён» и «нет» version = 5 # версия раскладки; обратной совместимости нет, есть «приведён» и «нет»
[docs] [docs]
# каталог миграций: по нему docs.py сверяет схему с database.md # каталог миграций: по нему docs.py сверяет схему с database.md
+3 -4
View File
@@ -362,10 +362,9 @@ Crockford. Выдаёт их приложение единой точкой `int
назначения, найденное по имени колонки. У аудиозаписи поля одного типа идут назначения, найденное по имени колонки. У аудиозаписи поля одного типа идут
длинным непрерывным рядом, и позиционный список дал бы сдвиг на одно поле, длинным непрерывным рядом, и позиционный список дал бы сдвиг на одно поле,
который компилируется молча и кладёт идентификатор файла в колонку текста. который компилируется молча и кладёт идентификатор файла в колонку текста.
Перечень задан двумя местами — `writeOwnedByPipeline` вместе с `writeRecord` и Перечень мест, где правится колонка, и серьёзность правила — инвариант
`readRecordColumns`, — плюс шагом схемы; правило правки и его серьёзность — «Колонки записи правятся в трёх местах» в [CLAUDE.md](../CLAUDE.md),
инвариант в [CLAUDE.md](../CLAUDE.md), сверку держат правила «Инварианты»; сверку держат правила `internal/archrules`.
`internal/archrules`.
- **Перечень рубежей объявлен одним дескриптором** — `internal/entity/stage.go`. - **Перечень рубежей объявлен одним дескриптором** — `internal/entity/stage.go`.
Из него выводятся выбор шага, отбор захвата, срок протухания и предел простоя: Из него выводятся выбор шага, отбор захвата, срок протухания и предел простоя:
рубеж, забытый в отборе, не выдаётся ни одному воркеру никогда, а пустой прогон рубеж, забытый в отборе, не выдаётся ни одному воркеру никогда, а пустой прогон
+52 -37
View File
@@ -2,10 +2,11 @@
## Как настроен конвейер ## Как настроен конвейер
Артефакты прогонов лежат в `openspec/changes/archive/<id>/review/` — под именем Артефакты прогонов лежат в `openspec/changes/archive/<id>/review/`; имя файла
`triage.md` либо `report.md`: имя менялось по ходу, и оба встречаются. Самый менялось по ходу — `triage.md`, `report.md`, `design-review.md`,
ранний — `fix-http-handler-tests` 2026-08-11, самый поздний — `code-review.md`, `triage-<дата>.md`. Самый ранний — `fix-http-handler-tests`
`start-without-telegram-token` 2026-08-13. 2026-08-11; самый поздний здесь не называется: строка протухала бы с каждым
прогоном, и смотреть его надо в самом архиве.
Конвейер прогонялся и на работе, шедшей без своего изменения openspec; артефакта Конвейер прогонялся и на работе, шедшей без своего изменения openspec; артефакта
в архиве у таких прогонов нет, и урожай их виден только записями журнала ниже. в архиве у таких прогонов нет, и урожай их виден только записями журнала ниже.
@@ -33,8 +34,8 @@
Пробел повторился на прогоне `config-test-headers-login` 2026-08-23, и это уже Пробел повторился на прогоне `config-test-headers-login` 2026-08-23, и это уже
не единичный случай: строки о потолке не дал ни один из шести проходов, а не единичный случай: строки о потолке не дал ни один из шести проходов, а
заметил это снова только триаж. Прогон при этом шёл с меткой `large`, то есть с заметил это снова только триаж. Состав прогона при этом был самым широким из
самым широким составом, — и разница с прошлым разом ровно в числе проходов, тогда доступных, — и разница с прошлым разом ровно в числе проходов,
промолчавших одинаково. Читать пробел надо как границу покрытия каждого прогона, промолчавших одинаково. Читать пробел надо как границу покрытия каждого прогона,
а не как свойство одного из них. а не как свойство одного из них.
@@ -263,43 +264,57 @@
- `architecture`: не зовётся ли на каждый запрос то, что меняет состояние - `architecture`: не зовётся ли на каждый запрос то, что меняет состояние
приложения, — сборка роутера хранилища оказалась именно такой. приложения, — сборка роутера хранилища оказалась именно такой.
### Триггеры метки ### Когда звать глубокое ревью
Проектная конкретизация правила выбора метки. Умолчание — `medium`. Проектная конкретизация признаков, по которым зовут `av-dev:code-deep-review`.
Что за признаками следует и каким составом идёт прогон, решает сам скилл ревью;
здесь только места этого проекта.
**Крупное здесь** (поднимает до `large`, ось объёма): **Смотрим целиком** (область кода, а не дифф задачи):
- изменение, трогающее конвейер задач целиком: состояние, воркер, шаг сервиса и - **вход и разграничение доступа** — звенья `internal/controller/http`
колонку разом; (узнавание, требование учётной записи, ограничитель частоты, подстановка
- замена хранилища — любой её кусок; заголовков отладочного запуска) вместе со спекой
- смена модели очереди: захват, повторы и воркеры разом; [access](../openspec/specs/access/spec.md). Возвращаются сюда чаще, чем куда бы
- каркас приложения: сборка фронтенда, раздача статики и шаг гейта разом; то ни было ещё, и журнал дефектов ниже это показывает: закрытая поверхность, в
- изменение, убирающее или возвращающее вход приёма целиком. которую не мог войти никто; проверка, читавшая живую карту заголовков вместо
ответа; анонимный запрос, навсегда замедлявший запись; путь анонима, уехавший в
журнал; ключ бюджета ограничителя, который выбирал тот, кого ограничивают. С
2026-08-22 барьер держит заголовок от прокси, изъятие у него одно — отладочный
запуск ([security.md](security.md), «Периметр»), — а настоящей Authelia в
прогоне нет (см. «Недоступно проверке»);
- **пакет хранилища** `internal/adapter/repo/sqlite` — здесь живёт инвариант
«Колонки записи правятся в трёх местах» ([CLAUDE.md](../CLAUDE.md),
«Инварианты», major): места, цена забытого и то, чем держится сверка, названы
там. Смотрится целиком потому, что компилятор не видит ни одного из мест;
- **конвейер расшифровки** `internal/service` вместе с дескриптором рубежа
`internal/entity/stage.go` — здесь живёт инвариант «Рубеж объявляется одним
дескриптором» ([CLAUDE.md](../CLAUDE.md), «Инварианты», major), и цена
забытого рубежа названа там. Сюда же дефекты о потере уже полученного: пустой
второй ответ распознавателя, стиравший сохранённую расшифровку, и остановка
сервиса, хоронившая конвертируемую запись;
- **распознаватель** `internal/adapter/recognizer/yandex` — единственное место,
чья ошибка стоит денег ([CLAUDE.md](../CLAUDE.md), «Запреты», «Yandex Cloud за
деньги»). Живым прогоном оно не проверяется вовсе (см. «Недоступно
проверке»), и разбор остаётся единственным способом судить о нём.
**Незнакомое здесь** (поднимает до `large`, ось формы решения): **Необратимое здесь.** Перечень необратимого один и лежит в
[CLAUDE.md](../CLAUDE.md), «Работа»; здесь — только места кода, которых его
пункты касаются, и правило прохода: находка в таком месте уходит человеку
развилкой, а не чинится молча.
- вход через OIDC и разграничение доступа: как связать чат Telegram с учётной - применённый шаг схемы — `internal/adapter/repo/sqlite/migrations`;
записью, до начала работы назвать нельзя; - формат файла на диске и раскладка каталога данных —
- всё, что делается на выбранном фреймворке впервые: правила `internal/adapter/repo/sqlite`, `store.go`;
[conventions/web-ui.md](conventions/web-ui.md) выведены из выбора и из замера - публичный контракт HTTP API — `internal/controller/http`;
на пробном экране, а не из написанного кода, и первая же задача проверяет их - имя ключа конфига — `internal/config`;
собой — форма решения нащупывается по ходу; - действие с боевыми данными и с Yandex Cloud, ротация секрета —
- установка на телефон: service worker перехватывает запросы, и что он кэширует, `internal/adapter/recognizer/yandex`.
до работы назвать нельзя;
- работа с записями в несколько часов: потолки внешних сервисов не замерены,
форма решения зависит от замера;
- приём дорожки из видео и форматов, которых `ffmpeg` не берёт текущей командой;
- всё, что требует записи в `research/` прежде, чем начать.
**Мелкое здесь** (опускает до `small`): Строка, уже ушедшая в журнал контейнера или меткой метрики, из перечня не
берётся: её необратимость записана инвариантами о секрете и о содержимом записи
- новая метрика в `internal/metrics`; ([CLAUDE.md](../CLAUDE.md), «Инварианты», оба critical), и правка кода помогает
- правка `config.example.toml` и умолчаний `defaultConfig()` без нового поля; там только следующей записи.
- правка документов канона.
Помни отрицательный тест: миграция, формат файла на диске, публичный контракт
API и имя не откатываются обратной правкой после мерджа — какими бы маленькими
ни были, они не `small`.
### Недоступно проверке ### Недоступно проверке