Skip to content

monitorモードのSessionStart hookが.claude/worktreesのサブセッションにも発火し、永続watcherが親セッションへの完了通知を妨げる #367

Description

@amabile4

概要

monitor モード(delivery.sh set monitor / both)の SessionStart hook が、Claude Code のバックグラウンドタスク用サブセッション(.claude/worktrees/ 配下の隔離 worktree で動くセッション)にも発火し、永続 Monitor(agmsg inbox stream)が起動されます。この永続 watcher がサブセッションを生かし続けるため、サブセッションの作業が完了しても親セッションに「タスク完了」通知が届かないという問題が発生しました。

環境

session-start.sh 'claude-code' '<project>'

として登録

再現手順

  1. agmsg に join 済みのプロジェクトで Claude Code セッションを開く(SessionStart hook で永続 Monitor が起動する)
  2. そのセッションからバックグラウンドタスク(spawn_task のチップ等)を起動する → .claude/worktrees/`に隔離 worktree が作られ、サブセッションが走る
  3. サブセッションにもプロジェクトの hooks が適用され、SessionStart で agmsg の永続 Monitor が起動される(サブセッションの応答が実際に「I'll start the agmsg monitor as directed」から始まることを確認)
  4. サブセッションの作業(調査・コミット)が完了する

期待される動作

サブセッションの作業完了と同時にセッションが完了扱いになり、親セッションへ完了通知が届く。

実際の動作

永続 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 される
  • 永続 Monitor は「セッション終了まで」動く仕様のため、短命であるべきサブセッションのライフサイクルと相性が悪い
  • サブセッションは通常 agmsg の宛先(チームメンバー)ではないので、watcher を持つ必要性も薄い

修正案

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 で実施

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions