Пара плагинов с намеренно проведённой границей: av-dev-tasks отвечает за то, что делаем и в каком порядке, av-dev-pipeline — за то, как ведём одну задачу. Зависимости между ними нет: управление задачами работает и с ручным исполнением, пайплайн — на проекте с любым учётом задач. - av-dev-tasks — преемник av-dev-backlog: цели вместо приоритетов, спринт под одну цель с заморозкой набора, различение вопроса и блокера, каденция «вопросы — разбор — переоценка — набор». Раскладка docs/tasks с items/, PLAN.md, BACKLOG.md, SPRINT.md, REJECTED.md; проверенное из av-dev-backlog перенесено, не переписано. - av-dev-pipeline — вынос того, что лежало копиями в healthlog и jellybit (3628 строк) и уже разошлось: цикл SDD, конвейер ревью с обязательным триажем, прогон нескольких задач разом. Проектная специфика вынесена в файл-бриф, charter'ы несут метод. Коммит фиксирует состояние на момент ревью: три прохода нашли блокирующие дефекты (нет шага, заводящего бриф; git rebase на занятой worktree ветке; sprint drop пишет наполовину) — они чинятся следующими коммитами. Сохранено как база, от которой видно правки.
94 lines
7.5 KiB
Markdown
94 lines
7.5 KiB
Markdown
# Промоут: находка → конвенция → правило → удаление
|
|
|
|
Механизм храповика. Без него конвейер выдаёт одни и те же находки бесконечно, а
|
|
конвенции не растут — то есть внимание тратится повторно на уже решённое.
|
|
|
|
Роли уровней:
|
|
|
|
- **generative-проходы** — механизм *открытия* неявного (дорого, шумно, но
|
|
только они достают то, чего нет в списках);
|
|
- **конвенции** — дешёвая *регрессионная сетка* на уже открытое;
|
|
- **правила линтера** — то же с детерминированным оракулом и нулевой ценой
|
|
внимания.
|
|
|
|
## Шаг 1. Находка → конвенция
|
|
|
|
Условия: находка **принята** при ревью (не отвергнута, не понижена в гипотезу) и
|
|
**не специфична для одного места**.
|
|
|
|
- Формулируется как **проверяемое свойство**, а не как совет: «уровень доменного
|
|
отказа выбирает единственный логирующий чекпоинт», а не «внимательнее с
|
|
уровнями логов».
|
|
- Записывается источник — какой проход нашёл. Это единственные данные для
|
|
калибровки: проход, чьи находки регулярно доезжают до конвенции, оправдан;
|
|
проход, чьи находки не доезжают никогда, — кандидат на `drop` (см.
|
|
[calibration.md](calibration.md)).
|
|
- Место записи — файл конвенций проекта (путь — в разделе `## Карта` брифа). Если
|
|
тема относится к поведению системы, а не к тому, как мы пишем код, — это не
|
|
конвенция, а требование: заводится дельта-спека обычным путём.
|
|
|
|
Промоут идёт **тем же путём, что change → spec**: правка попадает в тот же
|
|
коммит, что и исправление кода, с пометкой в сообщении — история промоутов
|
|
остаётся видна в `git log` по файлу конвенций.
|
|
|
|
## Шаг 2. Конвенция → правило
|
|
|
|
Как только свойство выражается детерминированно, оно переезжает в инструмент.
|
|
Порядок предпочтения — от дешёвого к дорогому:
|
|
|
|
1. **готовое правило существующего линтера** — включить в конфиг;
|
|
2. **запрет идентификатора или импорта** правилом-«запретителем» с собственным
|
|
паттерном;
|
|
3. **правило с настройкой формы** — когда важно не имя, а конструкция;
|
|
4. **тест-сканер исходников** — когда правило про структуру проекта или про
|
|
схему: направление зависимостей, форма миграций, матчинг ошибки по тексту,
|
|
бизнес-логика в транспорте;
|
|
5. **собственный анализатор** — последний рубеж, заводим только если 1–4 не
|
|
выражают правило.
|
|
|
|
Правило обязано быть **зелёным на текущем коде в момент включения**: иначе
|
|
хук блокирует любой коммит, и правило снимут первым же раздражённым движением.
|
|
Приводить код в соответствие — часть шага 2, отдельным коммитом.
|
|
|
|
## Шаг 3. Удаление из конвенций, из брифа и из промптов
|
|
|
|
**Шаг, который пропускают чаще всего, и единственный, ради которого затевались
|
|
первые два.**
|
|
|
|
Как только правило работает:
|
|
|
|
- из файла конвенций убирается формулировка правила; остаётся, если нужно, одна
|
|
строка «проверяется линтером `<имя>`» — но только там, где без неё раздел
|
|
теряет связность;
|
|
- **из брифа проекта** убирается соответствующий пункт, а в разделе `## Карта`
|
|
правило переезжает в перечень «механизировано и потому проходом по конвенциям
|
|
не проверяется»;
|
|
- из контекста инструмента спек убирается дубль, если он там был.
|
|
|
|
Charter'ы проходов при этом **не правятся**: они общие и живут в плагине, а
|
|
предмет проверки приходит из брифа. Именно поэтому шаг 3 стал дешевле, чем был:
|
|
вычеркнуть строку в одном файле проекта, а не в девяти промптах.
|
|
|
|
Практический критерий: **в прозаических конвенциях остаётся только то, что
|
|
принципиально не выражается правилом.** Файл конвенций на несколько сотен строк
|
|
размазывает внимание модели по тривиальному — она добросовестно проверит
|
|
именование полей лога и не дойдёт до формы решения. Каждая строка конвенций,
|
|
которую можно было бы проверить машиной, оплачивается непойманным дефектом
|
|
где-то ещё.
|
|
|
|
## Обратное движение
|
|
|
|
Правило, которое даёт ложные срабатывания чаще, чем ловит (порядка трети от
|
|
общего числа), снимается и возвращается в прозу — или удаляется совсем, если
|
|
свойство перестало быть важным. Снятие фиксируется там же, где включалось, с
|
|
одной строкой «почему».
|
|
|
|
## Что промоуту не подлежит
|
|
|
|
- Находка, специфичная для одного места (её лечит комментарий в коде).
|
|
- Вкусовщина: не меняет поведения, не влияет на стоимость следующего изменения,
|
|
не нарушает записанного. Такое выбрасывается на триаже и не хранится.
|
|
- Свойство, требующее знания рантайма (профиль нагрузки, история инцидентов) —
|
|
его нельзя проверить ни промптом, ни линтером; место такому — в журнале ревью
|
|
как «признано неавтоматизируемым» (см. [review-journal.md](review-journal.md)).
|