feat(skills): интерактивный контракт (wiki:2660) — выпил claim/TTL/heartbeat из mappa-* скилов (#1040)

- mappa-task-work 1.0.0→1.1.0: «взять таску» = task_update(status=active, owner=<сессия>, version) + 409-retry; release = status=ready; close с version; heartbeat убран (живость из session live-ingest); MCP-таблица и loop-mode обновлены
- mappa-knowledge 1.0.0→1.1.0: wiki_create карв-аут, wiki_update version+409; лиз-секция убрана
- mappa-delegation 1.0.0→1.1.0: task_create карв-аут, close/update version+409
- mappa-brainstorm-promote 1.2.0→1.3.0: create карв-аут, 422 busy → 409-семантика
- mappa-messaging 1.0.0→1.1.0: task_create/close карв-аут + version+409
- mappa-closing-ritual: task_close version+409 (упоминания)

Откат claim-механики из скилов; контракт = wiki:2660.
This commit is contained in:
2026-08-25 00:27:25 +03:00
parent aa80e9faa5
commit ae45a51420
6 changed files with 109 additions and 106 deletions

View File

@@ -1,12 +1,12 @@
---
name: mappa-brainstorm-promote
author: ours
version: 1.2.0
version: 1.3.0
description: >
Finalize a matured brainstorm buffer on the boss's desk
(~/projects/.workshop/.brainstorm/): ask routing (workshop-meta → local
.wiki/concepts/, domain → target project wiki via knowledge_ingest,
mappa-service → mappa-борд под лизом, skill → claude-skills skeleton),
mappa-service → mappa-борд (карв-аут), skill → claude-skills skeleton),
extract action-items into target .tasks, create pointers + review umbrella
for impl tasks, archive the buffer. Старое имя — триггер-синоним:
workshop-promote-brainstorm. Location-agnostic: fires from ANY folder; all
@@ -27,7 +27,7 @@ description: >
- **workshop-meta** → локальный `.wiki/concepts/` (методология самой зоны).
- **domain** → глобал через `mcp__projects-meta__knowledge_ingest` в `~/projects/<proj>/.wiki/`.
- **mappa-service** → сервисные борды (mappa, .common, …): таски/вики-сущности через `mcp__mappa__task_create`/`wiki_create` **под лизом** (`task_claim_next`); pointers-таска НЕ нужна, если спека уже в вики проекта (w:NNNN); review-umbrella — сервисная таска; covering-письмо в инбокс цели.
- **mappa-service** → сервисные борды (mappa, .common, …): таски/вики-сущности через `mcp__mappa__task_create`/`wiki_create` (карв-аут, wiki:2660); review-umbrella — сервисная таска; covering-письмо в инбокс цели.
- **skill** → `~/projects/claude-skills/skills/<name>/SKILL.md` (только шапка + пустой каркас тела, локальный коммит без push/install/build-hermes).
Буфер уезжает в `.archive/`. Action-items уходят тасками в target-проект. **Всегда, при любом маршруте, в воркшоп-вики остаётся summary-страница.**
@@ -63,7 +63,7 @@ description: >
│ │ │ │
│ ▼ ▼ ▼
│ knowledge_ingest mcp__mappa__wiki_create dialog: description (trigger contract)
│ │ (под лизом) │
│ │ (карв-аут, wiki:2660) │
│ │ │ ▼
│ │ │ preview + confirm
│ │ │ │
@@ -118,10 +118,9 @@ description: >
- **Определить канал борда:** есть ли у проекта файловая доска `.tasks/STATUS.md` (file channel) или борд живёт в mappa-сущностях (service channel — сервисные проекты: mappa, .common, …). Проверка: файл `.tasks/STATUS.md` в чек-ауте (file) против `mcp__mappa__task_list(project=<proj>)` / `entity_search` (service). Если файловой доски нет, а mappa-сущности есть → **service channel**.
4. **Если domain + service channel (mappa-борд, fold-in 1):**
- **Лиз:** `mcp__mappa__task_claim_next(project=<target>, owner=<своя>)` → `token`.
- **Спека → вики-сущность:** `mcp__mappa__wiki_create(project, slug, body, claim_token)` (или `wiki_update`, если страница уже есть). Если спека уже в вики проекта (w:NNNN) — не дублировать, описание импл-тасок ссылается на неё.
- **Спека → вики-сущность:** `mcp__mappa__wiki_create(project, slug, body)` (или `wiki_update(project, id, version)`, если страница уже есть). Если спека уже в вики проекта (w:NNNN) — не дублировать, описание импл-тасок ссылается на неё.
- **Pointers-таска НЕ нужна**, если спека уже в вики проекта — дыра pointers закрыта инлайн (описание импл-тасок прямо ссылается на спеку).
- **Импл-таски:** `mcp__mappa__task_create(project, slug, title, description, status='ready', claim_token)` — **ПОСЛЕДОВАТЕЛЬНО, не батчем** (см. NB в шаге 7).
- **Импл-таски:** `mcp__mappa__task_create(project, slug, title, description, status='ready')` (карв-аут, wiki:2660) — **ПОСЛЕДОВАТЕЛЬНО, не батчем** (см. NB в шаге 7).
- **Review-umbrella:** сервисная таска `mcp__mappa__task_create(status='blocked', blocker=<номера импл-тасок>)`.
- **Covering-письмо:** `mcp__mappa__inbox_send(project=<target>, from=<своя>, subject='Промоушен <topic>: таски <#N>…', body=<перечень>).` — канон mappa-delegation: таска на борде не пингует живую сессию.
@@ -367,7 +366,7 @@ description: >
- Если `tasks_create` review-таски упала — сообщить пользователю, **продолжить** к шагу 11 (архивация буфера). Review-таску можно создать вручную позже из `.archive/<date>-<topic>.md`.
- **domain (service channel):** review-umbrella — **сервисная таска**: `mcp__mappa__task_create(project=<target>, slug=<topic>-review, status='blocked', blocker=<номера импл-тасок через запятую>, description=<шаблон domain выше, спека = w:NNNN в вики проекта>, claim_token)` под тем же лизом. Pointers-таска отсутствует (спека в вики).
- **domain (service channel):** review-umbrella — **сервисная таска**: `mcp__mappa__task_create(project=<target>, slug=<topic>-review, status='blocked', blocker=<номера импл-тасок через запятую>, description=<шаблон domain выше, спека = w:NNNN в вики проекта>)`. Pointers-таска отсутствует (спека в вики).
**Covering-письмо в инбокс цели (оба канала; канон mappa-delegation).** После создания тасок — `inbox_send` получателю-проекту: таска на борде не пингует живую сессию, письмо = пинг + контекст. File channel: `mcp__mappa__inbox_send(project=<target>, from=<своя>, subject='[event: created] <topic> — <N> тасок', body=<перечень: #N slug> )`. Service channel: то же, но `from` = своя папка (или сервисный адрес) и тело ссылается на w:NNNN-спеку.
@@ -424,7 +423,7 @@ description: >
- `mcp__projects-meta` недоступен → abort до записей.
- Целевой проект (для domain) не найден в `meta_status` → abort.
- `knowledge_ingest` упал → abort до `tasks_create` и `git mv`. Буфер остаётся.
- **Service channel:** лиз занят (422 busy от `task_claim_next`) → abort или retry после освобождения; не писать без лиза.
- **Service channel:** create — карв-аут (wiki:2660), 422 busy больше не бывает; 409 на `wiki_update` (version) → retry со свежей версией.
- **Service channel:** `task_create` упал (гонка счётчика/переходный период) → **повторить последовательно**, не батчем; при стабильном отказе — abort до архивации.
- **Service channel:** спека уже существует в вики проекта (w:NNNN) → не дублировать `wiki_create`, ссылаться на неё.
- **domain:** `tasks_create` для `[<topic>-pointers]` упал → **abort** до content-тасок и до review-таски. Без pointers оставшиеся таски бесполезны (агент будет угадывать). Сообщить пользователю; буфер оставить на месте для retry.
@@ -440,7 +439,7 @@ description: >
- **Всегда (любой маршрут):** создаёт summary-страницу `.wiki/concepts/<topic>.md` в `.workshop/` + добавляет строку в `index.md`.
- **workshop-meta:** summary IS контент (шаг 6 записывает полное тело; шаг 9 дополняет секцию «задачи/ссылки» или пропускается если уже полный).
- **domain:** создаёт запись в target-wiki через MCP (`mcp__projects-meta__knowledge_ingest`).
- **domain (service channel):** создаёт спека-сущность в вики mappa-проекта (`mcp__mappa__wiki_create` под лизом); импл-таски + review-umbrella — сервисные таски (`mcp__mappa__task_create` под лизом); covering-письмо в инбокс цели (`inbox_send`). Pointers-таска НЕ создаётся (спека уже в вики).
- **domain (service channel):** создаёт спека-сущность в вики mappa-проекта (`mcp__mappa__wiki_create` — карв-аут); импл-таски + review-umbrella — сервисные таски (`mcp__mappa__task_create` — карв-аут); covering-письмо в инбокс цели (`inbox_send`). Pointers-таска НЕ создаётся (спека уже в вики).
- **domain:** создаёт также **mandatory pre-impl** таску `[<topic>-pointers]` в target — pre-filled блок текста для `.wiki/CLAUDE.md` Domain conventions (ссылки на global wiki slug + workshop archive trace + local overview.md). Без неё последующий импл-агент попадает в дыру: where_stopped one-liner + пустой Domain conventions stub.
- **skill:** создаёт `~/projects/claude-skills/skills/<name>/SKILL.md` — **только шапка + пустой каркас**. Локальный коммит в `claude-skills/`. **Без** установки, push, или build-hermes — это всё в созданных baseline-тасках.
- Создаёт N тасок в target `.tasks/` через MCP.
@@ -460,6 +459,6 @@ description: >
- **Skill:** не бампить `version` после первой записи (это работа владельца `claude-skills/`).
- **Skill:** не промоутить в существующий скил (см. Failure modes — abort).
- **Skill:** не пропускать обязательный preview + confirm перед `Write` — действие выходит за пределы мастерской, изменяет соседний репозиторий.
- **Service channel:** не писать в mappa-борд без лиза (422 busy); не батчить `task_create` (гонка sha-CAS счётчика, инцидент 2026-08-24: 6/7 упали) — только последовательно.
- **Service channel:** не батчить `task_create` (гонка счётчика, инцидент 2026-08-24: 6/7 упали) — только последовательно; `wiki_update`/`task_close` со свежей version (409 → retry).
- **Service channel:** не плодить pointers-таску, если спека уже в вики проекта (w:NNNN) — описание импл-тасок ссылается на неё инлайн.
- **Service channel:** не забывать covering-письмо в инбокс цели — таска на борде не пингует живую сессию.