Skip to content

cruise: 文脈で止まった親がタイマーで空回りし、/clear 後も最後の周の worktree に閉じ込められて再開できない #484

Open

Description

@hdknr

何が起きたか(cruise #474 --absent・dev-loop 1.59.0・2026-10-27〜28)

/dev-loop:cruise 474 --absent を 30 分おきの再開タイマー(CronCreate、プロンプトは /dev-loop:cruise 474 --absent)つきで回した。親セッションは 3505f9a0-…(トランスクリプトは ~/.claude/projects/-Users-hdknr-Projects-hdknr-claude-code-setup--claude-worktrees-issue-465/)。

時刻(UTC) 出来事
09:10 親が EnterWorktree(path=…/issue-440) で 1 周目に入る
10:32 / 11:20 / 11:53 EnterWorktree(path=…/issue-375)・issue-376・issue-465 と、前の周の worktree から次の周の worktree へ直接入る(ExitWorktree は 1 度も呼んでいない)
12:22 4 周目(#465 → PR #483)を終えた時点で親の文脈が 75% に達し、「新しい周は始めない」と判断して止まる。台帳の「着手できる」には #476 が残っていた
12:23〜23:53 タイマーが 23 回発火。どの回も「文脈が残り少ないので #476 は始めない」として PR 4 本の状態を見るだけで終わる(約 11.5 時間、周が 0 本)
翌 08:56 利用者が /clear → /dev-loop:cruise 474 --absent。セッションは issue-465 の worktree に隔離されたままで、ガードが git に当たる操作を issue-465 の外に向けると拒む。#476 の worktree を作れず、メインの作業ツリーから起動し直すよう案内して止まる

この間、PR は 4 本とも CI が緑のまま開いており、残りの 5 本は #440 のマージ待ちだった(不在の線「マージ」が効かないため。#476)。

原因

  1. 文脈で止まったあと、タイマーが空回りし続けた。 タイマーは同じセッションにプロンプトを注入するだけで /clear できない(cruise: 周の合間の /clear が利用者の操作に依るため、cruise が周ごとに止まる #461 の指摘と同じ)。そのため一度「文脈が足りない」と判断すると、以後の発火はすべて同じ判断で終わる。止まったこと自体も通知されず、利用者は朝まで気づけなかった。
  2. /clear しても、親は最後の周の worktree に閉じ込められたまま。 親が各周で EnterWorktree(path=…) を呼ぶため、/clear 後もセッションの隔離先は最後に入った worktree のままになる。cruise: 起動時に周で使う操作の権限を点検し、権限の拒否で cruise が止まらないようにする #466 は「起動時に worktree の中なら点検が言う」までで、親が周を回した結果として worktree に残る形は扱っていない(main の cruise SKILL.md は「周ごとの作業はこれまでどおり各周の worktree で行う(dev-loop の手順 4)」のまま)。dev-loop references/resume.md は、path で入った worktree に ExitWorktree が効くかを「測っていない」としている。
  3. (背景)手元の版は 1.59.0 で、cruise: 起動時に周で使う操作の権限を点検し、権限の拒否で cruise が止まらないようにする #466(1.60.0)が入っていなかった。起動時の点検 --cruise も無い。

案

  • A. 文脈の閾値で止まると判断したら、タイマーを止めて通知する。 同じ判断を繰り返すだけの発火を残さない(CronDelete)。止まったことと、利用者に要る操作(/clear してメインの作業ツリーから起動し直す)を PushNotification で知らせ、台帳の note にも残す。
  • B. 親を周の worktree に入れない。 各周の実装・関門は、worktree を cwd にしたサブエージェント(isolation: "worktree"、または既存の worktree を絶対パスで渡す)に任せ、親はメインの作業ツリーに留まって台帳だけを持つ。こうすれば cruise: 周の合間の /clear が利用者の操作に依るため、cruise が周ごとに止まる #461 の「親を割らずに軽く保つ」案とも合う。
  • C. B を採らないなら、周を閉じたら ExitWorktree(action: "keep") で起動ディレクトリに戻る。 まず path で入った worktree から戻れるか、戻った後に次の worktree へ入れるかを測る(resume.md が「測っていない」としている点)。
  • D. 再開時の点検で「親が worktree の中にいる」を名指しする。 ledger.py show か check-unattended-env.py --cruise が、起動時だけでなく台帳から再開したときにも言う。

決めること

  • B と C のどちらにするか(B は dev-loop 手順 4 の入場の規範に効く)
  • A の閾値(「文脈 N%」)を誰が決め、どこに書くか

関連: #461(タイマーでは /clear できない)・#466(親はメインの作業ツリーから起動)・#472(再開タイマーを起動時に訊く)・#476(不在のマージ)・#474(この cruise)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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