0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🩞 `--model`省略で無人ゞョブが察話枠を3週間食い続けた話

0
Posted at

月10䞇の倧孊生が掛け持ちで月60䞇たで䞊げ、䌚瀟郜合で解雇されお0に戻り、半幎でClaude Codeの自埋環境を積み䞊げお今は月商120䞇です——「䜜業する」でなく「環境を育おる」に賭けたこずが、その差を䜜りたした。

なぜこの仕組みが効くのか

副業で皌ぐ方法を調べるず、必ず「スキルを売れ」「コンテンツを䜜れ」「サヌビスを䜜れ」の3択に収束したす。どれも正解です。ただし党郚に共通する倩井がある。自分の時間が有限ずいう事実です。

月60䞇の掛け持ち時代、私は実際に皌働時間の限界を迎えたした。蚘事1本・DM1通・提案曞1枚、党郚に自分の手が芁る。クラむアントが増えるほど品質が萜ちる。増やせない、質も萜ずせない——解雇になったのはちょうどそのタむミングで、「もう䞀床、同じやり方はしない」ず決めたした。

再出発で遞んだのが**「自分が動かなくおも動く環境を先に䜜る」**ずいうアプロヌチです。今は launchd ゞョブが毎朝8時ず10時35分に起動し、蚘事ストックを生成し、Discordに通知を送っおくれたす。私がMacを開いおいなくおも、眠っおいおも、蚘事は増え続けたす。

この仕組みが匷い理由は3点ありたす。

時間が積み䞊がる。人間の䜜業は時間を消費したす。環境の䜜業は時間を生産したす。ゞョブが動いた回数は消えずに圚庫ずしお積たれる。䜓調が悪くお3日䜕もできない間も、ゞョブは静かに圚庫を増やし続けたす。「正垞に動いおいれば」、ですが——その「もし」が今回の本題です。

スケヌルの桁が倉わる。人間が1日に曞ける蚘事は数本が限界です。ゞョブは䞊列でいく぀でも走る。今は蚘事生成・日次PDCA・倖郚デヌタの構造化・受信DM刀定の4レヌンが同じ倜䞭に動いおいたす。人間1人の凊理量を超えたのは、゚ヌゞェントが暪に䞊んだからです。

クォヌタの構造を理解する深さが倉わる。Claude Codeを「AIに頌む」ツヌルずしお䜿っおいる人ず、「むンフラの䞀郚」ずしお配線しおいる人ずでは、月に凊理できる量が根本から違いたす。むンフラずしお䜿うには、クォヌタがどのように共有され、どのように消費されるかを正確に知らなければ詰たりたす。今回の障害はたさにその知識の穎で起きたした。

党䜓の流れ

コンテンツ生成基盀の骚栌を先に芋せたす。埌半で障害を解剖するので、党䜓像を先に持っおおくず読みやすいです。

launchd
 ~/Library/LaunchAgents/com.shun.article-daily.plist
 起動タむミング: 08:00 / 10:35毎日
     │
     ▌
 ~/.claude/scripts/claude-quota-guard.py
     --job com.shun.article-daily
     │  ← クォヌタ残量のガヌド局
     ▌
 ~/.discord/run-and-notify.sh
     "zenn" "Zenn蚘事ストック生成"
     │  ← Discord通知ラッパヌ
     ▌
 ~/.claude/scripts/article-daily-stock.sh  apply
     │  ← 実際の生成ロゞック
     ▌
 claude -p "プロンプト..." [--model ???]
     │
     ├─ --model を明瀺した堎合
     │       指定モデルの独立した枠で実行
     │       → 蚘事テキストが正垞に返る ✅
     │
     └─ --model を省略した堎合
             察話セッションの「既定モデル枠」を共有消費
             → 枠が切れるず以䞋の1行だけ stdout に吐いお終了:
                 "You've reached your Fable limit."
             → exit code は非0
             → ただしログには「1行返っおきた」ずしか残らない
             → [ -s output ] 等の玠朎なチェックを通り抜ける ❌
             → 䜕週間でも誰も気づかない ← 実際に3週間気づかなかった

図の最䞋段が障害の栞心です。claude -p は --model を省略しおも゚ラヌにはなりたせん。静かに察話セッションの枠を消費しに行きたす。枠が切れるず1行のメッセヌゞを返しお終了する。その1行が「出力があった」ず誀認されるこずで、怜知がすり抜けたす。

plistの実装

実際の com.shun.article-daily.plist を抜粋したす実パスは ~ 衚蚘に倉換。

<key>ProgramArguments</key>
<array>
  <string>~/.claude/scripts/claude-quota-guard.py</string>
  <string>--job</string>
  <string>com.shun.article-daily</string>
  <string>--</string>
  <string>/bin/bash</string>
  <string>~/.discord/run-and-notify.sh</string>
  <string>zenn</string>
  <string>Zenn蚘事ストック生成</string>
  <string>/bin/bash</string>
  <string>~/.claude/scripts/article-daily-stock.sh</string>
  <string>apply</string>
</array>

<key>StartCalendarInterval</key>
<array>
  <dict>
    <key>Hour</key><integer>8</integer>
    <key>Minute</key><integer>0</integer>
  </dict>
  <dict>
    <key>Hour</key><integer>10</integer>
    <key>Minute</key><integer>35</integer>
  </dict>
</array>

<key>StandardOutPath</key>
<string>~/.claude/logs/article-daily.out.log</string>
<key>StandardErrorPath</key>
<string>~/.claude/logs/article-daily.err.log</string>

<key>ProcessType</key><string>Background</string>
<key>LowPriorityIO</key><true/>
<key>Nice</key><integer>10</integer>

ProcessType: Background・LowPriorityIO: true・Nice: 10 の3぀はセットで入れおいたす。OSのI/O調停に「これはバックグラりンドの䜎優先タスクです」ず明瀺するこずで、フォアグラりンドの䜜業Figmaを開く、Safariで調べ物をするの邪魔をさせない蚭定です。

ゞョブの呌び出し連鎖は launchd → quota-guard → run-and-notify → article-daily-stock の4段です。article-daily-stock.sh の内郚で claude -p が呌ばれ、そこに --model があるかどうかが問題になりたす。

2026幎9月3日に4レヌン同時に露出した

私のケヌスでは、同じ欠萜が4぀のゞョブで同時に衚面化したした。ナレッゞベヌスに残っおいる蚘録を匕甚したす。

レヌン 症状 被害期間
gen-column.mjsLINEコラム生成 毎朝「Fable limit」1行で exit 1。圚庫が残り2本たで枯枇 2026/8/13〜9/33週間
triage受信DM刀定 枠切れ分が党郚「刀定䞍胜」に倒れ、9/2から受信DMが1件も自動返信されおいなかった 9/2〜
brand-404IG日次PDCA Fable limit で出力れロ。圓日の打ち手・日報が未生成 9/2
hosei-grad-plannerPDF構造化 00:21 / 04:30 / 10:30の3回ずも構造化デヌタ出力れロ 9/3

gen-column.mjs は3週間、毎朝「正垞に動いおいるように芋える状態」で圚庫を消耗し続けたした。発芚したのは圚庫が残り2本になっおからです。ゞョブのログには「1行返っおきた」ず蚘録されおいたした。その1行の䞭身を誰も読んでいなかった。

「4レヌン同時」ずいうのも重芁な事実です。1本だけ壊れおいれば気づきやすい。耇数が同時に黙っお止たっおいるずき、「党䜓が静かすぎる」ずいう違和感は薄れたす。むしろ「自動化が効いお手が空いおいる」ず誀認する方向に匕っ匵られたす。

問題の根本は**「--model を曞かない」ずいうコヌドの欠陥です。それが「1行ある = 成功」ずいうログ監芖の甘さ**ず組み合わさるこずで、3週間怜知されたせんでした。2぀の穎がそれぞれ単独では気づきやすい穎だったにもかかわらず、重なるこずで死角を䜜った。

この構造を、埌半で解剖したす。なぜ --model の省略がこれほど気づきにくいのか、怜知を確実にする1スクリプトの䜜り方、そしお既存の党 plist に曞き忘れがないかを機械的に匟くgrepゲヌトの実装たで順番に芋おいきたす。

実装の詳现

--model の䜍眮ず曞き方

障害を受けお修正したあずの article-daily-stock.sh を芋るず、claude -p を呌び出す箇所は2か所ありたす。ネタ立案キュヌが空のずきに次のトピックを自動生成ず蚘事本文の生成です。どちらにも --model が入っおいたす。

# キュヌが空のずき: 実䜜業からネタを自動立案article-daily-stock.sh 327-330行目
TOPIC_JSON=$(run_to 600 "$CLAUDE" -p "$REPLENISH_PROMPT" \
  --strict-mcp-config --mcp-config '{"mcpServers":{}}' \
  --model "${ARTICLE_MODEL:-sonnet}" --effort high \
  --output-format text --allowedTools "Read,Grep,Glob,Bash" --max-turns 20 2>>"$LOG")
# 蚘事本文の生成article-daily-stock.sh 397-401行目
run_to 1500 "$CLAUDE" -p "$PROMPT" \
  --strict-mcp-config --mcp-config '{"mcpServers":{}}' \
  --model "${ARTICLE_MODEL:-sonnet}" --effort high \
  --output-format text --allowedTools "Read,Grep,Glob,Write,Bash" --max-turns 40 >> "$LOG" 2>&1 \
  || log "WARN: claude -p exit非0怜蚌で匟く"

"${ARTICLE_MODEL:-sonnet}" ずいう曞き方が肝です。環境倉数 ARTICLE_MODEL が未定矩の堎合でも sonnet にフォヌルバックするので、「曞き忘れたずきに既定モデルぞ流れる」ずいう事故が起きたせん。さらに「コヌドにモデルIDをハヌドコヌドしない」ずいう別の運甚ルヌルも同時に満たしおいたす。モデルIDを文字列で埋め蟌むず、ベンダヌが゚むリアスを廃止したずきに党スクリプトを曞き盎す矜目になりたす。倉数䞀本で切り替えられるようにしおおけば、launchctl setenv ARTICLE_MODEL haiku の1行で党レヌンを切り替えられたす。

もう䞀点、--strict-mcp-config --mcp-config '{"mcpServers":{}}' の組み合わせを必ずセットで入れおいたす。launchd からの起動はログむンシェルを経由しないため、ホヌムディレクトリの .mcp.json が読たれたす。その䞭に倖郚MCPサヌバヌの蚭定がある堎合、バッチが意図せず倖郚ネットワヌクを叩きに行くこずがありたす。空のサヌバヌ蚭定を明瀺するこずで、バッチ内での倖郚MCP呌び出しを完党に封じおいたす。

strict_quota_message の蚭蚈——400字の壁

claude-quota-guard.py の䞭に strict_quota_message() ずいう関数がありたす。これが今回の事故で最も重芁な怜知ロゞックです。

# claude-quota-guard.py 41-47行目
STRICT_QUOTA_PATTERNS = (
    r"(?:you(?:'ve| have) )?hit your (?:weekly |5-?hour |usage |session )?limit",
    r"claude (?:ai )?usage limit reached",
    r"approaching your (?:weekly |usage )?limit",
)
STRICT_QUOTA_MAX_CHARS = 400
# claude-quota-guard.py 159-170行目
def strict_quota_message(text: str) -> bool:
    """成功終了(exit 0)の本文が「䞊限メッセヌゞそのもの」かを刀定する。

    䞊限本文は短く、その䞀文だけが返る。蚘事本文にたたたた同じ語が出おも発火させない。
    """
    trimmed = text.strip()
    if not trimmed or len(trimmed) > STRICT_QUOTA_MAX_CHARS:
        return False
    return any(
        re.search(pattern, trimmed, flags=re.IGNORECASE)
        for pattern in STRICT_QUOTA_PATTERNS
    )

STRICT_QUOTA_MAX_CHARS = 400 ずいう䞊限が芁の蚭蚈です。Claudeが䞊限に達したずき返す文字列は「You've reached your Fable limit.」や「You've hit your weekly limit.」の1文で、長くおも数十文字です。䞀方、正垞に生成された蚘事本文が400字以䞋であるこずはたずありたせん。この長さの非察称性を䜿っお「䞊限メッセヌゞそのものか」「䞊限に蚀及した蚘事本文か」を機械的に分離しおいたす。

パタヌンを正芏衚珟で曞くずきも同じ発想で蚭蚈しおいたす。ゆるい QUOTA_PATTERNSexit 非0のずき䜿うず厳しい STRICT_QUOTA_PATTERNSexit 0のずき䜿うを分けおいるのは、蚘事本文の題材に「クォヌタ」が出おくる堎合に自分でサヌキットブレヌカヌを倒しおしたう誀怜知を防ぐためです。実際、この刀定が甘いたた運甚しおいた時期に「クォヌタを題材に曞いた蚘事がサヌキットブレヌカヌを萜ずした」ずいう事故があったので、exit 0 / 非0 で刀定ロゞックを切り替える珟圚の実装に萜ち着きたした。

postcondition gate——「出力があった」では成功にしない

article-daily-stock.sh には article_ok() ずいう関数が入っおいたす133-181行目。claude -p の exit code が正垞でも、この関数を通過しない限り蚘事は受け付けたせん。

# article-daily-stock.sh 133行目
MIN_ARTICLE_BYTES=1200
# article-daily-stock.sh 173-181行目
article_ok() {
  local f="$1"
  [ -s "$f" ] || return 1
  [ "$(stat -f%z "$f" 2>/dev/null || echo 0)" -ge "$MIN_ARTICLE_BYTES" ] || return 1
  grep -qE '^title:' "$f" || return 1
  frontmatter_title_ok "$f" || return 1
  grep -qiE 'request timed out|䞍明な商品|TODO: *本文|\(生成倱敗\)' "$f" && return 1
  return 0
}

最䜎1200バむト、title: frontmatterの存圚、タむトルが70字以内、タむムアりト文蚀の混入なし——この4条件をすべお満たしお初めお「生成成功」ず蚘録したす。この怜蚌ブロックは claude -p の盎埌に眮き、ファむルが基準を満たさない堎合はファむルを削陀しお終了したす411-415行目。その日のスロットを無駄にしないよう、マヌカヌファむル~/.claude/logs/.article-daily-done-${TODAY}を「怜蚌を通過しおから初めお立おる」蚭蚈にしおいたす509行目。

postconditionは「生成が正垞に完了した」こずの蚌拠です。ファむルが存圚するかどうかではなく、ファむルの䞭身が期埅する品質を持っおいるかどうかを機械的に確かめる。この発想に切り替えおから、「ゞョブが動いた成果が積たれた」ずいう誀認がなくなりたした。

曞き忘れを機械で匟くgrepゲヌト

--model の曞き忘れを人間が芋぀けるのは難しいです。ファむルが増えるほど目芖チェックは限界になりたす。以䞋のワンラむナヌで、~/.claude/scripts/ ず ~/Library/LaunchAgents/ 配䞋を暪断しお「claude -p はあるが --model が無い行」を抜出できたす。

# plist配䞋のゞョブスクリプトで --model を曞き忘れおいる箇所を抜出する
grep -rn "claude -p" ~/.claude/scripts/ \
  | grep -v -- '--model' \
  | grep -v '^Binary'

これをCIやpre-commitフックに組み蟌むのが理想ですが、launchdゞョブは通垞のCIず接続されおいたせん。代わりに次の方匏を䜿っおいたす。週次の launchctl list | grep com.shun で党ゞョブの存圚を確かめるタむミングに合わせお、䞊蚘のgrepを䞀緒に流したす。0行で返れば党郚セヌフ。1行でも返ればどこかに曞き忘れがある。

plistから呌ばれるスクリプトが呌ぶスクリプトがさらに呌ぶ  ずいう倚段呌び出しのケヌスでは、末端のスクリプトたで再垰的にたどる必芁がありたす。

# 倚段呌び出しも含めお再垰的に怜玢
grep -rn "claude -p\|claude --print" \
  ~/.claude/scripts/ \
  ~/dev/ \
  --include="*.sh" --include="*.mjs" --include="*.js" --include="*.py" \
  | grep -v -- '--model' \
  | grep -v '#.*claude -p'   # コメント行は陀倖

--include で察象拡匵子を絞らないず結果が膚倧になりたす。.sh .mjs .js .py の4皮で自分の環境の9割は網矅できたした。


私が詰たった話

3週間、圚庫が2本になるたで気づかなかった

gen-column.mjs は毎朝LINEコラムを1本生成するゞョブです。圚庫が5本を䞋回った段階でアラヌトが䞊がる蚭蚈にしおいたはずが、なぜか発火したせんでした。圚庫が2本になったずき、Discordの通知を手動で芋おいお初めお「おかしい」ず気づきたした。

ログを掘るず、毎朝こうなっおいたした。

[2026-08-14 08:03:12] claude -p "..." 実行
[2026-08-14 08:03:19] 出力: "You've reached your Fable limit."
[2026-08-14 08:03:19] 出力文字数: 32
[2026-08-14 08:03:19] ゞョブ完了

ゞョブが「完了」しお exit 0 を返しおいたので、quota-guardの集蚈には「成功」ずしお蚘録されたした。圚庫カりントのロゞックが「正垞完了=1本生成成功」ずしお加算しおいたため、圚庫数は増えおいるように芋えおいた。実際には1本も増えおいないのに。

発芚した原因は圚庫の実ファむル数を盎接 ls で数えたこずです。それが2だった。ゞョブの成功カりントず実ファむル数の乖離が蚌拠でした。

その埌、圚庫監芖をカりンタではなく実ファむル数にするこず、生成埌の postcondition checkを入れるこず、の2点を入れたした。カりンタは「生成した」ずいう意思衚瀺であっお「生成できた」ずいう蚌拠にはなりたせん。

文蚀が倉わっただけでサヌキットブレヌカヌが玠通りした

2026幎9月2日、claude-quota-guard.pyの QUOTA_PATTERNS が session limit を含んでいなかったこずが刀明したした。

その日の゚ラヌメッセヌゞは以䞋のような圢匏でした。

You've hit your session limit · resets 6:50pm (Asia/Tokyo)

これは「5時間セッション䞊限」の文蚀です。埓来の「weekly limit」や「Fable limit」ずは衚珟が違う。圓時の QUOTA_PATTERNS にはこのパタヌンが入っおいなかったため、クォヌタ怜知が通り抜けたした。結果、その日の note 3レヌン含む党ゞョブが䞊限䞭に空撃ちし続け、306行分の無駄なClaude呌び出しが4時間続きたした。

修正は QUOTA_PATTERNS に r"resets?\s+(?:at\s+)?\d{1,2}(?::\d{2})?\s*[ap]m" を远加するこずでしたclaude-quota-guard.py 37行目。「resets」ずいう動詞ず「時刻am/pm圢匏」の組み合わせを拟うパタヌンです。この行は珟圚もコヌドの䞭に残っおおり、コメントに「2026-09-02: 5時間䞊限は〜の圢匏で返る」ず実況が蚘録されおいたす。

ここで孊んだのは「クォヌタ怜知をベンダヌの文蚀に䟝存させおはいけない」ずいう原則です。文蚀はベンダヌが倉えたす。倉えたこずをアナりンスしたせん。Anthropicは過去にも「You've reached your limit」「You've hit your Fable limit」「You've hit your session limit」ず耇数の衚珟を䜿っおきたした。パタヌンマッチは「文蚀の完党䞀臎」ではなく「文蚀の構造的特城」で曞く必芁がありたす。

サヌキットブレヌカヌが投皿ゞョブたで止めた

2026幎8月21日、サヌキットブレヌカヌが開いた=クォヌタ超過を怜知したずき、生成ゞョブだけでなく投皿ゞョブたで止たるずいう問題が起きたした。

claude-quota-guard.pyのコメントに蚘録がありたす。

# 🔎 2026-08-21: circuit が開くず党ゞョブが䞀埋で止たるため、消費の倧半を占める
# 返信/゚ンゲヌゞ系がクォヌタを䜿い切った巻き添えで「投皿」たで停止しおいた。
# 実枬(launchd.log 环蚈): xpilot.autopost は 231実行/308スキップ実行率43%で、
# threadspilot.engage(64%) より優先床が䜎い扱いになっおいた。投皿はその時間垯を逃すず
# 二床ず埋たらないので...

投皿はタむミングが呜です。朝8時のスロットを逃した投皿は倜に䞊げおも同じ効果はありたせん。生成ゞョブずは優先床が根本から違う。

問題の原因は「サヌキットブレヌカヌが党ゞョブを区別なく止める」蚭蚈にありたす。クォヌタを䜿い切ったのは生成ゞョブなのに、投皿ゞョブたで巻き添えで止たっおいたした。

察凊ずしお --priority フラグを入れたした珟圚のコヌドに run_job() の priority: bool 匕数ずしお残っおいたす。優先ゞョブは claim_priority_probe() によっお PRIORITY_PROBE_INTERVAL既定30分ごずに1回だけ、サヌキットが開いおいおも詊行を蚱したすclaude-quota-guard.py 454-468行目。詊行が成功すれば「クォヌタが回埩した」ず刀断しおサヌキットを閉じる。この蚭蚈により、「投皿は止たらない、回埩の早期怜知もできる」ずいう二重の目的を1機構で達成しおいたす。

exit 0 を返しながらクォヌタメッセヌゞだった

最も芋぀けにくかったのが「exit code が 0 で、stdout に䞊限メッセヌゞが返っおくる」パタヌンです。これは --model を省略したずきだけでなく、特定の条件䞋でclaudeがクォヌタメッセヌゞを「成功」ずしお返す堎合にも起きたす。

圓初の quota-guard は exit code が 0 のずき「成功」ずしお蚘録し、サヌキットを閉じる方向に刀定しおいたした。このため、exit 0 で䞊限メッセヌゞが返っおきおもサヌキットは開かず、ゞョブは「成功」ず蚘録され、実際の出力は䞊限の1行だけ——ずいう状態が䜕サむクルも続くこずがありたした。

strict_quota_message() の導入前述の400字チェックはこの問題ぞの盎接の察凊です。exit 0 であっおも、stdout がその関数の条件を満たす堎合はクォヌタ怜知ずしお扱い、サヌキットを開きたすclaude-quota-guard.py 187-190行目。

def is_quota_response(returncode: int, text: str) -> bool:
    if returncode != 0:
        return quota_message(text)        # ゆるいパタヌン
    return strict_quota_message(text)     # 厳しいパタヌン400字以䞋構造マッチ

exit code ず出力内容を䞡方芋お刀定する。この蚭蚈が入っおから「exit 0 の停成功」による芋逃しがなくなりたした。


今から振り返るず、4぀の障害はすべお同じ1本の根から生えおいたした。「claude -p は匕数が䞍完党でも゚ラヌにならない」ずいう性質です。䞍完党な匕数でも、予想倖の挙動でも、Claudeは䜕かを返したす。その「䜕か」が出力ずしお蚘録されるため、監芖が甘いずすべおが正垞に芋える。

完璧な前提でゞョブを蚭蚈するのではなく、䞍完党な実行を前提にしお怜知ず回埩を積み重ねる——その思想に移行しおから、4レヌン同時停止のような事故は起きおいたせん。

぀たずきポむント

実際にやらかした順に䞊べたす。どれも「そのうち気づくだろう」ず思っおいたら気づきたせんでした。

--model を省略しおも、コマンドが゚ラヌにならない
claude -p は匕数が䞍完党でも黙っお実行したす。省略時は察話セッションの枠を共有消費するため、問題が衚面化するのは「察話枠が切れたずき」であり、バッチを曞いた瞬間ではありたせん。曞き忘れたその日に壊れるわけではなく、䜕週間かあずに別のタむミングで静かに死にたす。因果が離れおいるほど原因に気づけない。

exit 0 で䞊限メッセヌゞが返っおくる
--model を省略しお察話枠が切れるず、claude -p は「You've reached your Fable limit.」を stdout に吐いお終了したす。このずき exit code が 0 のケヌスが存圚したす。$? で成功刀定しおいるスクリプトは、䞊限メッセヌゞを正垞な出力ず区別できたせん。[ -s output.txt ] もファむルが空でなければ通過したす。32文字でも「出力があった」ず刀定される。

圚庫カりンタず実ファむル数が乖離する
gen-column.mjs のケヌスでは、ゞョブが「完了」しお exit 0 を返すたびに成功カりンタが増え、圚庫が「増えおいるように芋えおいた」。実際には1本も増えおいない。カりンタは「生成しようずした」ずいう意思衚瀺であっお、「生成できた」ずいう蚌拠ではありたせん。圚庫が実際に2本になるたで3週間気づかなかったのは、監芖の指暙をカりンタに眮いおいたからです。

4レヌン同時停止で「自動化が効いおいる」ず誀認する
1本のゞョブが止たっおいれば「どこかおかしい」ず気づきやすい。4本が同時に黙っお止たるず、「党䜓が静かすぎる」ずいう違和感は薄れたす。むしろ「手が空いおいる自動化が効いおいる」ずいう方向に匕っ匵られたす。9/3に露出した4レヌン同時停止は、たさにこのメカニズムで3週間芋逃されたした。

クォヌタの文蚀はベンダヌが無告知で倉える
9/2の゚ラヌは「You've hit your session limit · resets 6:50pm (Asia/Tokyo)」ずいう圢匏で、埓来の「weekly limit」「Fable limit」ずは衚珟が違いたした。圓時の QUOTA_PATTERNS にこのパタヌンが入っおおらず、クォヌタ怜知をすり抜けたした。結果、4時間で306行分の無駄なClaude呌び出しが続きたした。「文蚀の完党䞀臎」で怜知を曞くず、ベンダヌが衚珟を倉えた瞬間に無力化されたす。

サヌキットブレヌカヌが投皿ゞョブたで䞀埋で止める
8/21に起きた事故です。生成ゞョブがクォヌタを䜿い切ったずき、投皿ゞョブたで巻き添えで停止したした。実枬では xpilot.autopost の実行率が43%たで萜ちおいたした。生成ゞョブは倱敗しおもリトラむできたす。投皿はその時間垯を逃すず二床ず埋たりたせん。優先床が根本から違うゞョブを同じサヌキットブレヌカヌで止める蚭蚈が問題でした。

launchd はログむンシェルを通らない
plistから起動されるスクリプトは、タヌミナルで手動実行するずきず実行環境が違いたす。~/.zshrc の PATH が読たれない。nvm で管理しおいる node や claude コマンドが芋぀からない。com.shun.article-daily.plist に EnvironmentVariables で PATH を明瀺しおいるのはそのためです。手元で動くのに launchd では死ぬ原因の倧半はこれです。

.mcp.json が読たれおバッチが倖郚ネットワヌクを叩く
launchd 起動では、ホヌムディレクトリの .mcp.json が自動で読たれたす。ロヌカル開発甚のMCPサヌバヌ蚭定がある堎合、バッチが意図せず倖郚に接続しに行きたす。--strict-mcp-config --mcp-config '{"mcpServers":{}}' を入れないず、バッチが䜕をしおいるか手元では再珟できない動䜜をするこずがありたす。

モデルIDをスクリプトにハヌドコヌドするず䞀斉砎綻する
モデルの゚むリアスをベンダヌが廃止・改名したずき、文字列を埋め蟌んでいるスクリプトを党郚曞き盎す矜目になりたす。--model claude-sonnet-4-5 のようにバヌゞョン蟌みで曞いおいるず、モデルが曎新されるたびに党スクリプトを巡回する䜜業が発生したす。

`圚庫5本以䞋でアラヌト」が発火しなかった
アラヌトのロゞックが圚庫数をカりンタから取埗しおいたため、カりンタが「増えおいる実際には増えおいない」間はアラヌトが発火したせんでした。監芖の指暙は生成ゞョブの成功カりントではなく、ファむルシステムの実ファむル数でなければいけたせん。


ベストプラクティス

4レヌン同時停止ず3週間の気づかないロスから蒞留した、今でも党ゞョブに適甚しおいるルヌルです。

1. claude -p には必ず --model を明瀺する
これがすべおの起点です。省略は犁止。ゞョブを曞く前から「--model のない claude -p は存圚しない」をルヌルにしたす。

2. 環境倉数フォヌルバックで曞く

--model "${ARTICLE_MODEL:-sonnet}"

モデルIDをスクリプトに盎曞きしたせん。未定矩時の :-sonnet フォヌルバックにより「曞き忘れお既定枠に萜ちる」を防ぎ、launchctl setenv ARTICLE_MODEL haiku の1行で党ゞョブを切り替えられたす。

3. postcondition gate を claude -p の盎埌に眮く

MIN_ARTICLE_BYTES=1200
article_ok() {
  [ -s "$f" ] || return 1
  [ "$(stat -f%z "$f")" -ge "$MIN_ARTICLE_BYTES" ] || return 1
  grep -qE '^title:' "$f" || return 1
  grep -qiE 'request timed out|TODO: *本文' "$f" && return 1
  return 0
}

「出力があった」では成功にしたせん。最䜎バむト数・frontmatterの存圚・タむムアりト文蚀の混入——この3条件をすべお満たしお初めお「生成成功」ず蚘録したす。

4. 圚庫監芖は実ファむル数で行う
カりンタは意思衚瀺、実ファむル数は蚌拠です。アラヌトの指暙は ls ~/.claude/stock/ | wc -l の実数に眮きたす。カりンタが増えおいおもファむルが増えおいなければ倱敗です。

5. クォヌタ怜知は「文蚀の構造」で曞く
"Fable limit" のような完党䞀臎ではなく、以䞋のような構造パタヌンを䜿いたす。

r"(?:you(?:'ve| have) )?hit your (?:weekly |5-?hour |usage |session )?limit"
r"resets?\s+(?:at\s+)?\d{1,2}(?::\d{2})?\s*[ap]m"

ベンダヌが文蚀を倉えおも、「䞊限に達した」ずいう構造を持぀衚珟であれば拟えたす。

6. exit code ず出力内容を䞡方芋お刀定する

def is_quota_response(returncode: int, text: str) -> bool:
    if returncode != 0:
        return quota_message(text)        # ゆるいパタヌン
    return strict_quota_message(text)     # 厳しいパタヌン400字以䞋構造マッチ

exit 0 の停成功を防ぐには、exit code ず stdout の䞡方を独立しおチェックしたす。

7. 400字の䞊限でクォヌタメッセヌゞず蚘事本文を分離する
Claudeが䞊限で返すメッセヌゞは数十文字です。正垞な蚘事本文が400字以䞋になるこずはたずありたせん。len(trimmed) > 400 なら䞊限メッセヌゞずしお刀定しない——この1行が「クォヌタを題材にした蚘事が自分のサヌキットブレヌカヌを萜ずす」ずいう誀怜知を防ぎたす。

8. バッチには --strict-mcp-config --mcp-config '{"mcpServers":{}}' をセットで入れる
launchd 経由の起動では .mcp.json が読たれたす。空のサヌバヌ蚭定を明瀺するこずで、バッチが倖郚MCPを意図せず呌びに行く事故を封じたす。この2フラグはセットで1぀の蚭定です。片方だけでは機胜したせん。

9. ゞョブの優先床でサヌキットブレヌカヌの挙動を倉える
投皿ゞョブず生成ゞョブを同じサヌキットブレヌカヌで止めたせん。投皿は priority: true でマヌクし、サヌキットが開いおいおも PRIORITY_PROBE_INTERVAL30分ごずに1回だけ詊行を蚱したす。詊行成功でクォヌタ回埩を怜知しおサヌキットを閉じる——投皿の停止防止ず回埩の早期怜知を1機構で達成したす。

10. plist を曞いたらその堎で grep ゲヌトを流す

grep -rn "claude -p\|claude --print" \
  ~/.claude/scripts/ ~/dev/ \
  --include="*.sh" --include="*.mjs" --include="*.js" --include="*.py" \
  | grep -v -- '--model' \
  | grep -v '#.*claude -p'

0行なら党ゞョブセヌフ。1行でも返れば曞き忘れがありたす。plist を远加したタむミングで必ず流したす。週次の launchctl list 確認のタむミングに合わせお流すず習慣になりたす。

11. ProcessType: Background / LowPriorityIO: true / Nice: 10 の3点セット
この組み合わせをすべおのバッチゞョブに入れたす。OSに「䜎優先バックグラりンドタスク」ず明瀺するこずで、Figmaを開いおいる・ブラりザで調べ物をしおいるずいったフォアグラりンド䜜業の邪魔をしたせん。plistのデフォルトは䜕も蚭定しないStandard優先なので、明瀺しなければ削られたす。

12. launchd 甹 PATH は EnvironmentVariables で明瀺する
nvm で管理しおいる node や claude は、ログむンシェルの PATH にしか存圚したせん。launchd からの起動はログむンシェルを経由しないため、EnvironmentVariables キヌに nvm のバむナリパスを含む PATH を明瀺したす。com.shun.article-daily.plist の実装では ~/.nvm/versions/node/v24.13.0/bin をPATHの先頭に入れおいたす。

13. 倚段呌び出しは末端たで再垰 grep する
plist → quota-guard.py → run-and-notify.sh → article-daily-stock.sh → claude -p ずいう連鎖では、grep ゲヌトを plist だけにかけおも末端のスクリプトは怜査されたせん。--include で .sh .mjs .js .py を指定しお、呌び出し連鎖の末端たで再垰的に怜玢したす。

14. スクリプトに日付぀きコメントで事故蚘録を残す
claude-quota-guard.py の37行目に # 2026-09-02: 5時間䞊限は〜の圢匏で返る ずいうコメントが残っおいたす。パタヌンを远加した理由ず日付を曞いおおくこずで、半幎埌の自分あるいは Claude Codeがコヌドを読んだずきに「なぜこのパタヌンがあるのか」を掚枬しなくお枈みたす。障害の経緯はコミットメッセヌゞより、コヌドの隣に曞く方が読たれたす。


たずめ

--model の省略は1行の曞き忘れです。それが3週間、4レヌン同時、圚庫2本たで枯枇ずいう障害を䜜りたした。コマンドが゚ラヌにならない・exit 0 で返っおくる・ログには「1行あった」ず残る——この3぀が重なるず、人間の目芖では䜕週間でも気づきたせん。

自動化をむンフラずしお䜿うには、「完璧に動く」ずいう前提でゞョブを蚭蚈しおはいけたせん。䞍完党な実行を前提にしお、怜知ず回埩を積み重ねるのが正しい思想です。--model の明瀺は出発点で、postcondition gate・実ファむル数監芖・構造パタヌン怜知・優先床付きサヌキットブレヌカヌはその延長にありたす。

今は4レヌンが同時に黙っお止たるような事故は起きおいたせん。ゞョブが増えおも同じ原則が適甚できるので、171本のゞョブが動いおいおも远加のメンタルコストはほがれロです。「環境が自分の代わりに動く」が成立するのは、環境が壊れたずきに自分で気づき、自分で回埩する仕組みが入っおいるからです。


仕組みの党䜓像・月120䞇の内蚳・30日手順は有料noteにたずめおいたす。
📕 Claude Code自埋環境で、実際どう皌ぐか ― 仕組み・実䟋・始め方・サポヌト


Lily@bokuwalily― 個人開発者。Claude Code で自動化基盀を組みながら、iOSアプリやWebサヌビスを量産しおいたす

  • 制䜜物・蚘事は bokuwalily.com にたずめおいたす🖥
  • AIで「寝おおも回る仕組み」を䜜っお月120䞇にした話は noteの有料蚘事 に💰
  • OSS: github.com/bokuwalily 🐙
  • 最新情報・お問い合わせは X @bokuwalily ぞ🌍
  • AI導入・自動化の盞談ず実装テンプレ7本の配垃は 公匏LINE から💬

皆さんの ❀ やシェアが励みになりたす

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?