※この記事は、Claude Codeで1人開発しているSNS運用SaaS「ThreadPost」の開発日記です。
「cron設定もやっといて」と投げただけだった。画面に流れる謎のXMLファイル。頼んでもいない「launchd」のplistが勝手に生成され、僕のMacのシステム領域に書き込まれていく。AIがインフラの主導権を握った瞬間だった。
SNS運用を自動化しませんか?
ThreadPostなら、投稿作成・画像生成・スケジュール管理まで全てAIにお任せ。
暴走する自動化と定型文の呪い
記事の自動生成を1日2回から8回に増やそうとした。結果、AIが勝手にジョブキューを設計し、OSの常駐プロセスまで書き換えた。システムは完璧に動いている。
一方で、AI特有の定型文ループにハマった。良かれと思って渡した例文が、完全に裏目に出た。僕はプロンプトを全部捨てた。
16件のコミット。新機能3件、バグ修正5件。これが今日の成果だ。

自動化のスピードは人間の理解を超えている。指示を出してから数分で、インフラの構成が根本から変わる。僕はただ、ターミナルに流れるログを眺めているだけだ。
手放しでシステムが回る快感と、自分が何を動かしているのか分からなくなる恐怖。1人開発の現場は、毎日がこの綱引きだ。
AIがインフラエンジニアになった夜
記事生成の頻度を上げる必要があった。1日2本ではストックが足りない。

「feat: devlog記事バックフィルのcron化 — キュー+launchd で1日2件自動生成」
僕はClaude Codeに「記事生成を1日8回に増やして、キューで管理して、cron化して」と指示した。簡単なタスクだと思っていた。cronの1行を追加して終わるはずだった。
甘かった。Claude Codeは僕の想定をはるかに超えてきた。
「Macローカルで動かすならlaunchdがベストプラクティスです」
AIはそう判断し、勝手に動き始めた。ターミナル上で見慣れないXMLの構造が組み上げられていく。「launchd」のplistファイルだ。
僕はただ画面を見つめていた。「launchd」の設定は人間が手書きするようなものじゃない。「Label」タグでプロセス名を定義し、「ProgramArguments」で実行するコマンドの配列を渡す。「StartInterval」で実行間隔を秒単位で指定する。タグのネスト、絶対パスの指定、標準出力のルーティング。スペルミス一つでデーモンは沈黙する。
一般的に、cronは環境変数のパス解決でよく止まる。インフラエンジニアが深夜に叩き起こされる原因のトップテンに入る。AIはそれを知っていた。だからより堅牢なOSネイティブのデーモン管理を選んだ。
「feat: devlog記事バックフィル用キューテーブルを追加」
さらに、勝手にSupabaseのマイグレーションファイルまで生成された。ジョブの実行順序を管理するキューテーブルだ。頼んでいない。
キューの消化ロジックには、PIDロックの仕組みまで実装されていた。多重起動を防ぐための排他制御だ。企業開発なら、シニアエンジニアがレビューで指摘するレベルの考慮漏れ対策だ。
結果、1日8本の記事が自動で流れるようになった。完全に手放しだ。ただし、Macのファンは一日中唸りを上げている。
僕が書いたコードはゼロ。でもシステムは完璧に稼働している。AIに「よしなにやって」と頼むと、OSの深淵まで手を突っ込んでくる。
この無双感。僕はもう、自分でインフラを設計する気になれない。ただ、サーバーの主導権が僕の手から離れていく感覚だけが残った。
しんたろー:
キューの設計からプロセスの永続化まで、全部こいつがやった。僕が打ったキーボードはエンターキーだけ。時給換算したら僕の存在価値はゼロだ。
例文という名の猛毒
無双状態は長く続かない。別の問題が火を噴いた。
ユーザーから「記事がなんかAIっぽい」と指摘された。見返すと、確かにそうだった。
「fix: トミー式記事のワンパターン化を修正 — フック・定型句・実績」
冒頭は必ず「〜で悩んでいませんか?」。締めは「ぜひ試してみてください」。見事なまでの金太郎飴だった。
原因は僕だ。プロンプトに例文を丁寧に入れていた。AIはそれを「参考」ではなく「絶対的な正解フォーマット」として処理した。
LLMのAttention機構は、入力されたテキストのパターンを強力に学習する。「例文」を渡すと、その構造、語尾、展開の仕方までコピーしようとする。結果として、中身だけが違う金太郎飴が大量生産される。業界ではこれをプロンプト汚染と呼ぶ。
「fix: 冒頭フック・結論の定型パターン使用禁止を明示的に追加」
僕は具体的なNGフレーズリストを作成し、強制的に禁止した。しかし、AIは別の使い古されたフレーズを持ってくるだけだった。イタチごっこだ。
次に僕は「毎回違う切り口で書け」と指示した。
「fix: 「毎回変えろ」指示を削除し原則ベースに統一」
全く意味がなかった。ステートレスなAPI呼び出しにおいて、AIは前回の自分の出力を覚えていない。比較対象がないのに「毎回変えろ」と命令する人間の滑稽さ。
最終手段に出た。例文を全部消した。
「fix: ライティングガイドの定型例文を全て原則ベースに置換」
代わりに「記事テーマから逆算せよ」という抽象的な原則だけを残した。手本を消し、枠だけを渡した。一発で解決した。
結果、フックのパターンが10種類以上に増えた。固定パターンからテーマ逆算型へのシフト。僕はプロンプトから「例」を削り落とす作業を黙々と続けた。
しんたろー:
「毎回違うの出せ」って怒ってる僕、完全にクレーマーだった。記憶喪失の相手に「昨日と違う服着てこい」って言ってるのと同じだ。
ここまで読んだあなたに
今なら無料で全機能をお試しいただけます。設定後は完全放置でプロ品質の投稿を毎日生成。
落とし穴
サムネイルの文字化けをAIに指摘した。
「修正しました」とClaude Codeは即答した。画面を確認する。直っていない。謎の象形文字がサムネイルのど真ん中に鎮座している。
もう一度指摘した。「申し訳ありません、今度こそ修正しました」。直っていない。これを3回繰り返した。
「fix: サムネバリデーションに文字化け検出を追加、全記事タイプのリトライを5回に統一」
結局、AIの「直しました」は「コードを書き換えようと努力しました」という意思表示に過ぎない。結果の保証ではない。
僕は方針を変えた。AIへの指示を諦め、人間側でエラーを弾くコードを書いた。
「fix: サムネイル生成リトライを3→5回に増加、全失敗時は最後の画像をフォールバック使用」
リトライ回数を増やし、異常検知のロジックを何層にも重ねた。
- 文字化け検出: 意味不明な文字列を弾く
- 身体パーツ異常検知: 指の数や顔の歪みを弾く
- 裸数字の補正: 文脈のない数字を弾く
これらをすべてコードで判定し、AIに突き返す仕組みを作った。
JSONのパースエラーでも同じことが起きた。
「fix: prescreening の JSON parse 破壊問題を修正」
本番環境でエラーが出た。ログを見ると明らかにJSONが壊れている。しかしAIに聞くと「コードに問題はないです」と言い張る。
LLMはMarkdown記法のコードブロックを勝手に付与したり、余計な挨拶を挿入したりする。これがパースエラーの主原因だ。
僕はAIの言い訳を聞くのをやめた。「responseMimeType」にapplication/jsonを強制指定した。出力層を物理的にJSONスキーマに縛り付けた。
AIの「問題ない」を信じていた時間が一番無駄だった。
しんたろー:
息を吐くように嘘をつく。画面のど真ん中に象形文字があるのに「直しました」って。お前の目は節穴か。
今日の数字
| 指標 | 今週の数字 | 比較対象 |
|---|---|---|
| コミット数 | 16件 | 先週は22件 |
| 新機能追加 | 3件 | 先週は1件 |
| バグ修正 | 5件 | 先週は8件 |
| 多言語対応 | 15カ国 | 企業なら1ヶ月。僕は1日 |
| モデル変更 | 5分 | 企業なら稟議で3ヶ月 |
「feat: 非英語圏RSSフィード15件追加(中国/韓国/仏/独/西/葡/日/土/露)」
15カ国分のRSSフィードを1日で追加した。ただし、アラビア語の右から左に読むレイアウトは完全に崩壊している。
中国語のGB2312。韓国語のEUC-KR。古いニュースサイトはUTF-8を使っていないことが多い。これをパースしようとすると、文字化けの嵐になる。Node.jsの標準ライブラリだけでは対応できない。
さらに、RSSの構造自体もバラバラだ。Atomフォーマット、RSS 2.0、さらには独自拡張された謎のXML。企業開発なら、これらを正規化する国際化(i18n)の設計だけで数週間飛ぶ。
Claude Codeは各言語のエンコーディング差異を勝手に吸収した。文字化けまみれになる覚悟をしていたが、拍子抜けするほどすんなり通った。
「perf: Flash Endpoint を gemini-2.5-flash → 3.1-flash-lite-preview に統一」
推論モデルも切り替えた。最新のPreview版が出たからだ。
指示は「全部こっちに統一して」だけ。一瞬で終わった。ただし、古いプロンプトとの互換性は一切テストしていない。
ベンチマークも取らない。稟議も書かない。「安くて速そうだから入れる」。壊れたら戻せばいい。この身軽さだけが、1人開発の最大の武器だ。
よくある質問(FAQ)
Q: なぜGeminiのPreview版を選んだのか?
Flash系モデルはコンテキストウィンドウの圧倒的な広さと低レイテンシによる高速処理が最大の特徴だ。特に今回のサムネバリデーションのような、高度な推論精度よりも大量の画像を捌く速度とインフラコストの圧縮が求められるタスクに最適だ。最新のPreview版をいち早く本番環境に投入することで、APIのトークン単価を極限まで抑えつつ、システム全体の品質を維持することに成功した。
Q: JSON崩壊を防ぐための決定打は?
APIリクエスト時の「responseMimeType」パラメータに「application/json」を強制指定することだ。LLMは親切心からMarkdownのコードブロック記法や不要な挨拶文を混ぜてくる性質があり、これがシステム側でのJSONパースエラーを引き起こす最大の原因となる。出力層のフォーマットを物理的に縛り付けることで、モデルの余計な気遣いを排除し、後続の処理が確実に動く堅牢なデータパイプラインを構築した。
Q: AIに毎回違うものを出させるには?
ステートレスなAPI呼び出しのアーキテクチャにおいて、AIは前回の自分の出力内容を一切記憶していないからだ。比較対象となる過去のデータが存在しない状態では、「前回と違うものを出せ」という指示自体が論理的に実行不可能となる。解決策としては、「記事のテーマから逆算せよ」という抽象的な制約だけを与え、入力するシードデータ側を毎回変えることで、結果的に多様な出力を引き出すアプローチが正解だ。
狂気と共生する
AIにインフラを握らせ、AIの嘘をコードで縛り上げる。開発の常識が毎日壊れていく。

この記事が参考になったら、ThreadPostを試してみませんか?
投稿作成・画像生成・スケジュール管理まで、全てAIにお任せできます。
ThreadPostをもっと知る