Проход упрощения уткнулся в один класс у всех пяти агентов: слово, живущее в трёх-шести файлах разом. Правка в одном месте развела бы словарь, правка во всех — уже не упрощение текста скилла. Каждый честно остановился и записал слово в отчёт, и одни и те же слова всплыли в разных отчётах. Разобрано этим проходом. Причина, по которой они вообще накопились, оказалась в самом уставе языка. Он разрешал не переводить «термин, у которого нет точного русского эквивалента и который в команде уже прижился». Проверить это нельзя: прижившимся выглядит любое слово, встреченное трижды, — и ровно так рассудили пять агентов подряд, каждый независимо. Оговорка заменена закрытым списком из девяти терминов с колонкой «что называет»: интейк, триаж, провенанс, дедуп, чек-лист, дифф, промпт, сущности OpenSpec, роды проходов ревью. Интейк оставлен потому, что «заведение» называет создание файла, и слить их значит смешать две операции; провенанс — потому что «источник» рядом называет саму запись, а не свойство числа. Слово не из списка и не из таблицы имён вещей — находка, а не стиль. Список заведён домом язык-словарь в language.md и копией в уставе doc-wording. Копия обязательна: агент работает в репозитории проекта, где плагина может не быть, и без списка предъявил бы интейк как англицизм. Снято пять слов, 29 мест: конфляция → смешение, декорреляция → разведённость, непоймание → почему не поймали, эвал-сет → проверочный набор, гайд → руководство. Латинизм или калька при живом русском слове в каждом случае. Разбор декорреляции показателен: проект уже владел нужным словом — «агенты разведены по глубине», «разведены по охвату» — и держал рядом латинский синоним того же понятия. Это не англицизм, а второй дом для слова. Непоймание снято ещё и потому, что форма журнала дефектов, которую канон кладёт в проекты, спрашивает «Почему не поймали», а проза рядом называла это «причиной непоймания». Скелет и проза о скелете говорили разными словами. Снятое записано вместе с оставленным, в одном списке и с заменой каждого. Иначе слово возвращается: из текстов оно уходит, но ничто не мешает следующему проходу завести его заново — оно ведь короткое и точное на вид. Тема 32 в DECISIONS.md, следствия 124-126. Нумерация правил в уставе doc-wording сдвинута: словарь встал шестым, жаргон и далее уехали на единицу. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
116 lines
10 KiB
Markdown
116 lines
10 KiB
Markdown
# Задачи из аудита и ревью
|
||
|
||
Ревью и аудиты — код-ревью, архитектурный проход, аудит безопасности, любой
|
||
разбор другим агентом — порождают находки, часть которых становится задачами.
|
||
Это отдельный интейк со своей опасностью, **зеркальной** интейку из диалога.
|
||
|
||
- Интейк из диалога грешит переполнением: из одной мысли рождается пять файлов.
|
||
- Интейк из ревью грешит сваливанием: сорок сырых находок превращаются в сорок
|
||
файлов. Беклог раздувается, а следующая переоценка склеивает их обратно.
|
||
|
||
Защита от сваливания — та же, что в самом ревью: **кластеризация по причине, а
|
||
не файл-на-находку.** Если у ревью был триаж — половина работы уже сделана, бери
|
||
его выход. Если нет — триажируй сам, прежде чем заводить.
|
||
|
||
## Находка агента — не задача
|
||
|
||
Мнение агента — **гипотеза, пока у неё нет свидетельства** (падающий тест,
|
||
воспроизводимый шаг, положение руководства). Согласие нескольких находок само по себе
|
||
достоверность не повышает: это один источник, высказавшийся несколько раз.
|
||
|
||
Отсюда фильтр входа, поверх обычного «не делаем сейчас + пожалеем о потере»:
|
||
|
||
- **Находка со свидетельством**, отложенная к исполнению → **задача**.
|
||
Свидетельство и последствие переносим в тело — это её «почему», то самое, что
|
||
переживает запись.
|
||
- **Находка без свидетельства / низкой уверенности** → **сырьё**: `research`, у
|
||
которого раздел «Вопрос» и есть недостающее свидетельство («при каких условиях
|
||
это воспроизводится»). Не `fix`: без `Воспроизведения` его в спринт не
|
||
возьмут, и правильно — чинить нечего, пока непонятно, что ломается. Судьба
|
||
сырья — штурм, где либо найдётся подтверждение, либо оно уедет в
|
||
`REJECTED.md`.
|
||
- **Уже починено по ходу ревью** → **ничего**. Починенное не заводим.
|
||
- **Развилка, решённая при ревью** → ничего; решённая «потом» → задача с
|
||
вопросом в разделе «Вопросы» и тегом `question`.
|
||
|
||
## Порядок
|
||
|
||
1. **Возьми выход триажа, а не сырые находки.** Сырой отчёт — это симптомы до
|
||
дедупликации; в нём одна причина размазана по нескольким строкам.
|
||
2. **Кластеризуй по причине.** Пять находок об одном отсутствующем инварианте —
|
||
одна задача, а не пять. Класс мелочи (nits, косметика) — **один пакетный
|
||
файл** со списком пунктов, а не файл на каждую запятую.
|
||
3. **Дедуп против живых задач и `REJECTED.md`.** Аудит переоткрывает уже
|
||
заведённое и уже выкинутое. Нашлось среди живых — дописываем находку в
|
||
существующий файл. Нашлось в `REJECTED.md` — это сигнал: причина отказа могла
|
||
устареть, выноси пользователю, а не заводи молча заново.
|
||
4. **Разложи по целям — там, где цель нужна.** Большинство находок ревью это
|
||
`fix` и `chore`, и **цель им не требуется**: они служат работоспособности, а
|
||
не направлению, и в спринт входят помимо его цели. Придуманная им цель —
|
||
ровно то враньё, от которого спасает тип.
|
||
|
||
Цель обязательна у находки, которая оказалась **новой возможностью**
|
||
(`feature`): нашлось поведение, которого никто не заказывал, и его надо
|
||
либо заказать целью, либо убрать. Подходящей цели нет — заведи её
|
||
(`add --type goal --section Направления`) в том же проходе.
|
||
5. **Покажи карту до создания файлов.** Кластер → задача / сырьё / строка в
|
||
пакетный файл / уже заведено / отброшено, и под какую цель — пачкой через
|
||
`AskUserQuestion`. Это тот же барьер, что и «три кандидата» в интейке из
|
||
диалога: массовое заведение файлов без подтверждения — ровно тот отказ, ради
|
||
которого интейк из ревью и выделен. Дешёвая мелочь по явному согласию может
|
||
заводиться и без поштучного вопроса — но карта пользователю предъявляется
|
||
всё равно.
|
||
6. **Заводи утверждённое** через `tasks.py add`, с тремя добавками:
|
||
- **тег партии** — `--tag review-ГГГГ-ММ-ДД` (или `audit-<slug>`), чтобы весь
|
||
заход разбора поднимался одной командой `list --tag …`;
|
||
- **тип** — `--type`, и он **не по умолчанию `fix`**: починкой считается
|
||
расхождение с заявленным поведением, а находка «этого свойства никто не
|
||
заказывал» — это `feature`, находка «не знаем, как поведёт себя драйвер» —
|
||
`research`. Тип, розданный оптом, врёт ровно там, где по нему потом
|
||
отбирают, **и требует не тех разделов**: каждому `fix` придётся заполнить
|
||
`Воспроизведение`, а у находки без свидетельства его нет;
|
||
- **провенанс в теле** — кто нашёл, каким проходом, с каким свидетельством.
|
||
Без него через месяц не отличить проверенную находку от догадки.
|
||
7. `tasks.py check`.
|
||
|
||
## Куда девается серьёзность, если приоритетов нет
|
||
|
||
Приоритетов нет, и отображать серьёзность некуда — но **выкидывать её нельзя**.
|
||
Правило замены:
|
||
|
||
- **тяжёлая находка со свидетельством** → задача под ту цель, которой она
|
||
угрожает, и **кандидат в ближайший набор**: серьёзность здесь превращается в
|
||
довод при выборе цели следующего спринта, а не в уровень в файле. Довод
|
||
записывается причиной в мете (`--reason`), иначе к моменту набора его
|
||
никто не вспомнит;
|
||
- **находка, ломающая уже идущий спринт**, — не интейк вовсе: см. правило
|
||
вторжения в скилле `session`. В беклог она падает, только если врываться не
|
||
положено;
|
||
- **низкая уверенность или нет свидетельства** → сырьё (`research` с пустым
|
||
разделом «Вопрос»);
|
||
- **мелочь** → строка в пакетный файл;
|
||
- **уже починено / развилка решена сейчас** → ничего.
|
||
|
||
Словарей серьёзности много, и отображать их механически не на что: при сомнении
|
||
— вопрос пользователю, а не догадка.
|
||
|
||
## Поимённая сверка
|
||
|
||
Интейк считается выполненным, только если **каждая** находка триажа получила
|
||
исход: слаг заведённой задачи, ссылку на существующую, строку пакетного файла
|
||
или запись «не заведена: причина». Нулевой урожай при непустом отчёте триажа
|
||
виден сразу — и это единственный способ отличить «находок не было» от «не стал
|
||
заводить». Список составляет не тот, кто отчитывается о заведении.
|
||
|
||
Границы покрытия отчёта — то, что ревью проверить **не смогло**, — не находки и
|
||
в задачи не идут: у них нет предмета. Их место в докладе, не в беклоге.
|
||
|
||
## Доклад
|
||
|
||
- Источник (какое ревью/аудит, сколько находок на входе).
|
||
- Свёрнуто в задачи: N кластеров из M находок, со слагами, целями и тегом партии.
|
||
- Что не заведено и почему: починено инлайн, уже заведено, стало сырьём, ушло в
|
||
`REJECTED.md`.
|
||
- Поимённая сверка: находок на входе N, исход есть у N.
|
||
- `tasks.py check`.
|