Files
skills/skills/using-tasks/SKILL.md
vitya 21023f1bae feat(using-tasks): v2.0.0 — .tasks/ board → mappa task-сущности (#983)
Борд = сущности type=task в сервисе (t:N, решение 20). Чтение — карв-аут
(entity_search), мутации под лизом (task_claim_next → claim_token, решение 19;
422 busy = чужой лиз — серверный аналог .tasks/.lock). claim/close/create/
heartbeat, notify-письмо при закрытии, локально-первая рекомендация. Файловый
.tasks/ — легаси; setup-tasks умер.
2026-08-24 16:45:58 +03:00

9.3 KiB
Raw Blame History

name, author, version, description
name author version description
using-tasks ours 2.0.0 Policy skill for working with the project task board in Mappa (решения 14/15: мета в сервисе). Use whenever switching between tasks, resuming a paused task, starting a new task, asking «where were we», says «use task management system», «pause», «switch to X», «what's the status», «update status», or tracking progress across parallel workstreams. Board = сущности `type=task` в mappa (чтение — карв-аут лиза; мутации — под лизом проекта, решение 19). Файловый `.tasks/` — легаси; `setup-tasks` умер (нечего настраивать).

using-tasks

Policy для поддержания сжатого рабочего контекста параллельных тасок. Борд проекта — сущности mappa: каждая таска t:N (per-type номер, решение 20) со статусом ready|active|paused|blocked|done, телом, owner'ом и рёбрами (refs → parent_of/ref, решения 4/6). Чтение — карв-аут лиза (решение 19); любая мутация — под лизом проекта.

MCP-поверхность

Операция Тул Примечание
Взять следующую ready-таску mcp__mappa__task_claim_next(project, owner) атомарно: лиз + таска; → {ok, token, task}
Продлить лиз mcp__mappa__task_heartbeat(project, claim_token) долгие таски
Создать таску mcp__mappa__task_create(project, slug, title?, description?, status?, claim_token) под лизом
Закрыть таску mcp__mappa__task_close(project, id, claim_token) под лизом
Прочитать таску mcp__mappa__entity_get(id) id internal из search/claim
Список борда mcp__mappa__entity_search(q, type='task', project=<имя>, limit) все статусы
Дерево parent_of mcp__mappa__graph_tree(root, depth?, fields?, limit?) зонтики/иерархия (решение 6)
Связанные сущности mcp__mappa__graph_neighbors/backlinks(id) рефы к таске
Уведомление при закрытии mcp__mappa__inbox_send(project=<notify>, from=<своя>, subject, body) письмо комиссионеру

Лиз = лок на запись (решение 19). Одна строка leases на проект: если другой агент держит лиз — task_claim_next вернёт 422 busy. Это серверный аналог старого .tasks/.lock: проверять «а не поллер ли работает» руками не нужно — сам claim скажет. Чтения лиза не требуют.

Рефы и id (#1037). Таски наружу несут ref: "t:N" первым полем, num следом, глобальный id — internal (последним, для addressing в тулах). Ссылайся на таску [[t:N]] (в body → рёбра автоматически), никогда #<глобальный id>.

Статусы (эмодзи для презентации)

Эмодзи Статус Значение
⚪ ready не начата, полностью определена
🔴 active в работе (обычно одна)
🟡 paused в процессе, возобновляема
🔵 blocked ждёт внешнего входа
🟢 done закрыта

Операции агента

Ориентация (session start)

  1. Инбокс-свип — mcp__mappa__inbox_monitor(project=<имя>): непрочитанные письма могут менять план. Обработай каждое по inter-session-messaging.
  2. Борд — mcp__mappa__entity_search(q='', type='task', project=<имя>, limit=50): отсортируй по статусу (🔴 → 🟡 → ⚪), по одной строке на таску, цитируй slug.
  3. Если user назвал таску — entity_get(id) по её рефу/номеру.
  4. Подтверди одним предложением: «Мы в середине X, следующий шаг — Y».
  5. Спроси, верен ли план, перед действиями.

Переключение / пауза / конец сессии

  1. Текущая 🔴 → task_close если завершена (см. закрытие), иначе пометь status=paused через update-механику (owner остаётся; «where stopped» — в body или handoff).
  2. Инбокс-свип на границе тасок (inbox_monitor).
  3. Возьми следующую: task_claim_next (лиз + таска). Прежняя остаётся 🟡.
  4. Подтверди ориентацию перед стартом.

Примечание про «Where I stopped»: у mappa-таски нет отдельного поля — держи место остановки в description (последний абзац) или, для сессионного контекста, в handoff-сущности (session-handoff: summary/open_treks). Перед концом сессии обязательно запиши handoff — это аналог «Never lose Where I stopped».

Создание таски

  1. Через тул, не руками (решение 20): сначала лиз (task_claim_next) → task_create(project, slug, title, description, status='ready', claim_token). Номер t:N назначает сервер — не выдумывай.
  2. Slug: kebab-case, латиница. Description: markdown, [[refs]] на связанное.
  3. Закрыть лиз не нужно — экспирится по TTL; мутации идут одним циклом.

Закрытие таски

  1. Pre-close coverage check. Собери acceptance criteria из description. Для каждого — evidence: тест в диффе, артефакт, ссылка на дизайн. Нет evidence на критерий → спроси user'а «закрывать или подождать coverage'а».
  2. Resolve/drop открытые вопросы.
  3. task_close(project, id, claim_token) → статус done.
  4. Notify-письмо (кросс-проектные таски). Если таска пришла из другого проекта (в description/meta есть from:/notify:) — inbox_send комиссионеру: project=<notify>, subject="[event: closed] <slug>", body = итог (сделано, acceptance, ссылки). Живая сессия пишет сама.
  5. Дополни summary-строку в handoff/вики при наличии.

Рекомендации / «что дальше»

User спросил «что дальше», «status», «куда копаем» — рекомендую в порядке:

  1. Локальный борд текущего проекта (cwd): entity_search(type='task', project=<имя>) — 🔴 → 🟡 → ⚪, по строке на таску, цитируй slug.
  2. Одна footnote-строка если кросс-проектно релевантно: Cross-project: N 🔴 active (см. mcp__projects-meta__tasks_aggregate). Только если N>0 и в cwd нет активной 🔴.

Кросс-проектные ургенты — информация, не драйвер «что делать здесь».

Правила

  • Лиз-дисциплина. Мутации — только под лизом; 422 busy = кто-то другой пишет, не параллель.
  • Never lose Where I stopped — критичное поле: в description + handoff.
  • Одна активная таска — только одна 🔴 на проект.
  • Не выдумывай номера — t:N назначает сервер.
  • Never close без coverage check — evidence на каждый acceptance criterion, иначе спросить.
  • Notify-письмо при закрытии кросс-проектных тасок — статус 🟢 ≠ комиссионер узнал.
  • Чтения — карв-аут. entity_search/entity_get/graph_* не требуют лиза и не блокируются чужим лизом.
  • Локально-первая рекомендация — борд cwd первым; кросс-проект — футонота.
  • Ссылайся [[t:N]], не глобальным id (#1037).

Legacy (переходное)

Файловый .tasks/ (STATUS.md + per-task файлы) — легаси-канал, живёт пока миграция/поллер не доедут. Не смешивай: новые таски — через mappa task_create; старые борды читай напрямую (.tasks/STATUS.md), если они ещё в файлах. setup-tasks умер — файловые борды больше не настраиваются.