From 8b0fd954ee4d4bf8a7a18c5c689d3f2a9f5b0b04 Mon Sep 17 00:00:00 2001 From: vitya Date: Mon, 24 Aug 2026 19:53:48 +0300 Subject: [PATCH] =?UTF-8?q?feat(skills):=20report-mappa-issue=20v0.1.0=20?= =?UTF-8?q?=E2=80=94=20temporary=20mappa=20deviation=20reporting=20(TDD:?= =?UTF-8?q?=20RED=20swallowed=20500s/locally-logged,=20GREEN=20mails=20map?= =?UTF-8?q?pa+.workshop)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + dist/report-mappa-issue.skill | Bin 0 -> 3637 bytes skills/report-mappa-issue/SKILL.md | 113 +++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 dist/report-mappa-issue.skill create mode 100644 skills/report-mappa-issue/SKILL.md diff --git a/README.md b/README.md index 1ce190e..d3c691f 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,7 @@ an explicit `adapted-from` marker in its frontmatter. | `writing-skills` | `adapted-from: obra/superpowers @ 6.2.0` (MIT) — TDD-for-skills core + ideya 8 self-skill-authoring | | `web-search` | `author: ours` — search_web tool (pi-extension) + policy: when to search, «без поиска» session-off | | `review-subagent` | `author: ours` — review_subagent tool (pi-extension): clean-context review by your own model, optional `model` override | +| `report-mappa-issue` | `author: ours` — TEMPORARY stopgap: mappa deviation reporting (mail to `mappa` + `.workshop`) while the service is unstable; retire when stabilized | | all other `skills/*` | `author: ours` | Adaptation policy: a clone is rewritten to our conventions (`.tasks/` boards, diff --git a/dist/report-mappa-issue.skill b/dist/report-mappa-issue.skill new file mode 100644 index 0000000000000000000000000000000000000000..0b50c1e76498f374a42837cd44622c320c8160b5 GIT binary patch literal 3637 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 E1E&1x_5c6? literal 0 HcmV?d00001 diff --git a/skills/report-mappa-issue/SKILL.md b/skills/report-mappa-issue/SKILL.md new file mode 100644 index 0000000..fdd46fb --- /dev/null +++ b/skills/report-mappa-issue/SKILL.md @@ -0,0 +1,113 @@ +--- +name: report-mappa-issue +author: ours +version: 0.1.0 +description: > + Use when working with mappa (MCP tools `mcp__mappa__*`, HTTP-роуты, скилы на + mappa) and anything deviates from the expected workflow: 500/5xx, «entity not + found» для id, который должен существовать, неожиданная форма ответа, + таймауты, молчаливые сбои, неверный статус, нестабильность. Report it by + mail to `mappa` AND `.workshop` — never swallow, never only-local-log, never + only in-chat. TEMPORARY skill: active while mappa is unstable; retire when + stabilized. Triggers: «маппа отдала 500», «entity not found», «неожиданный + ответ от mappa», «mappa вернула», "mappa returned 500", "entity not found", + unexpected mappa response. +--- + +# report-mappa-issue + +Любое отклонение от ожидаемого mappa-воркфлоу репортится **почтой в `mappa` +и `.workshop`** — немедленно, с evidence. Не глотать, не прятать в локальный +лог, не откладывать «до сборника». + +> ⚠️ **TEMPORARY (временный скил):** действует, пока mappa нестабильна. Это +> stopgap для сбора сигналов к стабилизации. Когда mappa стабилизируется +> (неделя без репортов) — скил отзывается: репорты становятся обычными +> баг-тасками. Владелец решения об отзыве — workshop. + +## When to use + +Репортить, когда в ходе работы с mappa произошло **любое** из: + +- **5xx / 500 / 502** на любом вызове (`task_*`, `wiki_*`, `inbox_*`, `entity_*`, + `admin_*`, `graph_*`, HTTP-роуты). +- **«Entity not found» / 404** для id/ref, который **должен** существовать + (знаешь, что создавал; видишь в свежем ответе; ссылается другое письмо/таска). +- **Неожиданная форма ответа** — поля не совпадают с документированными, + пустой `rows` где ожидались данные, новый/неожиданный тип в ответе. +- **Таймауты / зависания** вызова. +- **Молчаливый сбой** — вызов «успешен», но эффекта нет (таска не создалась, + письмо не ушло, статус не поменялся). +- **Ретрай сработал** — даже если повторный вызов прошёл: сама нестабильность + — сигнал для стабилизации (пометь `retry: resolved`). +- **Неверный/неожиданный статус** сущности, рассинхрон борда и реальности. + +**Ретраи допустимы** (1–2 с паузой), но репорт — независимо от исхода ретрая: +случай 500 → репорт; случай 500→ретрай→ок → репорт с `retry: resolved`. + +## When NOT to use + +- **Ожидаемый 404** — сущность действительно не существует и не должна + (никогда не создавалась; удалена по дизайну). Проверь перед репортом, что + сущность обязана была быть. +- **Документированные известные ограничения** (например, «verify на проде + невозможен по дизайну», «прод stale до редеплоя» — если это задокументировано + и известно команде mappa). +- **Отклонения НЕ от mappa** — VDS/docker (→ using-vds-ops), projects-meta кэш + (документированная сталезность), провайдеры моделей. Только mappa. +- **Уже зарепорченный тот же инцидент** — не дублируй (см. Dedup). + +## Core pattern — репорт + +Каждый вызов: `mcp__mappa__inbox_send` в **оба** адреса (`mappa` и `.workshop`, +адреса из адресной книги `~/projects/.wiki/concepts/projects-address-book.md`), +`from` = своё имя папки. Формат письма: + +``` +Subject: [mappa-issue] <симптом> @ <тул/эндпоинт> (<дата>) + +Body: +- Expected: <что должно было произойти по воркфлоу/докам> +- Actual: <ошибка/статус/ответ — текст сообщения или короткий сниппет> +- Call: <тул + ключевые параметры / эндпоинт + project> +- Retry: <сработал ли ретрай, сколько попыток> +- Recurrence: <первый раз / повторяется — сколько раз за сессию> +- Context: <проект, сессия, какой флоу шёл> +``` + +Одно письмо = **один инцидент** (симптом × эндпоинт). Рекуррентность — в том же +письме (`recurrence: 5 раз за 2 часа`), не новый репорт на каждый вызов. + +## Common mistakes / rationalizations + +| Рационализация | Реальность | +|---|---| +| «Mappa упала — письмо не дойдёт, зачем писать» | Письмо — сущность в Mappa (карв-аут, без лиза). При оживлении сервиса оно будет в инбоксе получателя. Пиши всегда. | +| «Расскажу человеку в чате» | Человек не всегда в сессии, команда mappa чат не видит. Письмо — durable и кросс-сессионно. | +| «Запишу в локальный лог» | Локальный лог не виден команде mappa. Цель репорта — видимость у получателей. (Локальная запись — дополнительно, не вместо.) | +| «Ретрай сработал — значит ок» | Нестабильность — сам по себе сигнал. Репорть с `retry: resolved`. | +| «Это мелочь, не буду спамить» | Пока mappa нестабильна — любой сигнал материал для стабилизации. Dedup защищает от спама, не молчание. | +| «Соберу несколько и отпишусь разом» | Первое вхождение — немедленно. Рекуррентность докидывай в то же письмо. | +| «Это наверняка уже известно mappa» | Неизвестно, пока не зарепорчено. Репорт — это и есть способ сделать известным. | + +## Red flags — STOP + +- Поймал ошибку mappa и продолжил молча (без репорта). +- Записал только локально / сказал только в чате — письма нет. +- Пропустил «entity not found», не проверив, должен ли id существовать. +- Отложил репорт «на потом» без письма и без таски. +- Зарепортил, но не в оба адреса (`mappa` и `.workshop`). + +## Cross-agent + +Канал — mappa inbox (`inbox_send` / `inbox.monitor`), общий для всех агентов +(pi: `mcp__mappa__inbox_send`; Claude Code: те же MCP-тулы; headless — то же). +Адресация — строго из адресной книги (`inter-session-messaging` канон). + +## Out of scope + +- **Не чинит mappa** — диагностика/починка сервиса отдельно; скил только + репортит. (Глубокий диагноз — `diagnosing-bugs` / `using-vds-ops` для инфры.) +- **Не репортит чужие сервисы** — только отклонения от mappa-воркфлоу. +- **Не заменяет** `inter-session-messaging` (механика отправки — там, этот скил + задаёт политику «что считать инцидентом»).