Skip to content

cruise: 利用上限で止まった後に続いたかを、トランスクリプトから数える(自動継続・人間・タイマー・止まったまま) #454

Closed

Description

@hdknr

何が起きるか

check-unattended-env.py は autoContinueAtUsageLimit: true が入っているかを見るだけで、上限の後に実際に続くかは一度も測っていない(#394 の R2-9 は残課題。同じ計画ファイルに「数時間の無人運転・利用上限の待機…1 周の検証では回せない」)。手元のトランスクリプトでは、9 月までは自動継続が 5 回起きていて、10 月からは 0 回。不在のときに上限で止まると、cruise はタイマーを張っていない限り止まったままになる。

実データ(2026-10-27。~/.claude/projects の全プロジェクト)

"error":"rate_limit" のレコード 113 件の、次に来たもの:

次に来たもの 件数
記録の終わり 31
人間の「継続」 23
ローカルコマンド(<local-command-caveat>) 15
自動継続(Your claude.ai usage limit has reset. Continue the task…) 7 行(重複を除いて 5 回)
<task-notification>・cross-session など 残り
  • 自動継続の 5 回は全部 spin/tfs-stocks、2026-08-27〜09-15。 再開の時刻はリセットの予告とほぼ一致(例: 「resets 2:10pm」→ 05:11Z)
  • 10 月以降は自動継続が 0 回——上限の後は人間の「継続」か、記録の終わり
  • 今の user の settings(~/.claude/settings.json・settings.local.json)には autoContinueAtUsageLimit が無い。9 月に効いていたのが設定か、未設定のときの既定(aZt() ?? e==="absent"。dev-loop: 利用者が不在になる前の環境点検(許可・自動継続・通知・スリープ)(#389 から分割) #394)かは分からない——設定の履歴はトランスクリプトに残らない(交絡)
  • cruise の周が上限に当たった例は見つけていない(cruise の印で絞り込んではいないので「無い」とは言えない)

数え方は使い捨てのスクリプトで、error == "rate_limit" のレコードから次の user/assistant のレコードを取った。

受入基準

  1. scripts/count-usage-limit-resumes.py(CI からは呼ばない——count-resume-recreations.py と同じ形)を作る。上限のレコードごとに次に来たものを分類する(自動継続/人間の入力/タイマーや別のセッションからの入力/記録の終わり)。リセットの予告時刻と実際に再開した時刻の差も出す。--anonymize を付ける
  2. scripts/test-count-usage-limit-resumes.py(変異テストを含む)。自動継続の文言と人間の「継続」を取り違える変異を殺せること
  3. 実データで回して、期間ごとの内訳をこの Issue に貼る。設定の履歴は記録に無いので「設定が効いた」と書かない
  4. 陽性対照: user の層に autoContinueAtUsageLimit: true を明示したうえで、上限まで回したセッションで「自動継続」と分類される例を 1 件取る。上限は狙って起こせないので、取れなければこの項目は BLOCKED として残す(課金と待ち時間がかかる)
    • 測る前と後で、~/.claude.json の cachedGrowthBookFeatures のうち tengu_marble_heron・tengu_linked_clover の値(キーが無いことも含めて)と、oauthAccount.billingType を記録して貼る——2.1.311 は設定が true でも、このフラグが外れているとき(killswitch)や、課金が usage_based のときは待たない(解説)。自動継続が起きなかったときに、設定の問題と取り違えないため。キー名は版で変わりうるので、測る時点の本体の文字列で確かめる
    • 取れなかったときは、記録したフラグの値を添えて BLOCKED とする(「起きなかった」を「設定が効かない」と書かない)
  5. 3・4 の結果を docs/plugins/dev-loop-cruise.md §5 と check-unattended-env.py の「守らないこと」に反映する——true で十分と言えるか、タイマーを保険として勧めるべきか

確かめていないこと

  • 10 月に自動継続が 0 回になった原因(設定・本体の版(いまは 2.1.311)・課金の種類が交絡)
  • cruise の周で上限に当たったときの、台帳と計画ファイルの状態

関連: #394(環境点検)・#390(台帳)・#389

Activity

  1. hdknr commented on Oct 26, 2026

    @hdknr
    OwnerAuthor

    autoContinueAtUsageLimit の解説(本体 2.1.311 の文字列から。2026-10-27)

    出所は ~/.local/share/claude/versions/2.1.311 の文字列だけ——公開ドキュメントではない。関数名は minify されたもので、版ごとに変わる。読み取ったことであって、動かして確かめたことではない。

    何をする設定か

    設定の説明(そのまま):

    When a claude.ai usage limit stops your session, wait for the limit to reset and continue the task automatically. When off, the limit dialog offers the wait as a choice instead.

    • オン: 上限で止まると、リセットの時刻まで待ってから利用者の発言として次の文を差し込み、続きを始める。トランスクリプトに残るのはこの文で、cruise: 利用上限で止まった後に続いたかを、トランスクリプトから数える(自動継続・人間・タイマー・止まったまま) #454 の分類はこれを手がかりにする:
      • Your claude.ai usage limit has reset. Continue the task you were working on when the limit was reached; do not repeat work that is already complete.
      • リセットより早く使えるようになった場合の別の文もある: Your claude.ai usage is available again before the usage-limit reset. Continue the task …(分類のときはこちらも拾う)
    • 待っている間の表示は Usage limit reached · limit resets <時刻> と Continuing shortly · esc to cancel。Esc で取り消せる(Automatic continue cancelled … が出る)
    • オフ: 上限の画面で「待つ」を選択肢として出すだけ。選ぶ人がいなければ止まったまま——不在の cruise で困るのはこちら

    どこに書けば効くか

    • 読むのは managed(policy)・flag・user の層だけ(dev-loop: 利用者が不在になる前の環境点検(許可・自動継続・通知・スリープ)(#389 から分割) #394 の R2-1。2.1.311 でも同じ読み方)。project・local の settings.json に書いても効かない
    • /config の「Model & output」にある「Continue automatically at usage limit」が user の層に書き込む。この切り替えが /config に出るのは、値が未設定か user の層から来ているときだけ(managed・flag で決まっていると出ない)
    • 未設定のときの値は式で決まる: 設定値 ?? (保存域でのキーの有無 === "absent")。キーの有無を調べられなければ unknowable になって再試行する。未設定でもオンになる場合があるが、いつそうなるかは文字列からは読み切れない——check-unattended-env.py が未設定を要対処にしているのはこのため。ちなみに /config の表示だけは未設定を true として見せる

    true にしても待たない場合(#394 の R2-9 の中身)

    待つかどうかの判定は、設定のほかに少なくとも次を全部要求する:

    1. 課金の種類が usage_based でない——手元の ~/.claude.json は stripe_subscription なので、ここは満たす
    2. サーバから配られる機能フラグ: tengu_marble_heron の enabled と autoArm、キルスイッチの tengu_linked_clover(既定はオン)。フラグが外れていると、設定が true でも killswitch として待たない
    3. ほかに環境の条件がいくつかある(中身は読み切れていない)

    10 月に 0 回になったことの候補(確かめていない)

    手元の ~/.claude.json の cachedGrowthBookFeatures に、tengu_marble_heron も tengu_linked_clover も無い。 無いときは {} が使われ、enabled は未定義になる——そう読めるなら、今の手元では設定に関係なく待たない。9 月に自動継続が起きていたことと合わせると、サーバ側のフラグが変わったことが 10 月の 0 回の候補になる。

    ただし確かめていない:

    • キャッシュに無いことが、判定の時点でフラグが取れていないことと同じか
    • 未定義を偽と読むか(r() の中身は読んでいない)
    • 9 月の時点のキャッシュの中身(残っていない)

    つまり、受入基準 4(陽性対照)が取れない理由は「上限は狙って起こせない」だけではない——フラグ次第で、取りに行っても起きない可能性がある。 取れなかったときに設定の問題と取り違えないように、測る前後で cachedGrowthBookFeatures の該当キーを記録することを基準 4 に足すのがよい。

    cruise の運用への含み

    • autoContinueAtUsageLimit: true は必要条件で、十分条件ではない。フラグはリポジトリからも利用者からも動かせない
    • だから、不在で回すならタイマー(CronCreate などで同じ引数の /dev-loop:cruise を起動し直す)を保険として張るのが今の作りでいちばん確実——台帳から再開するので、自動継続が起きても起きなくても続きは失われない
  2. hdknr commented on Oct 27, 2026

    @hdknr
    OwnerAuthor

    受入基準 1〜3・5(計画ファイルの U1〜U13)は PR #455 で済み、残課題は #457(PR #462)で直した。受入基準 4(陽性対照: true を明示して自動継続を 1 件取る)は #456 へ移した——true は 2026-10-27T13:36:33+09:00 に明示済み(#456 のコメント)で、上限に当たるのを待っている。同じものを 2 つの Issue で追わないため、ここは閉じる。

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