Борд = сущности 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 умер.
9.3 KiB
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)
- Инбокс-свип —
mcp__mappa__inbox_monitor(project=<имя>): непрочитанные письма могут менять план. Обработай каждое поinter-session-messaging. - Борд —
mcp__mappa__entity_search(q='', type='task', project=<имя>, limit=50): отсортируй по статусу (🔴 → 🟡 → ⚪), по одной строке на таску, цитируй slug. - Если user назвал таску —
entity_get(id)по её рефу/номеру. - Подтверди одним предложением: «Мы в середине X, следующий шаг — Y».
- Спроси, верен ли план, перед действиями.
Переключение / пауза / конец сессии
- Текущая 🔴 →
task_closeесли завершена (см. закрытие), иначе пометьstatus=pausedчерез update-механику (owner остаётся; «where stopped» — в body или handoff). - Инбокс-свип на границе тасок (
inbox_monitor). - Возьми следующую:
task_claim_next(лиз + таска). Прежняя остаётся 🟡. - Подтверди ориентацию перед стартом.
Примечание про «Where I stopped»: у mappa-таски нет отдельного поля — держи место остановки в
description(последний абзац) или, для сессионного контекста, в handoff-сущности (session-handoff: summary/open_treks). Перед концом сессии обязательно запиши handoff — это аналог «Never lose Where I stopped».
Создание таски
- Через тул, не руками (решение 20): сначала лиз (
task_claim_next) →task_create(project, slug, title, description, status='ready', claim_token). Номерt:Nназначает сервер — не выдумывай. - Slug: kebab-case, латиница. Description: markdown,
[[refs]]на связанное. - Закрыть лиз не нужно — экспирится по TTL; мутации идут одним циклом.
Закрытие таски
- Pre-close coverage check. Собери acceptance criteria из description. Для каждого — evidence: тест в диффе, артефакт, ссылка на дизайн. Нет evidence на критерий → спроси user'а «закрывать или подождать coverage'а».
- Resolve/drop открытые вопросы.
task_close(project, id, claim_token)→ статусdone.- Notify-письмо (кросс-проектные таски). Если таска пришла из другого
проекта (в description/meta есть
from:/notify:) —inbox_sendкомиссионеру:project=<notify>,subject="[event: closed] <slug>", body = итог (сделано, acceptance, ссылки). Живая сессия пишет сама. - Дополни summary-строку в handoff/вики при наличии.
Рекомендации / «что дальше»
User спросил «что дальше», «status», «куда копаем» — рекомендую в порядке:
- Локальный борд текущего проекта (cwd):
entity_search(type='task', project=<имя>)— 🔴 → 🟡 → ⚪, по строке на таску, цитируй slug. - Одна 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 умер — файловые борды больше не настраиваются.