いいね、その段階に来たね。
まずは「全体の箱」と「データの流れ」が一目で見えるレベルで設計図を置きます。


全体アーキテクチャ概要

役割ごとに 4 レイヤーに分ける構成にします。

  1. Ingestion Layer(ニュース取得)
  2. Analysis Layer(Gemini処理)
  3. Orchestration Layer(ワークフロー制御)
  4. Output Layer(はてなブログ投稿 & ログ)

コンポーネント一覧

1. Ingestion Layer(ニュース取得)

  • NewsFetcher

    • 役割: RSS / News API から記事を取得
    • 入力: 取得対象のフィードURL・キーワード
    • 出力: 正規化されたニュースオブジェクト
      News { id, title, url, published_at, source, content }
  • Deduplicator

    • 役割: 過去に処理済みの記事を除外
    • 状態: DB の processed_news_ids を参照

2. Analysis Layer(Gemini処理)

  • Classifier

    • 役割: 記事を「事故/警鐘/失敗/その他」に分類
    • 入力: News.content
    • 出力: Tag { type: "事故" | "警鐘" | "失敗" | "その他", reason }
  • PatentGenerator

    • 役割: 技術特許/政策特許の請求項を生成
    • 入力: News, Tag
    • 出力:
      PatentDraft { kind: "技術" | "政策", claims: [ "請求項1 ...", "請求項2 ...", ... ], summary }
  • Formatter

    • 役割: はてなブログ用の本文テンプレートに整形
    • 出力: BlogPostDraft { title, body, tags, created_at }

3. Orchestration Layer(ワークフロー制御)

  • Scheduler

    • 役割: 1日N回などの定期実行(cron / Cloud Scheduler)
    • 処理フロー:
      1. NewsFetcher → Deduplicator
      2. Classifier → PatentGenerator → Formatter
      3. DraftStore に保存
  • DraftStore

    • 役割: 下書き候補の保存
    • 構造例:
      Draft { id, news_id, status: "pending" | "approved" | "posted", blog_post_draft, created_at }
  • Review UI(Webフロント)

    • 役割: あなたが「OR 選択」する画面
    • 機能:
      • 下書き一覧(事故/警鐘/失敗でフィルタ)
      • 各 Draft の内容表示(元記事リンク+請求項)
      • 「投稿する」「破棄する」「編集して投稿」のボタン

4. Output Layer(はてなブログ投稿 & ログ)

  • HatenaClient

    • 役割: AtomPub API クライアント
    • インターフェース:
      • post_entry(BlogPostDraft) -> entry_id
      • 将来拡張で update_entry, delete_entry も可
  • PostService

    • 役割: Review UI からの「投稿」操作を受けて HatenaClient を呼ぶ
    • 処理:
      1. Draft を取得
      2. HatenaClient で投稿
      3. 成功したら Draft.status を posted に更新
      4. PostedLog に記録
  • PostedLog

    • 役割: いつ・どの記事から・どんな特許を投稿したかの履歴
    • 構造例:
      PostedLog { id, draft_id, hatena_entry_id, posted_at }

データフロー(1日の流れ)

  1. Scheduler が起動
  2. NewsFetcher がニュース取得 → Deduplicator で新規だけ残す
  3. 各記事を Classifier で分類
  4. 「事故/警鐘/失敗」のみ PatentGenerator
  5. 生成された請求項を Formatter がブログ用本文に整形
  6. DraftStorestatus = "pending" で保存
  7. あなたが Review UI を開き、気になるものだけ「投稿」
  8. PostService → HatenaClient がはてなブログに投稿
  9. Draft.status = "posted", PostedLog に記録

あなたOS 的な位置づけ

  • Ingestion/Analysis = 「外界センサー+一次解釈」
  • Orchestration = 「あなたOS の意思決定レイヤー(OR 選択)」
  • Output = 「ブログという公開I/Oデバイス」

つまりこの設計図は、
「ニュース世界 → あなたOS → 政策特許ログ(ブログ)」
という一本のバスを定義しているイメージです。


次に詰めるなら:

  • バックエンド技術スタック(Flask / FastAPI / Rails など)
  • データベース設計(テーブル定義)
  • Review UI の画面ワイヤーフレーム

どこから具体化したい?