Files
dev-skills/av-dev-tasks/skills/tasks/references/task-fix.md
T
avandClaude Opus 5 00ddfb0dde av-dev-pm расколот на av-dev-docs и av-dev-tasks
Плагин владел двумя разными вещами сразу — документацией проекта и учётом работ,
— и это мешало обеим. Канон нельзя было поставить без задач, задачи без канона, а
язык проектных текстов лежал внутри скилла canon и потому принадлежал половине.
Теперь плагина два, каждый ставится сам по себе.

av-dev-docs: скиллы canon, docs, init; агенты doc-consistency, doc-code-drift,
doc-wording; скрипт docs.py. av-dev-tasks: скиллы tasks, session; агенты
task-form, task-wording; скрипт tasks.py.

Между собой они зовутся через пространство имён, а не по пути в чужое дерево.
Все относительные ссылки, пересекшие границу плагина, сняты: tasks больше не
указывает в canon, canon не указывает в tasks. Вместо ссылки — имя скилла и
оговорка, что вызов может не разрешиться, и это исход, а не поломка.

То, что нужно обоим дословно, стало вторым общим домом. Словарь «Сопровождение и
эксплуатация» назван в трёх местах трёх плагинов — секция роадмапа, раздел
«Эксплуатация» в architecture.md, тема ревью operations — и ни один из трёх им не
владеет; он уехал в shared/operations.md, а canon.md и скилл задач везут копии.
Три перечня «чем держат проект» уже разъезжались на «метриках и логах» против
«мониторинга», так что ссылка тут не годится: плагин, поставленный в одиночку,
получил бы указатель в никуда. Тем же способом язык: у av-dev-tasks появилась
своя копия language.md.

Копий стало 18 при 8 домах.

Переименования разведены по смыслу, а не заменой строки: где речь о каноне —
av-dev-docs, где об учёте задач — av-dev-tasks. В пайплайне таких мест
одиннадцать, и оба адресата там встречаются вперемешку.

Журналы (DECISIONS, TODO, HISTORY) намеренно не тронуты: они описывают состояние
на момент записи. По той же причине оставлена наблюдённая строка в комментарии
docs.py — она цитирует конфиг живого проекта, а не называет плагин.

Не входит в этот заход и названо отдельно: слияние canon и docs в один скилл,
разделение docs/.pm.json на два конфига и переезд openspec в пайплайн.

Гейт зелёный: копии, фронтматтеры, диаграммы, json. Оба скрипта прогнаны после
переезда — docs.py version и tasks.py check на фикстуре.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-09 14:06:26 +03:00

5.7 KiB
Raw Blame History

🐞 fix — поведение расходится с заявленным

Задача о расхождении между тем, что система делает, и тем, что про неё заявлено — в спеке, в инварианте CLAUDE.md, в критериях закрытой задачи. Отвечает на «что нужно сделать», глаголом в неопределённой форме, перед ним допускается «не»: «Не отбрасывать молча лишние символы в ходе».

Общая форма записи (мета, слаг, строка индекса) — task-format.md. Здесь только то, что у этого типа своё.

Схема

Заголовок отвечает на что нужно сделать
Обязательные разделы Воспроизведение, Затрагивает, Критерии приёмки
Допустимые сверх того Рамки, Вопросы
Поле места Категория — полка домена беклога
Цель (goal:<слаг>) необязательна
Индекс BACKLOG.mdSPRINT.md
Берётся в спринт да

Воспроизведение — раздел, которого нет у других типов

Не воспроизводится — это research, а не fix. Правило было записано и раньше, но проверять его было нечем, и «починки» без единого шага повторения уходили в спринт наравне с остальными. Раздел делает правило проверяемым: он называет, что сделать, чтобы расхождение проявилось, и что при этом видно вместо ожидаемого.

Пишется двумя частями, обе обязательны по смыслу:

  • шаги или вход — команда, запрос, файл, последовательность действий;
  • что видно и что ожидалось — «ввод а1б2 ходит в a1, а должен быть отвергнут с ошибкой».

Это не критерии приёмки и не дублирует их: воспроизведение описывает сегодня, критерии — завтра. Пропущенное воспроизведение чаще всего означает одно из двух: расхождение приняли на слово, или его вообще нет, а есть недовольство поведением — и тогда это feature, а не fix.

Алгоритм

  1. Воспроизвести. Не удаётся — это research: заведи вопрос «при каких условиях проявляется» и не притворяйся, что чинить есть что.
  2. Найти, чему поведение противоречит. Спека, инвариант, критерий закрытой задачи. Не противоречит ничему — это feature: поведение никогда и не было заявлено, а тип, оставшийся от первой формулировки, врёт ровно там, где по нему отбирают.
  3. Записать воспроизведение — шаги и наблюдаемое против ожидаемого.
  4. Назвать границы в Затрагивает: починка часто трогает больше, чем кажется по объёму текста, и оценка систематически занижена именно здесь.
  5. Написать критерии приёмки — 2–5 утверждений с оракулами. У починки почти всегда есть парный критерий: прежнее поведение не сломалось («ввод а1 принимается по-прежнему»). Без него починка чинит одно и ломает соседнее.
  6. Цель не выдумывать. fix служит работоспособности, а не направлению, и в набор спринта входит помимо его цели. Придуманная цель — то же враньё, от которого спасает тип.
  7. Записать дефект в журнал docs/review.md с пометкой «проскочил / пойман ревью». Проскочившие — проверочный набор для калибровки конвейера; пойманные с оракулом — лучшая опора для прохода ревью: проектные, воспроизводимые, однажды оказавшиеся правдой.

Что видит машина, а что человек

check и sprint take смотрят на наличие непустого Воспроизведения и Затрагивает и на число критериев. Годность воспроизведения — человеку: шаги, по которым ничего не воспроизводится, машина от годных не отличает, и делать вид, что проверено больше проверенного, хуже, чем не проверять вовсе.