мета задачи — блоком, «хук» стал полем «Зачем»
Строкой через · мета уезжала за экран уже на трёх полях, а сам разделитель приходилось запрещать в тексте причины и «зачем». Списком поле занимает свою строку, запрещать нечего, и проверка длины схлопнулась до одной строки. «Хук» переименован в «Зачем» — поле отвечает на вопрос «зачем нужна эта задача». Слово «цель» под это не годится: оно уже занято [goal]-файлами и тегом goal:<слаг>, и в одном блоке значило бы две разные вещи. Хирург мета-строки — самая мутная функция скрипта, резавшая строку на куски с запоминанием пробелов каждого, — заменён на «прочитать поля и собрать блок заново». Тем же ходом старая форма переезжает в новую: check называет её дрейфом, check --fix переписывает списком, Хук становится Зачем. Чужие нераспознанные поля пересборку переживают. Проверено на восьми сценариях: add, edit, move с причиной, sprint take/drop, close --reason + reopen (мета собирается из текста, поднятого из git), миграция старой формы вместе с чужим полем, отказ на мете без секции. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Формат задач, целей и индексов
|
||||
|
||||
Заголовок, мета-строку и строку индекса ставит `tasks.py add` — руками их не
|
||||
Заголовок, мета-блок и строку индекса ставит `tasks.py add` — руками их не
|
||||
пишут. Этот файл описывает, что именно скрипт создаёт и что проверяет `check`;
|
||||
тело задачи (одну фразу, критерии, рамки, контекст) дописывает агент.
|
||||
|
||||
@@ -11,7 +11,9 @@
|
||||
```markdown
|
||||
# Тай-брейк при равной полноте
|
||||
|
||||
**Секция:** ядро — вышла из спринта: остаток писал нерешённое в журнал · **Хук:** порядок канонических форм берёт меньшее в 96% случаев — для накопительных это систематический недосчёт · **Теги:** goal:merge-robustness, sprint:2026-08-03
|
||||
- **Секция:** ядро — вышла из спринта: остаток писал нерешённое в журнал
|
||||
- **Зачем:** порядок канонических форм берёт меньшее в 96% случаев — для накопительных это систематический недосчёт
|
||||
- **Теги:** goal:merge-robustness, sprint:2026-08-03
|
||||
|
||||
При столкновении точек выигрывает более полная, но при равной полноте побеждает
|
||||
последняя доставка — а она систематически беднее первой.
|
||||
@@ -33,19 +35,27 @@
|
||||
префиксом `[goal]` / `[idea]` / `[epic]`; обычная задача — без префикса.
|
||||
Отдельного поля типа **нет**: два места для одного факта разъезжаются, а
|
||||
префикс виден прямо в индексе, где и принимается решение «брать или не брать».
|
||||
- **Мета-строка** — первая непустая строка после заголовка. Обязательна секция,
|
||||
причина после тире желательна (именно она объясняет, почему задача здесь
|
||||
оказалась — в том числе «вышла из спринта: …»), хук и теги опциональны. Поля
|
||||
разделяются ` · `, порядок свободный. `·` — служебный разделитель: в тексте
|
||||
причины и хука его быть не должно.
|
||||
- **Хук живёт здесь, а не только в индексе.** Строка индекса его повторяет и
|
||||
производна от него: `check` сверяет, `check --fix` восстанавливает пропавшую
|
||||
строку **вместе с хуком**. Пока хук лежал только в индексе, штатная починка
|
||||
дрейфа теряла его молча и навсегда — а хук это единственное, по чему задачу
|
||||
выбирают, не открывая.
|
||||
- **Мета-блок** — список сразу после заголовка, **поле на строку**. Обязательна
|
||||
секция, причина после тире желательна (именно она объясняет, почему задача
|
||||
здесь оказалась — в том числе «вышла из спринта: …»), «зачем» и теги
|
||||
опциональны. Порядок свободный, поле в одну строку. Нераспознанные поля
|
||||
сохраняются: скрипт правит свои и не трогает чужие.
|
||||
- **«Зачем» отвечает на «зачем нужна эта задача»** — состояние, остаток, боль.
|
||||
Не пересказ задачи: пересказ уже есть по ссылке. Живёт здесь, а не только в
|
||||
индексе: строка индекса его повторяет и производна от него, `check` сверяет,
|
||||
`check --fix` восстанавливает пропавшую строку **вместе с ним**. Пока поле
|
||||
лежало только в индексе, штатная починка дрейфа теряла его молча и
|
||||
навсегда — а это единственное, по чему задачу выбирают, не открывая.
|
||||
|
||||
- **Тело** — одна фраза «что станет наблюдаемо иначе», критерии приёмки, рамки,
|
||||
контекст, ссылки. Пишется на языке документации проекта.
|
||||
|
||||
Мета **одной строкой через `·`** — прежняя форма. Она читается по-прежнему,
|
||||
`check` называет её дрейфом, `check --fix` переписывает списком; поле `Хук`
|
||||
при этом становится `Зачем`. Причина отказа от строки простая: с тремя полями
|
||||
и длинным «зачем» строка уезжала за экран, а `·` приходилось запрещать в тексте
|
||||
причины и самого «зачем».
|
||||
|
||||
Тело — не план реализации и не спецификация: принятое и реализованное переезжает
|
||||
в документацию проекта, а файл задачи удаляется.
|
||||
|
||||
@@ -95,7 +105,7 @@
|
||||
**Ответ на вопрос — три правки, и первая обязательна.** Раздел «Вопросы»
|
||||
опустошается: ответ переезжает в тело решением, а не остаётся вопросом рядом с
|
||||
ответом. Затем снимается тег (`edit <slug> --rm-tag question`) и переписывается
|
||||
хук: «Решено: …» на вопрос «почему это лежит в беклоге» уже не отвечает.
|
||||
«зачем»: «Решено: …» на вопрос «зачем нужна эта задача» уже не отвечает.
|
||||
|
||||
**Порядок именно такой, потому что судит раздел, а не тег.** `sprint take`
|
||||
смотрит в непустой раздел и откажет взять задачу даже со снятым тегом, а `check`
|
||||
@@ -107,7 +117,8 @@
|
||||
```markdown
|
||||
# [goal] Прочность слияния
|
||||
|
||||
**Секция:** темы · **Теги:** decomposed
|
||||
- **Секция:** темы
|
||||
- **Теги:** decomposed
|
||||
|
||||
Ради чего: точки из разных доставок сходятся в один часовой объект, и сегодня
|
||||
исход столкновения зависит от порядка доставки, а не от содержания.
|
||||
@@ -148,10 +159,10 @@
|
||||
Строка везде одной формы:
|
||||
|
||||
```markdown
|
||||
- [Заголовок дословно](items/slug.md) — хук
|
||||
- [Заголовок дословно](items/slug.md) — зачем
|
||||
```
|
||||
|
||||
Хук отвечает на «почему это лежит в беклоге» одним предложением: состояние,
|
||||
«Зачем» отвечает на «зачем нужна эта задача» одним предложением: состояние,
|
||||
остаток, боль. Пересказ первого абзаца бесполезен — он уже есть по ссылке.
|
||||
|
||||
| Файл | Что отвечает | Секции |
|
||||
@@ -208,7 +219,7 @@
|
||||
## Теги
|
||||
|
||||
Единственный механизм разметки, потому что `list --tag` уже умеет отбирать по
|
||||
ним порцию разбора. Отдельных полей мета-строки под это не заводим.
|
||||
ним порцию разбора. Отдельных полей меты под это не заводим.
|
||||
|
||||
- `goal:<слаг>` — цель, которой служит задача. Обязателен: задача без цели не
|
||||
попадёт ни в один спринт.
|
||||
|
||||
Reference in New Issue
Block a user