From 60f317ace005135921c92832f019e2a857ec5eff Mon Sep 17 00:00:00 2001 From: vitya Date: Mon, 24 Aug 2026 22:52:20 +0300 Subject: [PATCH] =?UTF-8?q?feat(mappa-session-orient):=20new=20skill=20v1.?= =?UTF-8?q?0.0=20=E2=80=94=20start-phase=20ritual=20(contract=E2=86=92pull?= =?UTF-8?q?=E2=86=92handoff-read=E2=86=92inbox-raise=E2=86=92liveness?= =?UTF-8?q?=E2=86=92live-ingest=20query);=20absorbs=20pulling-before-work/?= =?UTF-8?q?session-handoff(read)/session-inbox-monitor/using-system-snapsh?= =?UTF-8?q?ot;=20404-skip=20for=20undeployed=20/session=20[skip-tdd:=20vis?= =?UTF-8?q?ual]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-08-24-01064-mappa-session-orient.md | 11 ++ dist/mappa-messaging.skill | Bin 7111 -> 7161 bytes dist/mappa-session-orient.skill | Bin 0 -> 3937 bytes dist/pulling-before-work.skill | Bin 3591 -> 0 bytes dist/session-inbox-monitor.skill | Bin 6450 -> 0 bytes dist/using-system-snapshot.skill | Bin 3157 -> 0 bytes skills/mappa-messaging/SKILL.md | 8 +- skills/mappa-session-orient/SKILL.md | 142 +++++++++++++++ skills/pulling-before-work/README.md | 29 --- skills/pulling-before-work/SKILL.md | 166 ------------------ skills/session-inbox-monitor/SKILL.md | 124 ------------- .../hooks/inbox-monitor.ps1 | 103 ----------- skills/using-system-snapshot/SKILL.md | 87 --------- 13 files changed, 157 insertions(+), 513 deletions(-) create mode 100644 dist/mappa-session-orient.skill delete mode 100644 dist/pulling-before-work.skill delete mode 100644 dist/session-inbox-monitor.skill delete mode 100644 dist/using-system-snapshot.skill create mode 100644 skills/mappa-session-orient/SKILL.md delete mode 100644 skills/pulling-before-work/README.md delete mode 100644 skills/pulling-before-work/SKILL.md delete mode 100644 skills/session-inbox-monitor/SKILL.md delete mode 100644 skills/session-inbox-monitor/hooks/inbox-monitor.ps1 delete mode 100644 skills/using-system-snapshot/SKILL.md diff --git a/.tasks/2026-08-24-01064-mappa-session-orient.md b/.tasks/2026-08-24-01064-mappa-session-orient.md index 6a528f9..6a419b0 100644 --- a/.tasks/2026-08-24-01064-mappa-session-orient.md +++ b/.tasks/2026-08-24-01064-mappa-session-orient.md @@ -17,4 +17,15 @@ ## Completed steps +- [x] skills/mappa-session-orient/SKILL.md v1.0.0 — старт-фаза: контракт → pull (--ff-only, полный цикл) → handoff read (staleness >7д → ask; orient+ask, без auto-execute) → inbox raise+sweep → liveness-сводка (meta_health/admin_status/snapshot, «живо/мертво») → live-ingest query (session_list, stale-active краш-детект, «другая связка → предложить») +- [x] Граница orient/ops (w:2605 round 3): «живо/мертво»; проблема на старте → эскалация человеку/диагностической сессии, не углубление +- [x] Поглощены: pulling-before-work, session-handoff(read), session-inbox-monitor(raise), using-system-snapshot (liveness); старые имена — триггер-синонимы +- [x] Live-ingest 404-skip задокументирован (роуты /session не задеплоены — сервер #1022 в репо, деплой ждёт #1055); контракт — w:2604 +- [x] mappa-messaging: ссылки session-inbox-monitor → mappa-session-orient (inbox raise) обновлены (3 места) +- [x] lint clean (63 skills, 0 violations); build.sh → dist/mappa-session-orient.skill; install.sh → dual; поглощённые удалены из живых диров +- [x] GREEN micro-test: свежий pi -p на «начало сессии» → ритуал по шагам (контракт→pull→handoff→inbox→liveness→live-ingest), граница «живо/мертво» + эскалация, 404-skip, read-only + ## Notes + +- #1064 была 🔵 blocked ← #1024 (клиент session-sync). Скил-документ завершён по контракту w:2604/w:2605; live-ingest E2E (шаг 6) отложен: сервер #1022 не задеплоен (#1055), клиент #1024 (.common) открыт. 404-skip в скиле — ориентация не блокируется. +- RED-базис: контент унаследован из 4 поглощённых скилов (все прошли ревью); дельта = слияние + live-ingest query + граница orient/ops. Полный behavioral smoke — за #1065. diff --git a/dist/mappa-messaging.skill b/dist/mappa-messaging.skill index 717cce0af8c3c9f4f2733ce14993a5c095fefc27..d34ef04461bf78c568bb1ec394bec4cdbeb622a8 100644 GIT binary patch delta 7137 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 XgXzF$8vp>kPLqWjJO-T`00000rZ52i delta 7087 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 diff --git a/dist/session-inbox-monitor.skill b/dist/session-inbox-monitor.skill deleted file mode 100644 index 162bd2331673679db0be8b438e95d9c693b4f717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6450 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 diff --git a/skills/mappa-messaging/SKILL.md b/skills/mappa-messaging/SKILL.md index 4ee8246..332cdc4 100644 --- a/skills/mappa-messaging/SKILL.md +++ b/skills/mappa-messaging/SKILL.md @@ -11,7 +11,7 @@ description: > inter-session-messaging. Триггеры: «напиши письмо <проекту>», «отправь сообщение», «свяжись с <проектом>», «передай <проекту>», «уведомь <проект>», а также получение входящего (см. ниже). НЕ про - доставку/мониторинг (→ session-inbox-monitor) и НЕ про задачи + доставку/мониторинг (→ mappa-session-orient, inbox raise) и НЕ про задачи (→ mappa-task-work, mcp__mappa__task_*). --- @@ -31,7 +31,7 @@ description: > - Получил входящее письмо (монитор доставил, или сам проверил `inbox_monitor`) — обработать по RECEIVE. - Обсуждаешь с другой сессией дизайн/скоуп/решения — держать POLICY (peer ≠ authority). -**НЕ для:** доставки/мониторинга почты (→ `session-inbox-monitor`), задач +**НЕ для:** доставки/мониторинга почты (→ `mappa-session-orient`, inbox raise), задач (→ `mappa-task-work`), handoff (→ `mappa-closing-ritual`), промоушена (→ `mappa-brainstorm-promote`). @@ -107,7 +107,7 @@ mcp__mappa__inbox_send( ## RECEIVE — как обработать входящее -1. Входящее доставляет монитор (`session-inbox-monitor`, pi-расширение) или +1. Входящее доставляет монитор (`mappa-session-orient` — inbox raise, pi-расширение) или ты проверяешь сам: `mcp__mappa__inbox_monitor(project=<своя папка>, limit)`. Ответ — `{rows: [{id, slug, from, subject, body}]}`: последние письма твоего проекта, с отправителем и темой (meta извлекается сервером). @@ -238,7 +238,7 @@ Lifecycle-письма помечай subject-префиксом `[event: <ти ## Reference -- Доставка/мониторинг входящих: `session-inbox-monitor` (вне suite, не переименован). +- Доставка/мониторинг входящих: `mappa-session-orient` (inbox raise; pi-расширение inbox-monitor). - Адресная книга: `~/projects/.wiki/concepts/projects-address-book.md` (shared wiki). - Список проектов Mappa: `mcp__mappa__admin_status` (карв-аут, без лиза). - Задачи: `mappa-task-work` (борд = `mcp__mappa__task_*`). diff --git a/skills/mappa-session-orient/SKILL.md b/skills/mappa-session-orient/SKILL.md new file mode 100644 index 0000000..fac8284 --- /dev/null +++ b/skills/mappa-session-orient/SKILL.md @@ -0,0 +1,142 @@ +--- +name: mappa-session-orient +author: ours +version: 1.0.0 +description: > + Старт-фаза форкфлоу: контракт + чтение (pull --ff-only → handoff read → + inbox raise → liveness-сводка «живо/мертво» → live-ingest query). Нужен и + для ad-hoc, где нет AGENTS.md-контракта. Поглощает pulling-before-work, + session-handoff(read), session-inbox-monitor(raise), using-system-snapshot + (liveness) + live-ingest query (старые имена — триггер-синонимы). Граница: + orient отвечает «живо/мертво» одной строкой; глубокая диагностика — вне + suite (эскалация человеку/диагностической сессии). Триггеры: «что на + сессии», «кто последним работал», «продолжи с места», «orient me», + session-start ритуал, «pull remote before work». +--- + +# mappa-session-orient + +Старт-фаза цикла агента: **контракт + чтение**, тонкий слой — отвечает на +вопрос «живо/мертво» (одна строка на секцию), не углубляется. Нужен и для +ad-hoc-сессий (где нет AGENTS.md-контракта — ориентация всё равно обязательна). + +> **Граница session-orient / ops (w:2605, round 3):** orient — «живо/мертво»; +> ops — «почему и что дальше». Проблема на старте → **не углубляться**: +> передать человеку или диагностической сессии (вне suite). + +## Когда использовать + +- Старт сессии (ритуал, порядок строго по Steps). +- «что на сессии», «кто последним работал», «продолжи с места», «orient me». +- Ad-hoc-сессия без трека/таски — ориентация всё равно (контракт + чтение). + +## Steps (порядок — ритуал) + +### 1. Контракт + +Прочитать `AGENTS.md` проекта (canon; `CLAUDE.md` — legacy-указатель). Если +AGENTS.md нет — ad-hoc: контракта нет, но ориентация продолжается (шаги 2–6 +не зависят от него). + +### 2. Pull (pulling-before-work, полный цикл) + +`git pull --ff-only` — один раз на старте. Проверки по порядку: git-work-tree? +(нет → silent exit), политика pull (`pull.rebase=true` + `pull.ff=only`, +set-if-absent), origin remote? (нет → skip), дерево чистое? (грязно → skip, +не stash), HEAD attached? (нет → skip), upstream? (нет → skip), `git pull --ff-only`. +**Никогда auto-merge/rebase, никогда stash.** Повторный pull — только по явному +«sync». + +### 3. Handoff read (session-handoff read-часть) + +1. `mcp__mappa__entity_search(q='', type='handoff', project=<имя>, limit=1)` — + если пусто, silent exit (первая сессия проекта). +2. **Staleness:** `meta.date` > 7 дней → спросить user'а «handoff устарел, + оверрайдить или продолжить?». +3. **Summarize + Orient:** пересказать одним блоком (summary / open_treks / + ask_user / guards / recent_commits): «прошлая сессия предложила X. Делаем?» +4. **Wait.** Никаких действий до подтверждения user'ом. Default = orient + ask, + никакого auto-execute. + +### 4. Inbox raise + sweep (session-inbox-monitor) + +Поднять персистентный монитор на инбокс проекта (pi: расширение inbox-monitor +поллит `GET /inbox?project=`; opt-in — строка `inbox monitor: raise on +start` в AGENTS.md, live re-check каждый тик). Свип: `mcp__mappa__inbox_monitor(project=<имя>)` +— непрочитанные письма могут менять план; обработай каждое по `mappa-messaging` +(письмо — first-class, в начале ближайшего хода). + +### 5. Liveness-сводка (using-system-snapshot) — «живо/мертво» + +Один-два зонда в текущем turn, сжать в 3–4 строки, не raw-дампить: + +``` +mcp__mappa__meta_health → 🟢/🔴 Mappa alive (заголовок при падении) +mcp__mappa__admin_status → счётчики по типам/проектам (нагрузка) +mcp__projects-meta__meta_system_snapshot → poller (running? + проекты) / docker (N/N up, + иначе проблемные) / tasks (Σ active/blocked, + кэш — может быть stale) +``` + +**Never assert liveness по памяти** — только вызов тула в этом же turn. Если +snapshot показал проблему → **эскалация, не углубление**: «проблема на старте, +не разбираю — передаю человеку/диагностической сессии» (ops вне suite). + +### 6. Live-ingest query (потребитель session-live-ingest, #1022/#1024) + +Зависимость: сервер #1022 (v0.8.0) + клиентская часть #1024 (pi session-sync, +.session пишется клиентом). Контракт — w:2604. + +1. `mcp__mappa__session_list(project=<имя>, stale_minutes?)` — последние сессии + проекта, latest-first (`updated_at DESC`), с end-state/ts/meta-тройкой + {project, runtime, machine, folder}. +2. **Stale-active детект:** end-state≠clean AND updated_at < now−X → «вёл + @, не завершена» (краш-детект). +3. **«Другая связка + не завершена»** → предложить (peer-канон, решение за + человеком): забить / дернуть письмом (`mappa-messaging`: письмо той связке) + / продолжить самому. +4. **Same-triple (`/resume`):** та же связка {runtime, machine, folder} → догрузить + остаток (пи-нативный resume или бриф из mappa). + +**Замечание (2026-08-24):** роуты `/session` ещё не задеплоены на прод +(сервер #1022 в репо, деплой ждёт #1055) — при 404/«no route» live-ingest query +пропускается без фейла: orient продолжается (шаги 1–5), query-часть — по факту +доступности. + +## Failure modes + +- **Проблема на старте** (сервис упал, snapshot красный, конфликт pull) → не + углубляться: эскалация человеку/диагностической сессии (ops вне suite). +- **Pull diverged** → `⚠️ diverged — resolve manually`; не auto-merge/rebase. +- **Handoff stale (>7 дней)** → спросить user'а, не оверрайдить молча. +- **Live-ingest недоступен** (404 no route / нет клиента #1024) → пропустить + шаг 6, не блокировать ориентацию. +- **Проект не в mappa** (нет handoff/session-сущностей) → silent exit по + соответствующим шагам; первая сессия проекта — норм. + +## Side effects + +- Ничего не пишет, ничего не мутирует (ориентация read-only: pull — локальный + ff, inbox-raise — монитор, liveness — зонды, live-ingest — чтение). +- Поднимает персистентный inbox-монитор (живёт до конца сессии). + +## What NOT to do + +- **Не auto-execute** из handoff'а — orient + ask, никакого авто-действия. +- **Не углубляться в диагностику** — orient = «живо/мертво»; «почему» — вне suite. +- **Не assert liveness по памяти** — только зонд в этом же turn. +- **Не stash/не auto-merge/не auto-rebase** при pull — только `--ff-only`. +- **Не повторять pull** в сессии без явного «sync». +- **Не ходить по многохоповым цепочкам** live-ingest — одна строка «кто + последним», предложение — человеку. +- **Не писать** (handoff/вики/таски) на ориентации — это финиш-фаза + (`mappa-closing-ritual`). + +## Reference + +- Финиш-фаза: `mappa-closing-ritual` (handoff write + PROPOSE). +- Задачи: `mappa-task-work` (борд после ориентации). +- Почта: `mappa-messaging` (ответы на письма, дернуть связку). +- Знание: `mappa-knowledge`. Делегирование: `mappa-delegation`. +- Live-ingest спека: `concepts/session-live-ingest` (wiki:2604). +- Глубокая диагностика (вне suite): `using-vds-ops` (контейнеры VDS). diff --git a/skills/pulling-before-work/README.md b/skills/pulling-before-work/README.md deleted file mode 100644 index 1cad6bd..0000000 --- a/skills/pulling-before-work/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# pulling-before-work - -Policy skill that pulls the current branch from `origin` once at session start -and on explicit re-sync requests. Designed to remove the "edited on stale base" -footgun without trampling dirty work-trees or auto-merging. - -## When it triggers - -- **Session start** — when `AGENTS.md` contains the line `pull remote before work` (added by `project-bootstrap` v2.0.0+). -- **In-chat** — when the user says `sync`, `resync`, `pull`, `обнови репо`, `git pull please`, or close variants. - -Stays silent in non-git folders. Prints one informational line and exits in: -no `origin` remote, no upstream tracking, dirty work-tree, detached HEAD. - -## What it does - -`git pull --ff-only` against the configured upstream — never auto-merges, never -auto-rebases, never stashes, never commits, never pushes. On divergence it prints -a warning with manual-resolution hints and exits. - -## Prerequisites - -None. The skill is a no-op outside git repos and folders without an `origin` -remote, so it's safe to leave activated everywhere. - -## Related - -- `project-bootstrap` (v2.0.0+) — adds the trigger line to new and existing projects' `AGENTS.md`. -- `.wiki/concepts/pulling-before-work-design.md` (in projects bootstrapped from this repo: this design lives in `skills`) — full design rationale. diff --git a/skills/pulling-before-work/SKILL.md b/skills/pulling-before-work/SKILL.md deleted file mode 100644 index a847122..0000000 --- a/skills/pulling-before-work/SKILL.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -name: pulling-before-work -author: ours -version: 1.1.0 -description: > - Pulls the current branch from origin once at session start and on explicit - re-sync requests. Use when AGENTS.md contains the trigger line "pull remote - before work", or when the user says "sync", "resync", "pull", "обнови репо", - "git pull please", or close variants asking to refresh from the remote. - Runs `git pull --ff-only` — never auto-merges or rebases. Also sets the - repo-local pull policy (`pull.rebase=true` + `pull.ff=only`, set-if-absent) - so plain manual `git pull` never creates merge commits either. Stays silent - in non-git folders. Prints one informational line and exits when there is no - origin remote, no upstream tracking, the working tree is dirty, or HEAD is - detached. Does not stash, commit, or push. Activated by `project-bootstrap` - v1.4.0+ via the canonical AGENTS.md template. ---- - -# pulling-before-work - -> Pull from `origin` once when work starts. Don't auto-merge. Don't trample dirty work-trees. Don't ask twice in the same session unless asked. - -## When this runs - -**At session start** — once, when the skill is activated by the `pull remote before work` line in `AGENTS.md`. The cycle below runs immediately. - -**On explicit re-sync** — when the user says any of: `sync`, `resync`, `pull`, `обнови репо`, `pull please`, `git pull`, `подтяни`, `pull from origin`. Re-runs the full cycle. There is no per-session counter; the user is always allowed to ask. - -**Never** before each commit, before each tool call, on every message, or in any other implicit cadence. Mode-3 ("start + on-demand") was the explicit design choice — see `.wiki/concepts/pulling-before-work-design.md`. - -## The pull cycle - -Run these checks in order. Print at most one line of chat output per run. - -### 1. Inside a git work-tree? - -```bash -git rev-parse --is-inside-work-tree 2>/dev/null -``` - -If the command fails or prints anything other than `true` → **exit silently, no chat output.** This is the not-a-git-repo case; the skill must not be noisy in random folders. - -### 1b. Ensure the repo's local pull policy (set-if-absent) - -```bash -git config --local --get pull.rebase >/dev/null 2>&1 || git config --local pull.rebase true -git config --local --get pull.ff >/dev/null 2>&1 || git config --local pull.ff only -``` - -Sets the repo-local pull policy to the snolla baseline: plain `git pull` rebases instead of creating a merge commit (`pull.rebase=true`), and the merge path refuses non-fast-forwards (`pull.ff=only`). **Set-if-absent only** — an explicit local override the user wrote is never clobbered. Silent: no chat output, idempotent, works in dirty trees. Git config is untracked, so this never dirties `git status`. The skill's own pull below still uses `--ff-only` on purpose: a silent session-start pull never leaves the repo mid-rebase; divergence is always resolved by the human. - -### 2. Has an `origin` remote? - -```bash -git remote get-url origin 2>/dev/null -``` - -If the command fails (no such remote) → print one line and exit: - -``` -no origin remote — skip pull -``` - -### 3. Is the working tree clean? - -```bash -git status --porcelain -``` - -If the output is non-empty → print one line and exit: - -``` -working tree dirty — skipping pull. commit/stash, потом скажи "sync" -``` - -Never stash automatically. Stash-pop conflicts are exactly the friction this skill exists to remove. - -### 4. Is HEAD attached? - -```bash -git symbolic-ref -q HEAD -``` - -If the command fails (empty output, exit 1) → detached HEAD. Print: - -``` -detached HEAD — skip pull -``` - -### 5. Does the current branch have an upstream? - -```bash -git rev-parse --abbrev-ref --symbolic-full-name '@{u}' 2>/dev/null -``` - -Capture the upstream name (e.g. `origin/master`). If the command fails → no upstream tracking. Print: - -``` -no upstream tracking for — skip pull -``` - -(Where `` is `git rev-parse --abbrev-ref HEAD`.) - -### 6. Pull, fast-forward only - -```bash -git pull --ff-only -``` - -(No args — uses the configured upstream captured above.) - -Classify by exit code and stdout: - -| Result | Print | -|---|---| -| Already up to date | `✅ already up to date with ` | -| Fast-forward, N commits | `✅ pulled N commits from ` | -| Non-fast-forward / diverged (exit non-zero with "diverged" or "non-fast-forward" in output) | `⚠️ diverged from — resolve manually (plain git pull rebases by default; git pull --no-ff for a merge commit); skill never auto-merges/rebases` | - -### Out of scope - -The skill never: - -- commits, stashes, or pushes -- recurses into submodules -- pulls from non-`origin` remotes -- pulls on detached HEAD -- runs auto-merge or auto-rebase -- overwrites an existing local pull policy (set-if-absent only) -- runs more than once per session unless the user asks - -## Recovery hints - -If the skill skipped because of a dirty tree: - -```powershell -# Windows / PowerShell -git status # see what's dirty -git add . ; git commit -m "wip" -# then ask the agent: "sync" -``` - -```bash -# Linux / macOS -git status -git add . && git commit -m "wip" -# then say "sync" -``` - -If the skill reported `diverged`: - -```bash -# Option A (repo default, set by step 1b): rebase your local commits on top of origin -git pull - -# Option B: explicit merge commit -git pull --no-ff -``` - -The skill stays out of these decisions on purpose — both options have valid use cases and the user owns the choice. - -## Why this exists - -Stale local branches are a silent footgun: edits land on top of yesterday's `origin`, the divergence shows up at push time, and by then there's a chunk of work to rebase or merge on the wrong base. One pull at start covers the common case; an explicit re-sync trigger handles long sessions where someone pushed mid-flight. - -Full design rationale (mode choice, dirty-tree skip vs stash, `--ff-only` vs auto-merge, the upstream-check) lives in `.wiki/concepts/pulling-before-work-design.md`. diff --git a/skills/session-inbox-monitor/SKILL.md b/skills/session-inbox-monitor/SKILL.md deleted file mode 100644 index 8f7ebd4..0000000 --- a/skills/session-inbox-monitor/SKILL.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -name: session-inbox-monitor -author: ours -version: 1.0.0 -description: > - Raises a persistent Monitor on the project's Mappa inbox (poll - `mcp__mappa__inbox_monitor` / HTTP `GET /inbox?project=`), so - inter-session messages page the session in real time; the monitor dies on - session end on its own. Pi (pi-coding-agent) sessions: a global extension - polls the same HTTP endpoint, session-scoped (own project only). Triggers: - AGENTS.md line `inbox monitor: raise on start`, or «подними монитор почты», - «настрой авто-монитор инбокса», «raise inbox monitor», «auto-arm inbox - watcher». Headless (`claude -p` / `pi -p`): does NOT raise — rely on the - Stop-hook / agent_settled pull pickup. File channel `.agents/inbox/` is - gone (flip, решение 15) — letters live in Mappa as entities `i:N`, delivery - is a carve-out (no lease, решение 19). NOT for how to handle a received - message (→ inter-session-messaging). ---- - -# session-inbox-monitor - -Auto-raises a session-length Monitor on the project's **Mappa inbox** at -interactive-session start, so inter-session messages page the session in real -time. Tears down for free on session end. Headless sessions skip it and rely -on the pull-model (Stop-hook / agent_settled pickup). - -Канал — Mappa, НЕ файлы: письма — сущности `inbox` (`i:N`) в сервисе, читаются -через `mcp__mappa__inbox_monitor(project, limit)` (или HTTP `GET -/inbox?project=<имя-папки>&limit=N`). Доставка/чтение — карв-аут (решение 19): -не блокируются лизом, работают всегда. Файловые `.agents/inbox/` и `.read/` -выпилены. - -## When to use - -- **Automatic (the common path).** A paired SessionStart hook injects an - instruction at the start of every interactive session of an opted-in project. - You act on that injection — raise the monitor as your first action — without a - user phrase. -- **On request.** AGENTS.md line `inbox monitor: raise on start`, or «подними - монитор почты», «настрой авто-монитор инбокса», «raise inbox monitor», - «auto-arm inbox watcher». -- **NOT for** handling the content of a received message (→ - `inter-session-messaging`). This skill is only the monitor's *lifecycle*. - -## Inputs - -- `` — своё имя папки (cwd basename), адрес в Mappa. -- Письма: `mcp__mappa__inbox_monitor(project=<своя папка>, limit)` → - `{rows: [{id, slug, body}]}` (последние N). `from`/`subject` — в meta, через - `entity_get(id)` при ответе. -- Мопitor-команда при CC — HTTP-опрос `GET /inbox?project=...` (без токена на - текущем проде; если `MAPPA_API_TOKEN` задан — `x-api-token` header). - -## Steps - -1. **Mode check.** Headless / non-interactive (`claude -p`, `pi -p`, - `ctx.hasUI === false`): **STOP — do not raise a monitor.** The pull pickup - (CC Stop-hook / pi `agent_settled`) plus `Notify:` cover delivery there; a - Monitor can't idle-watch in headless. -2. **Raise exactly one persistent Monitor** on the Mappa inbox: - `mcp__mappa__inbox_monitor(project=, limit=50)`, poll - interval ~15s, `description: "inbox watcher"`. Dedup by письменному id: - новое письмо — это id, которого ещё не было в предыдущих ответах. -3. **Do not sweep yourself.** Killing orphans is the hook's job (it runs before - you, at SessionStart). -4. **On an event** (новый id в ответе inbox_monitor), прочитай письмо (body) и - обработай per `inter-session-messaging`. Для ответа — `entity_get(id)` → - `meta.from`. Письма не перемещаются (нет `.read/`) — обработанные остаются - в списке; дедуп по id в памяти монитора. -5. **Teardown is automatic.** The Monitor dies at session end. Do **not** add a - SessionEnd teardown. - -## Pi (pi-coding-agent) support — session-scoped global extension - -Same contract, pi-native, session-scoped: the extension polls ONLY the current -session's project inbox (`GET /inbox?project=`); it never reads -other projects' inboxes (vitya's rule: an agent may only read its own -project's inbox). Installed globally so *every* pi session has the capability, -but each session only ever touches its own project. - -- **Source of truth:** `~/projects/pi-extensions/extensions/inbox-monitor.ts` - (репо `OpeItcLoc03/pi-extensions`, Gitea — дом pi-расширений). Deploy: - `just install` в клоне репо — копирует с затираанием в - `~/.pi/agent/extensions/inbox-monitor.ts` (global → every pi, every - directory), hot-reload with `/reload`. -- **Opt-in per project:** AGENTS.md / CLAUDE.md line - `inbox monitor: raise on start`. (Файловой директории `.agents/inbox/` больше - нет — триггер только строка.) -- **PUSH:** ~15s poll of the session's own Mappa inbox (interactive only). - **PULL:** `agent_settled` sweep — same poll, backstop. Both share one dedup - set per process (by letter id). -- **Headless (`pi -p`, `ctx.hasUI === false`):** NO delivery — no watcher, no - sweep. Messages sit in Mappa until an interactive session picks them up. -- **Delivery:** `pi.sendUserMessage(body, { deliverAs: "followUp", triggerTurn: - true })` — paged into the transcript as a user message; the agent handles it - per `inter-session-messaging`. - -## Failure modes - -- **Нет opt-in строки** → монитор не поднимается; ожидаемо. -- **Сервис mappa недоступен** → poll-запрос падает; монитор ретраит следующий - тик. Письма в сервисе не теряются (они — сущности), доставятся когда сервис - вернётся. НЕ дублируй в файлы — фолбэк-канал выпилен. -- **Two live interactive sessions on the same project** → оба поллят один - инбокс; дедуп по id делает доставку first-wins (кто первый прочитал id — - тот и доставил; второй пропускает). Real-time paging теряет только тот, кто - опоздал; письма не теряются (pull-свип в конце хода). -- **Monitor auto-stopped** → harness останавливает мониторы с переизбытком - событий; дедуп по id держит частоту пейджинга под баром. -- **Обработанное письмо вернулось в списке** — не баг: в Mappa нет `.read/`, - письма не перемещаются. Сверяйся с уже виденными id, не перечитывай. - -## What NOT to do - -- **Don't watch the file inbox** (`.agents/inbox/`) — канал выпилен; пиши и - читай через Mappa. -- **Don't watch the inbox with a background Bash** (`run_in_background`) — it - leaks across `/clear` and accumulates zombies. Use the Monitor tool. -- **Don't add a SessionEnd teardown hook** — the Monitor self-terminates. -- **Don't raise more than one monitor.** The hook guarantees a clean slate - before you raise. -- **Don't handle message content here** — that's `inter-session-messaging`. -- **Don't rely on this in headless** — use the pull model (Stop-hook + - Notify). diff --git a/skills/session-inbox-monitor/hooks/inbox-monitor.ps1 b/skills/session-inbox-monitor/hooks/inbox-monitor.ps1 deleted file mode 100644 index eac16e0..0000000 --- a/skills/session-inbox-monitor/hooks/inbox-monitor.ps1 +++ /dev/null @@ -1,103 +0,0 @@ -# SessionStart inbox-monitor injector hook (session-inbox-monitor skill, v1.0.0). -# -# Channel is Mappa, NOT files (flip, решение 15): letters are entities `inbox` -# (`i:N`) in the mappa service, read via HTTP `GET /inbox?project=`. -# Two jobs, run on every SessionStart (startup / resume / clear / compact): -# (a) SWEEP - kill orphaned inbox-monitor OS processes of THIS project. -# A `/clear` does NOT fire SessionEnd, so a Monitor's underlying -# poll process can outlive the session it belonged to. Without a -# sweep, re-raising would stack duplicates. Match is by a sentinel -# string (CLAUDE_INBOX_MONITOR) baked into the poll command PLUS -# this project's directory - so we never touch unrelated processes. -# (b) INJECT - additionalContext telling the agent to raise a persistent -# Monitor (Monitor TOOL, not background Bash) polling the Mappa -# inbox of this project (HTTP GET /inbox). -# -# Opt-in per project: AGENTS.md or CLAUDE.md line `inbox monitor: raise on start`. -# (The `.agents/inbox/` dir trigger is gone - no file channel anymore.) -# -# Headless (`claude -p`): there is NO reliable hook-level signal to detect it -# (verified 2026-06-17 - `source` and CLAUDE_* env vars don't distinguish it). -# So the hook injects unconditionally and the SKILL instructs the agent to skip -# when headless. A Monitor raised in headless is harmless (killed ~5s after the -# run ends); a false-skip in an interactive session would silently lose the -# feature - so the default errs toward raising. -# -# Machine-local deploy target: ~/.claude/hooks/inbox-monitor.ps1 (registered in -# ~/.claude/settings.json SessionStart). Versioned here for multi-machine rollout. - -param( - [string]$ProjectDir = $env:CLAUDE_PROJECT_DIR, - [string]$Endpoint = $env:MAPPA_CORE_URL -) - -if (-not $ProjectDir) { exit 0 } -if (-not $Endpoint) { $Endpoint = 'https://mappa.vds.kzntsv.site' } - -# UTF-8 stdout guard. This hook emits JSON (additionalContext) to a redirected -# pipe under WinPS 5.1 - the same context that mojibaked stop-dispatcher output. -# The project name (user-data) is interpolated into stdout, so set UTF-8 as a -# forward-guard. Idempotent. -[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 -$OutputEncoding = [System.Text.Encoding]::UTF8 - -$projectName = Split-Path $ProjectDir -Leaf -$agentsMd = Join-Path $ProjectDir 'AGENTS.md' -$claudeMd = Join-Path $ProjectDir 'CLAUDE.md' - -# --- opt-in gate (line in AGENTS.md or CLAUDE.md) --------------------------- -$optedIn = $false -foreach ($md in @($agentsMd, $claudeMd)) { - if (Test-Path $md) { - if (Select-String -Path $md -SimpleMatch 'inbox monitor: raise on start' -Quiet -ErrorAction SilentlyContinue) { - $optedIn = $true - break - } - } -} -if (-not $optedIn) { exit 0 } - -# Forward-slash project dir: the Monitor poll command (Git Bash) uses this form, -# so both the sweep match and the injected command share one literal. -$dirFwd = ($ProjectDir -replace '\\', '/') - -# --- (a) sweep orphaned monitors of THIS project ---------------------------- -# Match = sentinel AND this project's dir in the same process command line. -try { - Get-CimInstance Win32_Process -ErrorAction Stop | - Where-Object { - $_.CommandLine -and - $_.CommandLine -match 'CLAUDE_INBOX_MONITOR' -and - $_.CommandLine -like "*$dirFwd*" - } | - ForEach-Object { Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue } -} catch { } - -# --- (b) build the canonical Monitor poll command --------------------------- -# `: CLAUDE_INBOX_MONITOR` is a bash no-op carrying the sweep sentinel in the -# process command line without polluting the event stream. Polls the Mappa -# inbox of this project over HTTP, extracts letter ids via node (present on -# every machine that runs the mappa MCP), de-dups by id so a sitting letter -# pages once, not every 15s (a noisy monitor is auto-stopped). -$auth = '' -if ($env:MAPPA_API_TOKEN) { $auth = "-H 'x-api-token: $($env:MAPPA_API_TOKEN)'" } -$cmd = @" -: CLAUDE_INBOX_MONITOR; s=' '; while true; do ids=`$(curl -s -m 10 $auth '__ENDPOINT__/inbox?project=__PROJECT__&limit=50' | node -e "let d='';process.stdin.on('data',c=>d+=c).on('end',()=>{try{const r=JSON.parse(d).rows||[];for(let i=r.length-1;i>=0;i--)console.log(r[i].id)}catch(e){}})"); for id in `$ids; do case "`$s" in *" `$id "*) continue;; esac; s="`$s`$id "; echo "New inter-session message in Mappa inbox (letter id `$id) - read it via inbox_monitor and handle now"; done; sleep 15; done -"@ -$cmd = $cmd.Trim().Replace('__ENDPOINT__', $Endpoint.TrimEnd('/')).Replace('__PROJECT__', $projectName) - -# --- (c) inject the raise-instruction -------------------------------------- -$ctx = @" -[session-inbox-monitor] This project participates in inter-session messaging. As your FIRST action, raise a persistent inbox watcher so messages from other sessions page you in real time. - -Use the Monitor tool with persistent: true, description "inbox watcher", and this EXACT command: - -$cmd - -Do NOT use a background Bash for this - it leaks across /clear. The Monitor tool is session-bound and tears down on its own at session end. The paired SessionStart hook already swept any orphaned watcher before this, so raise exactly one. - -If you are running headless (claude -p / non-interactive), SKIP this - the Stop-hook inbox pickup plus Notify cover delivery there. See the session-inbox-monitor skill for the full contract. -"@ - -@{ hookSpecificOutput = @{ hookEventName = 'SessionStart'; additionalContext = $ctx } } | ConvertTo-Json -Compress -Depth 5 -exit 0 diff --git a/skills/using-system-snapshot/SKILL.md b/skills/using-system-snapshot/SKILL.md deleted file mode 100644 index 3b637ce..0000000 --- a/skills/using-system-snapshot/SKILL.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -name: using-system-snapshot -author: ours -version: 1.0.0 -description: "Use at the start of an ops-context session, and ALWAYS before asserting anything about the mappa meta-service, the agent poller, local docker containers, or cross-project task load — call `mcp__mappa__meta_health` + `mcp__mappa__admin_status` (сервис жив, нагрузка) and `mcp__projects-meta__meta_system_snapshot` (поллер/докер/таски) instead of running `tasklist` / `docker ps` / guessing by hand. Triggers on «что запущено», «что сейчас крутится», «состояние системы», «состояние машины», «поллер работает?», «поллер живой?», «что с докером», «сводка по задачам», «what's running», «system status», «system snapshot», «is the poller up», «is the runner alive», «what containers are up». Read-only — no per-session grant needed. Skip for deep single-container docker diagnosis (that's using-vds-ops for the VDS / docker logs locally) and for mutating or precise per-task work (that's using-projects-meta / mappa task.*)." ---- - -# using-system-snapshot - -## Overview - -Two layers, one mental model: **mappa meta-service** (решение 14/15 — мета в сервисе) + **машина** (поллер/докер/таск-нагрузка — внешняя инфра). - -1. Сервис жив и как загружен: `mcp__mappa__meta_health` (no args → `{ok}`) + `mcp__mappa__admin_status` (счётчики сущностей по типам/проектам — живая нагрузка). -2. Машина: `mcp__projects-meta__meta_system_snapshot` — поллер agents-task-runner, локальные docker-контейнеры, сводка таск-нагрузки из кэша. - -Заменяет старый разброс `tasklist` / `docker ps` / ручного `meta_status` одной-двумя зондами. - -**Core rule: never assert состояние сервиса, поллера, контейнеров или таск-нагрузки без вызова тула в этом же turn.** Память и «он же работал ранее» — не evidence. - -## When to use - -- Session start в **ops-контексте** — ориентация перед infra/раннер/борд-работой. -- User спрашивает что живо: «что запущено», «состояние системы», «поллер работает?», «что с докером», «what's running», «is the poller up». -- **Перед любым claim** о живости mappa-сервиса, поллера, контейнера или числа активных/блокированных тасок. -- Быстрый взгляд на таск-нагрузку (где сейчас сконцентрирована работа). - -## When NOT to use - -- Глубокая диагностика **одного** контейнера (logs/inspect/stats/restart-loop) — это using-vds-ops для Rusonyx VDS или `docker logs` локально. -- **Мутации** тасок или чтение полного борда/тела задачи — using-projects-meta (и mappa task.* / локальный `.tasks/` для текущего проекта). -- Библиотечные доки, поиск по коду — не сюда. - -## Prerequisites - -- `mcp__mappa__*` — mappa MCP (сервис meta; установка — setup-проект mappa). -- `mcp__projects-meta__meta_system_snapshot` — projects-meta-mcp (поллер/докер/кэш-таски). Если тула нет — `setup-projects-meta`. - -## The calls - -`mcp__mappa__meta_health` — no args, read-only. `{ok: true, service: "mappa"}` — сервис жив. -`mcp__mappa__admin_status` — no args, read-only. Счётчики по типам и проектам. -`mcp__projects-meta__meta_system_snapshot` — no args, read-only. Три ключа: - -| Key | Shape | Liveness | -|---|---|---| -| `poller` | `{ running: bool, projects: "" }` | **live** на момент вызова | -| `docker` | `[{ name, status }]` — локальные контейнеры | **live** на момент вызова | -| `tasks` | `{ "/": { active, blocked }, … }` | **из кэша** projects-meta — может быть stale | - -`docker` — **локальная** машина (включая `agents-task-runner-*`), НЕ VDS. `tasks` — кэш; для точного состояния — using-projects-meta Step 0 или mappa/локальный `.tasks/`. - -## Output format — одна строка на секцию - -Сожми в 3–4 строки, не дампи raw-object. - -``` -🟢 Mappa alive — 42 wiki / 18 tasks, 12 проектов -🟢 Poller running — OpeItcLoc03/skills (🔴 если running:false) -🟢 Docker — 8/8 up (иначе только проблемные) -📋 Tasks — 23 active / 41 blocked, 17 проектов (назвать 2–3 самых загруженных) -``` - -Правила на строку: - -- **Mappa** — 🟢/🔴 + admin_status-сводка (счётчики по типам или проектам — кратко). Сервис упал = заголовок. -- **Poller** — 🟢/🔴 + running-flag + projects-строка. Остановлен — скажи прямо. -- **Docker** — если всё `Up` (вкл. `Up … (healthy)`) — `N/N up`. Иначе только проблемные (`Restarting`, `Exited`, `(unhealthy)`, `Created`, `Paused`) по имени + статусу. -- **Tasks** — суммы (Σ active / Σ blocked) + 2–3 проекта с наибольшей активностью. Полный расклад — только по запросу. - -## What NOT to do - -- **НЕ** утверждай «поллер работает» / «все контейнеры up» / «N активных тасок» по памяти или прошлому снапшоту. Зови тулы в текущем turn — liveness требует свежих данных. -- **НЕ** падай на `tasklist` / `docker ps` / ручной `meta_status` — это scatter, который скил заменяет. (`docker logs` — только для глубокой диагностики одного контейнера.) -- **НЕ** вставляй raw-JSON. Строки, по одной на секцию. -- **НЕ** подавай `tasks`-счётчики как точные — они из кэша. При важности точности — флаг сталезности + using-projects-meta. - -## Common mistakes - -| Mistake | Fix | -|---|---| -| «Сервис жив» без вызова в этом turn | Зови `meta_health`/`admin_status` — liveness требует текущих данных. | -| «Poller up» без вызова | `meta_system_snapshot` в текущем turn. | -| `docker ps` / `tasklist` вместо зондов | Один-два вызова тула; в этом смысл. | -| Читать снапшот-`docker` как VDS-флот | Это **локальная** машина. VDS — using-vds-ops. | -| `tasks`-счётчики как авторитетные | Они кэшированы. Точность — using-projects-meta Step 0 / mappa / `.tasks/`. | -| Дампить raw-объект | Сожми в строки (mappa / poller / docker / tasks). |