Files
skills/skills/task-format/SKILL.md

9.8 KiB
Raw Blame History

name, author, version, description
name author version description
task-format ours 0.4.0 Use when creating or editing a task so it is actually claimable and routed — not silently skipped. Primary channel: **mappa** — create via `mcp__mappa__task_create` (схема ниже), не руками. Legacy: пока файловый поллер (agents-task-runner) не переключён на mappa (#984), блоки в `.tasks/STATUS.md` обязаны совпадать со строгим форматом (шапка, поля Weight/Notify), иначе поллер молча пропускает. Triggers: «оформить таску для поллера», «формат таски», «task block format», «make a task the poller will pick up», «add Weight/Notify», poller / agent-runner not claiming a task.

task-format

Канон создания задачи — через тул, не рукописным блоком. Поллер (автономный раннер) разбирает задачи строгими правилами; формат задаёт, какая таска будет взята, отмаршрутизирована и зарепорчена, а какая молча пропущена.

Создаёшь задачу для другого проекта/агента? См. delegate-task — он ведёт через тул + письмо. Работа с бордом (claim/close/status) — using-tasks.

Primary: mappa task.create

Создание задач в mappa (решение 14/15: мета в сервисе) — только через mcp__mappa__task_create, никогда руками вставляй блоки. Тул сам назначает per-type номер (t:N, решение 20) и пишет сущность.

mcp__mappa__task_create(
  project:  <имя проекта>,            // обязателен
  slug:     <kebab-case>,             // обязателен, латиница
  title:    <одна строка>,            // опционально
  description: <markdown>,            // тело; [[refs]] → рёбра (решение 4)
  status:   ready | active | paused | blocked | done,   // по умолчанию ready
  priority: P0 | P1 | P2,             // важность; отсутствует → P1 (task-priority-due)
  due:      yyyy-mm-dd,               // дедлайн; отсутствует = нет (task-priority-due)
  claim_token: <токен лиза проекта>   // мутация под лизом (решение 19)
)

**Priority/Due (task-priority-due, #1045):** задаются **только при создании**
— либо явными параметрами `priority`/`due`, либо строками в description
(`**Priority:** P0|P1|P2`, `**Due:** yyyy-mm-dd`; явные параметры переопределяют
парсинг). После создания агент приоритет и дедлайн **не меняет** — прецедент
человека структурный (update агентами отклоняется сервером). Обнаружил, что
таска на самом деле P0 → паркуй вопрос человеку, не бампай сам.

Мутация под лизом (решение 19): task_create требует claim_token активного лиза проекта (берётся mcp__mappa__task_claim_next). Без лиза — 422 busy. (Карв-аут: чтения и инбокс-доставка лиза не требуют.)

Per-type номер (решение 20): номер — канонический машинный реф t:N (см. ответы — поле ref). Глобальный id — internal, только для addressing (#1037). Ссылки на задачу в тексте — [[t:N]], не #<глобальный id>.

Slug-правила: короткий, lowercase, kebab-case, латиница (fix-nl-vds-reality-pq-dest, не Fix_this_TASK #1).

Status emoji ↔ state

Emoji State Значение
⚪ ready единственное состояние, которое поллер берёт
🔴 active взято / в работе
🟡 paused возобновляемо
🔵 blocked ждёт (указать почему в description/where_stopped)
🟢 done закрыто

Не путай: 🟢 — это done, не «готово».

Legacy: блок .tasks/STATUS.md (интерм до #984)

Пока файловый поллер (agents-task-runner) не переключён на mappa-лиз (#984), блоки в .tasks/STATUS.md, создаваемые руками/миграцией, обязаны совпадать со строгим форматом — иначе поллер молча пропускает или паркует. Это переходный канон; новые задачи создавай через task_create.

## ⚪ [#1234 my-task-slug] — One-line description.

**Status:** ready
**Created:** 2026-08-23
**Where I stopped:** (not started)
**Next action:** First concrete step the claiming agent runs.
**Branch:** master
**Weight:** needs-claude
**Notify:** OpeItcLoc03/workshop
<!-- created-by: you@machine / from: OpeItcLoc03/workshop / 2026-08-23 -->

---

Три load-bearing правила:

  1. Шапка точно: ## <emoji> [#<n> <slug>] — <description> — h2, один emoji, [#<n> <slug>] (глобальный номер, без ведущих нулей), разделитель — (пробел + em-dash + пробел). Несовпавшая шапка = задача не видна вообще.
  2. Поля — строки **Label:** value. Буллеты и проза игнорируются.
  3. **Created:** yyyy-mm-dd обязателен — пишется один раз при создании.

Номера legacy-блоков назначает сервер (tasks_create из счётчика OpeItcLoc03/agenda/task-counter) — никогда не выдумывай номер руками.

Поля, которые поллер разбирает

Field Format Meaning
**Weight:** cheap-ok | needs-claude | needs-human Тир маршрутизации. Обязателен для авто-взятия.
**Notify:** <owner>/<repo> Инбокс-адрес для событий close/park/delivery-failure.
**Requirements:** CSV (needs-db, needs-secrets) Capability-гейт: агент должен держать ВСЕ.
**Runtime allowed:** CSV (claude-opus) Runtime-whitelist.
**Consult policy:** auto | human-only | strict-human Эскалация consult; default human-only.
**Blocker:** CSV blocker-slug'ов Только на 🔵; авто-unblock при 🟢 всех.
**Priority:** P0 | P1 | P2 Важность (task-priority-due). Отсутствует = P1. Влияет на порядок выдачи claim_next (P0-пул первый, внутри по дедлайну). Ставится только при создании — после агенты не меняют.
**Due:** yyyy-mm-dd Дедлайн (task-priority-due). Просроченные (due < today, ready/active) → overdue-scan уведомляет в инбокс однократно. Отсутствует = нет дедлайна.
**Next action:** / **Where I stopped:** / **Branch:** free text Резюмируемость.

**Owner:** / **Claim token:** / **Claim expires at:** — claim-штамп, пишет и чистит поллер. Не автори руками; залипший штамп на ⚪ блокирует поллер.

Weight — поле, решающее взятие: без **Weight:** поллер берёт задачу, не находит тир и паркует в 🔵 (no backend for weight_tier: unknown). Обычный код → needs-claude; критикал-инфра (поллер, MCP-серверы, деплой, CI, git-хуки) → needs-human (никогда не авто).

Common mistakes

Mistake Fix
Рукописный блок вместо task_create Создавай через тул — номер/формат серверные.
### Title / буллеты вместо полей ## <emoji> [#n slug] — desc + **Field:** value.
🟢 для ready 🟢 — done. Ready — ⚪.
Шапка [slug] без номера [#n slug] — номер машинный ключ.
Выдуманный номер Номер — только от сервера (task_create).
**Created:** отсутствует (legacy) Добавить — обязательное поле.
Ссылка #<глобальный id> Ссылайся [[t:N]] (решение 20/#1037).
Без **Weight:** (legacy) Ставь всегда, или задача паркуется.
Агент бампает **Priority:**/**Due:** после создания Нельзя — прецедент человека структурный; ставь только при создании, иначе сервер отклоняет.
Дефис/двоеточие вместо — в шапке Разделитель — пробел + em-dash + пробел.

Verify

Задача корректна, когда: создана через task_create (или legacy-блок: шапка ## <emoji> [#n slug] — …, emoji = **Status:**, **Created:** есть, поля — **Label:** строки, есть **Weight:** и **Notify:**); slug kebab-case; ссылки на неё — [[t:N]].