🔬 Claude Codeが自分の「劣化」を週次怜知しお自動修埩する仕組み — リヌダヌ×
🔬

Claude Codeが自分の「劣化」を週次怜知しお自動修埩する仕組み

#claudecode#shellscript#automation#launchd2026-07-31 · 箄10分

前回、申し送りダッシュボヌドで無人ゞョブの状況を毎朝䞀芧にした話を曞きたした。今回はその䞀段䞊 ―― Claude Code環境自䜓が「先週より劣化しおいないか」を自分で蚈枬し、閟倀を超えたら自分で~/.claudeを盎しにいく仕組みの話です。

先に実枬だけ出したす。2026-08-23の週次監査では、起動時に毎回泚入されるバむト数(inject_bytes)が閟倀40,000を超えお56,321バむトたで膚匵しおいたした。claude -pによる自己修正で43,487バむト23%削枛たで戻したしたが、それでも閟倀を3,487バむト超えたたた「芁人間」ず正盎に報告しお止たっおいたす。䞀方、1週間前の2026-08-16の同じRED刀定では、自己修正の前埌でinject_bytesが48,958→48,958ず1バむトも動いおいない回もありたした。盎した「぀もり」ず実際に盎った量がズレる ―― これが今回の䞻題です。

困りごず環境が壊れおいるかどうかを人間が毎週芋に行く䜓力がない

発端は2026-07-11のパフォヌマンス監査でした。スクリプトのヘッダコメントにそのたた残っおいたす。

背景: 2026-07-11パフォヌマンス監査で「退避したはずのagents 99䜓が泚入され続ける」等の
      環境劣化がナヌザヌ䜓感悪化の䞻因ず刀明。以埌は人間が面倒を芋ずに枈むよう垞蚭化。

agents-archive/に退避したはずのサブ゚ヌゞェント定矩が、実は再垰的にドットディレクトリたで読み蟌たれおいお99䜓分そのたた泚入され続けおいた ―― ずいう事故です。この手の劣化はrulesファむルの継ぎ足し、MEMORY.mdの肥倧、hookのスパム化など、毎週少しず぀静かに進行するので、気づいた時には手遅れになりがちです。かずいっお「週1で自分の蚭定ディレクトリを芋に行く」を人間の習慣に頌るず、たず続きたせん。

党䜓像蚈枬 → 自己修正 → 独立再蚈枬の3局ルヌプ

~/.claude/scripts/cc-self-audit.shが日曜8:30にlaunchdで起動し、この3段を1本のシェルスクリプトでやりたす。

  1. 静的蚈枬泚入バむト数・agents読蟌数を実ファむルから数える
  2. 動的蚈枬前回実行以降のtranscriptから、監査hookのスパム・䞍満ワヌド・tool倱敗を数える
  3. 閟倀を超えたらREDclaude -pが~/.claude内だけを自己修正し、修正埌に同じ蚈枬をもう䞀床独立に走らせお改善を怜蚌する

fail-open蚭蚈で、bash 3.2互換・set -uo pipefail。監査自䜓がコケおも既存の環境を壊さないようにしおありたす。

5指暙ず閟倀

指暙閟倀䞭身
inject_bytes40,000rules/*.md + CLAUDE.md(2箇所) + MEMORY.md の合蚈バむト数
agents_loaded60~/.claude/agents配例.mdの再垰カりントドットdir再発怜知
stopspam15/週監査hookの発火回数
frustration8/週䞍満ワヌドの出珟回数
toolerr400/週tool倱敗"is_error":true件数

静的2指暙は毎回フルスキャン、動的3指暙はself-audit/lastrun.markerより新しいtranscript最倧200ファむルだけを芋たす。蚈枬本䜓はこれです。

collect() {
  local inject_bytes agents_loaded
  inject_bytes=$(( \
    $(find "$HOME/.claude/rules" -name '*.md' -print0 2>/dev/null | xargs -0 cat 2>/dev/null | wc -c) + \
    $(cat "$HOME/.claude/CLAUDE.md" 2>/dev/null | wc -c) + \
    $(cat "$HOME/CLAUDE.md" 2>/dev/null | wc -c) + \
    $(cat "$HOME/.claude/projects/-Users-matsubara/memory/MEMORY.md" 2>/dev/null | wc -c) ))
  agents_loaded=$(find "$HOME/.claude/agents" -name '*.md' 2>/dev/null | wc -l | tr -d ' ')
  # ...動的3指暙(stopspam/frustration/toolerr)は前回実行以降のtranscriptから...
}

breaches()は玠朎にPython蟞曞ず比范するだけです。

th = {'inject_bytes': 40000, 'agents_loaded': 60,
      'stopspam': 15, 'frustration': 8, 'toolerr': 400}
for k, t in th.items():
    if m.get(k, 0) > t:
        print(f'{k}={m[k]} (閟倀{t})')

stopspam/frustrationの怜出は最初、玠朎なgrepでした。するず2026-07-12の実枬でstopspamが6→40、frustrationが4→18に跳ね䞊がっおしたいたした。原因はhookスクリプト自身の゜ヌス匕甚やtranscript内のtool_result本文の郚分䞀臎たで誀怜知しおいたこずです。今はStop hookが実際に泚入するStop hook feedback:\n[.../self_audit_stop.sh]:ずいう固定文字列の完党䞀臎ず、type=userか぀isMetaでない=人間の実発蚀だけに絞っおいたす。

自己修正claude -pに~/.claudeだけを觊らせる

REDになったら、怜知した違反ず盎近履歎を埋め蟌んだプロンプトでclaude -pを呌びたす。

OUT=$(cd "$HOME/.claude" && printf '%s' "$PROMPT" | run_capped "$FIX_TIMEOUT" "$CLAUDE" \
      --strict-mcp-config --mcp-config '{"mcpServers":{}}' -p \
      --model "$MODEL" --output-format text \
      --allowedTools "Read,Write,Edit,Bash,Grep,Glob" \
      --max-turns 50 2>&1) || true

プロンプト本文には既知の劣化パタヌンず察凊の正兞を曞いおありたす。

2. 既知の劣化パタヌンず正兞:
   - agents_loaded超過 → ~/.claude/agents/ 配䞋の退避挏れドットdirも読み蟌たれるを agents-archive/ ぞ移動
   - inject_bytes超過 → 肥倧したrules/MEMORY.mdを圧瞮フル版は rules-archive/ ぞ。リンクは党維持し玢匕敎合を怜蚌
   - stopspam超過 → self_audit_stop.sh の抑制ロゞックを点怜
   - frustration/toolerr超過 → 該圓transcriptをgrepしお真因を特定し再発防止を仕蟌む
4. 修正埌に必ず 'cc-self-audit.sh --collect-only' を実行し改善を数倀で確認
5. 自分で安党に盎せない項目は無理せず、最埌に『芁人間: 理由』ず1行で出力

--strict-mcp-configでMCPサヌバヌをれロにし、allowedToolsは読み曞き4皮Bashのみ。䜜業ディレクトリを~/.claudeに固定し、修正察象を自分のホヌムディレクトリの倖に出さない䜜りです。

怜蚌自己申告は信じない

肝はここです。claude -pが「盎した」ず蚀っおも、修正が終わった盎埌にスクリプト自身がもう䞀床collect()を独立に呌び盎したす。history.jsonlに残っおいる実䟋を3぀䞊べたす。

倱敗①自己申告ず実枬が逆方向にズレた2026-07-12

[2026-07-12 08:30:06] RED: stopspam=40 (閟倀15) / frustration=18 (閟倀8)
[2026-07-12 08:40:00] claude output: frustration=18→0誀怜知だったtool_result郚分䞀臎を排陀、実発蚀は0件、
                       stopspam=40→27重耇蚈枬バグ修正...次回集蚈窓で閟倀15以䞋に収束芋蟌み。
[2026-07-12 08:40:03] after: {"stopspam":58,"frustration":32,"toolerr":68}

claude -pは「frustration 18→0」「stopspam 40→27」ず申告したしたが、独立再蚈枬の結果はstopspam=58, frustration=32ず申告ず逆に悪化しおいたしたこの誀怜知自䜓が䞊のgrep問題そのもので、埌日修正されおいたす。もし自己申告だけを信じおDiscordに「✅盎りたした」ず流しおいたら、実態ず真逆の報告になるずころでした。

倱敗②盎した぀もりで数倀が1バむトも動かない2026-08-16

[2026-08-16 08:30:36] RED: inject_bytes=48958 (閟倀40000)
[2026-08-16 08:50:37] claude output: (空)
[2026-08-16 08:51:05] after: {"inject_bytes":48958, ...}

claude output欄が空のたた、before/afterでinject_bytesが完党に同䞀でした。䜕も倉えずに終わった空振りです。これも独立再蚈枬がなければ「実行はしたから倧䞈倫」で芋逃されおいたはずです。

成功盎った䞊で、盎り切らなかった分は正盎に「芁人間」2026-08-23

[2026-08-23 08:30:11] RED: inject_bytes=56321 (閟倀40000)
[2026-08-23 08:43:57] claude output: inject_bytes 56321→43487(23%枛、党リンク怜蚌OK、個別memoryファむル358件は無傷)。
                       芁人間: 残り3487超過分は「皌働䞭プロゞェクト」セクション(進行䞭の商談・金額・日皋を含む)が
                       䞻因で、機械的に安党刀断できないため本人による棚卞しが必芁。
[2026-08-23 08:44:27] after: {"inject_bytes":43487, ...}

changelogにはもう少し詳しく残っおいたす。

1) フルバックアップ: rules-archive/memory-md-full-2026-08-23.md に元MEMORY.md(44798 bytes)を保存
2) 「監査・環境の䞍倉条件」「技術リファレンス」の2セクション(解決枈み45件・13KB)をむンデックスから倖し
   アヌカむブぞの1行ポむンタに眮換
3) 皌働䞭プロゞェクト内の停止/完了確認枈み゚ントリ4件を削陀しアヌカむブ参照に眮換
4) 個別memoryファむル(358ä»¶)は䞀切削陀しおいない
結果: MEMORY.md 44798→31964 bytes、inject_bytes 56321→43487 bytes (23%削枛)
怜蚌: 党リンク255件がファむル実圚ず䞀臎(MISSING 0ä»¶)

この回は「消しおいい根拠がある分だけ機械的に削り、根拠のない分進行䞭の商談情報は閟倀割れのたた人間に投げる」ずいう刀断をclaude -p自身がしお、それを独立再蚈枬が裏付けた圢です。3件ずも同じスクリプトの同じ経路ですが、**「申告ず実枬が逆行」「申告だけ空振り」「申告ず実枬が䞀臎し正盎に残課題を報告」**の3パタヌンが実際に起きおいたす。これが「自己申告を信じない」を蚭蚈の䞭心に眮いおいる理由です。

報告緑は1行、赀は差分入りでDiscordぞ

if [ -z "$STILL" ]; then
  notify "🔧 CC自己監査: 劣化怜知→自己修正枈み。前:[$BREACH] 埌:党緑。詳现=$CHANGELOG"
else
  notify "🚚 CC自己監査: 自己修正埌も残存 [$STILL]。芁確認: $LOG / $CHANGELOG
Claude芁玄: $(echo "$OUT" | tail -3 | tr '\n' ' ')"
fi

緑違反なしの週は✅ CC自己監査: 正垞の1行だけをDiscordの#01_alertsに飛ばしたす。週1実行なので、これは「生存確認」も兌ねおいたす。赀のたた盎り切らなかった週2026-08-23はたさにこれは🚚付きで残存差分ずclaude -pの芁玄をそのたた転蚘し、揉み消さずに人間に枡したす。

launchd偎前回の教蚓をそのたた掻かす

com.lily.cc-self-audit.plistは日曜8:30起動です。

<key>EnvironmentVariables</key>
<dict>
    <key>PATH</key>
    <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:~/.local/bin</string>
</dict>
<key>ProgramArguments</key>
<array>
    <string>~/.claude/scripts/claude-quota-guard.py</string>
    <string>--job</string>
    <string>com.lily.cc-self-audit</string>
    <string>--</string>
    <string>/bin/bash</string>
    <string>~/.claude/scripts/cc-self-audit.sh</string>
</array>
<key>LowPriorityIO</key><true/>
<key>Nice</key><integer>10</integer>
<key>RunAtLoad</key><false/>

PATHを明瀺しおいるのは、前回の蚘事で曞いた「launchdの最小PATHでclaudeが芋぀からない」を螏たえた察策です。さらに実行本䜓を盎接bash cc-self-audit.shにせず、claude-quota-guard.py --job ... --でラップしおいたす。無人ゞョブがプラン枠を食い朰す事故は既に別の仕組みで孊んでいたので、週次監査もその枠管理を玠通りさせたせん。Nice 10ずLowPriorityIOで、フォアグラりンド䜜業を劚げない優先床に萜ずしおありたす。

螏んだ萜ずし穎

  • 玠朎なgrepでstopspam/frustrationが実䜓ず無関係に跳ねた6→40, 4→18 → hookが泚入する固定マヌカヌ文字列の完党䞀臎ず、type=userか぀isMetaでない発蚀のみに絞った
  • 自己申告(frustration 18→0)が独立再蚈枬(32)ず逆行した → 「盎した」をログに曞かせるだけでは䞍十分。修正埌に必ず同じcollect()をもう䞀床独立に走らせる蚭蚈にした
  • RED修正が空振りでbefore/afterが完党䞀臎した回があった → 空振りもSTILL刀定にそのたた乗るので、握り぀ぶさずDiscordに残る
  • agents_loadedはドットディレクトリも再垰的に読み蟌たれる → 単玔なfind *.mdではなく、退避先(agents-archive/)自䜓が~/.claude/agents配䞋に残っおいないかも合わせお芋る必芁がある
  • MEMORY.mdの「進行䞭の商談」は機械的に安党に削れる根拠がない → 閟倀割れのたた「芁人間」で止める刀断をプロンプト偎に明瀺しおいる

たずめ

  • 週次で蚈枬→赀なら自己修正→独立再蚈枬の3局ルヌプをlaunchd䞀本で回しおいる
  • 指暙はinject_bytes/agents_loaded/stopspam/frustration/toolerrの5぀、すべお数倀の閟倀超過で刀定
  • claude -pの自己申告はそのたたでは信じない。修正埌に同じ蚈枬をもう䞀床独立に走らせお初めお「盎った」ず扱う
  • 実際に「申告ず実枬が逆行」「申告だけ空振り」の䞡方が起きおおり、独立再蚈枬なしでは芋逃しおいた
  • 盎し切れない分進行䞭の商談情報などは閟倀割れのたた「芁人間」で正盎に止める蚭蚈にしおいる

次回は、MEMORY.mdの「進行䞭の商談・案件情報」を機械にどこたで刀断させおよいか ―― 自動化ず人間の刀断の線匕きに぀いお曞く予定です。


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

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

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