概要
monitor モード(delivery.sh set monitor / both)の SessionStart hook が、Claude Code のバックグラウンドタスク用サブセッション(.claude/worktrees/ 配下の隔離 worktree で動くセッション)にも発火し、永続 Monitor(agmsg inbox stream)が起動されます。この永続 watcher がサブセッションを生かし続けるため、サブセッションの作業が完了しても親セッションに「タスク完了」通知が届かないという問題が発生しました。
環境
session-start.sh 'claude-code' '<project>'
として登録
再現手順
- agmsg に join 済みのプロジェクトで Claude Code セッションを開く(SessionStart hook で永続 Monitor が起動する)
- そのセッションからバックグラウンドタスク(spawn_task のチップ等)を起動する → .claude/worktrees/`に隔離 worktree が作られ、サブセッションが走る
- サブセッションにもプロジェクトの hooks が適用され、SessionStart で agmsg の永続 Monitor が起動される(サブセッションの応答が実際に「I'll start the agmsg monitor as directed」から始まることを確認)
- サブセッションの作業(調査・コミット)が完了する
期待される動作
サブセッションの作業完了と同時にセッションが完了扱いになり、親セッションへ完了通知が届く。
実際の動作
永続 Monitor がバックグラウンドタスクとして生存し続けるため、サブセッションは応答終了後もアイドルのまま「終了」にならず、親セッションへの完了通知が発火しない。ユーザーは完了に気づけず、手動でセッション一覧を確認する必要があった。
原因の分析
修正案
hook 入力 JSON の cwd(なければ $PWD)が .claude/worktrees/ 配下なら、指示を emit せず静かに exit 0 する。ローカルでは以下のパッチで解消を確認済みです(cwd はフォワードスラッシュ/JSONエスケープされたバックスラッシュの両形式が来るため、セパレータ非依存でマッチ):
# --- Skip spawned worktree sub-sessions (.claude/worktrees checkouts). ---
# A persistent inbox watcher keeps the sub-session alive after its task
# finishes, so the parent session never receives the completion notification.
HOOK_CWD=""
if [ -n "$INPUT" ]; then
HOOK_CWD=$(printf '%s' "$INPUT" \
| sed -n 's/.*"cwd"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' \
| head -1)
fi
[ -z "$HOOK_CWD" ] && HOOK_CWD="${PWD:-}"
case "$HOOK_CWD" in
*.claude*worktrees*) exit 0 ;;
esac
挿入位置は SESSION_ID 解決の直後、mkdir -p "$RUN_DIR" やインスタンス dedup(既存 watcher の kill)より前が安全です。
備考
- SessionEnd hook(session-end.sh)も同様にサブセッションで発火しますが、こちらは実害を確認していません
- worktree サブセッションを agmsg のロールとして意図的に spawn するユースケースがある場合は、単純スキップではなく opt-out 環境変数等の方が良いかもしれません
🤖 調査は Claude Code で実施
概要
monitor モード(delivery.sh set monitor / both)の SessionStart hook が、Claude Code のバックグラウンドタスク用サブセッション(.claude/worktrees/ 配下の隔離 worktree で動くセッション)にも発火し、永続 Monitor(agmsg inbox stream)が起動されます。この永続 watcher がサブセッションを生かし続けるため、サブセッションの作業が完了しても親セッションに「タスク完了」通知が届かないという問題が発生しました。
環境
として登録
再現手順
期待される動作
サブセッションの作業完了と同時にセッションが完了扱いになり、親セッションへ完了通知が届く。
実際の動作
永続 Monitor がバックグラウンドタスクとして生存し続けるため、サブセッションは応答終了後もアイドルのまま「終了」にならず、親セッションへの完了通知が発火しない。ユーザーは完了に気づけず、手動でセッション一覧を確認する必要があった。
原因の分析
session-start.shは worktree 配下の cwd をプロジェクトルートへ正規化する(agmsg commands register a new project when invoked from a subdir, instead of using the CC session's real project #92 の resolve-project)ため、worktree サブセッションでも identities が解決され、Monitor 指示が emit される修正案
hook 入力 JSON の cwd(なければ $PWD)が .claude/worktrees/ 配下なら、指示を emit せず静かに exit 0 する。ローカルでは以下のパッチで解消を確認済みです(cwd はフォワードスラッシュ/JSONエスケープされたバックスラッシュの両形式が来るため、セパレータ非依存でマッチ):
挿入位置は SESSION_ID 解決の直後、
mkdir -p "$RUN_DIR"やインスタンス dedup(既存 watcher の kill)より前が安全です。備考
🤖 調査は Claude Code で実施