раскладка av-dev поднята до версии 5: метка прогона ушла из процесса
- docs/review.md: подраздел «Триггеры метки» заменён на «Когда звать глубокое ревью» — областями кода и перечнем необратимых мест проекта - дубли инвариантов и перечня необратимого сведены к ссылкам на CLAUDE.md, а в database.md убрано разошедшееся число мест правки колонки - шапка раздела перестала называть самый поздний артефакт ревью: строка протухала каждым прогоном
This commit is contained in:
+1
-1
@@ -1,7 +1,7 @@
|
||||
# Раскладка av-dev в этом проекте: версия и настройки проверок.
|
||||
# Файл ведут скиллы плагина, править руками можно — комментарии свои.
|
||||
|
||||
version = 4 # версия раскладки; обратной совместимости нет, есть «приведён» и «нет»
|
||||
version = 5 # версия раскладки; обратной совместимости нет, есть «приведён» и «нет»
|
||||
|
||||
[docs]
|
||||
# каталог миграций: по нему docs.py сверяет схему с database.md
|
||||
|
||||
+3
-4
@@ -362,10 +362,9 @@ Crockford. Выдаёт их приложение единой точкой `int
|
||||
назначения, найденное по имени колонки. У аудиозаписи поля одного типа идут
|
||||
длинным непрерывным рядом, и позиционный список дал бы сдвиг на одно поле,
|
||||
который компилируется молча и кладёт идентификатор файла в колонку текста.
|
||||
Перечень задан двумя местами — `writeOwnedByPipeline` вместе с `writeRecord` и
|
||||
`readRecordColumns`, — плюс шагом схемы; правило правки и его серьёзность —
|
||||
инвариант в [CLAUDE.md](../CLAUDE.md), сверку держат правила
|
||||
`internal/archrules`.
|
||||
Перечень мест, где правится колонка, и серьёзность правила — инвариант
|
||||
«Колонки записи правятся в трёх местах» в [CLAUDE.md](../CLAUDE.md),
|
||||
«Инварианты»; сверку держат правила `internal/archrules`.
|
||||
- **Перечень рубежей объявлен одним дескриптором** — `internal/entity/stage.go`.
|
||||
Из него выводятся выбор шага, отбор захвата, срок протухания и предел простоя:
|
||||
рубеж, забытый в отборе, не выдаётся ни одному воркеру никогда, а пустой прогон
|
||||
|
||||
+52
-37
@@ -2,10 +2,11 @@
|
||||
|
||||
## Как настроен конвейер
|
||||
|
||||
Артефакты прогонов лежат в `openspec/changes/archive/<id>/review/` — под именем
|
||||
`triage.md` либо `report.md`: имя менялось по ходу, и оба встречаются. Самый
|
||||
ранний — `fix-http-handler-tests` 2026-08-11, самый поздний —
|
||||
`start-without-telegram-token` 2026-08-13.
|
||||
Артефакты прогонов лежат в `openspec/changes/archive/<id>/review/`; имя файла
|
||||
менялось по ходу — `triage.md`, `report.md`, `design-review.md`,
|
||||
`code-review.md`, `triage-<дата>.md`. Самый ранний — `fix-http-handler-tests`
|
||||
2026-08-11; самый поздний здесь не называется: строка протухала бы с каждым
|
||||
прогоном, и смотреть его надо в самом архиве.
|
||||
|
||||
Конвейер прогонялся и на работе, шедшей без своего изменения openspec; артефакта
|
||||
в архиве у таких прогонов нет, и урожай их виден только записями журнала ниже.
|
||||
@@ -33,8 +34,8 @@
|
||||
|
||||
Пробел повторился на прогоне `config-test-headers-login` 2026-08-23, и это уже
|
||||
не единичный случай: строки о потолке не дал ни один из шести проходов, а
|
||||
заметил это снова только триаж. Прогон при этом шёл с меткой `large`, то есть с
|
||||
самым широким составом, — и разница с прошлым разом ровно в числе проходов,
|
||||
заметил это снова только триаж. Состав прогона при этом был самым широким из
|
||||
тогда доступных, — и разница с прошлым разом ровно в числе проходов,
|
||||
промолчавших одинаково. Читать пробел надо как границу покрытия каждого прогона,
|
||||
а не как свойство одного из них.
|
||||
|
||||
@@ -263,43 +264,57 @@
|
||||
- `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 с учётной
|
||||
записью, до начала работы назвать нельзя;
|
||||
- всё, что делается на выбранном фреймворке впервые: правила
|
||||
[conventions/web-ui.md](conventions/web-ui.md) выведены из выбора и из замера
|
||||
на пробном экране, а не из написанного кода, и первая же задача проверяет их
|
||||
собой — форма решения нащупывается по ходу;
|
||||
- установка на телефон: service worker перехватывает запросы, и что он кэширует,
|
||||
до работы назвать нельзя;
|
||||
- работа с записями в несколько часов: потолки внешних сервисов не замерены,
|
||||
форма решения зависит от замера;
|
||||
- приём дорожки из видео и форматов, которых `ffmpeg` не берёт текущей командой;
|
||||
- всё, что требует записи в `research/` прежде, чем начать.
|
||||
- применённый шаг схемы — `internal/adapter/repo/sqlite/migrations`;
|
||||
- формат файла на диске и раскладка каталога данных —
|
||||
`internal/adapter/repo/sqlite`, `store.go`;
|
||||
- публичный контракт HTTP API — `internal/controller/http`;
|
||||
- имя ключа конфига — `internal/config`;
|
||||
- действие с боевыми данными и с Yandex Cloud, ротация секрета —
|
||||
`internal/adapter/recognizer/yandex`.
|
||||
|
||||
**Мелкое здесь** (опускает до `small`):
|
||||
|
||||
- новая метрика в `internal/metrics`;
|
||||
- правка `config.example.toml` и умолчаний `defaultConfig()` без нового поля;
|
||||
- правка документов канона.
|
||||
|
||||
Помни отрицательный тест: миграция, формат файла на диске, публичный контракт
|
||||
API и имя не откатываются обратной правкой после мерджа — какими бы маленькими
|
||||
ни были, они не `small`.
|
||||
Строка, уже ушедшая в журнал контейнера или меткой метрики, из перечня не
|
||||
берётся: её необратимость записана инвариантами о секрете и о содержимом записи
|
||||
([CLAUDE.md](../CLAUDE.md), «Инварианты», оба critical), и правка кода помогает
|
||||
там только следующей записи.
|
||||
|
||||
### Недоступно проверке
|
||||
|
||||
|
||||
Reference in New Issue
Block a user