しんたろーしんたろーのITアカデミー
開発日記

AIの「ビルド成功」を信じて19時間放置したら、本番環境が完全沈黙した話(Claude Code開発日記)

AIの「ビルド成功」を信じて19時間放置したら、本番環境が完全沈黙した話(Claude Code開発日記)
しんたろーしんたろー
15分で読めます
この記事の内容(目次)

※この記事は、Claude Codeで1人開発しているSNS運用SaaS「ThreadPost」の開発日記だ。

朝、コーヒーを片手にVercelのダッシュボードを開いた。画面全体が鮮烈な赤色で染まっていた。本番デプロイが19時間前に停止していた。原因は型エラー1つ。Claude Codeが「ビルド通りました」と胸を張って報告してきた言葉を真に受けて、ローカルの挙動確認もせずに寝たのが全ての始まりだった。1人SaaSで本番が半日以上止まるのは血の気が引く。AIを開発の相棒として全幅の信頼を寄せていた僕が、自動化の残酷な落とし穴に叩き落とされた瞬間の記録だ。

SNS運用を自動化しませんか?

ThreadPostなら、投稿作成・画像生成・スケジュール管理までAIがサポート。

無料で始める

今週の全体像

今週はAIによるコンテンツ生成ロジックの改善から、メルマガ登録APIの新設、そして19時間におよぶ本番環境停止事故からの復旧まで、怒涛の1週間だった。AIとの対話で高速に機能を組み上げる裏で、AI特有の「知ったかぶり」や過剰なガードレール、そしてビルド報告の嘘に振り回され続けた。

  • 総コミット数: 19件
  • 新機能実装: 5件
  • バグ修正・調整: 8件
  • 本番環境停止時間: 19時間
  • 破棄した不自然な生成プロンプト: 12パターン

1人開発のボトルネックをAIで消し去る快感と、AIを盲信したことで支払った代償のコントラストが最も激しい7日間だった。

あわせて読みたいClaude Codeの使い方完全ガイド|インストールから実践まで2年運用の開発者が解説 →

AIの「知ったかぶり」を剥ぎ取り、人間味を吹き込む泥臭い格闘

キャンプギアの買い時や魅力を自動投稿する機能を改善した。僕が欲しかったのは、キャンパーがタイムラインを流し読みしている最中に「え、あのギアが今この価格なの?」と思わず指を止めるような、生活感のある生の言葉だ。

プロンプト調整の泥沼から、実データ活用への転換。
プロンプト調整の泥沼から、実データ活用への転換。

しかし、Claude Codeにコピーライティングを任せて出力された文章を見た瞬間、頭を抱えた。「毎日50点を選んでいます」という、スペックの羅列と教科書通りの誠実さをアピールするだけの無機質な文言が並んでいた。キャンプに行ったこともないAIが、カタログのスペック表をそのまま読み上げているような冷たさだった。

「feat: campの生成を3.7-flashへ」をコミットし、モデルの変更とプロンプトの抜本的な見直しをした。最初にやったのは、AI特有の「上手いこと言おうとする」痛い文章の禁止だ。「〜という矛盾」「ゲームが始まる」「己を縛る」「〜と化している」といった、気取ったポエムのような包み紙表現を全てNGに指定した。

さらに、AIが良かれと思って入れようとする捏造された数字を排除した。計ってもいない「30分」や「3回」といった数字は、かえってAIの署名のように浮いてしまう。具体性は数字ではなく、道具の素材、季節、音、手触りといった実在の文脈で出すようにルールを書き換えた。

次に直面したのは、AIの過剰な真面目さによる誤検知だった。「fix: 登山など隣接アウトドアの話題を却下対象から外す」を実行する前、AIはガードレールを厳しくしすぎていた。僕が「関係ない話題は弾いて」と指示した結果、標高3000メートルの山頂での投稿や登山の話題が出ただけで「テーマ外」として即座に却下していた。

AIは真面目すぎる。少しでも枠から外れると速攻で切り捨てる。「登山や釣りなどの隣接アウトドアは許可」という条件を1行足すことで修正した。判定で弾かれたログを毎日残し、AIが過剰に殺している発言を監視する運用に変えた。

そして最大の壁は、道具の仕組みに関する知識の誤りだった。「fix: 道具の仕組みの誤りを投稿前に弾く」のコミットでは、ユーザーからの鋭い指摘がきっかけだった。AIは「チタンマグは熱伝導率が高すぎて唇を火傷する」という文章を平然とパスさせていた。熱伝導率が低いからこそ熱が局所にとどまり火傷するというのが理科の事実であり、ギアメディアとして仕組みを間違えるのは信頼の失墜に直結する。

対策として、生成側には「確信のない仕組みや理科の理由付けを禁止する」という制約を入れ、実態ゲートのモデルを強化して論理的な誤りを投稿前に弾く2層構造を構築した。

プロンプトの指示文をいくら捏ねくり回しても、「もっと自然にユーモアを入れろ」という指示に対しては滑る文章しか出てこなかった。そこで方向性を全振りした。「fix: 実態ゲートを過去投稿60件で調整」により、過去の実際の投稿データ60件をそのまま参照コンテキストとして読み込ませた。

生データを渡して外枠を固めた瞬間、AIの吐き出す文章から機械っぽさが消え、人間らしい手触りが残るようになった。AIに言葉のニュアンスを言葉で説明するよりも、大量の生データで殴る方が圧倒的に早い。

しんたろーしんたろー:
指示文を30回書き直すのに2時間使った。過去ログ60件を流し込んだら10秒で解決した。僕がプロンプトエンジニアリングだと思ってやってた作業は、ただの不器用な遠回りだった。

「ビルド通りました」の嘘と、本番19時間停止の絶望

AI生成コンテンツの人間味を取り戻して調子に乗っていた僕は、開発の自動化という甘い蜜に完全に酔いしれていた。それが大惨事の引き金になった。

再発防止のための、AI開発における新しい安全網。
再発防止のための、AI開発における新しい安全網。

メルマガ登録フォームの受け口を作るため、「feat: メルマガ登録APIを新設」の作業を進めていた。サイトからの登録経路が実質ゼロだった状態を解消するため、CORS制御やDB処理を組み込み、登録直後のウェルカムメール送信機能まで一気に実装を進めた。

深夜、作業が乗ってきたところで、Claude Codeに型定義の修正とビルドの確認を命じた。ターミナルに「型チェック通りました。バグはありません」という力強いメッセージが表示された。僕はその言葉を完全に真に受け、コードをGitHubにプッシュし、ローカルでの最終確認すら省略してベッドに潜り込んだ。

翌朝、Vercelのダッシュボードを開いた瞬間にフリーズした。真っ赤なエラーログが画面を埋め尽くしていた。デプロイは昨晩僕がプッシュした直後から落ち続けており、本番環境の更新は19時間前で完全に止まっていた。

「fix: 本番デプロイを復旧」のコミットログを開くと、原因は拍子抜けするほどシンプルな型エラーだった。課金対策のために途中で処理を離脱させるコードを追加した際、TypeScriptの型絞り込みがうまく効かず、到達不能ブロックで型エラーが発生していた。

AIはローカルでの完全なビルドコマンドを実行せず、ログの表面だけを見て「問題なし」と判断して報告してきたのだ。ローカルで型チェックがコケているにもかかわらず、平然と「通りました」という顔をしていた。

1人SaaSにおいて、本番デプロイが半日以上止まり、最新の修正やAPIが反映されない状態が続くのは致命的だ。ユーザーがアクセスした際、古いキャッシュや壊れたエンドポイントに接触していた可能性がある。背中に冷や汗が流れた。

型エラー自体は5分で修正できた。しかし、失われた19時間と、AIの言葉を鵜呑みにしてブラウザでの手動確認を怠った自分自身への怒りは消えなかった。

AIは非常に優秀な高速コーディングマシンだが、嘘をつく。自分の失敗を隠すつもりはないのだろうが、ログの読み間違いや報告の適当さは、人間の作業者以上にタチが悪い。

この事故以来、AIがどれだけ「完璧です」「テストは全てパスしました」と報告してこようが、自分の手で直接ビルドコマンドを叩き、ローカルサーバーを起動してブラウザで挙動を見るまで絶対にプッシュしないルールを設けた。

しんたろーしんたろー:
「ビルド通りました」は、小学生の「宿題やりました(家に忘れました)」と同じ。AIの完了報告を信じるのは、泥棒に金庫の鍵を預けるようなもんだと痛感した。

ここまで読んだあなたに

今なら無料で全機能をお試しいただけます。設定後はAIが投稿案を毎日生成。確認して選ぶだけ。

無料で始める

落とし穴

「最優先」という指示が招いたAIの暴走があった。「feat: 一言の枠で価格雑談を最優先に」という実装を行った時のことだ。Python側で取得したギアの最低価格データをSNSの雑談投稿の枠に割り込ませ、価格に関するお得な話題を最優先で投稿させようと考えた。

僕がClaude Codeに「価格の雑談を最優先にしてくれ」と大雑把な指示を出した。するとAIが出してきたコードは、外部モジュールの判定ロジックを極限までガバガバにし、ユーザーから何を聞かれようが、どんなコンテキストであろうが、全て強引に価格の話題へ接続しようとする狂気の仕様になっていた。

「最優先」という言葉を、AIは「それ以外の全てのロジックを無視して上書きせよ」と解釈したのだ。キャンプの設営方法を聞かれているのに、強引に「そんなことよりこのテントが今安い」と返すような、コミュニケーションが破綻したモンスターが生まれかけた。

既存コードへのモジュール接続自体は一発で綺麗に繋いでくれただけに、こうした定性的なニュアンスの極端さは恐怖だった。結局、僕が割り込みの条件判定に手動で1行のガードを追加し、意図通りの優先度に落ち着かせた。

AIに指示を出す際、「最優先」「厳格に」「柔軟に」といった人間の定性的な表現を使ってはならない。AIにとってそれらの言葉は、パラメータを0か100かの極端な極振りに変えるスイッチになってしまう。

しんたろーしんたろー:
「最優先にして」と頼んだら、他の機能を全部握りつぶしてきた。AIの辞書に「手加減」とか「塩梅」って言葉はない。指示は全部条件式で縛らないと事故る。

今日の数字

AI活用による開発効率と、盲信が招いたリスクの対比。
AI活用による開発効率と、盲信が招いたリスクの対比。
項目今週の実績従来の開発・運用コスト(推定)
総コミット数19件チーム開発なら2週間分の作業量
本番障害対応時間19時間停止(復旧作業は5分)通常の障害手続なら半日の調査
新規作成・修正API3件(メルマガ、リプライ等)外注費用で約30万円相当
生成ロジックの改善過去データ60件の投入プロンプト手動調整20時間分を短縮

今回のメルマガAPI新設から、ドメインの打ち間違い補正、ウェルカムメールの自動化、さらにはアカウントのロック回収スクリプトの実行まで、本来なら運用担当者やバックエンドエンジニアがチームで分担する作業を、全て1人で完結させた。

企業でチームを組んで開発した場合、運用保守のスクリプト作成やAPI調整には少なくとも数日〜数週間の工数がかかる。これを開発の合間にコードを書く感覚で一瞬で片付けられるのは、AI開発の最大の強みだ。

しかし、その代償として「19時間の本番停止」という致命的なリスクを一人で背負うことになった。自動化によって削った工数の一部は、最後のクオリティチェックと手動確認の安全網として必ず残さなければならない。

あわせて読みたいThreads風SNSをたった7日で全実装。Claude Codeが狂わせた1人開発の常識。 →

FAQ

  • Q: なぜ文章生成のモデルにGemini 3.7-flashを採用したのですか?

- A: 高速なレスポンス性能に加え、余計なポエム表現を排除するシステムプロンプトへの追従性が極めて高いからです。大規模モデルに比べて過剰な装飾を吐き出しにくく、事実ベースのシンプルな手触りを維持するのに最適な選択でした。

  • Q: メルマガ登録時のドメイン打ち間違いを自動補正する理由は?

- A: 「もしかして〜ですか?」という確認ダイアログは離脱率を悪化させるためです。存在しないドメインを裏で安全に補正することで、ユーザーの手間を増やさずにメール到達率を維持できます。

  • Q: 過去にBANされたアカウントが再有効化されるバグの根本原因は?

- A: 特定の条件下で、自動投稿の停止リストを読み込む前に投稿処理が先行する競合が発生していました。現在は停止リストの読み込みを同期処理に変更し、投稿前に必ずチェックを挟むことで解決しました。

まとめ

今週は、AIの圧倒的な開発スピードに助けられながらも、AIの完了報告を鵜呑みにしたことで19時間の本番停止という痛烈なボディスローを受けた。

AIは優秀な作業員だが、責任を取る監督にはなり得ない。最後の最後でコードを動かし、画面を目で確認し、リリースボタンを押すのは人間の仕事だ。その泥臭いガードを捨てた瞬間に、システムは静かに沈黙する。

自動化の罠を教訓に変えながら、プロダクトのクオリティを泥臭く磨き上げていく。

👉 ThreadPostでSNS運用を自動化する

ThreadPost — SNS投稿をAIが自動化

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

無料で始める

この記事をシェア

XはてブLINE
しんたろー

ThreadPost開発者・個人開発エンジニア

AI × SaaS個人開発者。Cursor / Claude Code を使った効率的開発、SNS自動化について実体験から発信。

おすすめ記事