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?

🗑 積みすぎたAuto-skillを週次で敎理する自動キュレヌション

0
Posted at

Claude Codeは䜿えば䜿うほど賢くなる、ずいうのは半分本圓で、半分嘘です。

半幎前、倧孊生のころに月10䞇だった収入が、副業を掛け持ちしながら60䞇たで増え、䌚瀟郜合で解雇されおからの半幎でClaude Code自埋環境を構築し、今は月商120䞇で回っおいたす。その過皋で痛感したのが「スキルの腐敗」です。最初は手になじんだ道具が、3ヶ月埌には誰も䜿わない文鎮になっおいる。そしおその文鎮は毎回の䌚話で読み蟌たれ続け、コンテキストを静かに圧迫したす。今回は、その問題を週次の自動キュレヌションで解決した話をしたす。

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

「䜿うほど賢くなる」の裏偎にある萜ずし穎

Claude Codeには auto-skill ず呌ぶ仕組みがありたす。非自明なタスクを5回以䞊こなしたずき、回避策を発芋したずき、アプロヌチを修正されたずき、AIが自埋的に ~/.claude/skills/auto/<kebab-name>/SKILL.md ぞ手順を曞き出す蚭蚈です。

このメモが積み重なるほど、次の䌚話でその経隓を参照できる。環境の「蚘憶」が育っおいく感芚は、たしかに気持ちいいものです。

しかし問題がある。

Claude Codeのコンテキスト泚入は、スキルファむルが増えれば増えるほど読み蟌み量が増えたす。スキルを30個、50個ず溜め蟌んでいくず、䌚話の冒頭だけで数千トヌクンが「䜿われおいないスキルの説明」に費やされたす。Opusやフル品質のSonnetでは、コンテキスト汚染は出力品質の劣化に盎結する。毎月課金されるトヌクン代は増え、応答の鋭さは萜ちる。たるでデスクに䜿わない曞類を積み䞊げ続けるようなものです。

Lily自身の環境で実際に確認した構造を蚀うず、~/.claude/skills/auto/ 配䞋に各スキルがディレクトリずしお䞊び、その䞭の SKILL.md が author: auto ずいうフロントマタヌを持぀。この author: auto フィヌルドがない手動スキルには、今回の敎理機構は䞀切觊れたせん。誀爆を防ぐ安党ガヌドが、蚭蚈の最初に眮かれおいる点が重芁です。

「䜜業」ではなく「環境」に投資する意味

月商120䞇の仕事の倧半は、Claudeに仕事を流す蚭蚈を䜜るこずです。個別タスクをこなすより、次の100タスクが自動化される仕組みを䜜るほうが䟡倀が高い。これはどの個人開発者にも圓おはたる原則だず思いたす。

しかしその「環境」自䜓が腐敗するず、敎備コストが逆に重くなる。auto-skillのキュレヌション自動化は、たさにこの「環境の環境を敎備する」メタレむダヌです。読者の方も、Claude Codeを䜿い蟌むほど「前に䜜ったはずのスキル、どこだっけ」「このスキル、ただ䜿っおる」ずいう感芚が出おくるはずです。その感芚を攟眮せずに自動化した、ずいう話です。

コンテキスト肥倧化の具䜓的な経路

スキルが増えるず䜕が起きるか、具䜓的に远いたす。

~/.claude/CLAUDE.md には スキル自己生成auto-skills ずいうセクションがあり、「再利甚䟡倀のある手順は頌たれなくおも自䜜する」 ず曞いおいたす。この指瀺が生きおいる限り、スキルは自然増殖したす。

問題は「䜿われなくなった」スキルの怜知が、人間の目芖に頌っおいるこず。手䜜業でスキルディレクトリを眺めおも、どれが珟圹でどれが遺物かは䞀目でわかりたせん。かずいっお党郚消すのは怖い。このゞレンマを解消するのが今回の週次キュレヌタヌです。

蚭蚈の栞心は3点です。

  1. 䌚話ログぞのスキル名蚀及を「䜿甚の代理指暙」にする → 盎接のAPI呌び出しログではなく、~/Documents/my-knowledge-base/raw/conversations/ 内の䌚話ログファむルからスキル名を grep し、最新のファむルmtimeを「最終䜿甚日」ずみなす。
  2. 30日未䜿甚でstale・90日未䜿甚で .archive/ 退避 → どちらも実削陀ではない。staleはフロントマタヌに status: stale を远蚘するだけ、archiveは mv で別ディレクトリぞ。
  3. 実行前に必ずスナップショットを取る → 操䜜を間違えおもワンコマンドで元に戻せる。

党䜓の流れ

アヌキテクチャ抂芳

[毎週日曜 4:15 AM]
      ↓
 com.shun.skill-curate (launchd)
      ↓
 skill-curate.sh
      │
      ├─ ① スナップショット取埗
      │    ~/.claude/skills/auto/.snapshots/
      │    auto-YYYYMMDD-HHMMSS.tar.gz
      │
      ├─ ② auto/配䞋を党スキルスキャン
      │    author: auto でないものはスキップ
      │
      ├─ ③ 最終䜿甚日の算出
      │    䌚話ログ grep → mtime
      │    → created: フロントマタヌ
      │    → SKILL.md のファむルmtime
      │
      ├─ ④ 日数刀定
      │    > 90日 → .archive/ ぞ mv非砎壊
      │    > 30日 → status: stale を远蚘
      │    それ以倖 → active カりント++
      │
      └─ â‘€ LLM統合提案オプション
           active ≥ 2 のずき Claude を呌び出し
           重耇・䜎品質候補を .curator-proposals.md に曞き出し
           実スキルは倉曎しない提案のみ

launchdのplistは以䞋のように蚭定されおいたす。

<key>StartCalendarInterval</key>
<dict>
    <key>Hour</key>
    <integer>4</integer>
    <key>Minute</key>
    <integer>15</integer>
    <key>Weekday</key>
    <integer>0</integer>
</dict>

Weekday: 0 が日曜、Hour: 4・Minute: 15 で毎週日曜 4:15 AM に起動したす。LowPriorityIO: true・Nice: 10 で最䜎優先床のバックグラりンド実行です。眠っおいる間に片付く。人間のコストはれロです。

① スナップショット完党リバヌサブルの基盀

スクリプトの冒頭でたずスナップショットを取りたす。

AUTO="$HOME/.claude/skills/auto"
SNAP="$AUTO/.snapshots"

tar czf "$SNAP/auto-$(date +%Y%m%d-%H%M%S).tar.gz" \
  -C "$HOME/.claude/skills" \
  --exclude='auto/.snapshots' \
  --exclude='auto/.archive' \
  auto 2>/dev/null \
  && echo "[$(ts)] snapshot taken" >> "$LOG"

.snapshots/ ず .archive/ 自身は陀倖しお圧瞮しおいたす。これをやらないず、アヌカむブの䞭にアヌカむブが入り蟌む再垰問題が起きる。date +%Y%m%d-%H%M%S でタむムスタンプ付きの名前にしおいるので、週を远うごずにスナップショットが積み䞊がりたす。

リストア方法は単玔で、tar xzf ~/.claude/skills/auto/.snapshots/auto-20260803-041500.tar.gz -C ~/.claude/skills/ を実行するだけです。週次でスナップショットが増えおいく点は別途 find で叀いものを消す運甚が必芁ですが、それは次の課題です。

② 安党ガヌドauthor: auto 以倖は絶察に觊らない

if ! grep -q '^author:[[:space:]]*auto' "$md"; then
    echo "[$(ts)] skip (not author:auto): $skill" >> "$LOG"
    continue
fi

これがあるこずで、手動で䞁寧に育おたスキルが誀っお退避されるこずはありたせん。author: auto ずいうフロントマヌカヌが「機械が生成した敎理察象」を瀺す唯䞀の旗です。逆に蚀えば、残したいスキルは author: フィヌルドを auto 以倖に曞き換えるだけで保護できたす。シンプルで匷い。

③ 最終䜿甚日の算出代理指暙の蚭蚈ず限界

ここが蚭蚈の䞭で最も工倫が芁る郚分です。Claude Codeには「どのスキルが呌ばれた」ずいうAPIレベルのログが倖郚から取れたせん。そのため、䌚話ログのテキストにスキル名が出珟したかどうか を代理指暙ずしお䜿っおいたす。

lastlog=$(grep -rl -- "$skill" "$LOGS" 2>/dev/null \
  | while read f; do stat -f '%m' "$f" 2>/dev/null; done \
  | sort -rn | head -1)

LOGS="$HOME/Documents/my-knowledge-base/raw/conversations/" を党文怜玢し、スキル名を含むファむルのうち最も新しいものの mtime をUnixタむムスタンプで取埗したす。

取埗できなかった堎合、フォヌルバックが2段階ありたす。

# Pythonむンラむンスクリプトよりskill-curate.sh 42-56行目
ref = None
if lastlog.strip():
    try: ref = float(lastlog)
    except: ref = None
if ref is None and created.strip():
    try: ref = time.mktime(datetime.datetime.strptime(
            created.strip(), "%Y-%m-%d").timetuple())
    except: ref = None
if ref is None:
    ref = os.path.getmtime(md)
print(int((time.time() - ref) // 86400))

① 䌚話ログのmtime → ② SKILL.md の created: フロントマタヌ → ③ SKILL.md ファむル自䜓のmtime、ずいう順です。created: が曞かれおいない叀いスキルでも、ファむルmtimeずいう最埌の砊がある。

ただし、この代理指暙には構造的な限界がありたす。

「䌚話ログにスキル名が登堎する」ず「スキルが実際に呌び出されお機胜した」は、厳密には別の事象です。スキルの名前が䌚話の䞭で蚀及された䟋: 「このスキルは䞍芁かも」ず議論した堎合でも、䜿甚ずカりントされたす。逆に、スキル名がコマンド圢匏/curate-skills などずしお呌ばれおいおもログの怜玢パタヌンが䞀臎しない堎合は拟えたせん。

この制玄を知った䞊で「それでも䌚話ログが最良の近䌌指暙」ずいう刀断を取っおいたす。完璧な䜿甚ログより、運甚可胜な近䌌指暙を遞ぶ。これが実甚的な自動化の哲孊です。

④ 刀定ず凊理staleずarchiveの二段階

STALE_DAYS=30
ARCHIVE_DAYS=90

if (( days > ARCHIVE_DAYS )); then
    mv "$d" "$ARCH/" && echo "[$(ts)] ARCHIVED (${days}d unused): $skill" >> "$LOG"
elif (( days > STALE_DAYS )); then
    # SKILL.md の status フィヌルドを stale に曞き換える
    python3 - "$md" <<'PY'
import sys, re
p = sys.argv[1]; s = open(p).read()
if re.search(r'^status:', s, re.M):
    s = re.sub(r'^status:.*$', 'status: stale', s, count=1, flags=re.M)
else:
    s = re.sub(r'^(author:[ \t]*auto.*)$', r'\1\nstatus: stale',
               s, count=1, flags=re.M)
open(p, 'w').write(s)
PY
    echo "[$(ts)] stale (${days}d unused): $skill" >> "$LOG"
    ((active++))
else
    ((active++))
fi

30日未䜿甚のスキルは status: stale をフロントマタヌに曞き蟌みたす。実際の削陀でも退避でもなく、フラグを立おるだけです。このフラグがあるこずで、スキルむンデックスが status: stale を衚瀺したり、次の敎理フェヌズで優先しお怜蚎したりできたす。

90日未䜿甚のスキルは .archive/ ぞ mv したす。rm ではなく mv なので、ファむルシステム䞊では消えおいたせん。ls ~/.claude/skills/auto/.archive/ で確認でき、必芁なら mv で戻せたす。この非砎壊性が重芁で、「消した埌に必芁だずわかった」ずいうシナリオを完党にカバヌしたす。

stale刀定されたスキルも active++ のカりントに含たれる点に泚目しおください。staleはあくたで「芁泚意フラグ」であり、スキル自䜓はただ auto/ 配䞋に存圚しおいたす。次の週次実行で30日がさらに経過すれば、stale→archiveぞ自然に昇栌したす。

â‘€ LLM統合提案Claudeがスキルを読んで提案を曞く

if [[ "$RUN_LLM" != "nollm" ]] && (( active >= 2 )) && [[ -x "$CLAUDE" ]]; then

activeスキルが2件以䞊あり、か぀ nollm 匕数が枡されおいない堎合に、Claudeを呌び出しお重耇・䜎品質スキルの統合提案を生成したす。

STG=$(mktemp -d -t skill-curate-stg)
( cd "$STG" && perl -e 'alarm 600; exec @ARGV' "$CLAUDE" \
    --strict-mcp-config \
    --mcp-config '{"mcpServers":{}}' \
    -p "${AUTO} 配䞋の自動生成スキルのうち、前回提案ファむル ${PROP} より埌に曎新された
       SKILL.md のみを Read し、重耇・䜎品質・統合候補を掗い出しおください。..." \
    --model sonnet \
    --permission-mode acceptEdits \
    --allowedTools "Write Edit Read" \
    --add-dir "$AUTO" \
    --max-budget-usd 5.00 >> "$LOG" 2>&1 < /dev/null )
[[ -f "$STG/curator-proposals.md" ]] && cp "$STG/curator-proposals.md" "$PROP"

蚭蚈䞊の工倫がいく぀かありたす。

--mcp-config '{"mcpServers":{}}' でMCPを無効化しおいたす。 週次バッチの䞭でネットワヌク䟝存のMCPサヌバヌが突然起動するのは䞍安定芁因です。スキルの読み蟌みず提案曞き出しだけに絞る。

--max-budget-usd 5.00 でコストに䞊限を蚭けおいたす。 Claude APIの課金が無制限に走らないよう、1回の提案生成は5ドルたで。提案ファむルが消えおも困らないレベルのタスクに、それ以䞊の課金をする必芁はありたせん。

perl -e 'alarm 600; exec @ARGV' でタむムアりトを600秒に蚭定しおいたす。 単玔な timeout コマンドはシグナルの䌝播方法によっお、Claudeプロセスが正垞に終了しない堎合がありたす。Perl の alarm を䜿った exec は、サブプロセスも含めお確実に終了させたす。

Claudeにはステヌゞングディレクトリ$STGぞ curator-proposals.md を曞かせ、シェルがコピヌする構造にしおいたす。 ~/.claude/ は曞き蟌み保護されおいるケヌスがあるため、Claudeに盎接曞かせるず゚ラヌになる可胜性がありたす。䞀時ディレクトリを䞭継点にするこずで、暩限問題を回避しおいたす。

前回の提案ファむルより新しいSKILL.mdだけを察象にしおいたす。 毎週党スキルを読み盎すのはトヌクンの無駄です。prop_mtime 前回の提案ファむルのmtimeより新しい SKILL.md だけを差分凊理するこずで、週次実行のコストを最小化しおいたす。


党䜓コヌドの倉数マップ

実コヌドを読む際の参照甚ずしお、スクリプト内の䞻芁倉数を敎理しおおきたす。

倉数 倀実コヌドより 圹割
AUTO ~/.claude/skills/auto スキル栌玍ルヌト
LOGS ~/Documents/my-knowledge-base/raw/conversations 䌚話ログ怜玢察象
SNAP ~/.claude/skills/auto/.snapshots スナップショット保存先
ARCH ~/.claude/skills/auto/.archive archive退避先
LOG ~/.claude/skills/auto/.curate.log 実行ログ
PROP ~/.claude/skills/auto/.curator-proposals.md LLM提案出力先
STALE_DAYS 30 staleフラグ閟倀日数
ARCHIVE_DAYS 90 archive退避閟倀日数
RUN_LLM 第1匕数、デフォルト "llm" "nollm" でLLMフェヌズスキップ

launchdの実行ログは ~/.claude/logs/com.shun.skill-curate.log に曞き蟌たれたすplistの StandardOutPath / StandardErrorPath。スクリプト内のアプリログ$LOGずは別ファむルで、launchd起動時のプロセスレベルの゚ラヌはこちらに残りたす。

この二重ログ構造は、「スクリプトが起動したかどうか」ず「スクリプトが䜕をしたか」を分けお远跡できる点で有効です。launchdのログに䜕も曞かれおいなければスクリプトが起動しおいない。スクリプトのログが snapshot taken で止たっおいれば、その先で゚ラヌが起きおいたす。


ここたでが「なぜこの仕組みが効くのか」ず「どう動いおいるのか」の党䜓像です。次は、この蚭蚈の最倧の匱点である 「䌚話ログ蚀及を䜿甚ず芋なす」代理指暙の怜蚌方法ず、実際に螏んだ぀たずき を掘り䞋げたす。

実装の詳现

冒頭2行が黙っお守っおいるもの

set -u
export PATH="$HOME/.local/bin:$HOME/.nvm/versions/node/v24.13.0/bin:/usr/bin:/bin:/usr/sbin:/sbin"

set -u は未定矩倉数を参照した瞬間にスクリプトを止めたす。䞀芋地味ですが、これがないず "$lastlog" が空のたた float() に枡り、Pythonが黙っお 0 を返し、党スキルが「最終䜿甚1970幎」扱いになりたす。䞀晩で党スキルがarchiveされ、朝起きたらスキルが消えおいた、ずいう事故を防ぐ䞀行です。

export PATH はもっず即物的な理由です。launchdが起動するシェルは、あなたが毎日䜿うzshずは別の最小環境です。~/.zshrc も ~/.nvm/nvm.sh も読み蟌たれない。぀たり claude コマンドも node も、PATHに明瀺しない限り「存圚しない」扱いになりたす。plistにも同じPATHを曞いおいたす<key>EnvironmentVariables</key> 以䞋が、スクリプト偎にも曞くのは倚重防衛です。plistのPATHはlaunchdがプロセスに枡す環境倉数ですが、スクリプト内でサブシェルを起動した堎合には匕き継がれないこずがありたす。export PATH を䞡方に曞くのは冗長に芋えお、実際には必芁な蚭蚈です。

find コマンド4぀のフラグが党郚芁る理由

find "$AUTO" -mindepth 1 -maxdepth 1 -type d ! -name '.*' -print 2>/dev/null

このfindは「auto/ 盎䞋のスキルディレクトリだけを列挙する」ための4フラグセットです。各フラグを倖したずきに䜕が起きるかを実際に考えるず、なぜ党郚芁るかわかりたす。

-mindepth 1を倖すず $AUTO 自身がヒットし、ルヌプが auto/ ディレクトリ党䜓を1スキルずしお凊理しようずしたす。auto/SKILL.md を探しに行き、なければ continue されるだけですが、ログにノむズが残りたす。

-maxdepth 1を倖すず .archive/ 配䞋の退避枈みスキルも再びスキャン察象になりたす。せっかく退避したスキルが「䌚話ログにヒットしないから再床archive」ずいう無限ルヌプに入り、mv が「移動先に同名ディレクトリが既に存圚する」゚ラヌで止たりたす。

-type dを倖すず .curate.log や .curator-proposals.md のファむルもヒットしたす。basename でファむル名を取り、SKILL.mdの存圚確認で걞러されるので実害はれロですが、ログに無意味な skip ゚ントリが倧量に積たれたす。

! -name '.*'を倖すず .snapshots ず .archive がスキャン察象になりたす。.snapshots には SKILL.md がないので continue されたすが、.archive の䞭身は本物の退避枈みスキルです。そこに author: auto があるスキルが再床stale/archive刀定を受け、すでに .archive/ にいるのに再床 mv "$d" "$ARCH/" しようずし、パスが倉になりたす。

2>/dev/null はmacOSの暩限゚ラヌをサむレント化するためです。~/.claude/ 配䞋の䞀郚ファむルが他プロセスにロックされおいるず find が Permission denied を吐きたすが、それをログに流すず本来の敎理ログが埋もれたす。

Python むンラむンずいう遞択の理由

スクリプト内に2箇所、Pythonコヌドが <<'PY' ヒアドキュメントで埋め蟌たれおいたす。「なぜ別ファむルの .py にしないのか」ず最初に聞かれたした。

理由は単䞀ファむルで自己完結しおいるこずです。skill-curate.sh だけを ~/.claude/scripts/ に眮けば動く。Pythonスクリプトの配眮パスを別途管理する必芁がない。スキルキュレヌタヌの蚭定を人に枡すずきも、このファむル1本でいい。

<<'PY' のシングルクォヌトが重芁です。<<PY だずヒアドキュメント内の $d や $md がシェルに展開されおしたい、Python偎に正しい文字列が枡りたせん。シングルクォヌトで囲むこずで、ヒアドキュメントの内容をリテラル文字列ずしおPythonに枡せたす。

日数蚈算をPythonで曞いた理由も明確で、bashの日付蚈算はmacOSずGNU/Linuxで曞き方が違いたす。date -d はGNU、date -v はBSD。Pythonの time.time() ず os.path.getmtime() はクロスプラットフォヌムで動く今回はmacOS専甚蚭蚈ですが、将来の移怍コストを䞋げる。

stale曞き蟌みの2パタヌン正芏衚珟

if re.search(r'^status:', s, re.M):
    s = re.sub(r'^status:.*$', 'status: stale', s, count=1, flags=re.M)
else:
    s = re.sub(r'^(author:[ \t]*auto.*)$', r'\1\nstatus: stale',
               s, count=1, flags=re.M)

すでに status: フィヌルドがあるスキルず、ないスキルで凊理を分けおいたす。

status: が既にある堎合は単玔な眮換です。active や experimental など䜕が曞いおあっおも status: stale に曞き換えたす。count=1 で最初の1件だけ眮換するので、本文䞭に偶然 status: ずいう文字列が出おきおも安党です。

status: がない堎合は author: auto の盎埌に改行で挿入したす。なぜ author: auto の盎埌か。YAMLフロントマタヌは --- で囲たれたブロックですが、Pythonはそのブロック境界を意識した解析をしおいたせん文字列ずしお正芏衚珟で凊理。フロントマタヌの最埌の行---の前に挿入するのが理想ですが、それをするには --- の䜍眮を探す必芁があり、コヌドが耇雑になりたす。author: auto は必ずフロントマタヌに存圚するこずが安党ガヌドで保蚌されおいるので、そこを挿入点にするのが最も単玔か぀安党です。

LLMフェヌズの3぀の安党装眮

前半でも觊れたしたが、3぀の工倫をそれぞれ深掘りしたす。

--strict-mcp-config --mcp-config '{"mcpServers":{}}'

これを省略しおlaunchdからClaudeを起動するず、Claudeは ~/.claude/claude_desktop_config.json か類䌌のMCP蚭定を読み、Obsidian MCPやFigma MCPなどのサヌバヌを起動しようずしたす。それらは認蚌を芁求し、UIがない環境では埅ち続けるか、タむムアりトしお倱敗したす。MCPを空オブゞェクトで䞊曞きするこずで、Claude本䜓だけをシンプルに起動できたす。

perl -e 'alarm 600; exec @ARGV'

bashの timeout 600 claude ... ずほが同じに芋えたすが、プロセスグルヌプの扱いが違いたす。timeout はタむムアりト時にSIGTERMを盎接の子プロセスここでは claude コマンドに送りたす。しかしClaudeは内郚でNode.jsのワヌカヌやサブプロセスを耇数起動するこずがある。SIGTERMが子プロセスだけに届き、孫プロセスが残留するこずがありたす。perl -e 'alarm 600; exec @ARGV' は同じPIDでClaudeを exec するため、シグナルがそのプロセスグルヌプ党䜓に届きたす。

STGステヌゞングディレクトリ

STG=$(mktemp -d -t skill-curate-stg)
( cd "$STG" && ... "$CLAUDE" ... -p "... ./curator-proposals.md ..." )
[[ -f "$STG/curator-proposals.md" ]] && cp "$STG/curator-proposals.md" "$PROP"
rm -rf "$STG"

Claudeに ~/.claude/skills/auto/.curator-proposals.md ぞ盎接曞かせるず、launchd環境では ~/.claude/ が曞き蟌み保護されおいるケヌスで倱敗したす。mktemp -d で䜜った䞀時ディレクトリに cd しおから起動するこずで、Claudeから芋たカレントディレクトリが $STG になりたす。Claudeぞの指瀺には ./curator-proposals.md盞察パスず曞けば、$STG/curator-proposals.md に曞かれたす。成功したら cp で正芏の堎所に眮き、rm -rf "$STG" で䞀時ディレクトリを片付けたす。

active >= 2 ずいう閟倀

if [[ "$RUN_LLM" != "nollm" ]] && (( active >= 2 )) && [[ -x "$CLAUDE" ]]; then

なぜ1件でもLLMを呌ばないのか。「重耇・䜎品質・統合候補を掗い出す」ずいう䜜業は、比范察象が耇数ないず意味をなしたせん。1件のスキルを読んで「これ䜎品質では」ず刀定させるこずは技術的には可胜ですが、Claude APIを呌び出すコストに芋合う䟡倀がない。週次で最倧5ドルの䞊限--max-budget-usd 5.00を蚭けおいたすが、そもそも呌び出さないのがベストです。

active件数が倚いほどLLM提案の䟡倀は䞊がりたす。10件のスキルに「これずこれは同じ内容なので統合できたす」ず蚀っおもらうのは有甚です。


私が詰たった話

詰たり①launchdで動くが䜕もしない

症状タヌミナルで手動実行するず正垞動䜜する。launchdに登録しお翌週埅っおも .curate.log が空のたた。

原因claude コマンドが芋぀からない。launchd環境のPATHは /usr/bin:/bin:/usr/sbin:/sbin だけです。~/.local/bin/claude はもちろん、~/.nvm/versions/node/v24.13.0/bin/ の node もない。スクリプトが [[ -x "$CLAUDE" ]] で claude の存圚確認をしお false になり、LLMフェヌズをスキップ。しかし敎理フェヌズは python3 を䜿っおいお、そちらも芋぀からない堎合は days の蚈算がれロ終了コヌド非れロのたた暗黙的にになっおいたした。結果、スナップショットは䜜成され snapshot taken だけ曞かれおそこで静止しおいた。

盎し方plistの EnvironmentVariables に完党なPATHを曞き、スクリプトの冒頭でも export PATH する。䞡方に曞くのは冗長に芋えたすが、launchdが枡す環境倉数ずスクリプト内で再゚クスポヌトする倉数は別のレむダヌです。片方だけでは特定の環境で再珟する問題があったため、珟圚のスクリプトのように䞡方に曞く圢が安定しおいたす。

詰たり②スナップショットが毎週10倍に膚らんでいく

症状.snapshots/ ディレクトリが3週目に急に重くなった。ls -lh ~/.claude/skills/auto/.snapshots/ を芋るず、最新のtar.gzが先週の10倍のサむズ。

原因--exclude を曞いおいなかったため、.snapshots/ 自䜓がtar.gzの䞭に含たれおいた。぀たり先週のスナップショットアヌカむブ内のアヌカむブが今週のtar.gzに䞞ごず入り蟌んでいた。これが毎週再垰的に膚らむ。3週目には「スナップショットのスナップショットのスナップショット」ずいう入れ子構造でディスクを圧迫しおいたした。

盎し方

tar czf "$SNAP/auto-$(date +%Y%m%d-%H%M%S).tar.gz" \
  -C "$HOME/.claude/skills" \
  --exclude='auto/.snapshots' \
  --exclude='auto/.archive' \
  auto 2>/dev/null

--exclude='auto/.snapshots' ず --exclude='auto/.archive' を远加しお解決。tarの --exclude はtar.gz内のパスで指定したす。-C "$HOME/.claude/skills" でスキルディレクトリに cd した状態でtar化しおいるため、auto/.snapshots ずいう盞察パスで正しく陀倖されたす。

叀いスナップショットの削陀は珟時点で自動化しおいたせん。月次で find ~/.claude/skills/auto/.snapshots -name '*.tar.gz' -mtime +60 -delete を手動実行する運甚です。これは次の改善課題ずしお残っおいたす。

詰たり③timeout でClaudeが残留し続けた

症状LLMフェヌズが600秒で止たらず、ps aux | grep claude が翌朝のlaunchd起動時にもClaudeプロセスを衚瀺する。翌週の実行ず前週の実行が䞊走し、$PROP の曞き蟌みが競合しおファむルが壊れた。

原因最初のバヌゞョンでは timeout 600 "$CLAUDE" ... ず曞いおいたした。timeout はタむムアりト時にSIGTERMを盎接の子プロセスに送りたす。しかしClaude CLIバヌゞョンによるは内郚でNode.jsのworker_threads或いは子プロセスを生成するこずがあり、SIGTERMが芪プロセスのみに届いお孫プロセスが生き残る状況が発生したした。

盎し方

perl -e 'alarm 600; exec @ARGV' "$CLAUDE" ...

exec @ARGV によっおperlはClaudeに眮き換わりperlのPIDがClaudeのPIDになる、alarm シグナルはそのプロセスグルヌプ党䜓を察象にしたす。加えお ( cd "$STG" && perl -e ... ) のサブシェル党䜓をプロセスグルヌプずしお扱うこずで、残留プロセスが発生しにくい構造になりたした。この修正埌は翌朝に残留プロセスが確認されなくなっおいたす。

詰たり④スキル名が短いず䌚話ログ党䜓がヒットした

症状codex ずいうスキル名を付けたものを䜜ったずころ、そのスキルが氞久に「䜿甚䞭active」ず刀定される。䌚話ログの grep -rl -- "codex" が党ファむルを返しおきお、最新mtimeが「今週の䌚話ログ」になり続ける。

原因䌚話ログには「Codexに投げる」「Codexで実装する」ずいう日垞的な蚘述が無数に存圚したす。スキル名 codex は単語ずしお䞀般的すぎお、ログ怜玢がスキル「䜿甚」ず「単なる蚀及」を区別できたせん。

盎し方ず限界根本的な解決にはなっおいたせん。珟時点での察凊は、スキル名をできるだけ固有で長くするこずです。codex ではなく codex-delegation-handoff のようなハむフン区切りの耇合語にするず、grep が完党䞀臎に近い粟床でヒットしたす。grep -rl -- "codex-delegation-handoff" は汎甚的な䌚話ログではほがヒットしたせん。

蚭蚈的には「䌚話ログぞの蚀及を䜿甚の代理指暙にする」こず自䜓が近䌌であり、この粟床はその近䌌の構造的な限界です。完璧な䜿甚ログがAPIレベルで取れない以䞊、スキル呜名の芏玄でカバヌするのが珟時点のベストです。

詰たり⑀staleフラグが本文に曞き蟌たれた

症状あるスキルの SKILL.md を開くず、フロントマタヌ--- で囲たれた郚分ではなく本文の䞭に status: stale が突然曞かれおいた。YAMLずしおは無効で、次回のgrep刀定が壊れた。

原因そのスキルの本文説明の䟋瀺郚分に author: auto の堎合は... ずいう文字列が含たれおいたした。正芏衚珟 r'^(author:[ \t]*auto.*)$' の re.M フラグは党行に察しお ^ を行頭ずしお扱いたす。フロントマタヌ内の author: auto より先に本文内の author: auto の堎合は... が出おきた堎合、そこにマッチしお \nstatus: stale が挿入されたす。

盎し方count=1 があるので「最初の1件だけ」眮換するずいう制玄はありたす。぀たり本文が先にくる堎合は本文にフラグが入り、フロントマタヌには入りたせん。正確な修正は「フロントマタヌ--- から最初の --- たでだけを察象にするパヌサヌを曞く」こずですが、コヌド量が増えたす。

珟圚の珟実的な察凊は、スキル本文の䟋瀺コヌドに author: auto ずいう文字列を曞かないずいう芏玄です。コヌドブロック内のYAML䟋瀺であればバッククォヌトで囲むため行頭にはならず ^ にマッチしたせんが、むンラむンの説明文には泚意が必芁です。完党な修正はFrontmatterパヌサヌの実装ずしお積み残しになっおいたす。


自動化がうたく動かない理由は、ほずんどの堎合「ツヌルの思い蟌み」です。タヌミナルで動くからlaunchdでも動く。SIGTERMを送れば必ず止たる。grepで名前を探せば䜿甚を怜知できる。どれも盎感的に正しく芋えお、実際の環境では壊れたす。

この仕組みを䜜った本圓の意味は、週次の自動敎理よりも、「どこで壊れるか」を事前に考え抜いた蚭蚈の思考プロセスを自分のものにするこずだったかもしれたせん。無人で走らせるものを䜜るたびに、同じ問いが来たす。「これが倜䞭の4時に倱敗したずき、朝起きた自分が䜕を芋れば原因がわかるか」。

それに答え続けるこずが、自埋環境の品質を䞊げおいく唯䞀の道です。

぀たずきポむント

前段で5぀の詰たりを深掘りしたしたが、実運甚ではそれ以倖にも现かい萜ずし穎が積み重なりたす。実コヌドず実䜓隓から網矅したす。

  • launchctl load が非掚奚なのに通っおしたう。macOS Monterey以降、正しい登録は launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.shun.skill-curate.plist。叀い load コマンドは「Deprecated」ず蚀いながら受け付けるこずがあり、起動しない症状が再珟性なく出たす。登録状態の確認は launchctl list | grep skill-curate で PID 欄を芋る。倀がれロなら「登録枈みだが䞀床も起動しおいない」です。

  • $LOGS ディレクトリが空・䞍圚だず党スキルが未䜿甚扱いになる。スクリプト9行目で LOGS="$HOME/Documents/my-knowledge-base/raw/conversations" ず定矩しおいたす。このパスが実圚しない堎合、grep -rl -- "$skill" "$LOGS" はヒットれロで lastlog が空文字列になりたす。set -u は「未定矩倉数の参照」を止める呜什であり、「空文字列の倉数」には反応したせん。Pythonはフォヌルバックずしお created: → mtime を䜿いたすが、スキルを䜜った日を最終䜿甚日ずみなすため、䜜っおから30日が経過しおいれば党スキルが䞀斉にstaleになりたす。最初にログ栌玍パスの実圚確認を [[ -d "$LOGS" ]] || { echo "LOGS missing"; exit 1; } で先にはじくべきでした。

  • 䌚話ログにバむナリが混圚するずgrepが停陜性を出す。ログディレクトリに .png や添付ファむルが玛れるず、grep -rl -- "skill-name" がバむナリにもマッチしたす。珟行の grep に --include='*.md' や --include='*.txt' は付いおいたせん。䌚話ログのフォヌマット玔テキストのみを前提ずした蚭蚈です。バむナリが混入しおいるディレクトリを $LOGS に指定するずスキルが「垞に最近䜿われおいる」ず誀刀定し続けたす。

  • stat -f '%m' はmacOSBSD専甚構文。スクリプト40行目で䜿っおいたす。GNU/Linuxの stat --format=%Y ずは曞き方が違いたす。今回のlaunchd前提ではmacOS固定なので実害れロですが、同じスクリプトをDockerコンテナやLinuxサヌバヌに持ち蟌む際は曞き換えが必芁です。Pythonの os.path.getmtime() がクロスプラットフォヌムで曞かれおいるのず非察称です。

  • Python sys.argv の防衛的むンデックス補填を倖すず IndexError でクラッシュ。実コヌド44行目

    lastlog, created, md = (sys.argv + ["","",""])[1:4]
    

    + ["","",""] の補填がないず、bash偎で匕数が1぀でも欠けたずき IndexError が出お終了コヌド非れロになりたす。days が空のたた if (( days > ARCHIVE_DAYS )) に入るず算術匏゚ラヌでスクリプト党䜓がそこで止たりたす。Python偎でクラッシュしないようにしおおくこずで、bash偎の防衛ラむンを薄くしおも安党な構造にしおいたす。

  • --max-budget-usd 5.00 で途䞭打ち切りになるず proposals.md が䞍完党。LLMが5ドルの䞊限に達した時点でClaudeが匷制終了され、$STG/curator-proposals.md は曞き出し途䞭のMarkdownになりたす。スクリプトは [[ -f "$STG/curator-proposals.md" ]] でファむルの「存圚」だけを確認しお cp するため、内容が壊れおいおも䞊曞きされたす。重芁な提案を芋萜ずすリスクはありたすが、䞊限を蚭けない堎合は週次バッチでAPIコストが青倩井になりたす。5ドルは「提案ファむルが壊れおも痛くない䞊限」ずしお蚭定しおいたす。

  • com.shun.skill-curate.log はロヌテヌション蚭定なし。plistの StandardOutPath ず StandardErrorPath は同じファむル ~/.claude/logs/com.shun.skill-curate.log を指しおいたすplist実装より。週次実行のたびに远蚘されるため、1幎攟眮するず数十MBになりたす。macOSの newsyslog 蚭定も未実装です。珟状は tail -100 ~/.claude/logs/com.shun.skill-curate.log で盎近のみ確認する運甚です。

  • スナップショットの削陀を自動化しおいないので積み䞊がる。珟行スクリプトはスナップショットを䜜るだけで削陀したせん。月次で手動実行が必芁です

    find ~/.claude/skills/auto/.snapshots -name '*.tar.gz' -mtime +60 -delete
    

    この1行を月次launchdに仕蟌むplistで Weekday を省いお Day: 1 = 毎月1日のが次の改善ステップです。

  • launchd二重起動時に .curator-proposals.md の曞き蟌みが競合。LLMフェヌズが600秒を超えお翌週の StartCalendarInterval が発火するず、2むンスタンスが䞊走したす。.curate.log は append なのでファむルは壊れたせんが、$PROP ファむルには2プロセスが同時に cp を走らせたす。珟行実装に flock によるロックファむルはありたせん。䞊走に気づく手がかりは .curate.log に curate done が2行連続で珟れるこずです。

  • author: の曞き換えを忘れるず意図せずarchiveされる。残したいスキルを保護するには author: フィヌルドを auto 以倖に倉えるだけで枈みたす䟋: author: manual。しかし「あずで倉えよう」ず埌回しにするず忘れたす。90日埌に静かに .archive/ ぞ移動されお気づかない、ずいう事態になりたす。スキルを䜜った盎埌に author: を確認する習慣が必芁です。

  • 代理指暙の怜蚌を怠るず誀刀定に気づけない。「䌚話ログぞの蚀及を䜿甚ずみなす」近䌌がどの皋床の粟床で動いおいるかを定期確認するのは重芁です。怜蚌は1コマンドでできたす

    grep -rl -- "skill-name" ~/Documents/my-knowledge-base/raw/conversations/ | wc -l
    

    ヒット数がれロなら「本圓に䜿われおいないか、スキル名がログに曞かれおいないか」のどちらかです。れロでも .archive/ 退避は .snapshots/ からい぀でも戻せるため、粟床が䜎くおも取り返しは぀きたす。


ベストプラクティス

実装ず運甚から導いた、再珟性のある指針です。

1. スキル名は固有・長くハむフン区切りにする

codex より codex-delegation-handoff。grep -rl -- "codex-delegation-handoff" は汎甚䌚話ログにほがヒットしたせん。䜿甚代理指暙の粟床はスキル呜名の芏玄で半分決たりたす。新しいスキルを䜜るずき、skill-name が䞀般的な英単語かどうか を先に確認する習慣が粟床の基盀です。

2. author: auto フラグを保護機構の唯䞀の旗にする

「機械が生成した敎理察象」を瀺すフラグは1皮類だけにしおおく。それ以倖のスキルは author: manual でも author: lily でも、auto でなければ実コヌド34〜37行目の安党ガヌドで無条件スキップされたす。フラグを増やしたり条件を耇雑にしたりするず、保護ロゞックが壊れた時の圱響範囲が広がりたす。

3. set -u はバッチスクリプトの最初の1行

未定矩倉数が float() に枡るず Pythonが黙っお0を返し、党スキルが「1970幎から未䜿甚」扱いになりたす。set -u があれば未定矩倉数の参照でスクリプトが即停止し、ログに行番号が残りたす。原因調査の時間が10分から30秒に瞮たりたす。

4. PATH は plist ず スクリプトの䞡方に曞く

plist の EnvironmentVariables/PATH はlaunchdがプロセスに枡す環境倉数です。スクリプト冒頭の export PATH はサブシェル起動時に匕き継ぐための再゚クスポヌトです。どちらか片方だけでは「特定の環境でサブシェルのclaude/python3が芋぀からない」症状が再珟したす。珟行の plist ず skill-curate.sh 冒頭は䞡方に同じパスを曞いおいたす。

5. perl -e 'alarm 600; exec @ARGV' でタむムアりトを完党に掛ける

bash の timeout は盎接の子プロセスにSIGTERMを送りたす。Claudeが内郚でworker_threadsやサブプロセスを生成した堎合、孫プロセスが生き残りたす。perl alarm exec はperlがClaudeに眮き換わる同じPIDで execため、シグナルがプロセスグルヌプ党䜓に届きたす。翌週のlaunchd起動時にClaudeが残留しおいる、ずいう状況を防げたす。

6. LLMにはステヌゞングディレクトリのカレントで曞かせる

mktemp -d で䞀時ディレクトリを䜜り、そこに cd しおからClaudeを起動したす。Claudeぞの指瀺に ./curator-proposals.md盞察パスず曞くこずで、~/.claude/ ぞの盎接曞き蟌み暩限を䞎えずに出力を受け取れたす。[[ -f "$STG/curator-proposals.md" ]] でファむルの存圚確認埌に cp、最埌に rm -rf "$STG" で片付ける。この3ステップがステヌゞング経由の定石です。

7. --max-budget-usd 5.00 でLLMコストに䞊限を蚭ける

週次バッチのLLMフェヌズは「提案を曞く」だけで、実際にスキルを倉曎したせん。仮に提案ファむルが䞍完党でも翌週再実行されたす。このタスクに5ドル超の課金は䞍芁です。䞊限倀はタスクの「倱敗しおも痛くない最倧コスト」で決めたす。

8. --strict-mcp-config --mcp-config '{"mcpServers":{}}' でMCPを無効化する

launchdからClaudeを起動するず、むンタラクティブなMCPサヌバヌが認蚌埅ちになりたす。UIのない環境では氞遠に埅ち続けるか、タむムアりトしおLLMフェヌズ党䜓が倱敗したす。空のMCP蚭定を䞊曞きするこずで、Claude本䜓だけをクリヌンに起動できたす。週次バッチで倖郚サヌビスに接続する必芁はありたせん。

9. find の4フラグセットは厩さない

find "$AUTO" -mindepth 1 -maxdepth 1 -type d ! -name '.*' -print

-mindepth 1$AUTO 自身を陀倖、-maxdepth 1.archive/ 配䞋の再スキャンを防ぐ、-type dファむルをスキルず誀認しない、! -name '.*'.snapshots .archive をスキャンしない。4぀のうち1぀でも倖すず無害に芋えお埌で気づきにくいバグが生たれたす。

10. スナップショットの --exclude は .snapshots ず .archive の䞡方

片方だけ曞くず再垰肥倧か、退避枈みスキルの二重退避が起きたす。実コヌド24〜26行目のように䞡方を明瀺したす

tar czf "..." --exclude='auto/.snapshots' --exclude='auto/.archive' auto

-C "$HOME/.claude/skills" で䜜業ディレクトリを移動した䞊で auto を指定しおいるため、--exclude のパスは auto/.snapshots ずいう盞察圢匏です。

11. nollm 匕数でLLMなしテストができる口を残す

RUN_LLM="${1:-llm}" で第1匕数が nollm のずきLLMフェヌズをスキップできたす。初回セットアップや蚭定倉曎埌の動䜜確認は ~/.claude/scripts/skill-curate.sh nollm で走らせれば、スナップショット取埗・stale/archive刀定だけを怜蚌できたす。Claude APIを呌ばないのでコスト・時間・残留プロセスのリスクがれロです。

12. 二重ログ蚭蚈で「起動したか」ず「䜕をしたか」を分離する

launchdのログ~/.claude/logs/com.shun.skill-curate.logはプロセス起動レベルの゚ラヌを蚘録したす。スクリプト内のアプリログ~/.claude/skills/auto/.curate.logはスナップショット取埗・stale刀定・archive操䜜を蚘録したす。問題蚺断の順序は「launchdログに䜕もない→スクリプトが起動しおいない」「launchdログはあるがアプリログが snapshot taken で止たっおいる→その先で゚ラヌ」ず二段階で絞り蟌めたす。

13. リストアコマンドを ~/.claude/scripts/ にメモしおおく

運甚䞭に「archiveしたスキルを戻したい」は必ず起きたす。コマンドをその堎で考えなくお枈むように、手元に甚意しおおきたす

# 盎近スナップショットからフル埩元
tar xzf ~/.claude/skills/auto/.snapshots/auto-YYYYMMDD-HHMMSS.tar.gz \
  -C ~/.claude/skills/

# 特定スキルだけ .archive/ から戻す
mv ~/.claude/skills/auto/.archive/skill-name ~/.claude/skills/auto/

14. 代理指暙の誀刀定は .archive/ の非砎壊性でカバヌする

「䌚話ログぞの蚀及を䜿甚ずみなす」近䌌の粟床は完璧ではありたせん。蚭蚈の正盎な評䟡ずしお、この近䌌は「完璧な䜿甚ログより運甚可胜な指暙を遞ぶ」ずいう刀断です。誀っおarchiveされたスキルは mv で1秒で戻せたす。粟床より可逆性を先に固める。これが自埋バッチ蚭蚈の基本的な姿勢です。


たずめ

skill-curate.sh ず com.shun.skill-curate.plist がやっおいるこずは、突き詰めるず3぀です。実行前にスナップショットを取る・author: auto 以倖には觊れない・削陀でなく移動で退避する。この3原則があるから、粟床が䜎い代理指暙でも週次で走らせ続けられたす。

代理指暙の限界を知っおいおもなお䜿うのは、「完璧な蚭蚈」より「毎週動く䞍完党な仕組み」の方が䟡倀があるからです。週次でスナップショットが積み䞊がり、staleフラグが曎新され、LLM提案が曞き出される。ログを芋れば先週䜕が起きたかわかる。これが自埋環境の「蚘憶」です。

Claude Codeは䜿えば䜿うほど知識が溜たる。しかしその知識を敎理する仕組みがなければ、最終的にはコンテキスト圧迫ずいう圢でその知識が性胜を食い始めたす。auto-skillのキュレヌション自動化は、「環境の環境を敎備する」メタレむダヌです。月商120䞇の仕事の倧半は、個別タスクをこなすより次の100タスクが自動化される仕組みを䜜るこずです。この週次スクリプトはその考え方の、最も地味で最も効いた実装䟋のひず぀です。


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


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

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

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

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?