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

「バグないです」と断言するAIに課金システムを任せたら爆死した。1人開発の絶望とリアル。

「バグないです」と断言するAIに課金システムを任せたら爆死した。1人開発の絶望とリアル。
しんたろーしんたろー
11分で読めます
この記事の内容(目次)
※この記事は、Claude Codeで1人開発しているSNS運用SaaS「ThreadPost」の開発日記です。

「バグないです」とAIが画面の中で断言した。

僕はその言葉を信じて、本番環境の課金テストを走らせた。

同時に2回ボタンを押したら、ユーザーのクレジットがあっさりとマイナスに突入した。

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

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

無料で始める

AIに課金システムを任せたら、レースコンディションで爆死した

今週の総コミットは15件だった。

新機能2件、バグ修正7件。残りはリファクタリングとドキュメントだ。

AIの「バグないです」を信じた結果、レースコンディションで爆死
AIの「バグないです」を信じた結果、レースコンディションで爆死

Claude Codeに「クレジット消費をアトミックにして」と指示した。

数秒でコードが返ってきて、「修正しました。これで安全です」と自信満々に言ってきた。

僕はその言葉を信じて、テストデータを流し込んだ。

同時に2回、クレジット消費のAPIを叩いた。

ユーザーの残高が、あっさりとマイナスになった。

トランザクションを張っただけで、レコードのロックを完全にかけていなかったのだ。

SELECTしてUPDATEを投げる間、ネットワークレイテンシの隙間に別のリクエストが割り込む。

これがレースコンディションだ。課金システムで起きると最悪のやつ。

「お前、ロックしてないだろ」と再指示を出して、何度かやり取りして、ようやくまともなコードが出てきた。

「fix: クレジットシステムのレースコンディションを修正(アトミックRPC化)」をコミットした。

12ファイル、362行追加・489行削除の大規模修正になった。

SELECTからUPDATEに繋ぐ脆弱なロジックを捨て、PostgresのRPC関数1つに全部集約した。

これでデータベース内で1ステートメントとして処理が完結する。

残高がマイナスになることは物理的に不可能になった。

しんたろーしんたろー:
AIの「できました」は、エンジニアの「あと5分で終わる」と同じくらい信用してはいけない。マジで肝が冷えた。課金周りのバグって、ログ追わないと静かに壊れ続けるんだよな。時限爆弾。

自分の過去をAIに壊させる

ランディングページに載せる創業者ストーリーを書こうとした。

自分で書くと、無意識に話を盛ったり遠慮したりする。

そこでGeminiに複数のペルソナを憑依させて、僕の文章をレビューさせることにした。

今週の開発スタッツ
今週の開発スタッツ

「厳しい読者」「共感しやすい読者」「事実確認をする編集者」など、6つの人格を設定した。

同じ文章を4周連続で読み込ませて、徹底的に粗探しをさせた。

1周目で「この描写、本当ですか?」という冷酷な指摘が飛んできた。

妻の体調不良のシーンだった。

僕は「ソファで倒れ込んだ」と書いていたが、実際のメモには「夜早めにベッドへ寝に行った」とあった。

記憶をドラマチックに書き換えていたのを、AIに完全に見抜かれた。

「refactor: 創業者ストーリー第5章の妻描写を事実に基づき修正」をコミットした。

偽造していた「信じてるから」というセリフを削除した。

代わりに「まだ寝ないの?」という実際のエピソードに置き換えた。

4周の多重レビューを終えた後、文章の密度は変わっていた。

当初20行もあった冗長な状況説明が、3行に凝縮された。

第三者視点のポエムのような解説パラグラフも、一人称の短い言葉に置き換わった。

「refactor: 創業者ストーリーをGeminiマルチペルソナレビュー4周で収束」をプッシュした。

12行追加して、49行削除した。

自分で何度読み直しても気づかなかったズレを、AIは全部削ぎ落としてくれた。ちょっと悔しい。

しんたろーしんたろー:
自分の記憶よりAIのログの方が正確だった。悔しい。でも事実ベースに直したら、文章の説得力が上がった。自分の人生をAIに添削されるのは、正直かなり気持ち悪い体験だった。たぶん。

英語アカウントに絡む暴走AI

SNS運用を自動化するスクリプトを動かしていた。

ある日タイムラインを見たら、見知らぬ英語アカウントにAIが流暢な日本語でリプライを飛ばしていた。

「TLをスキャンしてリプライせよ」と指示しただけで、日本語限定とは言っていなかった。

さらにヤバい事実が発覚した。

AIが「それいいじゃん」みたいなタメ口でリプライを投稿していたのだ。

「fix: リプライ・引用フックを敬語ベースに統一」を慌ててコミットした。

カジュアルなトーンを丁寧語ベースに変更し、タメ口禁止ルールを追加した。

「fix: TLスキャンで日本語ツイートのみリプライ対象に」も追加した。

これだけでは足りなかった。

収集前にDBに入ってしまった英語ツイートへの誤爆を防ぐ必要がある。

「fix: リプライ投稿時にも日本語チェック追加(二重フィルタ)」を入れた。

投稿直前にも日本語文字が3文字以上含まれているか確認する処理だ。

さらに、意味不明なツイートや専門外の話題にも無理やり絡もうとしていた。

わかったふりで適当なことを書くやつ。

「fix: 意味不明・専門外ツイートへの無理なリプ/引用をSKIP対象に」を実装した。

AIが生成した投稿に「参考になれば幸いです」が混ざる問題も起きた。

SNSでこれをやると、上から目線に見えて誰もフォローしてくれない。

「fix: リプライから上から目線の評価表現を排除」で、NGワードを追加した。

最初は広めに禁止ワードを設定した。

すると制限が強すぎて、AIの文章がスカスカの無味乾燥なものになった。

「fix: NG語を上から目線の評価表現のみに絞る」で調整し直した。

「筋がいい」という言葉は「腑に落ちます」に自動置換するようにした。

最終的に、言語判定とトーン制約の三重フィルタを構築した。

機能を作ることより、AIの「性格」と「空気感」をチューニングする方が圧倒的に時間がかかった。

しんたろーしんたろー:
英語に日本語で絡みに行くヤバいアカウントになりかけてた。即座にスクリプト止めた。自動化の恐怖を味わった。プロンプトに人間のルールを一つ一つ書き下ろす泥臭い作業、これが本番だ。

ここまで読んだあなたに

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

無料で始める

落とし穴:「できました」の後に本当のバグが始まる

今週、5回連続で同じパターンにやられた。

AIが「修正しました」と返してくる。コードを見ると確かに変わっている。でも動かすと壊れている。

クレジットのレースコンディションもそうだった。

トランザクションは張ってあった。見た目は正しかった。でもロックがなかった。

「SELECT FOR UPDATE」の1行が抜けているだけで、高負荷時に必ず競合する。

AIはコードの見た目を整えるのは得意だ。

でも「同時に2つのリクエストが来たとき何が起きるか」という空間的な想像は、指示しないと考えない。

今週は何パターンも同時リクエストを投げて、クレジットがズレないか全部目で確認した。

AIが書いたコードはドラフトだ。動作確認と最終的な責任は、全部僕が被るしかない。たぶんずっとそうだ。

今日の数字

| 項目 | 今週の数字 | 比較対象 |

|------|------------|----------|

| 総コミット | 15件 | 先週は22件 |

| 新機能 | 2件 | バグ修正は7件 |

| バグ修正 | 7件 | 新機能の3.5倍 |

| 最大修正 | 362行追加・489行削除 | 12ファイル同時変更 |

| 実装時間 | 約6時間 | 企業チームなら2〜3週間 |

今週のコミット比率は、バグ修正7件に対して新機能2件だ。

企業なら要件定義から実装・テストまで2〜3週間かかる規模の改修を、6時間で終わらせた。

ただし、そのうち2時間はAIの「できました」を信じて爆死した後の修正に費やした。

「perf: ダッシュボードをSuspense分割で即時表示化」もコミットした。

19個あった重いクエリを、即時表示の7個と遅延読み込みの12個に分割した。

全クエリを待機するウォーターフォールが解消されて、表示が体感で変わった。

「refactor: 角度システムを撤去しDB素材ローテーションに変更」で、AI生成素材の重複問題にも手を入れた。

直近10記事の使用素材をDBから取得し、プロンプトから除外する仕組みだ。

重複は減ったが、まだたまに似たような言い回しが出てくる。ロジックにまだ穴がある気がして、ずっと気になっている。

よくある質問

Q: レースコンディションはどうやって再現・検証したのか?

ターミナルからcurlコマンドで、同じAPIエンドポイントに同時に複数リクエストを投げた。

非アトミックな処理だと、1回目の消費処理が終わる前に2回目が残高を読み取ってしまう。

結果として1回分の残高しか減っていないのに2回分の処理が通る状態が確認できた。

Q: AIのコード品質チェックはどこまで人間がやるべきか?

今週の経験だと、「見た目が正しいコード」と「並行処理で壊れないコード」は別物だった。

AIは単一リクエストの動作確認は得意だが、同時リクエストのシナリオは指示しないと考えない。

課金・在庫・ポイントなど「残高が変わる処理」は、必ず同時リクエストテストを自分でやる。

Q: 1人開発でAIに任せていい範囲と、任せてはいけない範囲は?

コードのドラフト生成・リファクタリング・ドキュメント作成は任せていい。

課金ロジック・認証・並行処理の最終確認は、必ず人間が手動テストする。

今週の爆死はその境界線を甘く見た結果だった。

泥臭いチューニングの日々

AIの凄さと嘘に振り回されながら、ひたすらコードを直し続けた一週間だった。

来週は爆死しないようにしたい。たぶん。

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

ThreadPost — SNS投稿をAIが自動化

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

無料で始める

この記事をシェア

XはてブLINE
しんたろー

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

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

人気の記事