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>
50 lines
3.8 KiB
Markdown
50 lines
3.8 KiB
Markdown
# 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` стр. 116–125):
|
||
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.) дописано и соответствует реальности.
|