feat(mappa-delegation): rewrite delegate-task → mappa-delegation v1.0.0 (cycle pre-flight→letter→review-umbrella, suite refs, #1054 note, old name = trigger synonym) [skip-tdd: visual]

This commit is contained in:
2026-08-24 22:47:17 +03:00
parent 9c7d256fe5
commit 0d8bda1714
4 changed files with 52 additions and 26 deletions

View File

@@ -17,4 +17,13 @@ Rewrite delegate-task → **mappa-delegation** (редизайн mappa-skill-sui
## Completed steps
- [x] skills/mappa-delegation/SKILL.md v1.0.0 — rewrite delegate-task v0.5.1 (цикл: pre-flight gate → шаблон → preview → confirm → covering-письмо → review-umbrella → downstream)
- [x] Старый skills/delegate-task/ удалён (поглощён; имя — триггер-синоним в description)
- [x] Suite-ссылки: using-tasks→mappa-task-work, inter-session-messaging→mappa-messaging, using-wiki→mappa-knowledge; нота лизинговой модели #1054 (create-без-лиза — опционально, контракт работает на текущих тулах)
- [x] lint clean (67 skills, 0 violations); build.sh → dist/mappa-delegation.skill (старый .skill удалён); install.sh → dual; старый удалён из живых диров
- [x] GREEN micro-test: свежий pi -p на «создать задачу на агента… common» → активация mappa-delegation, обязательная пара tasks_create + covering-письмо (адрес из адресной книги, [event: created]), review-umbrella с наследованием weight
## Notes
- RED-базис: тело унаследовано из delegate-task v0.5.1 (прошёл ревью + smoke); дельта = rename, suite-ссылки, цикл-фрейминг, нота #1054. Полный behavioral smoke — за #1065.
- Поглощает delegate-task без потери контента (все шаги 17 сохранены, включая weight-наследование review и downstream-правило task+letter).

Binary file not shown.

BIN
dist/mappa-delegation.skill vendored Normal file

Binary file not shown.

View File

@@ -1,32 +1,36 @@
---
name: delegate-task
name: mappa-delegation
author: ours
version: 0.5.1
version: 1.0.0
description: >
Use when delegating a task to another agent or project via
mcp__projects-meta__tasks_create. Every cross-project delegation is a
pair: tasks_create + covering letter to the recipient's inbox (event:
created) — a task on the board does not ping a live session. Triggers:
Цикл делегирования задачи другому агенту/проекту: pre-flight gate →
шаблон тела → dry-run preview → confirm → covering-письмо в инбокс
получателя → парная review-таска для impl. Каждая кросс-проектная делегация
— пара: tasks_create + письмо (event: created) — таска на борде не пингует
живую сессию. Старое имя — триггер-синоним: delegate-task. Триггеры:
«делегировать таску», «delegate task», «создать задачу на агента»,
«поставить задачу агенту», «tasks_create для». Does NOT apply to
self-assigned tasks on your own board («создать задачу себе», «task for
myself», «поставить себе задачу» → using-tasks), to work you do yourself,
or to workshop-internal tasks.
«поставить задачу агенту», «tasks_create для». НЕ применимо: self-assigned
таски на своей доске («создать задачу себе» → mappa-task-work), работа
своими руками, workshop-внутренние таски.
---
# delegate-task
# mappa-delegation
Унифицированный формат постановки задач на агентов через `mcp__projects-meta__tasks_create`. Обеспечивает что каждая делегированная задача содержит: обязательные скилы (императивный invoke), pre-flight разрешения, steering-loop поля (notify/weight/allow_upgrade).
Унифицированный **цикл постановки задач на агентов**: от pre-flight гейта до
covering-письма получателю. Гарантирует, что каждая делегированная задача
содержит: обязательные скилы (императивный invoke), pre-flight разрешения,
steering-loop поля (notify/weight), парную review-таску для impl — и что
получатель реально узнаёт о задаче (письмо, не только борд).
## When to use
Перед каждым вызовом `mcp__projects-meta__tasks_create` для другого проекта или агента.
Перед каждым вызовом `tasks_create` для другого проекта или агента.
**Активируется:** «делегировать таску», «delegate task», «создать задачу на агента», «поставить задачу агенту», «tasks_create для».
**Не применяется:**
- Работа которую выполняешь сам в текущей сессии.
- Self-assigned таски на своей доске («создать задачу себе», «task for myself», «поставить себе задачу») → `using-tasks`, не делегирование. Дизамбигуатор: «на агента»/«агенту»/«в проект X» = делегирование; «себе»/«myself» = своя доска.
- Self-assigned таски на своей доске («создать задачу себе», «task for myself», «поставить себе задачу») → `mappa-task-work`, не делегирование. Дизамбигуатор: «на агента»/«агенту»/«в проект X» = делегирование; «себе»/«myself» = своя доска.
- Workshop-internal таски (`.workshop/.tasks/` — workshop-meta, не делегирование).
- `tasks_create` с `target=agenda` (cross-project agenda — не делегирование агенту).
@@ -37,11 +41,16 @@ description: >
- Краткое описание задачи (цель + acceptance criteria)
- `weight``cheap-ok | needs-claude | needs-human`
- `notify` — slug проекта-комиссионера (кому писать inbox при close/park)
- `allow_upgrade``true/false` (опционально; разрешить ли fallback на tier выше если нет matching backend)
Номер задаче присваивает сервер (`tasks_create` из счётчика `OpeItcLoc03/agenda/task-counter`) — постановщик номер не придумывает и не резервирует. Возвращённый `#n` из preview/confirm — машинный ключ задачи: им ссылаются блокеры, письма, decision-trail.
Номер задаче присваивает сервер (`tasks_create` из счётчика agenda/task-counter) — постановщик номер не придумывает и не резервирует. Возвращённый `#n` из preview/confirm — машинный ключ задачи: им ссылаются блокеры, письма, decision-trail.
## Steps
> **Лизинговая модель (#1054).** Мутации тасок гейтятся лизом проекта
> (`mcp__mappa__task_claim_next` → token для `task_create`; file channel —
> sha-CAS через Gitea). `#1054 lease-model-generalization` (create-без-лиза как
> принцип, claim на таску) — **опционально**: контракт этого скила работает на
> текущих тулах; перейти на create-без-лиза, когда #1054 имплементится.
## Steps (цикл)
### 1. Pre-flight gate (6 вопросов пользователю)
@@ -55,7 +64,7 @@ description: >
3. **Контекстные скилы сверх дефолтов?** — предложить по содержанию задачи (например `claude-api` для работы с Anthropic SDK, `frontend-design` для UI, `using-interns` если интерны разрешены), пользователь утверждает.
4. **notify — кому докладывать о завершении/затыке?** (slug проекта; обычно `.workshop` или `OpeItcLoc03/workshop`)
5. **Session-break после этой задачи?** — нужен ли разрыв сессии после её закрытия (domain-switch, milestone, heavy infra)?
- Если **да** → проставить `session_break` в теле задачи (см. шаблон): `true` или строка-hint с названием следующего трека. `using-tasks` остановится после close и предложит завершить сессию, не клеймя следующую задачу.
- Если **да** → проставить `session_break` в теле задачи (см. шаблон): `true` или строка-hint с названием следующего трека. `mappa-task-work` остановится после close и предложит завершить сессию, не клеймя следующую задачу.
- Если **нет** → поле не добавлять (дефолт — агент продолжает `claim-next`).
### 2. Составить тело задачи по шаблону
@@ -70,9 +79,9 @@ description: >
## Обязательные скилы — вызвать до начала работы
- invoke `tdd-criteria` — до написания кода
- invoke `using-tasks` — для управления статусом задачи
- invoke `mappa-task-work` — для управления статусом задачи
- invoke `project-discipline` — дисциплина коммитов/пушей
- invoke `using-wiki` после закрытия — заингесть .wiki/concepts/<slug>.md
- invoke `mappa-knowledge` после закрытия — заингесть .wiki/concepts/<slug>.md
[если кросс-проектная: - invoke `using-projects-meta` — cross-project tasks/wiki]
[контекстные скилы из шага 1.3]
@@ -81,7 +90,7 @@ description: >
**weight:** cheap-ok | needs-claude | needs-human
**notify:** <commissioning-project-slug>
[**allow_upgrade:** true/false]
[**session_break:** true | "<следующий трек / hint>"] # optional — using-tasks остановится после close, не клеймит следующую задачу
[**session_break:** true | "<следующий трек / hint>"] # optional — mappa-task-work остановится после close, не клеймит следующую задачу
```
**Когда ставить `session_break`** (опционально; по умолчанию НЕ ставить — это маркер реальной границы, не дефолт). Три случая:
@@ -90,7 +99,7 @@ description: >
2. **Milestone-задача** — последняя в группе sub-tasks одной фичи.
3. **Тяжёлая инфра-задача** — shared checkout, migrations, deploy — где разумно остановиться и проверить состояние.
Значение: `true` (следующий трек = «см. STATUS.md») либо строка-hint с названием следующего трека. Потребитель — `using-tasks` v1.2.0+ (Task completion step 6): после close печатает `🔚 SESSION BOUNDARY …` и останавливается, не клеймя следующую задачу. Дизайн: `.wiki/concepts/delegate-task-session-break.md`.
Значение: `true` (следующий трек = «см. STATUS.md») либо строка-hint с названием следующего трека. Потребитель — `mappa-task-work`: после close печатает `🔚 SESSION BOUNDARY …` и останавливается, не клеймя следующую задачу. Дизайн: `.wiki/concepts/delegate-task-session-break.md`.
**Этапные цепочки (staged breakdown):** если решение бьётся на этапы
(1 → 1b → 3), создавай каждый этап отдельной таской со `status: blocked` +
@@ -112,8 +121,8 @@ description: >
### 5. Сопроводительное письмо — обязательно при кросс-проектной делегации
После создания **каждая кросс-проектная делегация** дублируется письмом в
инбокс получателя (канон — `inter-session-messaging` v2: канал Mappa, адрес
из адресной книги `~/projects/.wiki/concepts/projects-address-book.md`):
инбокс получателя (канон — `mappa-messaging`: канал Mappa, адрес из адресной
книги `~/projects/.wiki/concepts/projects-address-book.md`):
```
mcp__mappa__inbox_send(
@@ -168,8 +177,9 @@ task» — общий случай (шаг 7 — его частность дл
## Side effects
- Создаёт таску в target-проекте через `mcp__projects-meta__tasks_create` (Gitea commit).
- Создаёт таску в target-проекте через `tasks_create` (file channel — Gitea commit; service channel — mappa-сущность под лизом).
- Опционально создаёт парную review-таску (status=blocked).
- Covering-письмо в инбокс получателя (кросс-проектная делегация).
## What NOT to do
@@ -181,7 +191,7 @@ task» — общий случай (шаг 7 — его частность дл
- Не создавать review-таску без `weight` — reconciler/поллер её пропустит. Наследовать от impl, флор `needs-claude` (см. Step 6).
- Не назначать `weight: cheap-ok` для задач где дисциплина критична (review, security, schema migration) — слабые модели могут игнорировать invoke-инструкции.
- Не назначать `weight: needs-claude` или `cheap-ok` задачам, меняющим критическую инфраструктуру (поллер, MCP серверы, deploy, CI/CD) — только `needs-human`.
- Не ставить `session_break` рутинно на каждую задачу — это маркер реальной границы (domain-switch / milestone / heavy infra), не дефолт; иначе `using-tasks` рвёт сессию после каждого close.
- Не ставить `session_break` рутинно на каждую задачу — это маркер реальной границы (domain-switch / milestone / heavy infra), не дефолт; иначе `mappa-task-work` рвёт сессию после каждого close.
- **Не создавать задачи из дизайна/решения без `**Спека:**`-ссылки** —
импл-агент угадывает пороги/скоуп вместо чтения дизайна.
- **Не создавать несколько тасок в один репо параллельно** — sha-lock
@@ -191,3 +201,10 @@ task» — общий случай (шаг 7 — его частность дл
живую сессию не пингует — task без letter остаётся незамеченной до
поллера/руки.
- **Не поручать агенту создать downstream-таску для живой сессии без парного inbox-письма** (см. Step 7). `tasks_create` в чужой борд живую сессию не пингует — ТЗ обязано требовать И таску, И письмо, иначе downstream-таска висит незамеченной.
## Reference
- Письма: `mappa-messaging` (канон inbox_send, адресная книга).
- Задачи/борд: `mappa-task-work`.
- Знание: `mappa-knowledge` (wiki после закрытия).
- Промоушен: `mappa-brainstorm-promote` (review-umbrella через него же).