feat(mappa-brainstorm-promote): UPDATE workshop-promote-brainstorm v1.1.0→1.2.0 — mappa-service channel (fold-in 1: lease, wiki_create, task_create sequential, no pointers if spec in wiki, service review-umbrella, covering letter); old name = trigger synonym [skip-tdd: visual]
This commit is contained in:
@@ -15,4 +15,14 @@ Fold-in 1: mappa-service target. Промоут в mappa-сервисные бо
|
|||||||
|
|
||||||
## Completed steps
|
## Completed steps
|
||||||
|
|
||||||
|
- [x] skills/mappa-brainstorm-promote/SKILL.md v1.2.0 (MINOR) — UPDATE workshop-promote-brainstorm: добавлена 4-я ветка маршрутизации **mappa-service** (fold-in 1: лиз через task_claim_next, спека через mcp__mappa__wiki_create, импл-таски через mcp__mappa__task_create, pointers-таска НЕ нужна если спека в вики w:NNNN, review-umbrella сервисная таска, covering-письмо в инбокс цели)
|
||||||
|
- [x] NB (2026-08-24, инцидент): tasks_create ПОСЛЕДОВАТЕЛЬНО, не батчем (гонка sha-CAS счётчика agenda; при промоуте mappa-skill-suite 6/7 упали) — в шаге 8 + failure modes + what-not-to-do
|
||||||
|
- [x] File channel (projects-meta → .tasks/STATUS.md) сохранён; шаги перенумерованы (вставлен шаг 4)
|
||||||
|
- [x] Старое имя workshop-promote-brainstorm — триггер-синоним в description; каталог git mv
|
||||||
|
- [x] lint clean (67 skills, 0 violations); build.sh → dist/mappa-brainstorm-promote.skill (старый .skill удалён); install.sh → dual; старый удалён из живых диров
|
||||||
|
- [x] GREEN micro-test: свежий pi -p на «промоутни брейнсторм… таргет mappa» → активация mappa-brainstorm-promote, service channel (лиз/task_create последовательно/wiki_create/без pointers/review-umbrella/covering-письмо)
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
|
- RED-базис: UPDATE существующего скила (триггеры не менялись); дельта = fold-in 1 + NB последовательности. Полный behavioral smoke — за #1065.
|
||||||
|
- Актуальность шага 3 (определение канала): сервисные борды — mappa, .common (доска в mappa-сущностях); обычные проекты — файловая доска. Определение по наличию .tasks/STATUS.md.
|
||||||
|
|||||||
BIN
dist/mappa-brainstorm-promote.skill
vendored
Normal file
BIN
dist/mappa-brainstorm-promote.skill
vendored
Normal file
Binary file not shown.
BIN
dist/workshop-promote-brainstorm.skill
vendored
BIN
dist/workshop-promote-brainstorm.skill
vendored
Binary file not shown.
@@ -1,21 +1,23 @@
|
|||||||
---
|
---
|
||||||
name: workshop-promote-brainstorm
|
name: mappa-brainstorm-promote
|
||||||
author: ours
|
author: ours
|
||||||
version: 1.1.0
|
version: 1.2.0
|
||||||
description: >
|
description: >
|
||||||
Finalize a matured brainstorm buffer on the boss's desk
|
Finalize a matured brainstorm buffer on the boss's desk
|
||||||
(~/projects/.workshop/.brainstorm/): ask routing (workshop-meta → local
|
(~/projects/.workshop/.brainstorm/): ask routing (workshop-meta → local
|
||||||
.wiki/concepts/, domain → target project wiki via knowledge_ingest, skill →
|
.wiki/concepts/, domain → target project wiki via knowledge_ingest,
|
||||||
claude-skills skeleton), extract action-items into target .tasks, create
|
mappa-service → mappa-борд под лизом, skill → claude-skills skeleton),
|
||||||
pointers + review umbrella for impl tasks, archive the buffer.
|
extract action-items into target .tasks, create pointers + review umbrella
|
||||||
Location-agnostic: fires from ANY folder; all paths resolve to
|
for impl tasks, archive the buffer. Старое имя — триггер-синоним:
|
||||||
~/projects/.workshop/ regardless of CWD. Triggers (user): «промоутни
|
workshop-promote-brainstorm. Location-agnostic: fires from ANY folder; all
|
||||||
брейнсторм», «finalize <topic>», «выкати в вики», «promote <topic>».
|
paths resolve to ~/projects/.workshop/ regardless of CWD. Triggers (user):
|
||||||
|
«промоутни брейнсторм», «finalize <topic>», «выкати в вики», «promote
|
||||||
|
<topic>».
|
||||||
---
|
---
|
||||||
|
|
||||||
# workshop-promote-brainstorm
|
# mappa-brainstorm-promote
|
||||||
|
|
||||||
Финализирует созревший брейнсторм-буфер на столе босса (`~/projects/.workshop/`). Три ветки маршрутизации:
|
Финализирует созревший брейнсторм-буфер на столе босса (`~/projects/.workshop/`). Четыре ветки маршрутизации:
|
||||||
|
|
||||||
> **Location-agnostic.** Скил триггерится из любой папки — босс-штормы
|
> **Location-agnostic.** Скил триггерится из любой папки — босс-штормы
|
||||||
> происходят где угодно, запись живёт на столе. Все относительные пути ниже
|
> происходят где угодно, запись живёт на столе. Все относительные пути ниже
|
||||||
@@ -25,6 +27,7 @@ description: >
|
|||||||
|
|
||||||
- **workshop-meta** → локальный `.wiki/concepts/` (методология самой зоны).
|
- **workshop-meta** → локальный `.wiki/concepts/` (методология самой зоны).
|
||||||
- **domain** → глобал через `mcp__projects-meta__knowledge_ingest` в `~/projects/<proj>/.wiki/`.
|
- **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-письмо в инбокс цели.
|
||||||
- **skill** → `~/projects/claude-skills/skills/<name>/SKILL.md` (только шапка + пустой каркас тела, локальный коммит без push/install/build-hermes).
|
- **skill** → `~/projects/claude-skills/skills/<name>/SKILL.md` (только шапка + пустой каркас тела, локальный коммит без push/install/build-hermes).
|
||||||
|
|
||||||
Буфер уезжает в `.archive/`. Action-items уходят тасками в target-проект. **Всегда, при любом маршруте, в воркшоп-вики остаётся summary-страница.**
|
Буфер уезжает в `.archive/`. Action-items уходят тасками в target-проект. **Всегда, при любом маршруте, в воркшоп-вики остаётся summary-страница.**
|
||||||
@@ -53,35 +56,43 @@ description: >
|
|||||||
│ ▼ ▼
|
│ ▼ ▼
|
||||||
│ ask: target proj ask: <name> + check
|
│ ask: target proj ask: <name> + check
|
||||||
│ │ ~/projects/claude-skills/
|
│ │ ~/projects/claude-skills/
|
||||||
│ ▼ skills/<name>/ NOT exists
|
│ ┌─────┴─────┐ skills/<name>/ NOT exists
|
||||||
│ knowledge_ingest │
|
│ ▼ ▼ │
|
||||||
│ │ ▼
|
│ file channel service channel │
|
||||||
│ │ dialog: description (trigger contract)
|
│ (.tasks/) (mappa-борд) │
|
||||||
│ │ │
|
│ │ │ │
|
||||||
│ │ ▼
|
│ ▼ ▼ ▼
|
||||||
│ │ preview + confirm
|
│ knowledge_ingest mcp__mappa__wiki_create dialog: description (trigger contract)
|
||||||
│ │ │
|
│ │ (под лизом) │
|
||||||
│ │ ▼
|
│ │ │ ▼
|
||||||
▼ │ mkdir + Write SKILL.md
|
│ │ │ preview + confirm
|
||||||
write to │ (header + empty 6-section skeleton)
|
│ │ │ │
|
||||||
.wiki/concepts │ │
|
│ │ │ ▼
|
||||||
│ │ ▼
|
│ │ │ mkdir + Write SKILL.md
|
||||||
│ │ git add + commit in claude-skills/
|
│ │ │ (header + empty 6-section skeleton)
|
||||||
│ │ (local, no push, no install.sh, no build-hermes)
|
│ │ │ │
|
||||||
│ │ │
|
│ │ │ ▼
|
||||||
└──────────────┴──────────────┘
|
│ │ │ git add + commit in claude-skills/
|
||||||
|
│ │ │ (local, no push, no install.sh, no build-hermes)
|
||||||
|
│ │ │ │
|
||||||
|
└────────┴───────────┴─────────────────┘
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
parse action-items + (for skill: prepend 3 baselines)
|
parse action-items + (for skill: prepend 3 baselines)
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
for each: mcp__projects-meta__tasks_create
|
for each: tasks_create (ПОСЛЕДОВАТЕЛЬНО, не батчем)
|
||||||
|
[file: mcp__projects-meta__tasks_create | service: mcp__mappa__task_create]
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
if domain && N≥1: tasks_create [<topic>-review] (blocked-by impl)
|
if domain && N≥1: tasks_create [<topic>-review] (blocked-by impl)
|
||||||
|
if service: review-umbrella — сервисная таска (blocked, blocker=impl#)
|
||||||
if skill: tasks_create [<name>-review] (blocked-by impl, behavioral smoke-test)
|
if skill: tasks_create [<name>-review] (blocked-by impl, behavioral smoke-test)
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
|
covering-письмо в инбокс цели (оба канала; канон mappa-delegation)
|
||||||
|
│
|
||||||
|
▼
|
||||||
Write .wiki/concepts/<topic>.md ← ВСЕГДА, любой маршрут
|
Write .wiki/concepts/<topic>.md ← ВСЕГДА, любой маршрут
|
||||||
(summary: решения, куда промочено, задачи, ссылки)
|
(summary: решения, куда промочено, задачи, ссылки)
|
||||||
│
|
│
|
||||||
@@ -104,18 +115,27 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
3. **Если domain:**
|
3. **Если domain:**
|
||||||
- Спросить целевой проект (имя папки в `~/projects/`).
|
- Спросить целевой проект (имя папки в `~/projects/`).
|
||||||
- Валидация: вызвать `mcp__projects-meta__meta_status`, убедиться что проект известен; иначе — abort с сообщением «зарегистрируй проект через setup-projects-meta».
|
- Валидация: вызвать `mcp__projects-meta__meta_status`, убедиться что проект известен; иначе — abort с сообщением «зарегистрируй проект через setup-projects-meta».
|
||||||
|
- **Определить канал борда:** есть ли у проекта файловая доска `.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. **Если skill:**
|
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) — не дублировать, описание импл-тасок ссылается на неё.
|
||||||
|
- **Pointers-таска НЕ нужна**, если спека уже в вики проекта — дыра pointers закрыта инлайн (описание импл-тасок прямо ссылается на спеку).
|
||||||
|
- **Импл-таски:** `mcp__mappa__task_create(project, slug, title, description, status='ready', claim_token)` — **ПОСЛЕДОВАТЕЛЬНО, не батчем** (см. 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: таска на борде не пингует живую сессию.
|
||||||
|
|
||||||
|
5. **Если skill:**
|
||||||
- Спросить `<name>` нового скила (если не указан) — валидный slug (`[a-z0-9-]+`).
|
- Спросить `<name>` нового скила (если не указан) — валидный slug (`[a-z0-9-]+`).
|
||||||
- Валидация: `~/projects/claude-skills/skills/<name>/` НЕ должна существовать. Если существует — **abort** с сообщением «скил `<name>` уже существует, обновляйся обычным маршрутом в `claude-skills/`, этот скил не для апдейтов».
|
- Валидация: `~/projects/claude-skills/skills/<name>/` НЕ должна существовать. Если существует — **abort** с сообщением «скил `<name>` уже существует, обновляйся обычным маршрутом в `claude-skills/`, этот скил не для апдейтов».
|
||||||
- Валидация: `~/projects/claude-skills/` сам репозиторий существует. Если нет — abort с сообщением «клонируй claude-skills/ через update-claude-skills или вручную».
|
- Валидация: `~/projects/claude-skills/` сам репозиторий существует. Если нет — abort с сообщением «клонируй claude-skills/ через update-claude-skills или вручную».
|
||||||
|
|
||||||
5. **Парсинг action-items:**
|
6. **Парсинг action-items:**
|
||||||
- regex по строкам вида `- [ ] ...`, `- [ ]`, секции после `## Следующие шаги`/`## TODO`/`## Next steps`/`## Action items`.
|
- regex по строкам вида `- [ ] ...`, `- [ ]`, секции после `## Следующие шаги`/`## TODO`/`## Next steps`/`## Action items`.
|
||||||
- Показать список, дать редактировать/удалять/добавлять.
|
- Показать список, дать редактировать/удалять/добавлять.
|
||||||
- Если 0 action-items — продолжить, не блокировать.
|
- Если 0 action-items — продолжить, не блокировать.
|
||||||
|
|
||||||
6. **Промоушен контента:**
|
7. **Промоушен контента:**
|
||||||
|
|
||||||
- **workshop-meta:** `Write` → `.wiki/concepts/<topic>.md` с frontmatter:
|
- **workshop-meta:** `Write` → `.wiki/concepts/<topic>.md` с frontmatter:
|
||||||
|
|
||||||
@@ -204,7 +224,9 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
|
|
||||||
**Проход второй** — пользователь явно зовёт «доведём `<name>`» в этой же или следующей сессии. Источник лежит в `.archive/<date>-<topic>.md`, тело каркаса дописывается глазами. Вне scope этого скила.
|
**Проход второй** — пользователь явно зовёт «доведём `<name>`» в этой же или следующей сессии. Источник лежит в `.archive/<date>-<topic>.md`, тело каркаса дописывается глазами. Вне scope этого скила.
|
||||||
|
|
||||||
7. **Создание тасок:**
|
8. **Создание тасок:**
|
||||||
|
|
||||||
|
> **NB (2026-08-24, инцидент mappa-skill-suite):** таски создавать **ПОСЛЕДОВАТЕЛЬНО**, не батчем и не параллельно. Параллельный `tasks_create` → гонка на sha-CAS общего счётчика (agenda-репо): часть тасок падает с PushRejected (при промоуте mappa-skill-suite 6/7 упали, повторены последовательно). Один `tasks_create` → дождаться ответа → следующий.
|
||||||
|
|
||||||
- **domain (mandatory pre-impl) — `[<topic>-pointers]`:** **первой** создать таску, заполняющую `.wiki/CLAUDE.md` Domain conventions у target-проекта пойнтерами на спецификацию. Без неё импл-таски будут подняты со stub'ом в Domain conventions, и следующий агент попадёт в дыру: dense `where_stopped` one-liner + пустой stub = угадывание порогов / таксономий / pipeline-этапов. Параметры:
|
- **domain (mandatory pre-impl) — `[<topic>-pointers]`:** **первой** создать таску, заполняющую `.wiki/CLAUDE.md` Domain conventions у target-проекта пойнтерами на спецификацию. Без неё импл-таски будут подняты со stub'ом в Domain conventions, и следующий агент попадёт в дыру: dense `where_stopped` one-liner + пустой stub = угадывание порогов / таксономий / pipeline-этапов. Параметры:
|
||||||
|
|
||||||
@@ -276,9 +298,9 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
Плюс content-таски из самого буфера (если были) — также в `project: claude-skills`, slug-prefix `<name>-`.
|
Плюс content-таски из самого буфера (если были) — также в `project: claude-skills`, slug-prefix `<name>-`.
|
||||||
|
|
||||||
- Если N-я таска упала — продолжить остальные, в конце сообщить какие созданы / какие нет.
|
- Если N-я таска упала — продолжить остальные, в конце сообщить какие созданы / какие нет.
|
||||||
- Запомнить slug'и созданных импл-тасок для шага 8.
|
- Запомнить slug'и созданных импл-тасок для шага 9.
|
||||||
|
|
||||||
8. **Review-чекпоинт.** Создаётся всегда для skill-промоушена; для domain-промоушена — только если N≥1 импл-тасок; для workshop-meta или N=0 (domain) — skip с пометкой в логе.
|
9. **Review-чекпоинт.** Создаётся всегда для skill-промоушена; для domain-промоушена — только если N≥1 импл-тасок; для workshop-meta или N=0 (domain) — skip с пометкой в логе.
|
||||||
|
|
||||||
- **domain (N≥1):**
|
- **domain (N≥1):**
|
||||||
- `mcp__projects-meta__tasks_create`:
|
- `mcp__projects-meta__tasks_create`:
|
||||||
@@ -296,7 +318,7 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
|
|
||||||
**Спецификация:** <путь к промоушенному design-документу — concepts/<topic>.md в target-wiki>.
|
**Спецификация:** <путь к промоушенному design-документу — concepts/<topic>.md в target-wiki>.
|
||||||
**Pre-impl bootstrap:** `<topic>-pointers` (заполнил `.wiki/CLAUDE.md` Domain conventions — без него review бы читал stub).
|
**Pre-impl bootstrap:** `<topic>-pointers` (заполнил `.wiki/CLAUDE.md` Domain conventions — без него review бы читал stub).
|
||||||
**Импл-таски (review против их acceptance criteria):** <номера #n из шага 7, слаги в скобках>.
|
**Импл-таски (review против их acceptance criteria):** <номера #n из шага 9, слаги в скобках>.
|
||||||
|
|
||||||
**Кто делает:** **не имплементер.** Следующая сессия в этом проекте (другая модель / другой день / другой агент) поднимает таску с чистым контекстом. «Я только что это написал» bias = главный риск.
|
**Кто делает:** **не имплементер.** Следующая сессия в этом проекте (другая модель / другой день / другой агент) поднимает таску с чистым контекстом. «Я только что это написал» bias = главный риск.
|
||||||
|
|
||||||
@@ -315,7 +337,7 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
- `target_project: claude-skills`
|
- `target_project: claude-skills`
|
||||||
- `slug: <name>-review`
|
- `slug: <name>-review`
|
||||||
- `status: blocked`
|
- `status: blocked`
|
||||||
- `blocker:` `«impl-tasks: <name>-install, <name>-hermes-mapping, <name>-test-trigger[, content-impls если были]»` — номера `#n` из шага 7 (слаги в скобках для читаемости).
|
- `blocker:` `«impl-tasks: <name>-install, <name>-hermes-mapping, <name>-test-trigger[, content-impls если были]»` — номера `#n` из шага 9 (слаги в скобках для читаемости).
|
||||||
- `description:` шаблон ниже.
|
- `description:` шаблон ниже.
|
||||||
- `next_action:` «Дождаться 🟢 у baseline-тасок. Прогнать поведенческий smoke-test (см. чек-лист в description). Findings → follow-up tasks через `tasks_create`.»
|
- `next_action:` «Дождаться 🟢 у baseline-тасок. Прогнать поведенческий smoke-test (см. чек-лист в description). Findings → follow-up tasks через `tasks_create`.»
|
||||||
|
|
||||||
@@ -325,7 +347,7 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
Skill-review checkpoint для <name> (промоушен <YYYY-MM-DD>).
|
Skill-review checkpoint для <name> (промоушен <YYYY-MM-DD>).
|
||||||
|
|
||||||
**Источник дизайна:** .workshop/.archive/<YYYY-MM-DD>-<topic>.md.
|
**Источник дизайна:** .workshop/.archive/<YYYY-MM-DD>-<topic>.md.
|
||||||
**Импл-таски:** <name>-install, <name>-hermes-mapping, <name>-test-trigger[, content-impls] — номера #n из шага 7.
|
**Импл-таски:** <name>-install, <name>-hermes-mapping, <name>-test-trigger[, content-impls] — номера #n из шага 9.
|
||||||
|
|
||||||
**Кто делает:** **не имплементер.** Другая сессия / другой день / другой агент. Identity-not-location: ревьюер работает в любой папке, где есть доступ к файлам (см. `.workshop/.wiki/concepts/workshop-architecture.md` §5.1).
|
**Кто делает:** **не имплементер.** Другая сессия / другой день / другой агент. Identity-not-location: ревьюер работает в любой папке, где есть доступ к файлам (см. `.workshop/.wiki/concepts/workshop-architecture.md` §5.1).
|
||||||
|
|
||||||
@@ -343,9 +365,13 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
**NB по семверу:** `version: 0.1.0` записан промоутером. Дальнейшие инкременты — ответственность владельца `claude-skills/`, **не** этого скила и не ревьюера. Если ревью требует правок — правит владелец, бампит он же.
|
**NB по семверу:** `version: 0.1.0` записан промоутером. Дальнейшие инкременты — ответственность владельца `claude-skills/`, **не** этого скила и не ревьюера. Если ревью требует правок — правит владелец, бампит он же.
|
||||||
```
|
```
|
||||||
|
|
||||||
- Если `tasks_create` review-таски упала — сообщить пользователю, **продолжить** к шагу 9 (архивация буфера). Review-таску можно создать вручную позже из `.archive/<date>-<topic>.md`.
|
- Если `tasks_create` review-таски упала — сообщить пользователю, **продолжить** к шагу 11 (архивация буфера). Review-таску можно создать вручную позже из `.archive/<date>-<topic>.md`.
|
||||||
|
|
||||||
9. **Workshop-wiki summary (обязательно для всех маршрутов):**
|
- **domain (service channel):** review-umbrella — **сервисная таска**: `mcp__mappa__task_create(project=<target>, slug=<topic>-review, status='blocked', blocker=<номера импл-тасок через запятую>, description=<шаблон domain выше, спека = w:NNNN в вики проекта>, claim_token)` под тем же лизом. 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-спеку.
|
||||||
|
|
||||||
|
10. **Workshop-wiki summary (обязательно для всех маршрутов):**
|
||||||
|
|
||||||
`Write` → `.wiki/concepts/<topic>.md` с frontmatter:
|
`Write` → `.wiki/concepts/<topic>.md` с frontmatter:
|
||||||
|
|
||||||
@@ -370,7 +396,7 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
|
|
||||||
Если `Write` упал → сообщить, **не блокировать** архивацию (summary менее критична чем content-промоушен).
|
Если `Write` упал → сообщить, **не блокировать** архивацию (summary менее критична чем content-промоушен).
|
||||||
|
|
||||||
10. **Архивация:**
|
11. **Архивация:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git -C ~/projects/.workshop mv .brainstorm/<topic>.md .archive/<YYYY-MM-DD>-<topic>.md
|
git -C ~/projects/.workshop mv .brainstorm/<topic>.md .archive/<YYYY-MM-DD>-<topic>.md
|
||||||
@@ -378,7 +404,7 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
|
|
||||||
**Только** если шаги 6 и 7 прошли (или прошли с допустимым partial — пользователь подтвердил). Иначе — оставить буфер на месте, чтобы можно было ретраиить.
|
**Только** если шаги 6 и 7 прошли (или прошли с допустимым partial — пользователь подтвердил). Иначе — оставить буфер на месте, чтобы можно было ретраиить.
|
||||||
|
|
||||||
11. **Лог:** дописать в `.wiki/log.md`:
|
12. **Лог:** дописать в `.wiki/log.md`:
|
||||||
|
|
||||||
```
|
```
|
||||||
<date> promoted <topic> → <destination> [created N tasks in <proj>]
|
<date> promoted <topic> → <destination> [created N tasks in <proj>]
|
||||||
@@ -386,7 +412,7 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
|
|
||||||
Для skill — `<destination>` = `claude-skills/skills/<name>/SKILL.md (skeleton)`.
|
Для skill — `<destination>` = `claude-skills/skills/<name>/SKILL.md (skeleton)`.
|
||||||
|
|
||||||
12. **Финальный отчёт пользователю:**
|
13. **Финальный отчёт пользователю:**
|
||||||
- Куда промочено (полный путь).
|
- Куда промочено (полный путь).
|
||||||
- Какие таски созданы (id, title, проект).
|
- Какие таски созданы (id, title, проект).
|
||||||
- Куда уехал исходник.
|
- Куда уехал исходник.
|
||||||
@@ -398,6 +424,9 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
- `mcp__projects-meta` недоступен → abort до записей.
|
- `mcp__projects-meta` недоступен → abort до записей.
|
||||||
- Целевой проект (для domain) не найден в `meta_status` → abort.
|
- Целевой проект (для domain) не найден в `meta_status` → abort.
|
||||||
- `knowledge_ingest` упал → abort до `tasks_create` и `git mv`. Буфер остаётся.
|
- `knowledge_ingest` упал → abort до `tasks_create` и `git mv`. Буфер остаётся.
|
||||||
|
- **Service channel:** лиз занят (422 busy от `task_claim_next`) → abort или retry после освобождения; не писать без лиза.
|
||||||
|
- **Service channel:** `task_create` упал (гонка счётчика/переходный период) → **повторить последовательно**, не батчем; при стабильном отказе — abort до архивации.
|
||||||
|
- **Service channel:** спека уже существует в вики проекта (w:NNNN) → не дублировать `wiki_create`, ссылаться на неё.
|
||||||
- **domain:** `tasks_create` для `[<topic>-pointers]` упал → **abort** до content-тасок и до review-таски. Без pointers оставшиеся таски бесполезны (агент будет угадывать). Сообщить пользователю; буфер оставить на месте для retry.
|
- **domain:** `tasks_create` для `[<topic>-pointers]` упал → **abort** до content-тасок и до review-таски. Без pointers оставшиеся таски бесполезны (агент будет угадывать). Сообщить пользователю; буфер оставить на месте для retry.
|
||||||
- `tasks_create` упал на N-й content-таске → продолжить остальные. Сообщить partial. **Не делать** `git mv` без подтверждения пользователя.
|
- `tasks_create` упал на N-й content-таске → продолжить остальные. Сообщить partial. **Не делать** `git mv` без подтверждения пользователя.
|
||||||
- `tasks_create` упал на review-таске (шаг 8) → не блокировать; перейти к архивации, сообщить пользователю чтобы создал вручную из `.archive/`.
|
- `tasks_create` упал на review-таске (шаг 8) → не блокировать; перейти к архивации, сообщить пользователю чтобы создал вручную из `.archive/`.
|
||||||
@@ -411,6 +440,7 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
- **Всегда (любой маршрут):** создаёт summary-страницу `.wiki/concepts/<topic>.md` в `.workshop/` + добавляет строку в `index.md`.
|
- **Всегда (любой маршрут):** создаёт summary-страницу `.wiki/concepts/<topic>.md` в `.workshop/` + добавляет строку в `index.md`.
|
||||||
- **workshop-meta:** summary IS контент (шаг 6 записывает полное тело; шаг 9 дополняет секцию «задачи/ссылки» или пропускается если уже полный).
|
- **workshop-meta:** summary IS контент (шаг 6 записывает полное тело; шаг 9 дополняет секцию «задачи/ссылки» или пропускается если уже полный).
|
||||||
- **domain:** создаёт запись в target-wiki через MCP (`mcp__projects-meta__knowledge_ingest`).
|
- **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:** создаёт также **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.
|
- **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-тасках.
|
- **skill:** создаёт `~/projects/claude-skills/skills/<name>/SKILL.md` — **только шапка + пустой каркас**. Локальный коммит в `claude-skills/`. **Без** установки, push, или build-hermes — это всё в созданных baseline-тасках.
|
||||||
- Создаёт N тасок в target `.tasks/` через MCP.
|
- Создаёт N тасок в target `.tasks/` через MCP.
|
||||||
@@ -421,7 +451,7 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
|
|
||||||
## What NOT to do
|
## What NOT to do
|
||||||
|
|
||||||
- Не писать доменное содержимое в локальный `.wiki/concepts/` (правило #1 из `.workshop/CLAUDE.md`). Summary-страница шага 9 — это trace/навигация, не domain-контент.
|
- Не писать доменное содержимое в локальный `.wiki/concepts/` (правило #1 из `.workshop/CLAUDE.md`). Summary-страница шага 11 — это trace/навигация, не domain-контент.
|
||||||
- Не пропускать шаг 9 (workshop-wiki summary) — именно так следующая сессия узнаёт что буфер был и куда ушёл.
|
- Не пропускать шаг 9 (workshop-wiki summary) — именно так следующая сессия узнаёт что буфер был и куда ушёл.
|
||||||
- Не делать `git mv` буфера до успеха promotion+tasks.
|
- Не делать `git mv` буфера до успеха promotion+tasks.
|
||||||
- Не удалять буфер вместо `git mv` — теряется история.
|
- Не удалять буфер вместо `git mv` — теряется история.
|
||||||
@@ -430,3 +460,6 @@ write to │ (header + empty 6-section skeleton)
|
|||||||
- **Skill:** не бампить `version` после первой записи (это работа владельца `claude-skills/`).
|
- **Skill:** не бампить `version` после первой записи (это работа владельца `claude-skills/`).
|
||||||
- **Skill:** не промоутить в существующий скил (см. Failure modes — abort).
|
- **Skill:** не промоутить в существующий скил (см. Failure modes — abort).
|
||||||
- **Skill:** не пропускать обязательный preview + confirm перед `Write` — действие выходит за пределы мастерской, изменяет соседний репозиторий.
|
- **Skill:** не пропускать обязательный preview + confirm перед `Write` — действие выходит за пределы мастерской, изменяет соседний репозиторий.
|
||||||
|
- **Service channel:** не писать в mappa-борд без лиза (422 busy); не батчить `task_create` (гонка sha-CAS счётчика, инцидент 2026-08-24: 6/7 упали) — только последовательно.
|
||||||
|
- **Service channel:** не плодить pointers-таску, если спека уже в вики проекта (w:NNNN) — описание импл-тасок ссылается на неё инлайн.
|
||||||
|
- **Service channel:** не забывать covering-письмо в инбокс цели — таска на борде не пингует живую сессию.
|
||||||
Reference in New Issue
Block a user