From aabf8da806cc7fea6cb6e7cbec6bdcb6ac14456a Mon Sep 17 00:00:00 2001 From: vitya Date: Tue, 25 Aug 2026 10:10:18 +0300 Subject: [PATCH] =?UTF-8?q?feat(skills):=20mappa-brainstorm-promote=201.5.?= =?UTF-8?q?0=E2=86=921.6.0=20=E2=80=94=20storm-=D0=BA=D0=B0=D0=BD=D0=B0?= =?UTF-8?q?=D0=BB:=20=D0=B1=D1=83=D1=84=D0=B5=D1=80=20=3D=20mappa=20storm-?= =?UTF-8?q?=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D1=8C,=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=BC=D0=BE=D1=83=D1=82=20=D1=87=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B7=20storm=5Fpromote,=20project-agnostic=20(#1066)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/mappa-brainstorm-promote.skill | Bin 11309 -> 6340 bytes skills/mappa-brainstorm-promote/SKILL.md | 594 ++++++++--------------- 2 files changed, 202 insertions(+), 392 deletions(-) diff --git a/dist/mappa-brainstorm-promote.skill b/dist/mappa-brainstorm-promote.skill index d1c29cb8fb7296c4202a35861a55d9152fb605d9..6ca3d03b1ce441ac64fb7da59d34ed4e95d6fed9 100644 GIT binary patch delta 6315 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

phizol4*bJ#v7Szv;6tIwcs;Uht<8j| z5Ho#A9qu{Mxx~34D-H)`{|hV5vwnRyp7efoK&2Un>q2%(!YLXAT1q>nBCteq9X@mz z@62)-PfI_#GyrQvxVMdR*kct=Y$9n_vSD))aqhLoZWt^@YhVV))2v1nIikQY&UWx@&+A(lF(Be2eJ8I=S$XV=ifFZ{8*zI>?(ipw)3;O6)w=p zpT%eR%hb-$4@q!%g7F+{LVjDJ^G`t$Q2cpc6;-F-$n2o)E8ab?!QG|c&+jFYE&fBf zS#-9Z$y=`NaP(w1Pj70H-ZM+(Zj!-LQ=Pt+GNhS9Cb}mJTi~tjh`M&j9m%p;6;+|m z=RSm!?Dw$Re9TOv4$P6cFHi2X3|QeOsg2gRnuSOS&9efpprGuG&V@;aK&#n!6O9_ zi(FUUf|DcgT_9CVv2umE2|Oy-5zsR;&16mgf-xg`GX7}IRK@JA{od8?=9ir;m}X;% z^QUC6N7(#ex7rz+%VYjGwO_BRh4(K$R)NRpX` z3i3Q(-gf2Pd61zJ5n?{Xls@b0^z8atn)emDV@i2Bl zj2#whebY&{si1l#-FqSOjY+?*f_>3FoUKC9)5OrcQ80tFBwuQlpz0Gb=$bI*ZfTjWkPWVYJ?YbENG?wuRkr%}3z(10 zde=wV;jE?zM$f0a@?e-Yf?MvUtF_5Wzh_6bT|mVd7#*0Gu}; zK*{*%DACX8`Rw5sLUZ;8Y9^hzPs;!La)Ogm=(~n*QZ=hWur$vYLvEx^LrEh0N2Vp( zECO9Mzwi1;5c%^z2g!<(_M}O6DcP;LCPM{VPox9UgxTf9R3Ui zkt0V4hw>QwWrI42gv#&Y&uCUTnhcSDqgMB>*YC&k`pmfVpp~5U4T!25>rd7=KFfs| zb9>awL545j^z}AFt-(*2Wk!S>i!*%nN9jJJh7S^{rp#S0#&awUT*c>>4sj-lKqvSa zfTOfMo$QJcJ+IacS9|9xcHBXXJN(1C;axw30%ld9yYotY9A}jDgAUZHy~S8DyqQ2Y z68U;r)tvAc{p1%USM+EY25{)+9x+Y;1gV;P6>WsebOKYiJh%tQAV8r@5iuMsH4x|IH65iz&R%@t=z$AKZ}?~^XA15+AjH$AlJeWe)%%4v!@ry zW7d;$uSKgd;cKsVTL^2hphi(;XWXRrMWVr<-myCMqtBu%+!yHj#q_7$=0wu@7_q4} z2=Colkzu)#V37oHkUyy^&DrNdaQ@9wfO;U13kD5%C+;EQf%_0cWr-k(#|VgL3pB1n zsr^SBnSB@#PK~k67 z?MHbd0E{%beMpRb<`rUvW6u~YI)*#Wq;;)w={sy3YMTPysLxN$P#bhL=7Kw)`kfeKktC2k$=4jb8&D~Kw0 zBfWt;FqdYzeyOe)x}{|ikeV={u#))*q;W`LS&HwM2~Sqw9~zagoTOCTQTk(lOjA!6 zYCG-OOkeJtMH(K`KjeRc6fI^UMGa$t_AvFW()5EQN9&9NgeM|KiU-t|BU{vvq@AZz zFD7^&-#W{`-F?2hqWvy2`v@mgRoYJ@-&UWlgcxyFFrY90#cFy_V^7zh!YXnMHsO-M z+g9Pep)vabnQ;NeK-dAebXYf%mY3ufPB&c`hDJ7tGK)QV)(ZvO0Tc@}hPKMX_IQpx za*PM^QXNXPITX`PX47|&E%M25xwM$cYlNub!zQ|V${2W6@(#^Ua=kUuIvP{$VA7f#mYQ(u#0Y)N&qAsJ z443oVe~EzbD;9~1OfdU)l~NHaI62lNO(cYo!5lDdLR5gb24jr=mPzzw6N_hQ?rFLl zIj8a&;FSiSOwq4Fxb zOTB^~W6)a_Vc#b-!A?0n21})T=8(kcSxeJn!{USIbq|{_WeaMyCbg8WBMc5FKDGI2 z&W|8Oo{5(ZeWJ%!I zC5zr*orWqH!X(%#NPzhG8mgS;jD$lXp<0!b(m*RHjbN`M4q8r$#Ow-2>DCXGXDhaN z1*4#~x8G2PZI#@cA3)P9WnD+t1*^JW<7;@n^FWqkjRfjH!w2Yi@^%lnam8&o ztmhZc4!IQ3Q!a{_lDw+giJ#u z3aICt;Z%!2$UyiJbC+L-x=Lr7tD&uvFi80j)5!Ivdaa0)JT<_tUTi+gMYsxbsTz0h z%8g})W^kHxJo)C?sk&v$DY(fu_ch?>&)Qq!frq{C+9s={iXNyV82We1hG^a_sHzZx zGG=ZtBk@3H7oeHqfoSxkk4O+na+PC&H40y4_2(y1W7X1gyW(yv{VP<^F9@m6k2ccQ ze?p>EK376bm!b{j&Ov7TXC|_|c%7-Yq})M9qW!w@xY_yHL7|V&QFHN^2daPUaR=<1 z&jV95o5%_e(5UD3(?s5Cy0QDrdz@mm4dm)ZGbnS30=A05nLYUYmAlpwNf4X~DmHS? z%8IqJA_dM{M;G>X1Vk~S^&dB4&G6C)>YXV}&lLNCT2uiMFW>|SsPLr5My9PtUEX2M zwD27{QUb%m!P~`dAvqjlS2|@`diTVIo+j(7BfH;!tMX6nB}e0Jf^Y$u<^Ttp=vi%% ze(Mfsz>QVJn;dl5sX-B$_WHLT&BK4AUnA(o8BTFJ&n_f0b4kYEX~-9S<6MD|GO5#? zS4-=Au`kb5#vg>~NWd5RR!FOvCb*gma8raN{dI2O$GDPCY@I6`v3Gm$H0_qt`z36}9 z9I>f=>t+0~i(K)Qzcr+oS{XmdMQ_XBgz}gCcG%y%akE)!@do(-@uECWvyO|{W@)!{ z5EcP9@q7!G>I=Tz;tF?Mv#eG{Ze7o10nGW0E@n$N{oHB2AT1;D{JM_w6& zCU6rfbk(@IQAViO9(a2pF$9D#Q$xQp{2#T?u;7WZTw93ED7eRRXsBkQv z;}+>~0iN7cab@4Vo}u>$I6*Py|AEihyP`5!=S9t?ys#KPmotUy;dSpd+>U5L^F$Ix zvO;!`|40f5E6gu+;Y{edrh1=qnRLzBuddg2M~Yo<;Dl#B5NFQne4@k&fxo-A;r%?h_g zl-a7wl;*I48MF{0VqG2(e69A2a~~SgHjD0;xIWtojyUD-kxK#Iwt;Mu;i|m&2Hc%X$;A$yz=%Ka5Ga2 zcLujZe)1CjalxVZKog?W4`dh2iGBJ2PGQ=wqrra$TVcSkqa9v6=&qw+C*e6U84PE+MSwBoGyN!@qK_I_#obDA)}&v`Gj9cm%kS#h znW^LiO!$}OJjzwX{PE9}Qh4f_6{KQ7bDFEVDKifBPL@}vR^b;e8T*u`6=!c=S8nx- zn9-{Mh@!<_ccL1?FS;%~1h#r~6z>DVA~}9{P;FI0wrV0az!JZ@_q$+H#6HK-K=Qa7 zo&6$|di(hMUO(B@j=A5(@Vs8&3BsyyoS#-I$*<2gJn!d&BeoDha#Yf+*-Vy<$S;L zdbF#)LhEj0JbyUnXF=~aluG#5W$G$cNS^dk7A*Dd$I>zqlf}+u92?N!=0j68F%l&m zORv;*U=ULg2b7^Q>QaD3h&44Uqp*yt29RQ#TJS<}v+)5JMCvni^&Cr?R-iD}$H*Ugki zJdc@?*AegW>ee~iJ#()nvz5x&Y39%s+r--<8{MLdQq}B2bPVT^&rV6Lb1@*j*38W0 zcl3WU)5vOA#>S;<$$=fe@TfZM(PjI6d{sPg*Fcflk{{*CsJp04?j1E8{&E|9^mGHB zvlrwB&p*K36-H)};tXmyG#eBKqqN7mQg!?UB4%#0N}Mvj{}krFoi>!xGxXcgz$S*@ z3?LtQhQ~={_kBjuBh^wv&Q73=yI|ju7E#lGD7e8h-OR(6IPDJ~BlTPaT|5491gzEu z-=bR__Am2EGZ9*8P{?#BC_c$jV{tnNJm1AqSR4tC9agsgEwB?@AFRTbR7&*CBV+4U zv`R#^K^E0dZ}I-CzgDx+TC*Cz45hcHVG!E!FB=LEb(}{2<#D2TK3L>f;#aZFaEpiG zui#7AyfqF(ChU2|WC6ZCnmDg)o=Asv(o{mkQJiESbLO8X@@=(ED9dA(juQA15?nr4 zOSsc;?VT6_A^*noux{^ItmN!IW0!msia6f$7ngfT#wzn<#835?ubR{3O`dd_0YFTL zteN7h+|N10)%#U)W?$GuXxd-c1Fi%GA76>VLKlIXsULMbi87z5ep?1A->4yNTa;+*mXTiV1e}UGbKmZ z6jS`3zsH0E$CDG7fMTpJjnJ8q;8F@86c=^5`VkMU3sI3bDm-KbJUE(DY6Ow{BCg$u z`n%Y!H$K6047*Ps1xrt`QFZ@ioYzyHc04-<*2N%z19Ra89JXPrM)X*m$5nODwTY}O zropaWPnzS4W10bAx)%kS(2#YUR)|1%X1U1%FG#x8S>1o!6d|SW{pSoLE_21Q=R2FV zn~RsQk&!=q);4mtxTcXa^N$c+9sh%nk}N0~I>`S{^8N?&{(td*a=l8jkWl}#5Bgs! N{#VETgMvXo{vVec=E?v7 diff --git a/skills/mappa-brainstorm-promote/SKILL.md b/skills/mappa-brainstorm-promote/SKILL.md index e20daf4..674f71e 100644 --- a/skills/mappa-brainstorm-promote/SKILL.md +++ b/skills/mappa-brainstorm-promote/SKILL.md @@ -1,466 +1,276 @@ --- name: mappa-brainstorm-promote author: ours -version: 1.5.0 +version: 1.6.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-борд (create — карв-аут без лиза wiki:2660), 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 - paths resolve to ~/projects/.workshop/ regardless of CWD. Triggers (user): - «промоутни брейнсторм», «finalize », «выкати в вики», «promote - ». + Finalize a matured brainstorm storm-entity in mappa (type=storm, in ANY + project): read buffer → route (workshop-meta → .workshop wiki; domain → + target project wiki; skill → ~/projects/skills skeleton) → promote via + mcp__mappa__storm_promote (atomic buffer → wiki-страница + archive, решение 7) + → extract action-items into target tasks (mcp__mappa__task_create, карв-аут) + → review umbrella → covering letter. Старое имя — триггер-синоним: + workshop-promote-brainstorm. Project-agnostic: storm lives where it is led, + not only in .workshop; file channels (.brainstorm/.archive) are read-only + legacy (импортированы в mappa). Triggers (user): «промоутни брейнсторм», + «finalize », «выкати в вики», «promote ». --- # mappa-brainstorm-promote -Финализация созревшего брейнсторм-буфера на столе босса (`~/projects/.workshop/`) — **процедура** (линейная: от чтения буфера до архивации), не цикл в смысле повторения: запускается явно на финальном буфере и доводит его до конца (промоушен + таски + архив). В форкфлоу встаёт между работой (`mappa-task-work`) и финишем (`mappa-closing-ritual`). Четыре ветки маршрутизации: +Финализация созревшего шторм-буфера, который живёт **как mappa storm-сущность** +(type=storm, status=buffer) в любом проекте — **процедура** (линейная: от чтения +буфера до промоута и тасок), не цикл: запускается явно на финальном буфере и +доводит его до конца. В форкфлоу встаёт между работой (`mappa-task-work`) и +финишем (`mappa-closing-ritual`). -> **Location-agnostic.** Скил триггерится из любой папки — босс-штормы -> происходят где угодно, запись живёт на столе. Все относительные пути ниже -> (`.brainstorm/`, `.archive/`, `.wiki/`, `index.md`) разрешаются относительно -> `~/projects/.workshop/` **независимо от CWD**; git-команды явно указывают -> `-C ~/projects/.workshop`. +> **Project-agnostic.** Шторм ведётся там, где его ведут, — не только в +> `.workshop/`. Скил триггерится из любой папки; буфер ищется в mappa +> (`entity_search` type=storm), а не на диске. Файловые `.brainstorm/`/ +> `.archive/` — read-only легаси: их содержимое уже импортировано в mappa +> storm-сущности (решение 15, флип), новые записи в файлы не делаются. -- **workshop-meta** → локальный `.wiki/concepts/` (методология самой зоны). -- **domain** → глобал через `mcp__projects-meta__knowledge_ingest` в `~/projects//.wiki/`. -- **mappa-service** → сервисные борды (mappa, .common, …): таски/вики-сущности через `mcp__mappa__task_create`/`wiki_create` (**create — карв-аут без лиза**, wiki:2660; update — version+409); pointers-таска НЕ нужна, если спека уже в вики проекта (wiki:NNNN); review-umbrella — сервисная таска; covering-письмо в инбокс цели. -- **skill** → `~/projects/claude-skills/skills//SKILL.md` (только шапка + пустой каркас тела, локальный коммит без push/install/build-hermes). +Три ветки маршрутизации (спросить пользователя): -Буфер уезжает в `.archive/`. Action-items уходят тасками в target-проект. **Всегда, при любом маршруте, в воркшоп-вики остаётся summary-страница.** +- **workshop-meta** → промоут в `.workshop`: wiki-страница в вики зоны + (методология самой зоны). +- **domain** → промоут в целевой проект: wiki-страница (спека) в его вики + + импл-таски + review-umbrella. +- **skill** → каркас скила в `~/projects/skills/skills//SKILL.md` + (только шапка + пустой каркас тела, локальный коммит без push/install). + +Промоут контента — **всегда через `mcp__mappa__storm_promote`**: атомарно +создаёт wiki-страницу (slug из шторма, body сохраняется) в проекте из вызова и +переводит шторм в `archive` (номер/slug стабильны, решение 20; рёбра parent_of, +событие `storm.promoted`). **Никаких git mv и файловых архивов.** Action-items +уходят тасками в target-проект через `mcp__mappa__task_create` (карв-аут без +лиза, #1054; последовательно, не батчем). ## When to use -- «промоутни брейнсторм», «finalize », «выкати в вики», «promote ». -- Пользователь явно ссылается на `.workshop/.brainstorm/.md` как на готовый к промоушену. +- «промоутни брейнсторм», «finalize », «выкати в вики», «promote + ». +- Пользователь ссылается на storm-сущность (storm:N) или на тему шторма, + которая созрела и готова к промоушену. ## Inputs -- Путь `.brainstorm/.md` или просто ``. -- Для skill-ветки дополнительно: `` нового скила (если не указан — спросить, предложить производное от topic). +- Storm-реф `storm:N` или `` (slug/тема шторма) + project (если шторм + не в текущем проекте — спросить). +- Для skill-ветки дополнительно: `` нового скила (если не указан — + спросить, предложить производное от topic). ## Decision flow ``` -.brainstorm/.md +storm-сущность в mappa (type=storm, status=buffer) │ ▼ - read + summarize (1–2 paragraphs) + find + read (entity_search type=storm → entity_get полный body) │ ▼ ask: workshop-meta or domain or skill? │ │ │ │ ▼ ▼ │ ask: target proj ask: + check - │ │ ~/projects/claude-skills/ + │ │ ~/projects/skills/ │ ┌─────┴─────┐ skills// NOT exists │ ▼ ▼ │ - │ file channel service channel │ - │ (.tasks/) (mappa-борд) │ + │ storm_promote storm_promote dialog: description (trigger contract) + │ (project=.workshop) (project=) │ + │ │ │ ▼ + │ │ │ preview + confirm │ │ │ │ - │ ▼ ▼ ▼ - │ knowledge_ingest mcp__mappa__wiki_create dialog: description (trigger contract) - │ │ (карв-аут, wiki:2660) │ - │ │ │ ▼ - │ │ │ preview + confirm - │ │ │ │ - │ │ │ ▼ - │ │ │ mkdir + Write SKILL.md - │ │ │ (header + empty 6-section skeleton) - │ │ │ │ - │ │ │ ▼ - │ │ │ git add + commit in claude-skills/ - │ │ │ (local, no push, no install.sh, no build-hermes) - │ │ │ │ - └────────┴───────────┴─────────────────┘ + │ │ │ ▼ + │ │ │ mkdir + Write SKILL.md + │ │ │ (header + empty 6-section skeleton) + │ │ │ │ + │ │ │ ▼ + │ │ │ git add + commit in ~/projects/skills/ + │ │ │ (local, no push, no install.sh) + │ │ │ │ + └────────┴───────────┴────────────┘ │ ▼ - parse action-items + (for skill: prepend 3 baselines) + parse action-items from storm body │ ▼ - for each: tasks_create (ПОСЛЕДОВАТЕЛЬНО, не батчем) - [file: mcp__projects-meta__tasks_create | service: mcp__mappa__task_create] + for each: mcp__mappa__task_create (ПОСЛЕДОВАТЕЛЬНО, не батчем) │ ▼ - if domain && N≥1: tasks_create [-review] (blocked-by impl) - if service: review-umbrella — сервисная таска (blocked, blocker=impl#) - if skill: tasks_create [-review] (blocked-by impl, behavioral smoke-test) + review-umbrella: mcp__mappa__task_create (blocked, blocker=impl#) │ ▼ - covering-письмо в инбокс цели (оба канала; канон mappa-delegation) + covering-письмо: mcp__mappa__inbox_send (канон mappa-delegation) │ ▼ - Write .wiki/concepts/.md ← ВСЕГДА, любой маршрут - (summary: решения, куда промочено, задачи, ссылки) - │ - ▼ - git -C ~/projects/.workshop mv .brainstorm/.md .archive/-.md - │ - ▼ - append to .wiki/log.md + финальный отчёт (wiki:NNNN — спека, storm:N — архив, таски) ``` ## Steps -1. **Прочитать `.brainstorm/.md`.** Показать summary (≤2 абзаца). +1. **Найти шторм в mappa.** `mcp__mappa__entity_search(type='storm', + project=<проект>, q=)` → в результатах storm:N + **internal id**. + Прочитать полный буфер: `mcp__mappa__entity_get(id=)` — тело = + running record шторма (frontmatter + раунды). -2. **Спросить тип:** - - **workshop-meta** — методология самой workshop-зоны: ретро дистилляции, паттерны, апгрейды скилов зоны. + - Если шторм не найден, но пользователь показывает файловый + `.workshop/.brainstorm/.md` — это легаси: он уже импортирован или + доимпортируется в mappa storm-сущность (оператор, 2026-08-25). Скил + работает с storm-сущностью; файлы не трогает. + - Если шторма нет ни в mappa, ни в файлах — создать storm-сущность: + HTTP `POST /entities` с `x-api-token: $MAPPA_API_TOKEN`, + body `{project, type:'storm', slug, status:'buffer', body}` (MCP-тула + `storm.create` пока нет — follow-up на mappa; контракт POST /entities, + решение 7/#1054). + +2. **Показать summary буфера (≤2 абзаца).** + +3. **Спросить тип:** + - **workshop-meta** — методология самой workshop-зоны: ретро дистилляции, + паттерны, апгрейды скилов зоны. - **domain** — доменное содержимое для какого-то целевого проекта. - - **skill** — методология общего назначения, оформляется как скил в `~/projects/claude-skills/`. + - **skill** — методология общего назначения, оформляется как скил в + `~/projects/skills/`. -3. **Если domain:** - - Спросить целевой проект (имя папки в `~/projects/`). - - Валидация: вызвать `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=)` / `entity_search` (service). Если файловой доски нет, а mappa-сущности есть → **service channel**. - -4. **Если domain + service channel (mappa-борд, fold-in 1):** - - **Create — карв-аут, лиз НЕ нужен** (wiki:2660): `task_create`/`wiki_create` - без claim_token (интерактивный контракт, поллер вне mappa). - - **Спека → вики-сущность:** `mcp__mappa__wiki_create(project, slug, body)` (или `wiki_update(project, id, version, …)`, если страница уже есть). Если спека уже в вики проекта (wiki:NNNN) — не дублировать, описание импл-тасок ссылается на неё. **Frontmatter-summary (wiki:2661):** при создании пиши `summary:` одной строкой в frontmatter — карточки `wiki.search` и поиск по вики читают его. - - **Pointers-таска НЕ нужна**, если спека уже в вики проекта — дыра pointers закрыта инлайн (описание импл-тасок прямо ссылается на спеку). - - **Импл-таски:** `mcp__mappa__task_create(project, slug, title, description, status='ready')` — **ПОСЛЕДОВАТЕЛЬНО, не батчем** (см. NB в шаге 7). - - **Review-umbrella:** сервисная таска `mcp__mappa__task_create(status='blocked', blocker=<номера импл-тасок>)`. - - **Covering-письмо:** `mcp__mappa__inbox_send(project=, from=<своя>, subject='Промоушен : таски <#N>…', body=<перечень>).` — канон mappa-delegation: таска на борде не пингует живую сессию. +4. **Если domain:** спросить целевой проект (имя папки в `~/projects/`). + Проверить, что проект существует в mappa: `mcp__mappa__entity_search` + type=project или `admin_status` (список проектов). Если нет — abort с + сообщением. 5. **Если skill:** - - Спросить `` нового скила (если не указан) — валидный slug (`[a-z0-9-]+`). - - Валидация: `~/projects/claude-skills/skills//` НЕ должна существовать. Если существует — **abort** с сообщением «скил `` уже существует, обновляйся обычным маршрутом в `claude-skills/`, этот скил не для апдейтов». - - Валидация: `~/projects/claude-skills/` сам репозиторий существует. Если нет — abort с сообщением «клонируй claude-skills/ через update-claude-skills или вручную». + - Спросить `` нового скила (если не указан) — валидный slug + (`[a-z0-9-]+`). + - Валидация: `~/projects/skills/skills//` НЕ должна существовать. + Если существует — **abort** с сообщением «скил `` уже существует, + обновляйся обычным маршрутом в `~/projects/skills/`, этот скил не для + апдейтов». + - Валидация: `~/projects/skills/` сам репозиторий существует. Если нет — + abort с сообщением «клонируй skills через update-skills или вручную». -6. **Парсинг action-items:** - - regex по строкам вида `- [ ] ...`, `- [ ]`, секции после `## Следующие шаги`/`## TODO`/`## Next steps`/`## Action items`. - - Показать список, дать редактировать/удалять/добавлять. - - Если 0 action-items — продолжить, не блокировать. +6. **Промоут контента (всегда через `storm_promote`, решение 7):** -7. **Промоушен контента:** + `mcp__mappa__storm_promote(project=, storm_id=)` - - **workshop-meta:** `Write` → `.wiki/concepts/.md` с frontmatter: + - Атомарно: buffer → wiki-страница (slug из шторма, body сохраняется, + рёбра parent_of wiki→storm и refs→storm) + шторм → `archive` + + значимое событие `storm.promoted`. + - **workshop-meta:** `project='.workshop'` → спека/концепт в вики зоны. + - **domain:** `project=` → спека в вики целевого проекта. **Frontmatter-summary + (wiki:2661):** убедиться, что в теле шторма есть `summary:` одной строкой + в frontmatter — карточки `wiki.search` читают его. Если нет — дописать + перед промоутом (через HTTP PATCH body шторма, entities.update). + - **skill:** контент шторма НЕ промоутится в вики (каркас пустой, тело + дописывается вторым проходом глазами) — но шторм всё равно архивируется + `storm_promote(project=<где шторм>)`, чтобы буфер не висел. + - Повторный промоут архивированного шторма → ошибка (one-shot, идемпотентно + через статус). Сверить `storm_id` (internal) из шага 1. + - Если `storm_promote` упал (конфликт версии, 409) → retry со свежим + internal id; при стабильном отказе — abort до создания тасок. - ```yaml - --- - date: - source: .brainstorm/.md - status: promoted - type: workshop-meta - --- - ``` - - Тело — содержимое буфера (можно слегка причесать заголовки, секции типа TODO убрать — они уже сепарированы в action-items). - - - **domain:** `mcp__projects-meta__knowledge_ingest` с параметрами: - - `project: ` - - `path: concepts/.md` (внутри target wiki) - - `content: <тело буфера с frontmatter>` - - Если `knowledge_ingest` падает → abort до tasks_create и до `git mv`. Сообщить пользователю. - - - **skill:** двухпроходной. - - **Проход первый (этот скил):** - - 1. **Диалог по `description`** — поведенческий контракт активации скила. Показать пользователю summary буфера и спросить: - - На каких триггер-фразах скил должен активироваться? (минимум 2-3, лучше — пары русский/английский) - - Что скил делает в одном предложении? - - Когда скил **не должен** активироваться (антипаттерны)? - - Из ответов собрать `description` строкой ~200-400 символов в стиле существующих скилов (см. `~/projects/claude-skills/skills/*/SKILL.md` для примеров). - - 2. **Preview + confirm** (обязательно): - ``` - Писать в: ~/projects/claude-skills/skills//SKILL.md - Frontmatter: name=, version=0.1.0, description=<...> - Body: пустой каркас с заголовками - When to use / Inputs / Steps / Failure modes / Side effects / What NOT to do - Коммит: feat(skills): add v0.1.0 (promoted from .workshop/.brainstorm/.md) - Без: install.sh, push, build-hermes (это в созданных тасках) - ОК? - ``` - - 3. После confirm: - - `mkdir -p ~/projects/claude-skills/skills//` - - `Write` файла `~/projects/claude-skills/skills//SKILL.md`: - - ```markdown - --- - name: - version: 0.1.0 - description: <вписанный пользователем триггер-контракт> - --- - - # - - <одно-два предложения что скил делает — из диалога> - - ## When to use - - <пусто, дописывается во втором проходе> - - ## Inputs - - <пусто> - - ## Steps - - <пусто> - - ## Failure modes - - <пусто> - - ## Side effects - - <пусто> - - ## What NOT to do - - <пусто> - ``` - - - В `~/projects/claude-skills/`: `git -C ~/projects/claude-skills add skills//SKILL.md && git -C ~/projects/claude-skills commit -m "feat(skills): add v0.1.0 (promoted from ~/projects/.workshop/.brainstorm/.md)"`. - - **STOP.** Не запускать `install.sh`. Не делать `git push`. Не править `hermes/mapping.yaml`. Это всё уйдёт тасками на шаге 7. - - **Проход второй** — пользователь явно зовёт «доведём ``» в этой же или следующей сессии. Источник лежит в `.archive/-.md`, тело каркаса дописывается глазами. Вне scope этого скила. +7. **Парсинг action-items:** regex по строкам вида `- [ ] ...` в теле шторма, + секции после `## Следующие шаги`/`## TODO`/`## Next steps`/ + `## Action items`. Показать список, дать редактировать/удалять/добавлять. + Если 0 action-items — продолжить, не блокировать. 8. **Создание тасок:** - > **NB (2026-08-24, инцидент mappa-skill-suite):** таски создавать **ПОСЛЕДОВАТЕЛЬНО**, не батчем и не параллельно. Параллельный `tasks_create` → гонка на sha-CAS общего счётчика (agenda-репо): часть тасок падает с PushRejected (при промоуте mappa-skill-suite 6/7 упали, повторены последовательно). Один `tasks_create` → дождаться ответа → следующий. + > **NB:** таски создавать **ПОСЛЕДОВАТЕЛЬНО**, не батчем. Один + > `task_create` → дождаться ответа → следующий. - - **domain (mandatory pre-impl) — `[-pointers]`:** **первой** создать таску, заполняющую `.wiki/CLAUDE.md` Domain conventions у target-проекта пойнтерами на спецификацию. Без неё импл-таски будут подняты со stub'ом в Domain conventions, и следующий агент попадёт в дыру: dense `where_stopped` one-liner + пустой stub = угадывание порогов / таксономий / pipeline-этапов. Параметры: + - **workshop-meta / domain:** для каждого action-item — + `mcp__mappa__task_create(project=, slug=, title, description, + status='ready')`. Create — карв-аут, лиз не нужен (wiki:2660/#1054). + Описание импл-таски ссылается на спеку (wiki:NNNN из шага 6). + - **skill:** три baseline-таски в `project='skills'`: + - `[-install]` — запустить `install.sh` в `~/projects/skills/`, + проверить активацию в новой сессии. + - `[-hermes-mapping]` — запись в `~/projects/skills/hermes/mapping.yaml` + (режим `auto` для стилевых, `pending` если трогает тулы/окружение). + - `[-test-trigger]` — прогнать триггер-фразы из description: + активируется на своих, не активируется на 2-3 близких чужих. + Плюс content-таски из буфера (если были) — тоже в `project='skills'`, + slug-prefix `-`. + - Если N-я таска упала — продолжить остальные, в конце сообщить какие + созданы / какие нет. Запомнить slug'и для review-umbrella. - - `target_project: ` - - `slug: -pointers` - - `status: ready` - - `description:` шаблон ниже - - `next_action:` готовый блок текста для копирования в `.wiki/CLAUDE.md` (шаблон ниже) +9. **Review-umbrella (для domain с импл-тасками и для skill — всегда):** - Description-шаблон: + `mcp__mappa__task_create(project=, slug=-review, + status='blocked', blocker=<номера импл-тасок через запятую>, description=<чек-лист>)` - ``` - Bootstrap-pointers для design . Pre-fills target's `.wiki/CLAUDE.md` - Domain conventions ссылками на спецификацию. Дизайн не лежит в этом репо — - только pointer-stub. Без этой таски следующий агент попадёт в дыру: - where_stopped one-liner + пустой Domain conventions stub = угадывание - порогов / таксономий / pipeline-этапов вместо чтения готовых решений. + - **Кто делает:** не имплементер. Следующая сессия в этом проекте (другая + модель / другой день / другой агент) с чистым контекстом. «Я только что + это написал» bias = главный риск. + - Чек-лист: прочитать спеку (wiki:NNNN из шага 6), `git log` shipped-коммитов, + для каждой импл-таски прогнать тесты и сверить с acceptance criteria, + findings → follow-up tasks через `task_create`. + - Закрытие: все findings зафайлены ИЛИ ревьюер подтвердил «нет findings» + в close-note. + - Если review-таска упала — сообщить, **продолжить** к шагу 10 (промоут уже + сделан, шторм в archive). - **Кто делает:** любой следующий агент в этом проекте. Это первая по - приоритету таска промоушена — все остальные импл-таски ссылаются на - pointers через .wiki/CLAUDE.md. - ``` +10. **Covering-письмо в инбокс цели (канон mappa-delegation).** Таска на борде + не пингует живую сессию, письмо = пинг + контекст: - Next-action шаблон (pre-filled, копировать дословно — подменив `` и ``): + `mcp__mappa__inbox_send(project=, from=<своя папка>, subject='Промоушен + : таски <#N…>', body=<перечень + wiki:NNNN спека>)` - ``` - В `.wiki/CLAUDE.md` секции "Domain conventions" вставить блок (или заменить - дефолтный setup-wiki stub): - - ### Mandatory: read design context before implementation - - Before picking up any task in `.tasks/`, load the full design context. It - does **not** live in this repo — only pointers do. Sources, in order: - - 1. **Global wiki design (canonical):** `mcp__projects-meta__knowledge_get` - с `slug = "concepts/"`. Architecture decisions, contracts, scope. - 2. **Brainstorm process trace (rationale):** - `~/projects/.workshop/.archive/-.md`. - Why each decision was made, what was rejected and why, anti-patterns. - 3. **Local `overview.md`** — thin summary of (1), used as quick orientation - only — never as the source of truth. - - Do **not** invent thresholds, taxonomies, container topology, or pipeline - stages from task `where_stopped` lines alone — those are pointers, not - specifications. - - --- - - Закоммитить: `wiki(claude): add design-context pointers for `. - ``` - - Конкретные значения, которые промоутер должен подставить **заранее** в - текст next_action перед `tasks_create`: - - - `` — тема промоушена (тот же slug, что используется в `concepts/.md` и в `.archive/-.md`). - - `` — сегодняшняя дата (та же, что в шаге 9 архивации). - - Если `tasks_create` для `-pointers` упала → **abort** до content-тасок и до review. Без pointers оставшиеся таски бесполезны: импл-агент будет угадывать. Сообщить пользователю, буфер оставить на месте. - - - **workshop-meta / domain (content):** для каждого action-item: - - `mcp__projects-meta__tasks_create` с `project: ` (для domain) или с `project: ` (для workshop-meta — спросить пользователя если неоднозначно). - - Title — первая строка action-item; description — остальное. - - - **skill:** **всегда** добавляются три baseline-таски в `project: claude-skills`: - - `[-install]` — запустить `install.sh` в `~/projects/claude-skills/`, проверить что скил активируется в новой сессии, сделать `/reload-plugins`. - - `[-hermes-mapping]` — добавить запись в `~/projects/claude-skills/hermes/mapping.yaml`. Режим: `auto` если скил чисто стилевой / response-style, `pending` если скил трогает инструменты или окружение (требует отдельного аудита). - - `[-test-trigger]` — прогнать триггер-фразы из `description` на тестовом буфере: убедиться что активируется на своих фразах И не активируется на 2-3 близких чужих (false-positive check). - - Плюс content-таски из самого буфера (если были) — также в `project: claude-skills`, slug-prefix `-`. - - - Если N-я таска упала — продолжить остальные, в конце сообщить какие созданы / какие нет. - - Запомнить slug'и созданных импл-тасок для шага 9. - -9. **Review-чекпоинт.** Создаётся всегда для skill-промоушена; для domain-промоушена — только если N≥1 импл-тасок; для workshop-meta или N=0 (domain) — skip с пометкой в логе. - - - **domain (N≥1):** - - `mcp__projects-meta__tasks_create`: - - `target_project: ` - - `slug: -review` - - `status: blocked` - - `blocker:` `«bootstrap: -pointers; impl-tasks: <номера #n через запятую>»` — блокеры по номерам (номер = машинный ключ; слаги оставить в скобках для читаемости). - - `description:` шаблон ниже. - - `next_action:` «Дождаться 🟢 у всех blocker-тасок (включая `-pointers` — без него pointers в `.wiki/CLAUDE.md` не залиты, и review будет читать stub). Прочитать спецификацию (см. путь в description). Для каждой импл-таски: `git show `, прогнать тесты в её scope'е, сверить с acceptance criteria. Findings → новые follow-up tasks через `mcp__projects-meta__tasks_create`.» - - Description-шаблон (domain): - - ``` - Code-review checkpoint для брейнсторма (промоушен ). - - **Спецификация:** <путь к промоушенному design-документу — concepts/.md в target-wiki>. - **Pre-impl bootstrap:** `-pointers` (заполнил `.wiki/CLAUDE.md` Domain conventions — без него review бы читал stub). - **Импл-таски (review против их acceptance criteria):** <номера #n из шага 9, слаги в скобках>. - - **Кто делает:** **не имплементер.** Следующая сессия в этом проекте (другая модель / другой день / другой агент) поднимает таску с чистым контекстом. «Я только что это написал» bias = главный риск. - - **Чек-лист ревью:** - - Прочитать спецификацию (acceptance criteria каждой импл-таски). - - `git log --oneline` shipped-коммитов (по slug или scope в commit-message). - - Для каждой импл-таски: прогнать соответствующие тесты, реально проверить что они доходят до своих веток (не coverage-illusion). - - Сверить дизайн-decisions со shipped-кодом (signature, params, error-paths, безопасность). - - Findings — отдельные follow-up tasks (`--fix` или подобное) через `tasks_create`. - - **Закрытие:** только когда все findings зафайлены ИЛИ ревьюер подтвердил «нет findings» в close-note. - ``` - - - **skill:** - - `mcp__projects-meta__tasks_create`: - - `target_project: claude-skills` - - `slug: -review` - - `status: blocked` - - `blocker:` `«impl-tasks: -install, -hermes-mapping, -test-trigger[, content-impls если были]»` — номера `#n` из шага 9 (слаги в скобках для читаемости). - - `description:` шаблон ниже. - - `next_action:` «Дождаться 🟢 у baseline-тасок. Прогнать поведенческий smoke-test (см. чек-лист в description). Findings → follow-up tasks через `tasks_create`.» - - Description-шаблон (skill): - - ``` - Skill-review checkpoint для (промоушен ). - - **Источник дизайна:** .workshop/.archive/-.md. - **Импл-таски:** -install, -hermes-mapping, -test-trigger[, content-impls] — номера #n из шага 9. - - **Кто делает:** **не имплементер.** Другая сессия / другой день / другой агент. Identity-not-location: ревьюер работает в любой папке, где есть доступ к файлам (см. `.workshop/.wiki/concepts/workshop-architecture.md` §5.1). - - **Поведенческий smoke-test (это и есть acceptance):** - - Скил активируется в чистой сессии на каждой триггер-фразе из `description` (русский И английский варианты). - - Скил **не** активируется на 2-3 близких но не своих фразах из соседних доменов (false-positive check). - - Каждый шаг секции `Steps` отрабатывает на тестовом буфере без ошибок. - - `Failure modes` уводят в abort, не в частичный успех с грязным состоянием. - - `What NOT to do` соответствует реальности — нет дыры между правилом и реализацией. - - Findings — обычные follow-up tasks (`--fix` или подобное) через `tasks_create` в `claude-skills`. - - **Закрытие:** только когда все findings зафайлены ИЛИ ревьюер подтвердил «нет findings» в close-note. - - **NB по семверу:** `version: 0.1.0` записан промоутером. Дальнейшие инкременты — ответственность владельца `claude-skills/`, **не** этого скила и не ревьюера. Если ревью требует правок — правит владелец, бампит он же. - ``` - - - Если `tasks_create` review-таски упала — сообщить пользователю, **продолжить** к шагу 11 (архивация буфера). Review-таску можно создать вручную позже из `.archive/-.md`. - - - **domain (service channel):** review-umbrella — **сервисная таска**: `mcp__mappa__task_create(project=, slug=-review, status='blocked', blocker=<номера импл-тасок через запятую>, description=<шаблон domain выше, спека = wiki:NNNN в вики проекта>)` — create = карв-аут (без лиза). Pointers-таска отсутствует (спека в вики). - - **Covering-письмо в инбокс цели (оба канала; канон mappa-delegation).** После создания тасок — `inbox_send` получателю-проекту: таска на борде не пингует живую сессию, письмо = пинг + контекст. File channel: `mcp__mappa__inbox_send(project=, from=<своя>, subject='[event: created] тасок', body=<перечень: #N slug> )`. Service channel: то же, но `from` = своя папка (или сервисный адрес) и тело ссылается на wiki:NNNN-спеку. - -10. **Workshop-wiki summary (обязательно для всех маршрутов):** - - `Write` → `.wiki/concepts/.md` с frontmatter: - - ```yaml - --- - date: - source: .brainstorm/.md → .archive/-.md - status: promoted - type: workshop-meta - --- - ``` - - Содержание (≤60 строк): - - **Что решили** — ключевые решения раундов (не пересказ, а outcomes). - - **Куда промочено** — полный путь: target-wiki / claude-skills / local concepts. - - **Задачи** — перечень slug'ов, созданных в шаге 7. - - **Ссылки** — архив буфера + связанные концепты в workshop-вики + глобальная вики. - - Для **workshop-meta**: summary — сокращение полного контента (который уже в `.wiki/concepts/.md` шага 6); если шаг 6 уже записал туда полный файл — шаг 9 его дополняет секцией «Куда промочено / Задачи» или пропускается (не дублировать). - - Затем обновить `index.md` — добавить строку в нужную секцию. - - Если `Write` упал → сообщить, **не блокировать** архивацию (summary менее критична чем content-промоушен). - -11. **Архивация:** - - ```bash - git -C ~/projects/.workshop mv .brainstorm/.md .archive/-.md - ``` - - **Только** если шаги 6 и 7 прошли (или прошли с допустимым partial — пользователь подтвердил). Иначе — оставить буфер на месте, чтобы можно было ретраиить. - -12. **Лог:** дописать в `.wiki/log.md`: - - ``` - promoted [created N tasks in ] - ``` - - Для skill — `` = `claude-skills/skills//SKILL.md (skeleton)`. - -13. **Финальный отчёт пользователю:** - - Куда промочено (полный путь). - - Какие таски созданы (id, title, проект). - - Куда уехал исходник. - - **Для skill:** напомнить что нужен второй проход «доведём ``» для дописывания тела каркаса. +11. **Финальный отчёт пользователю:** + - Куда промочено: `wiki:NNNN` (спека в вики target). + - Архив: `storm:N` (status=archive, номер стабилен). + - Какие таски созданы (ref, title, проект). + - **Для skill:** напомнить про второй проход «доведём ``». ## Failure modes -- `.brainstorm/.md` отсутствует → abort. -- `mcp__projects-meta` недоступен → abort до записей. -- Целевой проект (для domain) не найден в `meta_status` → abort. -- `knowledge_ingest` упал → abort до `tasks_create` и `git mv`. Буфер остаётся. -- **Service channel:** create упал (гонка счётчика/переходный период) → **повторить последовательно**, не батчем; при стабильном отказе — abort до архивации. -- **Service channel:** спека уже существует в вики проекта (wiki:NNNN) → не дублировать `wiki_create`, ссылаться на неё. -- **domain:** `tasks_create` для `[-pointers]` упал → **abort** до content-тасок и до review-таски. Без pointers оставшиеся таски бесполезны (агент будет угадывать). Сообщить пользователю; буфер оставить на месте для retry. -- `tasks_create` упал на N-й content-таске → продолжить остальные. Сообщить partial. **Не делать** `git mv` без подтверждения пользователя. -- `tasks_create` упал на review-таске (шаг 8) → не блокировать; перейти к архивации, сообщить пользователю чтобы создал вручную из `.archive/`. -- **Skill:** `~/projects/claude-skills/` не существует → abort с сообщением «клонируй через update-claude-skills или вручную». -- **Skill:** `~/projects/claude-skills/skills//` уже существует → abort с сообщением «скил уже существует, обновляйся обычным маршрутом в `claude-skills/`». -- **Skill:** пользователь не подтвердил preview перед записью → abort, состояние не меняется. -- **Skill:** локальный `git commit` в `claude-skills/` упал (например, не настроен user.email) → файл остаётся, сообщить пользователю что коммит нужно сделать руками; **не** делать `git mv` буфера до подтверждения. +- Шторм не найден в mappa (нет storm-сущности и нет файлового легаси) → abort, + сообщить: создать шторм через HTTP POST /entities (шаг 1) или дождаться + импорта. +- Целевой проект (domain) не существует в mappa → abort до промоута. +- `storm_promote` упал (409 версия / стабильный отказ) → retry со свежим + internal id; при повторном отказе — abort до создания тасок. Шторм остаётся + в buffer — ретраится позже. +- Шторм уже `archive` (повторный вызов) → abort: промоут one-shot, идемпотентность + через статус (решение 7). +- `task_create` упал на N-й content-таске → продолжить остальные, сообщить + partial. Промоут уже сделан — шторм не откатывается. +- `task_create` review-umbrella упал → не блокировать, сообщить пользователю + (создать вручную из шага 9). +- **Skill:** `~/projects/skills/` не существует → abort. +- **Skill:** `~/projects/skills/skills//` уже существует → abort. +- **Skill:** пользователь не подтвердил preview → abort, состояние не меняется. +- **Skill:** локальный `git commit` в `~/projects/skills/` упал → файл остаётся, + сообщить что коммит нужно сделать руками; промоут шторма не блокируется. ## Side effects -- **Всегда (любой маршрут):** создаёт summary-страницу `.wiki/concepts/.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`, карв-аут wiki:2660); импл-таски + review-umbrella — сервисные таски (`mcp__mappa__task_create`, карв-аут); covering-письмо в инбокс цели (`inbox_send`). Pointers-таска НЕ создаётся (спека уже в вики). -- **domain:** создаёт также **mandatory pre-impl** таску `[-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//SKILL.md` — **только шапка + пустой каркас**. Локальный коммит в `claude-skills/`. **Без** установки, push, или build-hermes — это всё в созданных baseline-тасках. -- Создаёт N тасок в target `.tasks/` через MCP. -- Для domain (N≥1) или skill: создаёт зонтичную review-таску (status=blocked, blocker=impl-slugs; для domain — также включает `-pointers`) в том же target. -- Перемещает `.brainstorm/.md` → `.archive/-.md`. -- Аппендит строку в `.wiki/log.md`. -- **Семвер скилов:** при target=skill промоутер записывает `version: 0.1.0` в шапку. Дальнейшие инкременты — ответственность владельца `claude-skills/`, **не** этого скила. При попытке промоушена в существующий скил — abort (см. Failure modes). +- **Всегда:** `storm_promote` — атомарно wiki-страница в target + шторм → + `archive` + рёбра parent_of (wiki→storm, refs→storm) + событие `storm.promoted`. + Файловый `.archive/` НЕ трогается (легаси read-only). +- **workshop-meta:** wiki-страница (концепт) в вики `.workshop`. +- **domain:** спека-страница в вики целевого проекта (с frontmatter-summary, + wiki:2661) + импл-таски + review-umbrella + covering-письмо. +- **skill:** каркас `~/projects/skills/skills//SKILL.md` (только шапка + + пустой 6-секционный каркас) + локальный коммит в `~/projects/skills/`. + **Без** install.sh, push, build-hermes — это в baseline-тасках. +- Создаёт N тасок в target через `mcp__mappa__task_create` (карв-аут). +- Создаёт review-umbrella таску (status=blocked, blocker=impl#). +- Отправляет covering-письмо в инбокс target. ## What NOT to do -- Не писать доменное содержимое в локальный `.wiki/concepts/` (правило #1 из `.workshop/CLAUDE.md`). Summary-страница шага 11 — это trace/навигация, не domain-контент. -- Не пропускать шаг 9 (workshop-wiki summary) — именно так следующая сессия узнаёт что буфер был и куда ушёл. -- Не делать `git mv` буфера до успеха promotion+tasks. -- Не удалять буфер вместо `git mv` — теряется история. -- **Skill:** не пытаться автоматически переформатировать тело буфера в каркас `Steps`/`Failure modes`/etc. — это поведенческий контракт, не косметика. Каркас остаётся пустым; тело дописывается во втором проходе глазами. -- **Skill:** не запускать `install.sh`. Не делать `git push` в `claude-skills/`. Не править `hermes/mapping.yaml`. Не запускать `build-hermes.py`. Это работа baseline-тасок, не промоутера. -- **Skill:** не бампить `version` после первой записи (это работа владельца `claude-skills/`). -- **Skill:** не промоутить в существующий скил (см. Failure modes — abort). -- **Skill:** не пропускать обязательный preview + confirm перед `Write` — действие выходит за пределы мастерской, изменяет соседний репозиторий. -- **Service channel:** не батчить `task_create` (гонка sha-CAS счётчика, инцидент 2026-08-24: 6/7 упали) — только последовательно. Create — карв-аут, лиз не нужен. -- **Service channel:** не плодить pointers-таску, если спека уже в вики проекта (wiki:NNNN) — описание импл-тасок ссылается на неё инлайн. -- **Service channel:** не забывать covering-письмо в инбокс цели — таска на борде не пингует живую сессию. +- **Не писать в файловые `.brainstorm/`/`.archive/`** — read-only легаси после + флипа (решение 15). Буфер живёт в mappa storm-сущности. +- **Не использовать `mcp__projects-meta__tasks_create` / `knowledge_ingest` / + `knowledge_promote`** — файловые каналы выпилены. Таски — `mcp__mappa__task_create`, + вики — `storm_promote` (контент) + `wiki_create`/`wiki_update` (доп. страницы). +- Не делать `git mv` буфера в архив — промоут архивирует сам. +- Не удалять шторм вместо промоута — теряется граф-история (parent_of, refs). +- Не батчить `task_create` (гонка; инцидент 2026-08-24: 6/7 упали) — только + последовательно. +- Не забывать covering-письмо — таска на борде не пингует живую сессию. +- **Skill:** не переформатировать тело буфера в каркас автоматически — тело + дописывается вторым проходом глазами. +- **Skill:** не запускать `install.sh`, не делать push, не править + `hermes/mapping.yaml` — это baseline-таски. +- **Skill:** не промоутить в существующий скил (abort).