канон 4: тип записи стал единственной осью и задаёт схему

Осей было две — тип записи (goal/idea/task) и род работы (kind:<род>
тегом), — и ортогональность у них была фальшивой: из двенадцати клеток
произведения законны шесть. У цели род запрещён, у задачи обязателен, у
идеи пуст и на практике не ставится. Плюс «алгоритм работы над записью
такого типа» крепится не к task, а к fix и research, то есть к роду:
ось, к которой пишется алгоритм, и была настоящим типом. Схлопнуто в
одну ось из пяти значений: goal | feature | fix | chore | research.

Тип idea упразднён отдельно и по другой причине: он значил не род
работы, а незаполненность, а состояние типом быть не может — оно
меняется по мере того, как запись дописывают, а тип меняют командой.
Теперь состояние выводится из заполненности: research без раздела
«Вопрос» это сырьё. В спринт не берётся, как и прежняя идея, лежит в
конце категории, отбирается list --raw.

Дом типа — поле меты «Тип» первой строкой, эмодзи в H1 производна.
Прежнее «отдельного поля типа нет: два места для одного факта
разъезжаются» отменено собственным аргументом: он был против префикса
плюс поля, а при переносе дома место остаётся одно. Эмодзи стоит в H1,
а не в строке индекса, чтобы инвариант «заголовок в индексе дословно»
остался нетронутым.

Поле места названо по типу: «Секция» у цели (часть роадмапа, состояние
очереди), «Категория» у задачи (полка домена, куда её вернёт sprint
drop). Одинаковое переименование закрепило бы конфляцию; какое поле
обязательно, решает тип — то самое, ради чего затевалась правка.

Два новых обязательных раздела выросли из правил, которые были записаны
и которые нечем было проверить. «Не воспроизводится — это research, а не
fix» стояло в каноне: теперь есть раздел «Воспроизведение». Приёмка
разведки — «записанный ответ, а не изменённый код» — тоже стояла, но
sprint take требовал от research два-пять критериев с оракулами, и они
писались ради проверки; вместо них «Вопрос» и «Куда ляжет ответ».

Сортировка «по важности» из заметок не взята: она требует, чтобы кто-то
важность поддерживал, а это приоритет, от которого отказалось правило 4.
Взято только «сырьё в конец категории» — этот порядок выводится из типа
и заполненности, а не назначается человеком, и потому проверяется
машиной.

TYPE_SCHEMA кормит и body_template, и schema_verdict: иначе add кладёт
то, на чём sprint take потом откажет. check --fix мигрирует за один
проход — kind:/[goal]/[idea] в поле «Тип», эмодзи в заголовок, «Секция»
→ «Категория», сырьё в конец. Тип, которого неоткуда взять, не
угадывается: feature от chore машина не отличает, такие записи уходят в
НЕОДНОЗНАЧНО поимённо.

Попутно закрыт класс отказов в --fix: шагов, правящих мету, стало пять,
и второй, перечитавший файл с диска, стирал правку первого. Общий
stage() поверх отложенных правок; до этого корректность держалась на том,
что шагов было мало.

Устав на тип отдельным файлом — references/task-<тип>.md, пять штук:
схема, алгоритм, что видит машина и что человек. Агент task-form получил
правило «тип сходится с тем, что в записи написано» с проверяемыми
расхождениями.

Обкатано на демо-наборе из 13 записей: миграция за один проход, второй
прогон даёт ноль починок; fix без «Воспроизведения» и сырьё в спринт не
идут, годная feature берётся.

DECISIONS тема 27 (ААББ–ЛЛММ, следствия 101–104).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-05 10:00:05 +03:00
co-authored by Claude Opus 5
parent 069205ac69
commit 228b6c7eee
18 changed files with 1521 additions and 511 deletions
+36 -13
View File
@@ -1,6 +1,6 @@
---
name: task-form
description: "Проверка формы записи каталога задач по существу: форма заголовка по типу (цель — что приложение будет уметь, задача — что нужно сделать, идея — о чём она), «зачем», пересказывающее заголовок вместо состояния и боли, раздел «Затрагивает» с замыслом вместо границ, критерий приёмки с оракулом только на словах, предписание процесса в теле, и связь задачи со строкой «Завершения» её цели. Читает файл цели, на которую ссылается задача. Отдаёт готовые формулировки на замену и ничего не правит сам. Язык текста (залог, оценки, стоп-слова, англицизмы) смотрит отдельный агент doc-wording. Использовать после заведения или разбора пачки записей, до взятия в спринт и на переоценке. Только чтение."
description: "Проверка формы записи каталога задач по существу: тип, разошедшийся с содержанием записи, форма заголовка по типу (цель — что приложение будет уметь, задача — что нужно сделать, разведка — о чём она), «зачем», пересказывающее заголовок вместо состояния и боли, раздел «Затрагивает» с замыслом вместо границ, критерий приёмки с оракулом только на словах, предписание процесса в теле, и связь задачи со строкой «Завершения» её цели. Читает файл цели, на которую ссылается задача. Отдаёт готовые формулировки на замену и ничего не правит сам. Язык текста (залог, оценки, стоп-слова, англицизмы) смотрит отдельный агент doc-wording. Использовать после заведения или разбора пачки записей, до взятия в спринт и на переоценке. Только чтение."
tools: Read, Grep, Glob
model: opus
color: yellow
@@ -29,7 +29,7 @@ color: yellow
Список файлов записей (`docs/tasks/items/<slug>.md`) или каталог задач целиком.
Каталог тебе нужен и сам по себе: задача несёт тег `goal:<слаг>`, и **файл цели
ты открываешь**, иначе шестое правило не проверить.
ты открываешь**, иначе седьмое правило не проверить.
Документы проекта — паспорт, архитектура, конвенции — если зовущий их назвал.
По ним видно, названа ли граница именем, которое в проекте существует.
@@ -38,11 +38,14 @@ color: yellow
1. **Заголовок отвечает на вопрос своего типа.**
Тип стоит первым полем меты — `- **Тип:** …`, — а в заголовке ему
соответствует эмодзи.
| Тип | Отвечает на | Форма |
| --- | --- | --- |
| `[goal]` | что приложение будет уметь | утверждение о возможности: «Соперником может быть компьютер» |
| задача | что нужно сделать | глагол в неопределённой форме, допускается «не» перед ним: «Печатать поле одним куском кода» |
| `[idea]` | о чём она | назывное, без обещания: «Подсказка следующего хода» |
| 🎯 `goal` | что приложение будет уметь | утверждение о возможности: «Соперником может быть компьютер» |
| `feature`, 🐞 `fix`, 🧹 `chore` | что нужно сделать | глагол в неопределённой форме, допускается «не» перед ним: «Печатать поле одним куском кода» |
| 🔬 `research` | о чём разведка | назывное, без обещания: «Подсказка следующего хода» |
Описательный заголовок задачи («Лишние символы молча отбрасываются») называет
**состояние** и одинаково читается как жалоба и как задание. Заголовок цели в
@@ -55,12 +58,32 @@ color: yellow
законная возможность**: «исход слияния не зависит от порядка доставки» — цель,
а не абстракция.
2. **«Зачем» отвечает на «зачем нужна эта задача»** — состояние, остаток, боль,
2. **Тип сходится с тем, что в записи написано.** Тип — первое поле меты, и он
решает, каких разделов запись требует; разошедшийся тип врёт ровно там, где
по нему принимают решение. Проверяемые расхождения:
- **`fix`, у которого нечего воспроизвести**, — расхождение приняли на слово.
Либо это `research` («при каких условиях проявляется»), либо `feature`:
поведение никогда и не было заявлено, и чинить нечего;
- **`feature`, после которой снаружи ничего не меняется**, — это `chore`, и
сказать это честно дешевле, чем выдумывать пользовательскую пользу;
- **`chore`, меняющий наблюдаемое поведение**, — это `feature` или `fix`, и у
них другие требования (цель, воспроизведение);
- **`research`, у которого «Вопрос» — это тема, а не вопрос.** «Разобраться с
выводом в терминалах» вопросом не является: на него нельзя ответить. Пока
вопроса нет, запись остаётся сырьём — и это законное состояние, но назови
его.
Раздел не из схемы своего типа (`Воспроизведение` у `chore`, критерии у
`research`) — сигнал того же расхождения, и `check` о нём говорит замечанием.
Твоя работа — сказать, **какой тип верен**, а не только что текущий не сходится.
3. **«Зачем» отвечает на «зачем нужна эта задача»** — состояние, остаток, боль,
— а не пересказывает заголовок. «Починить разбор хода» при заголовке «Не
отбрасывать молча лишние символы» — пересказ: читающий узнаёт то же самое
дважды и по-прежнему не знает, почему это лежит в беклоге.
3. **«Затрагивает» перечисляет границы, а не замысел.** Граница — то, у чего есть
4. **«Затрагивает» перечисляет границы, а не замысел.** Граница — то, у чего есть
внешняя сторона: команда и её аргументы, эндпоинт, таблица и миграция, формат
на диске, публичный тип пакета, внешний сервис. «Переписать хранилище на новый
драйвер» — замысел; проверяется вопросом «это можно назвать до того, как
@@ -72,17 +95,17 @@ color: yellow
становится двумя» вместо «выбор источника хода в модуле партии») — это уже
решение о том, как делать.
4. **У критерия назван оракул, и оракул проверяем.** «Оракул: глазами» на
5. **У критерия назван оракул, и оракул проверяем.** «Оракул: глазами» на
утверждение, которого глазами не проверить («компьютер не проигрывает ни в
одной партии»), — находка: слово стоит, проверки нет. Число критериев считает
`tasks.py check`, тебе оно неинтересно.
5. **Предписания процесса в теле нет.** «Делать профилем standard», «взять
6. **Предписания процесса в теле нет.** «Делать профилем standard», «взять
такой-то агент» — это выбор, который делают, увидев изменение, а не при
постановке. Он же путь понизить требования решением, принятым до
проектирования.
6. **Задача называет, какую строку «Завершения» своей цели она двигает.**
7. **Задача называет, какую строку «Завершения» своей цели она двигает.**
Открой файл цели из тега `goal:<слаг>` и сверь. Три исхода, и все три —
разные находки:
@@ -94,8 +117,8 @@ color: yellow
это незакрытая часть возможности. Скажи о ней отдельно, вне списка находок
по файлам: это про набор, а не про запись.
У задачи **без цели** (`kind:fix`, `chore`, `research`) правило не
применяется вовсе — они служат работоспособности, а не направлению.
У задачи **без цели** (`fix`, `chore`, `research`) правило не применяется
вовсе — они служат работоспособности, а не направлению.
## Чего ты не проверяешь
@@ -113,7 +136,7 @@ color: yellow
одного правила.
**Содержание работы**: нужна ли задача, верно ли выбрана цель, не крупна ли она,
достаточна ли декомпозиция. Шестое правило подходит к этому близко и
достаточна ли декомпозиция. Седьмое правило подходит к этому близко и
останавливается там, где кончается сверка с текстом цели. Об этом молчи.
## Порог вмешательства