- скилл project-brief: бриф собирается из CLAUDE.md, архитектуры, Taskfile и конвенций и показывается человеку. Раньше единственная инструкция по его созданию лежала внутри шаблона, поэтому деградированный режим был не аварийным, а единственным: critical по основанию «нарушен инвариант» недостижим ни на одной задаче - rebase перенесён внутрь worktree задачи: прежняя форма падала на занятой ветке, и агент уводил весь батч в провалившиеся с ложной причиной - контракт брифа дополнен восемью слотами; проверен заполнением на обоих проектах, незаполнимых нет. Прецедент healthlog вынут из общего charter'а в бриф — там он вмёрз вместе с числами - шов: пайплайн задачу не закрывает и записи учёта не трогает, урожай отдаёт списком, правило остатка — ссылкой на av-dev-tasks - деградированный абзац во всех девяти проходах, вопрос 9 в ops, пространство имён в вызовах, раздел предпосылок
95 lines
7.6 KiB
Markdown
95 lines
7.6 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)).
|