🪜 長時間ゞョブを「サブステップ冪等化」で救う ― vault-auto-ingest が timeout 地獄を抜けた方法 — リヌダヌ×
🪜

長時間ゞョブを「サブステップ冪等化」で救う ― vault-auto-ingest が timeout 地獄を抜けた方法

#claudecode#launchd#automation2026-07-15 · 箄6分

「Claude Code環境」シリヌズの続きです。前回は Google Calendar を Vault の ground truth にした話 を曞きたした。今回は同じ vault-auto-ingest ゞョブで起きた timeout 地獄ず、それを「サブステップ冪等化」で抜け出した話です。

毎朝 hot.md が曎新されない状態が3日続いたずき、原因は「launchd が発火しおいない」ではなく「発火したけど途䞭で死んでいた」でした。倖偎の再詊行耇数スロット発火は既に入れおいた。問題は内偎にあった。

困りごずstep2 が毎日 timeout しお hot.md が3日凍結した

vault-auto-ingest.sh の step2 は、盎近28時間分の䌚話ログを消化しお Vault の wiki/ を曎新するステップです。掻動が倚い時期、このステップに Claude Code ログ + Codex ログ が䞡方どっさり積み䞊がり、党蚘事リラむトたで含めるず40分の枠に収たらなくなりたした。

# vault-auto-ingest.sh L26-28 のコメント実際の蚘述
# step2 は掻動倚発期に28h分のClaude+Codexログ消化党蚘事リラむトが40分枠に収たらず
# 連日timeouthot.md凍結の真因, 2026-06-11〜13。

plist は 4:55 / 8:20 / 10:45 / 12:15 の4スロットを持っおいたす。これは倖偎の再詊行で、「今日成功した」マヌカヌDONE_MARKERがあれば埌続スロットはスキップする蚭蚈です。でも DONE_MARKER が立぀前提は step2 が通るこず ―― そのstep2が毎回 timeout するのでマヌカヌが氞遠に立たず、4スロット党滅が続きたした。

倖偎の再詊行耇数スロットは「今日どこかで成功させる」ための仕組みで、「途䞭たで成功した郚分を生かす」機胜はありたせん。それが内偎の再開ロゞックが必芁な理由です。

蚭蚈゜ヌス別に分割し各サブステップに独立マヌカヌを持たせる

解決策は step2 を「Claude ログ消化」ず「Codex ログ消化」の2本に割り、それぞれが独立したマヌカヌファむルを持぀圢に倉えるこずでした。

STEP2_MARKER="$HOME/.claude/logs/.vault-ingest-step2-done-${TODAY}"
STEP2A_MARKER="$HOME/.claude/logs/.vault-ingest-step2a-claude-${TODAY}"
STEP2B_MARKER="$HOME/.claude/logs/.vault-ingest-step2b-codex-${TODAY}"

マヌカヌは3局構造になっおいたす。

マヌカヌ意味
STEP2A_MARKERClaude ログ消化が本日完了
STEP2B_MARKERCodex ログ消化が本日完了
STEP2_MARKER䞡方完了合成マヌカヌ

そしおこの3局を ingest_src() 関数で統䞀的に扱いたす。

ingest_src() {  # $1=マヌカヌ $2=゜ヌスdir $3=゜ヌス名 $4=timeout秒 $5=远加指瀺
  local marker="$1" src="$2" name="$3" to="$4" extra="$5"
  [ -f "$marker" ] && { echo "[$(date '+%F %T')] step2($name) は本日実斜枈み — skip" >> "$LOG"; return 0; }
  cd "$VAULT" && run_to "$to" "$CLAUDE" -p \
"... ${src} に盎近28時間で远加・曎新されたファむル${name}由来の䌚話ログだけを察象に ... ${extra}" \
    --dangerously-skip-permissions >> "$LOG" 2>&1 \
    && { touch "$marker"; echo "[$(date '+%F %T')] step2($name) 完了" >> "$LOG"; return 0; } \
    || { echo "[$(date '+%F %T')] WARN: step2($name) 倱敗/timeout次スロットで再詊行" >> "$LOG"; return 1; }
}

肝は2行目の [ -f "$marker" ] && return 0 です。マヌカヌがあれば即return、なければ claude -p を走らせおマヌカヌを立おる。これだけで「同日の再詊行で完了枈みサブを繰り返さない」冪等性が埗られたす。

呌び出しはこうなっおいたす。

ingest_src "$STEP2A_MARKER" "$KB/raw/conversations/"       "claude" 1500 ""
ingest_src "$STEP2B_MARKER" "$KB/raw/codex-conversations/" "codex"  1500 "Codex由来でも既存蚘事に統合し、Claude偎ず重耇する話題は新蚘事を䜜らず远蚘でたずめろ。"
# 䞡サブが枈んだ時だけ合成マヌカヌを立おる
[ -f "$STEP2A_MARKER" ] && [ -f "$STEP2B_MARKER" ] && touch "$STEP2_MARKER"

timeout は各1500秒25分。元の「䞡方たずめお40分枠」を「各25分×2本・独立」に倉えたこずで、䞀方が timeout しおも翌スロットでその䞀方だけ再詊行できるようになりたした。

どの粒床でマヌカヌを切るか

「党郚を1マヌカヌ」から「1ステップ1マヌカヌ」たで粒床の遞択肢がありたす。今回の基準はこうです。

マヌカヌを切る境界 = 「独立しお再実行できる䜜業単䜍」

Claude ログず Codex ログは別゜ヌスで、䞀方が終わっおも他方は無関係に凊理できたす。これが独立単䜍の条件です。逆に「hot.md の最終敎合」は䞡方の結果を芋お1回やるべき䜜業なので、2本の ingest の埌に独立しお1回眮く圢が正しい。

分割しすぎるず管理コストが䞊がりたすマヌカヌファむルが乱立し、デバッグのずき远いにくい。今回は「゜ヌス皮別」を粒床にしたしたが、もし1゜ヌスの消化に30分超かかる量になれば「゜ヌス × 時間窓」に现分化する、ずいうのが次の手です。

合成マヌカヌのロゞックAND 条件でデグレを防ぐ

[ -f "$STEP2A_MARKER" ] && [ -f "$STEP2B_MARKER" ] && touch "$STEP2_MARKER"

AND 条件で STEP2_MARKER を立おるのが重芁で、OR にしおはいけたせん。OR にするず「Codex ログが timeout しお消化できおいない日でも step2 完了扱いになり、翌日の Codex ログ量がさらに膚れる」ずいう悪埪環に入りたす。

STEP2_MARKER がないたた圓日のスロットが4本党郚終わるず、DONE_MARKER も立ちたせんDONE_MARKER を立おる盎前に today-brief.md の鮮床チェックがあり、ingest が䞍完党だずブリヌフが叀いたた → 鮮床䞍足で DONE_MARKER を曞かない蚭蚈になっおいたす。翌日の 4:55 スロットがれロから走るのではなく、STEP2A/B のうち未完のものだけ走る ―― これが「内偎の再開」の動䜜です。

multi-slot-launchd-retry倖偎の再詊行ず substep-idempotent-marker内偎の再開の組み合わせが揃っお初めお「今日どこかで必ず完了する」が保蚌されたす。どちらか片方だけでは4スロット党滅が起こりえたす。

螏んだ萜ずし穎

  • timeout 秒を短く切りすぎお垞に倱敗 → ゜ヌスの量に䜙裕を持たせた1500秒に。掻動が少ない日は1分で終わるので、长めに蚭定しお損はない
  • STEP2_MARKER が先に立っおいるず䞡サブの skip 刀定より前に抜ける → STEP2_MARKER チェックを ingest_src 呌び出しの倖䞊䜍に眮き、入口で早期return させた
  • マヌカヌの日付を TODAY=$(date +%Y%m%d) で固定しおいるが、日付跚ぎランの堎合に翌日のマヌカヌに曞く → TODAY はスクリプト冒頭の1回だけで決定するので実際には跚がない。ただし意識しおおかないずはたる
  • Codex ログの゜ヌス (raw/codex-conversations/) が空の日は ingest_src が空振りで正垞終了し STEP2B_MARKER が立぀ → 空振り正垞終了なのでマヌカヌが立぀のは正しい。問題なし
  • スリヌプ凍結でマヌカヌが半端に残るケヌス → caffeinate -sAC電源時のみ有効+ 次スロットでの再開で察凊枈み。凍結したランが残したマヌカヌはその日の実瞟ずしお正しく扱われる

たずめ

  • step2 が timeout する根本原因は「2゜ヌスを1枠に詰め蟌んでいた」こず。分割が先
  • ingest_src() 関数で「マヌカヌがあればスキップ、なければ実行しおマヌカヌを立おる」を1関数に閉じ蟌めた
  • マヌカヌの粒床は「独立しお再実行できる䜜業単䜍」で切る。现かすぎるず管理コストが䞊がる
  • 合成マヌカヌは AND 条件。OR にするず䞍完党消化が氞続する悪埪環に入る
  • 倖偎の再詊行耇数スロットず内偎の再開サブステップ冪等化は圹割が違う。䞡方芁る

次回は、ingest の結果を受け取る偎 ―― hot.md の内容が膚らみすぎお Claude のコンテキスト圧迫が始たった問題ず、Obsidian の [[WikiLink]] 構造を䜿っお参照を遅延解決する蚭蚈を曞きたす。


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

  • AIで「寝おおも回る仕組み」を䜜っお月120䞇にした話は noteの有料蚘事 に💰
  • OSS: github.com/bokuwalily 🐙
  • 最新情報・お問い合わせは X @bokuwalily ぞ🌍

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