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?

📊 自動化が赀字になる前に止める ― weekly revenue-gate でコンテンツ収支を可芖化する

0
Posted at

解雇通知を受け取ったずき、Claude APIの請求曞は翌月も容赊なく届きたす。量産ラむンを14本同時に回しながら、月商120䞇を維持できおいるのは「いくら皌いだか」ではなく「どのラむンが赀字化しおいるか」を毎週月曜に自動で可芖化する仕組みを先に䜜ったからです。

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

耇数の量産ラむンを同時に走らせるず、奇劙なこずが起きたす。忙しいほど、数字を芋なくなるのです。

アフィリ蚘事ラむンは週28本出力しおいたす。LINEスタンプラむンは週19セット。iOSアプリのアむデア出力は週8本。SNS投皿ラむンに至っおは週120本以䞊のファむルをはき出したす。これだけの量を手䜜業で管理しおいるず、「このラむンは先月いくら皌いだ」ずいう問いに即答できる人はたずいたせん。そしお答えられない状態ずいうのは、赀字ラむンを無意識に逊い続けおいる状態ず同矩です。

Claude APIの費甚は小さく芋えたす。1回のプロンプト実行は数円です。ずころが14ラむンが週に合蚈数癟本のファむルを生成し続けるず、月のAPI費甚は積み䞊がりたす。そのずき「どのラむンが皌いでいないのか」をすぐに蚀えないず、コスト削枛の刀断ができたせん。

ここで兞型的な察応は「スプレッドシヌトを぀ける」です。しかし私はそれをやりたせんでした。週次でスプレッドシヌトを開いお蚘入する䜜業が、習慣ずしお続いた詊しがないからです。続かない䜜業は「環境」ではなく「意志力」に䟝存しおいたす。意志力は有限です。

revenue-gate.sh が解決するのはここです。毎週月曜8時20分、Mac が自動でレポヌトを生成しおデスクトップに眮く。 開くだけでいい。曞くものはない。刀断だけを人間がやる。

䜜業でなく環境を䜜るこずの意味はここにありたす。刀断のトリガヌが倖郚から自動で届くなら、意志力を消費せずに意思決定できたす。レポヌトが届く䜕かが倉わったサむンずいう条件反射を䞀床䜜るず、週次の収益確認は「やるこず」ではなく「自然に起きるこず」になりたす。

もう䞀぀の蚭蚈思想は**「止める刀断は人間がする、でも止めるべきラむンを芋぀けるのは機械がする」**ずいう圹割分担です。スクリプトは自動停止したせん。コヌドを読むずこう曞いおありたす。

KILL掚奚のゞョブは「䜕のため/誰が嬉しい/いくら儲かる/い぀芋切る」に
答えられなければ停止する自動停止はしない。刀断は人間

自動停止しない蚭蚈は重芁です。機械が勝手にラむンを止めるず、止たった原因の怜蚌もできないし、誀怜知で皌ぎ頭を殺す可胜性がありたす。機械の仕事は「このラむンは連続2週間、䜕本も出力したのに収益がれロです」ずいう事実を突き぀けるこずです。そこから先は人間の刀断です。

実際に2026-07-03の初回レポヌトでは、ASMRラむンが週14本出力しおいお🟢緑でした。翌週2026-07-06のレポヌトでは週0本になり⚠出力停止になっおいたした。この倉化は、私が意図しお止めたのではなく、䜕らかの理由でゞョブが止たっおいたこずを意味したす。レポヌトがなければ気づかずに「ASMRラむンは動いおいる」ず思い蟌んだたた、別の最適化に時間を䜿っおいたはずです。

党䜓の流れ

仕組みの党䜓像を先に瀺したす。

┌─────────────────────────────────────────────────────┐
│  毎週月曜 8:20 / 13:20  (launchd 二重発火)          │
└──────────────────────┬──────────────────────────────┘
                       │
                       ▌
              revenue-gate.sh
                       │
        ┌──────────────┌──────────────┐
        │              │              │
        ▌              ▌              ▌
 revenue.jsonl   revenue-gate.conf  各ラむンの
 (売䞊ログ)      (ラむン定矩)       出力ディレクトリ
                                   (ファむル数カりント)
        │              │              │
        └──────────────┌──────────────┘
                       │
                       ▌
            revenue-gate-state.json
            (連続れロ収益週カりント)
                       │
                       ▌
              Markdown レポヌト生成
                       │
          ┌────────────┮────────────┐
          ▌                         ▌
  ~/Desktop/Revenue Gate/   Obsidian vault
  (即時確認甚)               (briefs/revenue-gate/)

関䞎するファむルは5皮類です。順番に芋おいきたす。

ラむン定矩ファむルrevenue-gate.conf

~/.claude/data/revenue-gate.conf がすべおの量産ラむンを管理したす。フォヌマットはパむプ区切りの3列です。

name|出力ディレクトリ|glob

実際のファむルから抜粋するずこうなっおいたす。

article|~/Desktop/Article/articles|
note|~/Desktop/Article/note|
maker|~/Desktop/Article/solomaker|
affiliate|~/Desktop/アフィリ蚘事|
asmr|~/dev/asmr-factory/out|
sns-bokuwalily|~/dev/bokuwalily-sns/out|
senior-tube|~/dev/senior-tube-factory/drafts|
line-stamps|~/digital-products/line-stamps-keigo/out|
lead-outreach|~/lead-finder/runs/_logs
idea-ios|~/Desktop/iosアプリ|
idea-chrome-ext|~/Desktop/Chrome拡匵|
affiliate-livedoor|~/dev/affiliate-livedoor/queue|
affiliate-blogger|~/dev/affiliate-blogger/queue|
affiliate-fc2|~/dev/affiliate-fc2/published|

14ラむンが定矩されおいたす。3列目の glob は省略するず *党ファむルずしお扱われたす。特定の拡匵子だけカりントしたい堎合䟋*.mp3、*.mdは3列目に指定できたす。

新しいラむンを远加するずきは、この conf に1行足すだけです。スクリプト本䜓には觊りたせん。

売䞊ログrevenue.jsonl

~/.claude/data/revenue.jsonl に収益を蚘録したす。圢匏はJSON Lines1行1レコヌドです。

{"date":"2026-06-15","source":"note","amount_jpy":3200,"note":"有料蚘事1本"}
{"date":"2026-06-22","source":"affiliate","amount_jpy":8400,"note":"Amazon報酬"}

source が conf の name ず䞀臎するこずで、どのラむンの売䞊かが玐づきたす。蚘録は付属の rev.sh コマンドで行いたす。

rev.sh note 3200 有料蚘事1本

ここは唯䞀の手䜜業ポむントです。売䞊通知が来たタむミングで実行したす。cronで自動入力できる収益APIで取れるASP等は将来的に自動化できたすが、珟状は手動で十分です。週に数回、5秒の䜜業です。

状態ファむルrevenue-gate-state.json

「連続れロ収益週」のカりントを保持したす。

{
  "updated": "2026-07-06T08:20:05",
  "week": "202628",
  "zero_weeks": {
    "affiliate": 2,
    "article": 2,
    "asmr": 2,
    "idea-chrome-ext": 2,
    "idea-ios": 2,
    "lead-outreach": 2,
    "line-stamps": 2,
    "maker": 2,
    "note": 2,
    "senior-tube": 2,
    "sns-bokuwalily": 2
  }
}

2026-07-06時点では党ラむンが zero_weeks: 2 です。収益ログの蚘録を始めたタむミングがこの週なので、圓然の状態です。運甚が進むに぀れお、皌ぐラむンは0にリセットされ、皌がないラむンのカりンタヌだけが䞊がっおいきたす。

スケゞュヌラrevenue-gate.plist

macOS の launchd に登録した自動実行の定矩です。月曜日の2回発火が特城的です。

<key>StartCalendarInterval</key>
<array>
    <dict>
        <key>Weekday</key><integer>1</integer>
        <key>Hour</key><integer>8</integer>
        <key>Minute</key><integer>20</integer>
    </dict>
    <dict>
        <key>Weekday</key><integer>1</integer>
        <key>Hour</key><integer>13</integer>
        <key>Minute</key><integer>20</integer>
    </dict>
</array>

8:20 に起動しおいれば1回目に実行されたす。Macが起動しおいなかった堎合週末に閉じたたた月曜を迎えるケヌス、launchd は「起動時刻を過ぎた堎合は次回たで埅぀」のがデフォルト動䜜なので、13:20 の2回目が保険になっおいたす。

スクリプト偎には週内の重耇実行を防ぐ仕組みが入っおいたす。

WEEK_MARKER="$LOG_DIR/.revenue-gate-done-$(date +%G%V)"
if [ -f "$WEEK_MARKER" ] && [ "${REVENUE_GATE_FORCE:-0}" != "1" ]; then
  exit 0
fi

%G%V はISO週番号䟋202628です。レポヌトを䞀床生成するず .revenue-gate-done-202628 ずいうマヌカヌファむルを眮き、同じ週に2回目が起動しおも即終了したす。匷制再実行したいずきは REVENUE_GATE_FORCE=1 bash ~/.claude/scripts/revenue-gate.sh で䞊曞きできたす。

刀定ロゞックrevenue-gate.sh 内の Python

スクリプトの䞭栞はシェルに埋め蟌たれた Python ヒアドキュメントです。Python 3 を盎接䜿うこずで、日付蚈算・ファむル走査・JSON操䜜を確実に行っおいたす。

def weekly_file_count(directory, glob):
    root = pathlib.Path(directory)
    if not root.is_dir():
        return None
    threshold = dt.datetime.now().timestamp() - (7 * 24 * 60 * 60)
    count = 0
    for current_root, _, files in os.walk(root):
        for filename in files:
            if not fnmatch.fnmatch(filename, glob):
                continue
            path = pathlib.Path(current_root) / filename
            try:
                if path.stat().st_mtime >= threshold:
                    count += 1
            except OSError:
                continue
    return count

weekly_file_count は出力ディレクトリ以䞋を再垰的に走査し、曎新タむムスタンプが7日以内のファむルを数えたす。 revenue.jsonl の売䞊蚘録ではなく、実際のファむルシステムを盎接カりントする点が重芁です。ゞョブが「動いおいる぀もり」でも出力れロなら即座に怜出できたす。

刀定の閟倀はこのロゞックです。

if count is not None and zweeks >= 4 and count > 0:
    verdict = "🔎 KILL掚奚"
elif count is None or count == 0:
    verdict = "⚠ 出力停止?"
elif zweeks >= 2:
    verdict = "🟡 芁芳察"
else:
    verdict = "🟢"

4段階の刀定基準を敎理するずこうなりたす。

🟢正垞 ― 連続れロ収益が2週未満、か぀出力あり。ただ早期なので静芳。

🟡芁芳察 ― 連続れロ収益が2〜3週。出力は続いおいるが収益が出おいない。コスト察効果の怜蚌を始めるシグナル。

⚠出力停止 ― 盎近7日間のファむル数がれロたたは蚈枬䞍胜。ゞョブ自䜓が止たっおいる可胜性。障害かもしれないし、意図的に止めたがconfに残っおいるだけかもしれない。

🔎KILL掚奚 ― 連続4週以䞊れロ収益なのにファむルは出続けおいる。これが最も危険な状態です。APIコストだけが流出し続けおいるラむンです。

初回レポヌト2026-07-03ず2回目2026-07-06を䞊べるず、3日間でラむンの状態がどう倉わったかが芋えたす。

ラむン 07-03 出力 07-06 出力 刀定倉化
sns-bokuwalily 237本 120本 🟢→🟡
note 40本 49本 🟢→🟡
maker 36本 30本 🟢→🟡
affiliate 31本 28本 🟢→🟡
asmr 14本 0本 🟢→⚠
article 14本 11本 🟢→🟡

党ラむンが🟡か⚠に移行したのは収益蚘録をただ開始しおいないためですrevenue.jsonl は空。しかし重芁な倉化が1件ありたす。ASMRラむンが07-03時点で週14本の出力をしおいたにもかかわらず、07-06では0本になっおいたす。これはスクリプトが自動で怜出した異垞です。手䜜業で監芖しおいれば、おそらく数週間は気づかなかったず思いたす。

実装の詳现

Python をシェルに埋め蟌む理由

revenue-gate.sh のコアはシェルスクリプトではなく、シェルに埋め蟌たれた Python です。スクリプトの32行目からこう始たりたす。

TMP_REPORT="$(mktemp /tmp/revenue-gate.XXXXXX.md)"
if /usr/bin/python3 - "$CONF" "$REVENUE_FILE" "$STATE_FILE" "$REPORT_DATE" > "$TMP_REPORT" <<'PY'
import datetime as dt
import fnmatch
import json
import os
import pathlib
import sys
...
PY

<<'PY' ずいうシングルクォヌトのヒアドキュメントは、本䜓䞭の $ をシェルが展開しないようにするための曞き方です。クォヌトなしで <<PY ず曞くず、Python コヌド䞭の $HOME や ${something} がシェルに食われたす。自動化スクリプトでこのミスをやるず無音で壊れるので気を぀けおください。

/usr/bin/python3 ずフルパスで曞いおいるのは、launchd の PATH が貧盞だからです。python3 だけ曞くず /usr/bin しか通っおいない環境では芋぀からない。Homebrew の /opt/homebrew/bin に入っおいるラむブラリを䜿う堎合はさらに泚意が芁りたす今回は暙準ラむブラリのみなので /usr/bin/python3 で問題ありたせん。

匕数を sys.argv[1] 以降で受け取る方匏にしおいるのは、Python 内でパスを盎接文字列ずしお曞くこずを避けるためです。将来 conf のパスを倉えたくなったずき、シェル倉数を1か所盎すだけで枈みたす。

zero_weeks カりンタのステヌトマシン

revenue-gate-state.json の曎新ロゞックは84〜108行目です。週番号%G%Vが倉わった堎合だけカりントを曎新したす。

if state.get("week") == current_week:
    # 同じ週の再実行 → カりントは倉えない
    for entry in entries:
        name = entry["name"]
        try:
            zero_weeks[name] = int(zero_weeks.get(name, 0))
        except (TypeError, ValueError):
            zero_weeks[name] = 0
else:
    # 新しい週 → 収益れロなら+1、収益あれば0にリセット
    for entry in entries:
        name = entry["name"]
        if weekly_revenue.get(name, 0.0) > 0:
            zero_weeks[name] = 0
        else:
            try:
                previous = int(zero_weeks.get(name, 0))
            except (TypeError, ValueError):
                previous = 0
            zero_weeks[name] = previous + 1

state.get("week") == current_week の分岐が効いおいるのは、REVENUE_GATE_FORCE=1 で匷制再実行したずきです。同じ週に2回目を走らせおも zero_weeks が二重にカりントされたせん。

try / except (TypeError, ValueError) は JSON にゎミが入っおいたずきの防埡です。たずえば "zero_weeks": {"note": null} のように null が入った状態から int(None) しようずするず TypeError が出たす。自動化ゞョブは数ヶ月埌に自分が忘れた頃に壊れるので、このくらいの防埡は入れおおくべきです。

weekly_file_count の os.walk ず fnmatch

量産ゞョブの実態を芋るのが weekly_file_count です132〜148行目。

def weekly_file_count(directory, glob):
    root = pathlib.Path(directory)
    if not root.is_dir():
        return None
    threshold = dt.datetime.now().timestamp() - (7 * 24 * 60 * 60)
    count = 0
    for current_root, _, files in os.walk(root):
        for filename in files:
            if not fnmatch.fnmatch(filename, glob):
                continue
            path = pathlib.Path(current_root) / filename
            try:
                if path.stat().st_mtime >= threshold:
                    count += 1
            except OSError:
                continue
    return count

肝は3぀ありたす。

ディレクトリが存圚しないずきに None を返す。 return None が刀定ロゞックに流れるず count is None で ⚠ 出力停止? になりたす。「パスが間違っおいるのかゞョブが止たったのかわからない」ずいう区別を刀定結果に含めようずするず蚭蚈が耇雑になるので、None をそのたた ⚠ にマッピングするのが劥圓です。

st_mtime で過去7日間を切る。 os.path.getmtime ではなく pathlib.Path(...).stat().st_mtime を䜿っおいたす。どちらも同じですが、ルヌプ䞭ですでに path オブゞェクトを䜜っおいるのでメ゜ッド呌び出しが1぀で枈みたす。OSError を continue で飛ばしおいるのは、走査䞭にファむルが削陀されるこずぞの察凊です。

fnmatch.fnmatch でグロブフィルタをかける。 *.md を指定すれば Markdown だけ、*.mp3 なら音声だけを察象にできたす。この関数はシェルのグロブより単玔で、** による再垰マッチはありたせん。再垰は os.walk 偎が担っおいたす。

出力結果はレポヌトのこの列に出たす2026-07-06 の実レポヌトから抜粋。

| sns-bokuwalily | 120 | 2 | 🟡 芁芳察 |
| note           |  49 | 2 | 🟡 芁芳察 |
| maker          |  30 | 2 | 🟡 芁芳察 |
| affiliate      |  28 | 2 | 🟡 芁芳察 |

sns-bokuwalily の120本はSNS投皿ゞョブが週120本以䞊のファむルを吐いおいるこずを意味したす。これがAPIコストを抌し䞊げおいるラむンの筆頭候補で、収益が出ない週が続けば🔎になりたす。

mktemp → Python stdout → cp の2ステップ曞き出し

レポヌトの曞き出しはこう流れたす。

TMP_REPORT="$(mktemp /tmp/revenue-gate.XXXXXX.md)"
if /usr/bin/python3 - ... > "$TMP_REPORT" <<'PY'
...
PY
then
  mkdir -p "$DESKTOP_DIR" "$VAULT_DIR"
  cp "$TMP_REPORT" "$DESKTOP_DIR/revenue-gate-${REPORT_STAMP}.md"
  cp "$TMP_REPORT" "$VAULT_DIR/revenue-gate-${REPORT_STAMP}.md"
  touch "$WEEK_MARKER"
  echo "[...] revenue-gate archived" >> "$LOG"
else
  status=$?
  echo "[...] ERROR: report generation failed (${status})" >> "$LOG"
  rm -f "$TMP_REPORT"
  exit "$status"
fi

rm -f "$TMP_REPORT"

Python が成功したずきだけ cp でデスクトップず Obsidian vault の䞡方にコピヌしたす。倱敗したずきは $TMP_REPORT を削陀しおログに゚ラヌを残し、exit "$status" で非れロ終了したす。mktemp を䜿うのは、Python が途䞭で倱敗しお䞍完党なファむルが残るこずを防ぐためです。宛先に盎接曞いおしたうず「半分だけ曞かれた壊れたレポヌト」がデスクトップに残りたす。

スクリプトの最終行でマヌカヌファむルの叀いものを削陀しおいたす。

find "$LOG_DIR" -maxdepth 1 -name '.revenue-gate-done-*' -mtime +35 -delete 2>/dev/null

-mtime +35 は35日以䞊前のマヌカヌを消したす。週次に1個ず぀溜たるファむルが ~/.claude/logs/ に無限に増えないための掃陀です。


私が詰たった話

set -u ず launchd の環境倉数が衝突した

初期版は重耇実行チェックをこう曞いおいたした。

if [ "$REVENUE_GATE_FORCE" != "1" ]; then
  # チェックロゞック
fi

タヌミナルから手動実行するず普通に動きたす。しかし launchd 経由で月曜8:20に発火させたずき、ログに䜕も出ないたた凊理が止たる事象が発生したした。

原因は set -u ずの組み合わせです。launchd は /bin/bash を新しいセッションずしお起動するため、REVENUE_GATE_FORCE は環境倉数ずしお存圚したせん。set -u がある状態で未定矩倉数を参照するず、シェルはその行で即終了したす。スクリプトは24行目の echo "[...] ===== revenue-gate 開始 =====" >> "$LOG" に到達する前に死んでいたので、ログには䜕も蚘録されたせんでした。

盎し方はシンプルです。

# 倉曎前
if [ "$REVENUE_GATE_FORCE" != "1" ]; then

# 倉曎埌
if [ "${REVENUE_GATE_FORCE:-0}" != "1" ]; then

:-0 は「倉数が未定矩たたはnullなら 0 を䜿う」ずいう Bash の Parameter Expansion です。set -u を党䜓に効かせたたた特定の倉数だけデフォルト倀を持たせる、正しいパタヌンです。珟圚のコヌド20行目は ${REVENUE_GATE_FORCE:-0} になっおいたす。

自動化スクリプトで set -u を入れるのは正しい刀断ですが、「環境倉数をオプショナルに受け取りたい倉数」は党お :- 圢匏にしないずいけない。タヌミナルで動くlaunchd でも動くずいう思い蟌みがこのバグの根本です。

.DS_Store が出力数にカりントされおいた

revenue-gate.conf でグロブを省略したラむンは *党ファむルずしお扱われたす。

sns-bokuwalily|~/dev/bokuwalily-sns/out|

このラむンの出力ディレクトリを Finder で開いた際、macOS が自動で .DS_Store を生成したした。Python の fnmatch.fnmatch(".DS_Store", "*") は True を返したす。os.walk はドットファむルを陀倖したせん。結果ずしお、ゞョブが䜕も出力しおいないのに「週出力数: 1」ず衚瀺されおしたいたした。

zero_weeks が1の時点で出力が1本だず 🟢 の刀定になりたす。「問題なし」に芋えるのに実際はゞョブが死んでいた、ずいう誀怜知です。

暫定の盎し方は conf の3列目に明瀺的な拡匵子を指定するこずです。

sns-bokuwalily|~/dev/bokuwalily-sns/out|*.md

根本的には weekly_file_count の䞭でドットファむルを陀倖するフィルタを远加するべきですが、「glob を明瀺しないラむンは運甚者の責任」ずいう割り切りで珟状は蚭蚈しおいたす。

revenue.jsonl の source 名をタむポしお売䞊が迷子になった

rev.sh で売䞊を蚘録するずき、source の名前は revenue-gate.conf の name 列ず完党䞀臎しないずいけたせん。

{"date":"2026-07-01","source":"affiliate","amount_jpy":8400,"note":"Amazon報酬"}

私が実際にやったミスは affiliate-livedoor の぀もりで affiliate ず打っおしたったこずです。8,400円の売䞊が affiliate-livedoor ラむンではなく affiliate ラむンに蚈䞊されたした。気づいたのはレポヌトを芋たずき。affiliate-livedoor の zero_weeks がリセットされおいないのに affiliate だけリセットされおいたからです。

症状の特城は「合蚈収益は正しいが、ラむンの刀定がズレる」ずいう点です。合蚈で芋るず売䞊は入っおいるのに、特定ラむンが氞遠に🟡から䞊がっおこない。

修正は revenue.jsonl を盎接線集するこずです。JSON Lines なので間違えた行を正しい source 名で曞き盎したす。ただし状態ファむルの zero_weeks は圓週のカりントを再蚈算しないので、修正埌に REVENUE_GATE_FORCE=1 で匷制再実行する必芁がありたす。

長期的な防衛策ずしお rev.sh に conf ずの突き合わせバリデヌションを远加する予定ですが、手䜜業ポむントはここだけなので「打ち間違えたら jsonl を盎す」で今は運甚しおいたす。

ASMR が14本→0本に萜ちた原因はカりント窓のズレだった

前半で觊れた「ASMRラむンが07-03の週14本から07-06の週0本に突萜した」件の実際の原因です。「ゞョブが壊れた」ず思っお調べたのですが、違いたした。

weekly_file_count は実行時刻から「過去7日間」のファむルを数えたす。

  • 07-03朚のレポヌト06-26〜07-03 のファむルを察象。ASMRゞョブが06-26朚に14本をたずめお生成しおいたため、党14本がカりントに入った。
  • 07-06日のレポヌト06-29〜07-06 のファむルを察象。06-26のファむルは窓の倖に出た。その埌1週間、ASMRゞョブは次のバッチをただ生成しおいなかった。結果れロ。

ASMRゞョブは「週1回たずめお生成」ずいう蚭蚈だったのですが、launchd が月曜起動のスケゞュヌルだったのに察し、06-26は朚曜でした。私が最初に手動で実行したのが朚曜だったため、7日サむクルがずれおいたした。

この構造的な問題は「週次レポヌトのカりント窓ず、量産ゞョブの出力サむクルが䞀臎しおいない堎合、正垞なゞョブを異垞に芋せる」ずいう点です。週1回たずめお出力するゞョブは、レポヌトの曜日ず出力日が近ければ毎週怜出されたすが、タむミングが悪いず隔週でれロになりたす。

珟状の運甚䞊の察凊は「⚠が出たら即座にゞョブが壊れたず刀断せず、盎近の出力日時を手動確認しおから刀断する」です。完璧ではありたせんが、手動監芖よりははるかにたしです。この問題に気づいたこず自䜓、レポヌトがなければ2〜3ヶ月芋過ごしおいたはずです。スクリプトが瀺す数字を「事実」ではなく「調査のトリガヌ」ずしお䜿う、ずいう距離感が重芁です。

぀たずきポむント

前半・䞭段で取り䞊げた4件set -uず環境倉数衝突・.DS_Store混入・source名タむポ・カりント窓ズレの先にも、実運甚で螏むポむントがありたす。箇条曞きでたずめたす。

  • ISO週番号の幎境界バグ date +%G%V のうち %G はISO幎カレンダヌ幎ではないを返したす。2026幎12月28日月を䟋にずるず 202701 になりたす。マヌカヌファむル名も zero_weeks のキヌも %G%V で統䞀されおいるので蚈算自䜓は狂いたせんが、「2026幎の最終週を凊理したはずなのにファむル名が2027幎になっおいる」ずいう混乱を生みたす。自前でフォヌクしお %Y%V に倉えるず完党に壊れたす。ISO weekの幎はカレンダヌ幎ずズレるこずが前提であり、このスクリプトが %G%V を遞んでいるのは理由がありたす。

  • conf に存圚しないsourceで rev.sh を叩くず売䞊が闇に消える weekly_revenue ず total_revenue はオヌプンハッシュなので任意の source 名を受け付けたす。しかしレポヌトは entriesconf の name 列だけをむテレヌトしたす。たずえば affilIate倧文字Iず打おば affiliate ラむンずは別゚ントリが生たれ、収益がどこにも衚瀺されたせん。症状は「rev.sh で蚘録したのに zero_weeks がリセットされない」です。P2で觊れた source 名タむポ同ラむン内の誀蚘録ず䌌おいたすが、こちらは「conf 自䜓に定矩のない名前ぞの蚘録」ずいう亜皮で、jq -r '.source' ~/.claude/data/revenue.jsonl | sort -u で source 䞀芧を出し、conf ず突き合わせるのが唯䞀の怜出手段です。

  • 砎損シンボリックリンクが即⚠になる weekly_file_count の先頭は if not root.is_dir(): return None です。砎損したシンボリックリンクリンク先のディレクトリが消えた・倖付けSSDが未接続などは is_dir() が False を返し、None → ⚠ 出力停止? になりたす。ゞョブが正垞皌働しおいるのにレポヌトが譊告を出し続ける状況は、たいおいここか4件目のケヌスです。出力ディレクトリを倉曎したり倖付けドラむブに移したりした埌は conf も曎新する必芁がありたす。

  • os.walk がシンボリックリンクディレクトリを远跡しない os.walk(root) のデフォルトは followlinks=False です。量産ゞョブの出力先を ~/Desktop/Article/articles ずいうシンボリックリンクで指し、実䜓が別パスにある構成だずカりントが垞に 0 になりたす。「Finder では芋えおいるのに週出力数が 0」ずいう症状が出たらこれを疑いたす。conf の出力ディレクトリ列には実䜓パスを曞くのが安党です。

  • mktemp のガヌドがない 珟行コヌドは TMP_REPORT="$(mktemp /tmp/revenue-gate.XXXXXX.md)" の埌に || exit 1 がありたせん。/tmp が枯枇するず mktemp が倱敗しお空文字を返し、> "$TMP_REPORT" がカレントディレクトリに空ファむルを生成するか、Pythonの出力が捚おられたす。通垞のMacでは発生したせんが、/tmp を共有するCI環境や残量が逌迫したマシンでは起きたす。フォヌクしお䜿う堎合は || { echo "ERROR: mktemp failed" >> "$LOG"; exit 1; } を远加しおください。

  • 収益集蚈窓ずファむルカりント窓の基準点がズレる 収益集蚈は week_start = report_date - timedelta(days=7)日付ベヌス、0:00:00起点、ファむルカりントは datetime.now().timestamp() - (7 * 24 * 60 * 60)実行時刻ベヌス、8:20:00起点です。ちょうど7日前のファむルがどちらの窓に入るかで刀定が倉わるこずがありたす。「今週の収益はあるのに出力れロ」「出力はあるのに収益れロ」ずいう1日分のズレが境界付近で生じたす。実運甚䞊は誀差の範囲ですが、日次バッチで1ファむルず぀生成するラむンでは粟床に圱響したす。

  • launchd のログには Python の stdout が入らない plist の StandardOutPath ず StandardErrorPath は同じ revenue-gate-launchd.log を指しおいたす。しかし埋め蟌みPythonの print() 出力はシェルの > "$TMP_REPORT" にリダむレクトされるため launchd.log には残りたせん。Python 偎にデバッグ出力を入れお launchd.log を远いかけおも䜕も出おこない理由はここにありたす。Python のデバッグ出力は import sys; sys.stderr.write("debug\n") ずしお stderr に流すず launchd.log に入りたす。

  • 新ラむンを远加した週は過去のれロ履歎が匕き継がれない conf に新しいラむンを远加した週、zero_weeks.get(name, 0) で 0 からカりントが始たりたす。これはコヌド䞊正しい動䜜ですが、「conf 远加前から数週間皌いでいないラむンを0週スタヌトで远加した」ずいう文脈が消えたす。将来🔎になったずき「い぀から䞍採算だったか」が远えたせん。新ラむンを远加するずきは revenue.jsonl に amount_jpy: 0・note: "ラむン開始" で開始蚘録を残す習慣が、埌から経緯を読むうえで圹立ちたす。

  • アヌカむブファむルは自動削陀されない マヌカヌファむル.revenue-gate-done-*は -mtime +35 -delete で35日埌に掃陀されたすが、~/Desktop/Revenue Gate/ のレポヌト本䜓ず Obsidian vault の briefs/revenue-gate/ にコピヌされたファむルは消えたせん。週次で1ファむル増え続け、1幎で50ファむル超になりたす。Obsidian の党文怜玢にレポヌトがヒットし始めたら settings.json の userIgnoreFilters に briefs/revenue-gate を远加するか、月次 cron で6ヶ月以䞊前のレポヌトを archive/ に移す凊理を足すのが珟実的です。


ベストプラクティス

3週間運甚しお敎理したルヌルを14条にたずめたす。

1. set -u を入れるなら党オプション環境倉数に :- デフォルト倀を付ける ${REVENUE_GATE_FORCE:-0} のパタヌン。launchd は新しいセッションで起動するためタヌミナルずは環境倉数が異なりたす。手動実行で通るスクリプトが launchd で無音死する最倚原因です。

2. launchd の登録は二重発火スロットにする 8:20 に加えお 13:20 も登録し、週内重耇実行はマヌカヌファむル%G%V ベヌスで防ぎたす。Mac を週末に閉じるなら必須です。plist の StartCalendarInterval が配列を受け付けるこずは公匏ドキュメントでは目立たないのでこのスニペットはそのたた䜿えたす。

3. 宛先ぞの盎接曞き出しは犁止。mktemp → Python stdout → cp の順にする Python が途䞭でクラッシュしたずき、宛先ファむルが半壊した状態で残るのを防ぎたす。if python3 ... > $TMP; then cp $TMP $DEST; fi ずいう構造が原子性の保蚌になりたす。

4. Python ヒアドキュメントは <<'PY'シングルクォヌトで曞く <<PY だずPythonコヌド䞭の $HOME や ${var} がシェルに展開されたす。珟時点でコヌド内に倉数がなくおも、将来远加したずきにシレッず壊れたす。シングルクォヌトはコストれロの保険です。

5. Python はフルパス /usr/bin/python3 で呌ぶ launchd の PATH は /usr/bin:/bin:/usr/sbin:/sbin 皋床しか通っおいたせん。python3 だけ曞くずHomebrew環境では芋぀からないこずがありたす。スクリプト冒頭で export PATH="/opt/homebrew/bin:..." を远加しおあるため実際は問題ありたせんが、Python の呌び出しにはフルパスを維持しおおくず launchd デバッグが楜になりたす。

6. conf の glob 列は省略せず必ず明瀺する *.md, *.mp3 など。省略するず * ずしお扱われ、.DS_Store・.gitkeep・__pycache__ が混入したす。出力数1になっおいるのにゞョブが止たっおいる、ずいう誀怜知の根本原因がここにありたす。

7. 収益蚘録コマンドは5秒で完結させる rev.sh note 3200 有料蚘事1本 ずいう圢匏が維持できおいるのは、蚘録が3単語で終わるからです。蚘録が手間だず続かなくなり、zero_weeks が意味をなさなくなりたす。ASP自動連携できるものは将来的にcronで自動化したすが、手動蚘録の抵抗を最小化するこずが今の珟実解です。

8. JSON Lines は jq で垞時ヘルスチェックできる状態を維持する jq -c . ~/.claude/data/revenue.jsonl > /dev/null でパヌス゚ラヌを即怜出できたす。手動線集で修正したあずは必ずこのコマンドを通しおから REVENUE_GATE_FORCE=1 で匷制再実行したす。

9. スクリプト本䜓は自動停止しない蚭蚈を維持する 🔎 KILL掚奚 はレポヌト内の文蚀であり、ゞョブを止めるアクションはコヌドに持たせおいたせん。機械が自動停止するず「なぜ止たったか」の文脈が倱われ、誀怜知で皌ぎ頭を殺すリスクがありたす。ラむン停止は人間が手動で行う。この蚭蚈思想は倉えないほうがいいです。

10. ⚠ を「ゞョブが壊れた確定」ず読たない カりント窓のズレ・シンボリックリンク問題・月次たずめ出力のタむミングなど、正垞なゞョブが ⚠ になるパタヌンが耇数ありたす。最初に確認するのは ls -lt <出力ディレクトリ> | head -5 でファむルの最終曎新日時を確認するこずです。ファむルが存圚しおmtimeが最近なら窓ズレ、存圚しなければゞョブ障害です。

11. state.json のれロ週カりントは定期的に手動確認する レポヌトには🟡 芁芳察ずだけ衚瀺されたすが、その裏にある数字は state.json にありたす。jq .zero_weeks ~/.claude/data/revenue-gate-state.json で各ラむン2週か3週かが芋えたす。3週ならそろそろ刀断を始めるタむミングです。

12. 匷制再実行の alias を甚意する .zshrc に alias rg-force='REVENUE_GATE_FORCE=1 bash ~/.claude/scripts/revenue-gate.sh' を远加しおおくず、タむポ修正埌の再集蚈が1コマンドで枈みたす。REVENUE_GATE_FORCE を手打ちするたびにスペルミスするので alias は必須です。

13. conf を線集したら必ず手動で1回実行しお出力を確認する 新ラむンを远加した盎埌や globを倉えた埌は、rg-force で即レポヌトを生成し、週出力数ず刀定が期埅通りかを確認したす。次の月曜たで埅っおから「実は蚭定が間違っおいた」に気づくず1週間分のデヌタが飛びたす。

14. 4関門リマむンドは毎週读む レポヌト末尟の「䜕のため誰が嬉しいいくら儲かるい぀芋切る」は自分で曞いた文蚀なので読み飛ばしがちです。しかし🟡が3週目に入ったラむンに察しおこの4問に答えられない堎合は、それが「止めどき」のシグナルです。KILLの刀断はここから始たりたす。


たずめ

revenue-gate.sh の構造をコヌドレベルで远っおきたした。党䜓で芋えおくるこずは1぀です。量産ラむンを増やすほど、芋る時間が枛る。 毎週月曜に自動で数字が届かなければ、14ラむンのコスト察効果を同時に把握するこずは物理的に䞍可胜です。

月商120䞇の内蚳が「どのラむンが皌いでいるか」ず「どのラむンがAPIコストを食い朰しおいるか」の䞡方を毎週把握しおいるこずで成り立っおいるように、自動化の芏暡を広げるほど「自動で止たれる仕組み」が収益を守りたす。ASMR ラむンが07-03から07-06の3日間で週14本から0本に萜ちたこずを、レポヌトがなければ数週間芋過ごしおいたはずです。

実装コストは revenue-gate.sh204行ず plist37行の2ファむル、蚭眮15分です。それで週次の収益刀断に必芁な情報が毎月曜に自動で届くなら、ROIは初日に回収できたす。

収益れロのラむンを4週間回し続けるコストが、月に䞀床でも止めおいれば浮いたAPIコストを超える前に。今週の月曜レポヌトを芋お、刀断しおください。


仕組みの党䜓像・月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?