Files
claude-skills/.tasks/session-inbox-monitor-sessionstart-hook.md
vitya c3e1ce7b40 feat(session-inbox-monitor): SessionStart hook + fill SKILL body v0.2.0
Core content task of the session-inbox-monitor line. Two deliverables:

1. SessionStart hook `skills/session-inbox-monitor/hooks/inbox-monitor.ps1`
   (versioned for multi-machine rollout; deployed to ~/.claude/hooks/ and
   registered in ~/.claude/settings.json SessionStart):
   - sweep: Get-CimInstance | Stop-Process orphaned monitors of THIS inbox,
     matched by sentinel CLAUDE_INBOX_MONITOR + inbox path (a /clear leaves
     the poll process alive -> re-raise without sweep stacks duplicates);
   - inject: hookSpecificOutput.additionalContext with the exact persistent
     Monitor command (Monitor tool, not background Bash);
   - opt-in gate: fires only on .claude-inbox/ dir or CLAUDE.md trigger line.
   ASCII-only (em-dash -> mojibake under WinPS 5.1 without BOM, fixed).

2. SKILL.md body filled (When to use / Inputs / Steps / Deployment /
   Failure modes / Side effects / What NOT to do); bump 0.1.0 -> 0.2.0 MINOR.

Headless: no hook-level signal exists (verified via claude-code-guide) ->
agent-side best-effort skip, default errs toward raising (false-skip in
interactive loses the feature; false-raise in headless is a harmless no-op).

Live-verified: inject -> valid JSON; sweep -> killed a planted orphan (PASS);
real Monitor tool spawns a bash process carrying the sentinel (sweep will
find real orphans); settings.json stays valid. Sweep over-match edge and
multi-session-per-project limit documented honestly in Failure modes.

Closes [session-inbox-monitor-sessionstart-hook].

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 10:48:50 +03:00

50 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# session-inbox-monitor-sessionstart-hook — working context
**Status:** 🟢 done (shipped 2026-06-17) — hook written+deployed+registered, SKILL body filled (v0.2.0), live-verified (sweep+inject+real-Monitor signature). See STATUS.md block for full evidence.
**Owner:** vitya (interactive session)
**Notify:** OpeItcLoc03/workshop
Ядро ленты `session-inbox-monitor`. Написать SessionStart-хук (уборка + инжект,
headless-skip) и дописать тело SKILL.md. Дизайн согласован в воркшопе:
- archive: `~/projects/.workshop/.archive/2026-06-17-session-inbox-monitor.md`
- concept: `~/projects/.workshop/.wiki/concepts/session-inbox-monitor.md`
## Verified facts (механика)
- **Monitor tool** запускает shell-команду (через Bash env), `persistent:true` живёт
до session end / TaskStop. Хук сам tool поднять НЕ может → инжектит инструкцию,
агент поднимает первым ходом (прецедент — так инжектится `using-superpowers`).
- **`/clear` НЕ вызывает SessionEnd** → teardown на SessionEnd для `/clear` бесполезен.
Поэтому уборка идемпотентно в SessionStart: «прибей старые мониторы этого инбокса →
подними ровно один».
- **Сигнатура уборки** (решение этой сессии): зашить **сентинел** в poll-команду
Monitor'а. OS-процесс, спавненный Monitor'ом, несёт poll-команду в своей командной
строке → уборка матчит `Get-CimInstance Win32_Process` по сентинелу + inbox-пути.
Снимает риск over-match произвольных процессов.
- **Stop-хук block-фикс** уже в проде (`~/.claude/hooks/stop-dispatcher.ps1` стр. 116125):
inbox-путь отдаёт `decision:block` с телом письма. Это смежная таска `-stophook-blockfix-proof`.
- **Близнец** `interactive-lock.ps1` — machine-local PS-хук, регистрируется в settings.json
SessionStart/SessionEnd. Тот же паттерн установки.
## Решения по реализации
1. Хук-файл версионируем в репо: `skills/session-inbox-monitor/hooks/inbox-monitor.ps1`
(deployment goal: multi-machine rollout). Install/дока деплоит его в `~/.claude/hooks/`.
2. Регистрация в `~/.claude/settings.json` SessionStart — мутация user-level конфига →
**гейт: пауза + ОК user** перед записью (как setup-скилы).
3. Committable: SKILL.md тело + hook-файл + per-task + STATUS.md. settings.json — вне репо.
## Open question (surface to user / flag as failure mode)
- **Мульти-сессия на одном проекте.** Уборка по inbox-пути прибьёт монитор ДРУГОЙ живой
интерактивной сессии того же проекта (сигнатура per-inbox, не per-session). Дизайн
воркшопа явно выбрал «прибей все → подними один». Задокументировать как known
limitation в SKILL.md; при необходимости — follow-up таска. Связь: [[inter-session-peer-discipline]].
## Acceptance (из -review зонтика)
- Уборка реально прибивает осиротевшие мониторы этого инбокса.
- Инжект поднимает РОВНО один Monitor.
- Headless → skip.
- Тело SKILL.md (Steps/Failure modes/etc.) дописано и соответствует реальности.