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

3.8 KiB
Raw Permalink Blame History

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.) дописано и соответствует реальности.