AI自動化

朝起きたら通知3件が全部同じ内容」Discord bot重複バグ+X日本語化+不要ストック削除を1セッションで直した話

朝起きたら通知3件が全部同じ内容」Discord bot重複バグ+X日本語化+不要ストック削除を1セッションで直した話

この記事は約 5 分で読めます

📖 目次
  1. 📌 何が起きたか
  2. 📌 環境
  3. 📌 実際に試したこと
  4. 📌 解決までの実際の手順
  5. 📌 試してわかったこと
  6. 📌 まとめ

何が起きたか

朝のDiscord botが同じサマリーを何度も送ってきた。起きたら通知が3件届いていて、全部「おはよう朝のまとめ」。内容も重複。最初はlaunchdの設定ミスを疑ったが、bot側の_dm_queue_loop処理が原因だった。同じセッションでブログキューの古いストック6件の削除と、X投稿サムネが英語のまま上がってしまった問題も同時に抱えていた。詰まり点が3つ重なったセッション。

環境

  • MacBook Pro M5 32GB / macOS
  • Claude Code(コンテキスト引き継ぎセッション)
  • Discord bot: 01_Scripts/discord_bot/bot.py
  • ブログキュー管理: priority_stock_manager.py
  • X投稿スクリプト: sns/generate_experience_x_posts.py
  • launchd(com.taito.discord-bot

実際に試したこと

セッション開始時点でコンテキスト上限に達して引き継ぎが走っていた。前セッションの要約を受け取りながら作業継続。まずブログキューの状態確認から入った。

priority_stock_manager.pyの削除対象チェックを走らせると、noteキューは削除対象0件、ブログキューは6件がヒット。

noteキュー削除対象: 0件
blogキュー削除対象: 6件
  s080_A_20260410_priority_stock_managerが見せ.json
  s075_B_20260410_ローカルAI自動化とサーバー検出並行させる実戦検証.json
  s100_S_20260406_ClaudeAIとChatGPTの使い分け完全ガイ.json
  s080_A_20260410_ローカルAIのゴミ掃除とBlueskyでの仮説検証.json
  s080_A_20260410_macOS標準flockがなくてもPIDでロック再.json

スコアはs080〜s100と悪くないが、タイトルが旧テーマ(ChatGPT比較、ローカルAI汎用解説)で全部削除対象に入っていた。テーマ転換後の在庫整理。

次にbot.pyのdiffを確認。_dm_queue_loop関数が24行から58行に変わっていた。

@@ -475,24 +475,58 @@ async def _dm_queue_loop():

重複通知の原因はDMキューのループ処理が同一エントリを複数回拾っていたこと。修正後のdiffで変更点を確認しながら、朝のサマリー送信ロジックの重複チェック機構を追加。

X投稿のサムネイル問題は別ルートで調査した。生成されたサムネに「X/TWITTER SETUP GUIDE」という英語文字列が入ってしまっていた。画像生成プロンプト内の言語指定が抜けていたのが直接原因。

x_queueのsession_logファイルも確認しようとしたが存在しなかった。

(eval):1: no matches found: 02_Content/x_queue/session_log*.json

ファイルが生成されていなかった。このルートはいったん保留。

解決までの実際の手順

bot.py_dm_queue_loop修正が主作業。変更箇所は以下の構造になっている。

async def _dm_queue_loop():
    # 修正前: エントリの重複チェックなしで送信
    # 修正後: 送信済みフラグ管理を追加、同一エントリの再送を防ぐ
    while True:
        # fetch_user 失敗時はキューを保持して次ループへ
        except Exception as e:
            print(f"[dm] fetch_user 失敗(キュー保持): {e}", flush=True)

フェッチ失敗時にキューを保持するコードは既存だったが、成功後の送信済みマーキングが不完全で次のループでも同じエントリを処理していた。

ブログキューの6件削除はpriority_stock_manager.pyで実行。スコアは高くても旧テーマ記事はtrashへ移動するルール。削除後の在庫確認も合わせて実施。

X投稿サムネの英語問題は画像生成プロンプトを修正。日本語テキスト明示の形式に変更して再生成。

試してわかったこと

コンテキスト引き継ぎセッションは詰まり箇所が複数重なるタイミングで起きやすい。前のセッションで積み残した問題が次のセッション開始時に一気に顕在化する構造。

_dm_queue_loopの重複は、フェッチ失敗時のリトライ機構と送信済み管理が噛み合っていなかった典型パターン。ループ系の処理は「送ったかどうか」と「送れなかったかどうか」を別々に管理しないと詰まる。

ブログキューのスコアS/A/Bは品質の高さを示しているが、テーマ適合性とは別の指標。s100でも旧テーマなら投稿してはいけない。スコアだけ見て投稿判断するのは危ない。

画像生成の言語問題はプロンプトの構造依存。英語プロンプトで日本語テキスト入り画像を生成するとき、テキスト内容を明示しないと勝手に英語が入る。

まとめ

Discord botの重複通知は_dm_queue_loopの送信済み管理の不備が原因で、24行から58行への修正で解決した。ブログキューはスコアが高くても旧テーマ6件を削除、在庫の質とテーマ適合性は別管理が必要だとわかった。コンテキスト引き継ぎセッションは積み残しが重なるタイミングで発生しやすいので、セッション開始直後に状態確認を走らせるのが効く。✨

👨‍💻
一ノ瀬泰斗
AI自動化エンジニア / Python個人開発者

Claude Code × Ollama × launchd で SNS・ブログ・KDPを全自動化。実測データと失敗談を軸に、月5万円収益化のリアルな記録を発信中。