äŒè©±ãã°ãå€äžã«èªåã¹ãã«åãã â Claude ãèªåã®èšæ¶ããåŠã¶ä»çµã¿
ååãClaude Codeã«èªåã§ã¹ãã«ãæžãããŠè²ãŠã話ã§ãã»ãã·ã§ã³äžçæããšãå€éãããçæãã®2å±€æ§é ã玹ä»ããŸãããä»åã¯ãã®å€éããããskill-harvest.sh ã®äžèº«ã ããæããŸãã
| é ç® | 宿ž¬å€ |
|---|---|
| çŸåšã® auto ã¹ãã«ç·æ° | 118åïŒæå€ 2026-05-26 ã ææ° 2026-08-09ïŒ |
| çŽè¿78åã®å®è¡å èš³ | æ£åžžçµäº50 / ã¿ã€ã ã¢ãŠã17ïŒ22%ïŒ / èªèšŒã»ã¯ã©ãŒã¿å€±æ11 |
| æŽèµ°é²æ¢ã®ã³ã¹ãäžé | --max-budget-usd 1.20ïŒå°å
¥æã¯0.5â0.6âçŸåš1.20ïŒ |
| 1åã®ããã³ããã«æž¡ããã°äžé | 15,000B à 3æ¬ = 宿ž¬18,255ã45,103B |
| çŸåšé²è¡åœ¢ã®äžå ·å | watermarkå€å®ãå£ããçŽè¿10æ¥éãã£ãšç©ºæ¯ãïŒdigest=19BïŒ |
æåŸã®1ä»¶ã¯ä»åã³ãŒããèªãã§ããŠèŠã€ãããã®ã§ããŸã çŽã£ãŠããŸããããããå«ããŠå®éã®ãã°ãšå®ã³ãŒãã§èŠãŠãããŸãã
å°ãããšïŒã»ãã·ã§ã³äžã«æžããã³ããæé ã¯æ¶ãã
ã»ãã·ã§ã³äžçæïŒå±€1ïŒã¯CLAUDE.mdã®æç€ºã§ãã®å Žã§ã¹ãã«åããŸãããããã¯ãä»ã®ã»ãã·ã§ã³ã§æ°ã¥ããããšãããæŸããŸãããéå»ã®ã»ãã·ã§ã³ã§èžãã åé¿çããå°å³ã«ç¹°ãè¿ããŠããå®åäœæ¥ã¯ãæžããã³ãããŸãŸäŒè©±ãã°ã«åãããŠãããŸãã
ãã®äŒè©±ãã°ã®çœ®ãå Žã ~/Documents/my-knowledge-base/raw/conversations/ãä»ãã®ãã£ã¬ã¯ããªã«ã¯18,926ãã¡ã€ã«ãããŸãããããæ¯æ©3:30ã«launchdãèµ·åããŠæŸãçŽãã®ã skill-harvest.sh ã§ãã
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key><integer>3</integer>
<key>Minute</key><integer>30</integer>
</dict>
å šäœæ§é ïŒwatermarkã§å·®åã ããåŠçãã
18,926ãã¡ã€ã«å šéšãæ¯åèªãããã«ã¯ãããªãã®ã§ããååã©ããŸã§åŠçããããã1ãã¡ã€ã«ã«å»ãã§å·®åã ãæŸããŸãã
WM="$AUTO/.harvest-watermark"
...
if [[ -f "$WM" ]]; then
newlogs=("${(@f)$(find "$LOGS" -name '*.md' -newer "$WM" 2>/dev/null)}")
else
newlogs=("${(@f)$(ls -t "$LOGS"/*.md 2>/dev/null)}")
fi
newlogs=(${newlogs:#})
if (( ${#newlogs} > 0 )); then
newlogs=("${(@f)$(ls -t "${newlogs[@]}" 2>/dev/null | head -$MAX_LOGS)}")
fi
.harvest-watermark ã¯äžèº«ãæããªã0ãã€ãã®ãã¡ã€ã«ã§ãtouchããããã ãã«ååšããŸãããåååŠç以éã«æŽæ°ããããã¡ã€ã«ãã find -newer ã§æŸããmtimeéé ã§å
é MAX_LOGS=3 æ¬ã ãã«çµãèšèšã§ãã
ããã«çŸåšé²è¡åœ¢ã®äžå ·åããããŸããæå ã§åãããžãã¯ãåçŸãããšããã
find -newerã15,471ä»¶ãè¿ãããããäžžããšls -t "${newlogs[@]}"ã«æž¡ããç¬éã«å£ããŸããzsh:7: argument list too long: ls
lsãåŒæ°è¶ éã§å€±æãïŒ2>/dev/nullã§æ¡ãã€ã¶ãããïŒã空æååã1ä»¶ã ãé åã«æ®ããŸããçµæããã®æ¥åŠçãããããã°ãã¯ãã¡ã€ã«åã空ã®å¹œéãšã³ããªã«ãªãããã€ãžã§ã¹ãã¯===== LOG: =====ãšããäžèº«ãŒãã®19ãã€ãã«ãå®éã®.harvest.logãèŠããšã2026-08-01ãã仿¥ïŒ2026-08-10ïŒãŸã§10æ¥é£ç¶ã§ãã®ç¶æ ã§ãã[2026-08-09 03:30:05] harvest start: 1 log(s), digest= 19B The log excerpt is empty (`=== LOG: ===` contains no content), so there's no material to extract procedural knowledge from. 該åœãªã [2026-08-09 03:30:30] harvest done (exit 0, created=0)
exit 0ã§ãæ£åžžçµäºãããŠããã®ã§ããã°ãæµãèªã¿ããã ãã§ã¯æ°ã¥ããŸãããç®èãªããšã«ããã®raw/conversations/ã®mtimeæ±æåé¡ãã®ãã®ã¯ã8æ3æ¥çæã®å¥ã¹ãã«conv-log-content-date-filterã«ãäžæ¬syncã§13,809ä»¶ã®mtimeãå šæ» ããããšããäºäŸãšããŠãã§ã«èšé²ãããŠããŸããharvestãåãåã£ãç¥èŠããharvestèªèº«ã«ã¯ãŸã åæ ã§ããŠããŸããã
ãªã15,471ä»¶ã-newerã«ãããããã®ããraw/conversations/é
äžã®å€ãã®ãã¡ã€ã«ãèªååã¬ãŒã³ïŒnote-autolike, affiliate-amebaçïŒããç¶ç¶çã«è¿œèšãããŠãããmtimeãæ¯æ¥æŽæ°ããç¶ããããã§ããwatermarkããæšæ¥ã®3:30ããæããŠããŠãããã®åŸã«ã»ãŒå
šãã¡ã€ã«ãè§ŠãããŠããã°find -newerã®æ¯æ°ã¯ããäžåäœã«èšãã¿ãŸãã
$1.20ã®ããžã§ãããã£ããïŒæŽèµ°ã³ã¹ãã®å®ç©
claude -pãcronã§ç¡äººå®è¡ãã以äžãã³ã¹ãã®äžéã¯æ°å€ã§æããªããšå±éºã§ããçŸåšã®ã¹ã¯ãªããã¯ãããªã£ãŠããŸãã
BUDGET_USD=1.20 # å®å
šäžéïŒMaxã¯å®é¡ãããã¯æŽèµ°é²æ¢ã®ãã£ãããsonnetã¯ããŒã¹è² è·ãéãïŒ
TIMEOUT_SEC=600
...
( cd "$STAGING" && perl -e 'alarm shift @ARGV; exec @ARGV' "$TIMEOUT_SEC" \
"$CLAUDE" --strict-mcp-config --mcp-config '{"mcpServers":{}}' -p "$PROMPT" \
--model sonnet \
--permission-mode acceptEdits \
--allowedTools "Write Edit Read" \
--max-budget-usd "$BUDGET_USD" >> "$LOG" 2>&1 < /dev/null )
ãã®1.20ã¯æåãããã®å€ã ã£ãããã§ã¯ãããŸãããå°å
¥çŽåŸã®ãã°ã«ã¯ããæ®ã£ãŠããŸãã
[2026-05-26 04:29:39] harvest start: 5 log(s)
Error: Exceeded USD budget (0.5)[2026-05-26 04:30:00] harvest done (exit 1)
[2026-05-26 04:31:13] harvest start: 3 log(s), digest= 22798B
Error: Exceeded USD budget (0.6)[2026-05-26 04:31:35] harvest done (exit 1)
0.5â0.6ãšäžããŠããŸã è¶³ãããexit 1ã§äžžããšå€±æããŠããŸãããä»ã®1.20ã¯ãã®åŸã®èª¿æŽã®çå°ç¹ã§ãã--max-budget-usdã¯CLIåŽã®ããŒãäžéã§ãè¶
ãããããŒã«åŒã³åºãã®éäžã§ãæã¡åã£ãŠçµäºã³ãŒããè¿ããŸãã
ããäžæ®µãperl alarmã«ãã壿èšã¿ã€ã ã¢ãŠãïŒ600ç§ïŒãæãã£ãŠããŸããããŒã¯ã³äºç®ã ãã§ã¯ãæéãã¯çžããªãããã§ããå®éãçŽè¿78åã®å®è¡ã®ãã¡17åïŒ22%ïŒããã®ã¿ã€ã ã¢ãŠãã§exit 142çµäºããŠããŸãã
grep "harvest done" .harvest.log | grep -oE 'exit [0-9]+' | sort | uniq -c
# 50 exit 0
# 17 exit 142 â timeout
# 11 exit 1 â èªèšŒåã/鱿¬¡ã¯ã©ãŒã¿è¶
é
ã¿ã€ã ã¢ãŠããèªèšŒåããcreated=0ã§çµããã ãã§ããªãã©ã€ã¯ããŸãããæ¬¡ã®3:30ãŸã§åŸ
ã£ãŠããã®æ¥ã®å·®åãšããŠãŸãæŸãçŽãããŸãã
system-reminderãã€ãºãäºåã«ãã£ã«ã¿ãã
äŒè©±ãã°1ä»¶ã¯æ°çŸKBã700KBãããŸãïŒnote-autolike_*.mdã¯å®æž¬580ã702KBïŒãããããã®ãŸãŸããã³ããã«æž¡ããšãã·ã¹ãã ãªãã€ã³ããŒïŒã¹ãã«äžèЧãããŒã«äžèЧã®åæ²ïŒã ãã§ã³ã³ããã¹ããåãŸããèå¿ã®ãäœãããŠã©ã解決ãããããåæ²¡ããŸãããã€ãžã§ã¹ãçæã¯ãããåã£ãŠããŸãã
DIGEST=$(mktemp -t skill-harvest)
for f in "${newlogs[@]}"; do
{
echo "===== LOG: ${f:t} ====="
# 巚倧㪠<system-reminder> ãããã¯ã倧ãŸãã«é€å»ããŠãããã€ãäžéã§åã
grep -v -e 'system-reminder' -e '^- [a-z0-9].*:' "$f" 2>/dev/null | head -c $PER_LOG_BYTES
echo
} >> "$DIGEST"
done
PER_LOG_BYTES=15000ãMAX_LOGS=3ãªã®ã§çè«äžéã¯45,000Bãå®éã®ãã°ã®digest=衚瀺ã远ããšã18,255Bã45,103Bã®ç¯å²ã«åãŸã£ãŠãããèšèšå€ã©ããé æã¡ã«ãªã£ãŠããããšã宿ž¬ã§ç¢ºèªã§ããŸãã
digest= 45103B (2026-06-12)
digest= 35159B (2026-07-08ã11)
digest= 29070B (2026-07-13ã21)
digest= 18255B (2026-06-26, 07-01, 07-04)
grep -vã®2ãã¿ãŒã³ã¯èããsystem-reminderã®XMLã¿ã°ãå³å¯ã«ããŒã¹ããŠããããã§ã¯ãããŸããã^- [a-z0-9].*:ã¯ã¹ãã«äžèЧã®ç®æ¡æžãïŒ- ad-creative: ...ã®ãããªè¡ïŒã朰ãããã®ç°¡æãã¥ãŒãªã¹ãã£ãã¯ã§ããå³å¯ããããããŒã¯ã³ãé£ãå®åãã€ãºãæ©æ¢°çã«éåŒããããšãåªå
ããèšèšã§ãã
æš©éã®è¿åïŒ~/.claudeã«çŽæ¥æžãããªã
ãã1ã€å°å³ã«éèŠãªã®ãæžã蟌ã¿çµè·¯ã§ãã~/.claudeé
äžã¯Claude Codeèªèº«ãä¿è·å¯Ÿè±¡ã«ããŠããããããããã¬ã¹ãžã§ãã«çŽæ¥æžãããããšãããšæš©éã§è©°ãŸããŸããããã§äžæŠã¹ããŒãžã³ã°ã«éãããŸãã
STAGING=$(mktemp -d -t skill-harvest-stg)
( cd "$STAGING" && ... "$CLAUDE" -p "$PROMPT" \
--permission-mode acceptEdits \
--allowedTools "Write Edit Read" ... )
# ã¹ããŒãžã³ã°ã§äœããã SKILL.md ãæã€ãã£ã¬ã¯ããªã ãã AUTO ãžåã蟌ã
for sd in "$STAGING"/*(/N); do
[[ -f "$sd/SKILL.md" ]] || continue
...
cp -R "$sd" "$AUTO/$name" && { echo "CREATED: $name" >> "$LOG"; ((created++)); }
done
ããã³ããåŽã«ããã«ã¬ã³ããã£ã¬ã¯ããªçŽäžã«çžå¯Ÿãã¹ã§äœãã絶察ãã¹çŠæ¢ããšæèšããŠããŸããClaudeã«ã¯äžæãã£ã¬ã¯ããªã®äžã ããè§Šããã~/.claude/skills/auto/ãžã®å®ã³ããŒã¯ã²ãŒããããŠããªãçŽ ã®cpïŒã·ã§ã«åŽïŒãæ
åœããããšãã圹å²åæ
ã§ããã³ããŒæã«author: autoãæ¬ ããŠããã°Pythonã§æ¿å
¥ããCuratorã察象ãå€å®ã§ããç¶æ
ãä¿èšŒããŠããåã蟌ã¿ãŸãã
宿ž¬ïŒ78åã®ãããå®è¡ãš118åã®ã¹ãã«
$ find ~/.claude/skills/auto -maxdepth 1 -type d ! -name '.*' | wc -l
118
ååèšäºã®æç¹ã§64åã ã£ãã®ã§ããã®2ã¶æåã§åè¿ãã«å¢ããŠããŸãããã ãæ°èŠäœæã€ãã³ãïŒCREATED:ïŒèªäœã¯78åäž20åã ãã§ãæ®ã60åè¿ãã¯created=0ïŒéè€å€å®ã»ç©ºæ¯ãã»å€±æïŒã§ãããä¹±é ããªããèšèšã®ãšãããå®è¡åæ°ãšçææ°ã¯ãããã«äžèŽããŸããã
çŽè¿ã®çæäŸãèŠããšãharvestãæŸã£ãŠããæé ã¯ããªãå®åçã§ãã
conv-log-content-date-filterïŒ2026-08-03ïŒâ äžæ¬syncã§mtimeã13,809ä»¶å šæ» ããå®äŸãšãæ¬æã®æ¥æ:ãã£ãŒã«ãã§ãã£ã«ã¿ããåé¿çautomation-bool-selector-pitfallsïŒ2026-08-09ïŒâ èªååã¬ãŒã³ãæ¢ãŸãçå ã®å€§åããbooleanæ»ã倿ãããšãdocumentã¹ã³ãŒãã®åºãããã»ã¬ã¯ã¿ãã ã£ããšããæšªæèšºæconv-log-overlap-routingïŒ2026-07-29ïŒâ åäžãããžã§ã¯ãã®äŒè©±ãã°ãwikiãžè¿œèšãããæ°èŠäœæãããã®å€æã«ãŒã«
ãããããäžåºŠããã£ãåé¡ã®è§£ãæ¹ãããã®ãŸãŸæé åãããŠããŠã次ã«åãçŸè±¡ãèµ·ãããšãClaudeãèªåã§åç §ã§ãã圢ã«ãªã£ãŠããŸãã
èžãã èœãšã穎
find -newer+ls -tã¯åŒæ°ãäžåäœã«ãªããšç¡èšã§æ»ã¬ âzsh:7: argument list too longã2>/dev/nullã§æ¡ãã€ã¶ããã空ã®ãã°ãšã³ããªãšããŠåŠçãç¶ç¶ããŠããŸããçŸåšé²è¡åœ¢ïŒ2026-08-01ã08-10ã10æ¥é£ç¶ã§ç©ºæ¯ãïŒ- ã³ã¹ãäžéã¯æåãã驿£å€ã§ã¯ãªãã£ã â
0.5â0.6ã§å°å ¥åæ¥ã«2å倱æããçŸåšã®1.20ã«èœã¡çãããæ°å€ã¯çµéšçã«äžããŠãããã® --max-budget-usdã ãã§ã¯æéã¯çžããªã âperl alarmã«ãã壿èš600ç§timeoutã奿ããããã§ãçŽè¿78åäž17åïŒ22%ïŒã¯ã¿ã€ã ã¢ãŠãã§çµãã£ãŠãã~/.claudeã¯èªåèªèº«ã®ä¿è·å¯Ÿè±¡ â ãããã¬ã¹ãžã§ãã¯äžæãã£ã¬ã¯ããªã«æžãããã³ããŒã ãã·ã§ã«åŽã®çŽ ã®cpã«ãããã- äŒè©±ãã°ã®noiseé€å»ã¯æ£èŠè¡šçŸã®åœãŠãã£ãœã â
system-reminderãšç®æ¡æžãã¹ãã«äžèЧãç²ãé€å€ããã ãã§ã45,000Bäžéã«åãŸãçšåºŠã«ã¯å¹ããŠãã - OAuthã»ãã·ã§ã³ãåãããš2æ¥é£ç¶ã§å
šæ»
ãã â
Failed to authenticate: OAuth session expiredãexit 1ã§èšé²ãããã ãã§ãèªåãªãã©ã€ãéç¥ããªã
ãŸãšã
- å€éãããã¯watermark(mtimeå·®å)+ãã€ãäžéãã€ãžã§ã¹ãã§18,926ä»¶ã®äŒè©±ãã°ããå·®åã ããå®ãåŠçããèšèš
- ã³ã¹ãã¯**
--max-budget-usdã®æ°å€äžéïŒå£æèštimeout**ã®äºéã§æ¢ãããäžéå€ã¯éçšããªããäžããŠãããã®ïŒ0.5â0.6â1.20ïŒ - system-reminderãã€ãºã¯æ£èŠè¡šçŸã§ç²ãäºåé€å»ããããã³ãããµã€ãºã宿ž¬18KBã45KBã«æããŠãã
~/.claudeãžã®æžã蟌ã¿ã¯èªå·±ä¿è·ãšè¡çªãããããã¹ããŒãžã³ã°âã·ã§ã«åŽã³ããŒã§è¿åãã- watermarkå€å®ã¯
find -newerã«äŸåããŠãããmtimeãæ±æããããšç¡èšã§å£ããããã㯠harvest ãéå»ã«èªåã§èŠã€ããŠèšé²ããæèšïŒconv-log-content-date-filterïŒããharvestèªèº«ã«ã¯ãŸã åæ ãããŠããªããšããæ§é çãªç©Ž
次åã¯ãã®118åãCuratorãã©ãéåŒãããå®éã®.curator-proposals.mdãèŠãªããæžããŸãã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ