※この記事は、Claude Codeで1人開発しているSNS運用SaaS「ThreadPost」の開発日記です。
SNS運用を自動化しませんか?
ThreadPostなら、投稿作成・画像生成・スケジュール管理まで全てAIにお任せ。
核心回答:41回のコミット。直らないバグ。今週の全体像
「直しました」
AIがそう出力するたびに、画面のどこかが壊れていった。
Threadsの返信タブを作ろうとしただけだ。
Xと同じUIを使い回せば一瞬で終わるはずだった。
甘かった。
自分のコメントが表示されない。
更新ボタンが反応しない。
アバターを読み込もうとして画面が完全にフリーズする。
AIにとって「コードを修正した」ことと「実際に動く」ことは全く別の現象らしい。
今週はThreadsとXのエンゲージメント機能を統合する大規模実装に挑んだ。
結果から言うと、地獄を見た。
総コミット数は41件。
新機能は3件追加できた。
しかし、公式なバグ修正のコミットは1件だけだ。
残りのコミットは全て、AIが壊したUIの微調整と尻拭いに消えた。

「fix: 返信タブで自分のコメントが表示されない問題を修正」
「fix: 返信キャッシュが表示されないバグを修正」
直しても直しても、別の場所から火の手が上がる。
UIコンポーネントの共通化という、開発のセオリーが牙を剥いた1週間だった。
[Act 1] 「直しました」の無限ループ。共通化の罠
「FeedCard」コンポーネントを共通化すれば、返信タブも他のタブと同じように動くはずだ。
XとThreads、いいね・コメント・引用・リポスト。
全部1つの画面で捌ける最強の返信タブを作りたかった。
設計思想はDRY原則だ。
同じコードを二度書かない。
他のタブで動いているコンポーネントを返信タブにも流用する。
AIに「返信タブを共通コンポーネントで作って」と指示を出した。
共通化した途端、システムが崩壊した。

まず、自分のコメントが消滅した。
相手の投稿は見えるのに、自分が何を返信したのかが画面から消え去った。
次に、Threadsの更新ボタンが動かなくなった。
何度押しても新しい返信を拾ってこない。
極めつけはアバター画像の取得だ。
Threadsのアバターを読み込もうとした瞬間、画面全体がフリーズした。
AIは何度も「修正しました」と自信満々にコードを出力してくる。
でも全く動かない。
「fix: 返信タブのFeedCardからreadOnlyを完全に削除 — 他タブと完全統一」
このコミットを入れた直後、今度はコメントの入力欄が二重に表示された。
なぜこんなことが起きるのか。
フロントエンド開発における状態管理の汚染だ。
XとThreadsでは、APIのレスポンス構造が根本的に違う。
XのAPIはフラットな構造のJSONを返してくる。
投稿データとユーザーデータが同じ階層に入っている。
ThreadsのAPIは全く違う。
投稿の中にユーザー情報がネストされた階層で入っている。
これを無理やり1つのプロパティでラップしようとした。
片方の仕様変更が、もう片方を確実に破壊する。
これが「結合度の罠」だ。
一般的に、異なるプラットフォームのAPIを統合するレイヤーは、バックエンドで吸収するのがセオリーと言われている。
僕はそれをフロントエンドのReactコンポーネント内で処理しようとしていた。
AIは目先のTypeScriptの型エラーを消すことだけを考える。
結果、Threadsのユーザー情報を読み込む部分を丸ごと削除してしまった。
しんたろー:
マジでAIの「直しました」は信用できない。41回もコミットしたのに、公式なバグ修正は1件だけ。残りは全部AIが壊したUIの尻拭いだ。自分で書いた方が早かったんじゃないかと何度も思った。
泥臭いデバッグの末、ついに突破口を見つけた。
「feat: 返信タブの既存コメントをページコメントから直接構築して確実に表示」
APIのレスポンスに頼るのをやめた。
すでにローカルのデータベースに保存されている送信済みコメントのデータを使う。
そこから直接UIを構築した。
さらに、アバターの取得も同期処理から非同期処理に切り替えた。
「feat: Threadsアバターを非同期取得に変更」
返信データだけを先に画面に出す。
アバター画像は後から裏側でこっそり取得して差し替える。
ブラウザのレンダリングブロックを回避する定石だ。
これで画面のフリーズは完全に消滅した。
最終的に引用ツイートをエンゲージメントコメントに記録する機能まで漕ぎ着けた。
表示とアクションが全プラットフォームで完全に同期された。
丸1日潰れた。
[Act 2] Xのアルゴリズムをハックする。AI返信戦略の実装
泥沼のUI共通化を乗り越え、次は攻めの実装に入った。
X公式のアルゴリズムに従い、AI返信の戦略を実装する。
XのソースコードはGitHubで公開されている。
誰でも推薦アルゴリズムの中身を見ることができる。
そこには明確なスコアリングのルールが書かれている。
単なる「いいね」のスコアは低い。
「リポスト」は少し高い。
圧倒的に高いのが「返信」だ。
さらに、その返信に対して投稿者がアクションを返すと、スコアが跳ね上がる。
つまり、相手から返信を引き出すコメントを書くことが最強のハックになる。
これをAIにやらせようとした。
5つのプロンプト戦略を用意した。
丁寧な返信、共感、受け止め、体験の追加、別視点の提示だ。
早速AIにコメントを生成させてみた。
結果は最悪だった。
「まさにその通りですね!大変参考になります!」
「素晴らしい視点です!共有ありがとうございます!」
どの戦略を選んでも、AIが量産型のスパムボットみたいな言葉を吐き出し始めた。
AI臭全開だ。
こんなコメントを送りつけたら、一発でユーザーからの信用を失う。
ミュートされるかブロックされるのがオチだ。
LLMの出力制御におけるテンプレート化問題に直面した。
最近のAIは本当にお行儀が良い。
RLHFという強化学習の影響だ。
人間のフィードバックをもとに、誰も傷つけない安全な回答をするように訓練されている。
企業のカスタマーサポートなら、これで完璧だ。
でも、SNSのタイムラインではただのノイズになる。
SNSで求められているのは、適度な雑さと人間味だ。
しんたろー:
AIに「人間らしく書け」って指示しても無駄。あいつら「人間らしさ」を「絵文字をたくさん使うこと」だと勘違いしてる。プロンプトの限界を感じて、力技でいくことにした。
プロンプトでお願いするのをやめた。
力技でいくことにした。
「fix: AI臭の禁止ワード対応強化 + ポストプロセス置換追加」
禁止ワードリストを作った。
「まさに」「参考になります」「素晴らしい」といった言葉をシステム側で弾く。
生成されたテキストをポストプロセス置換で強制的に書き換える仕組みを入れた。
正規表現を使って、AI特有の言い回しを空文字に置換していく。
さらに、戦略の中に「Contrarian+Expert」という型を追加した。
あえて相手の意見に少しだけ異論を唱える。
議論を誘発する。
結果、驚くほど自然で、思わず返信したくなるようなコメントが生成されるようになった。
泥臭い試行錯誤の末に、アルゴリズムをハックする武器を手に入れた。
送信済みコメントに戦略タイプのバッジを表示するUIも追加した。
ただし、たまに空気を読まないマジレスを生成して冷や汗をかく。
ここまで読んだあなたに
今なら無料で全機能をお試しいただけます。設定後は完全放置でプロ品質の投稿を毎日生成。
落とし穴:完璧なコードが動かない。まさかの原因
Threadsの返信更新ボタンを実装した。
「feat: 返信タブの更新ボタンでX APIから最新の返信を取得するように修正」
ボタンを押して、最新の返信を引っ張ってくる。
シンプルな機能だ。
だが、ボタンを押してもThreadsのデータが一切更新されない。
ネットワークのタブを見ても、APIへのリクエストすら飛んでいない。
コンソールログをあちこちに仕込んで、データの流れを追った。
小一時間悩んで、コードを一行ずつ確認した。
原因は信じられないほどアホらしかった。
「fix: フロントエンドの選択プラットフォームがXのガードで返信リフレッシュがThreadsで呼ばれなかった」
関数を呼び出す手前に、プラットフォームがXかどうかを判定するガード句が書かれていた。
Xの時しか動かないように自分で制限をかけていたのだ。
そりゃ動かんわ。
しんたろー:
1時間悩んで原因が自分の書いたif文だった時の虚無感。AIのせいにしてたけど、最後は自分のポンコツ具合に泣けた。コーヒー淹れてくる。
数字で見る開発のリアル
今週の作業を数字で振り返る。
| 指標 | 今回の実績 | 比較対象 |
| --- | --- | --- |
| コミット数 | 41件 | 先週の同機能開発は15件 |
| 新機能追加 | 3件 | バグ修正は1件のみ |
| メンション取得APIコスト | 追加なし | 一般的な外部ツールなら月額数千円 |
| 返信のアルゴリズム評価 | 非常に高い | いいねの評価は低い(一般論) |
APIコスト削減のハックについて少し深掘りする。
「feat: 相手起点のメンションとリプライを返信タブに表示」
普通にAPIを叩いてメンションを取得すると、リクエスト制限をゴリゴリ削ることになる。
そこで、Xの検索機能を使って特定のユーザー宛ての未マッチ投稿を記録する手法をとった。
これでAPIの追加コストはかからない。
開発工数はかかったが、ランニングコストを抑える1人SaaSの生存戦略だ。
AI開発の裏側FAQ
Q: なぜThreadsの返信取得はXより複雑なのか?
A: ThreadsのAPIはネストされた会話の取得に再帰的なリクエストが必要になる。1階層ずつ順番に掘り下げていかないと全体のツリーが構築できない。そのため、単純な一覧取得に比べてAPIのレート制限に引っかかりやすい構造になっている。
Q: AIが生成したコードのデバッグは具体的にどう進めたのか?
A: コンソールログを各コンポーネントのレンダリング直前に仕込み、データの欠落ポイントを特定した。AIが生成した巨大な差分を一度全て破棄し、1機能ずつ手作業でマージし直す作業を繰り返した。自動テストが追いつかないUIの不具合は、目視と手動クリックで直すしかない。
Q: LLMの出力制御でプロンプト以外の方法を選んだ理由は?
A: プロンプトで「自然な言葉で」と指示しても、LLMの安全フィルターが働いて無難な回答に戻ってしまう。システム側で禁止ワードを弾き、強制的にテキストを置換する方が確実だった。結果的にAPIの呼び出し回数も減り、レスポンスも速くなった。
AIに任せきりにせず、最後は人間がUIを磨く。
泥臭いけれど、それが一番確実だ。

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