koba · 稼働ログ

SNS ナレッジループ・システム 全体設計書

📚 ナレッジ · 2026-06-29_SNS_Knowledge_Loop_設計書
← 戻る

SNS ナレッジループ・システム 全体設計書

0. エグゼクティブサマリ


1. 全体アーキテクチャ(テキスト図)

┌────────────────────────────────────────────────────────────────────┐
│  毎朝6:00 launchd: com.koba.sns.fetch                              │
│  ├─ X (sengoku_yayaya): likes / bookmarks / tweets                  │
│  ├─ TikTok (96shi96):   [bot検知のため停止 / config無効化]          │
│  ├─ IG (meganenoshizu): [config flag enabled時のみ実行]             │
│  └─ 拡張SNS:            Threads / Note / YouTube (将来)             │
└────────────────────────────────────────────────────────────────────┘
                              │
                              ▼  raw_*.jsonl
            ┌────────────────────────────┐
            │ P1: parse + 差分検出        │
            │ (08_parse_x.py 拡張)        │
            │ 前回 _seen.json と比較       │
            └────────────────────────────┘
                              │
                              ▼  new_<sns>_<date>.jsonl
            ┌────────────────────────────┐
            │ P1: Telegram通知            │
            │ 「新規12件取得 / Cookie失効?」│
            └────────────────────────────┘
                              │
                              ▼
            ┌────────────────────────────┐
            │ P2: Haiku 4.5 仕分け        │
            │ ナレッジ/アイデア/タスク/他  │
            └────────────────────────────┘
                              │
                              ▼  classified/<date>.jsonl
            ┌────────────────────────────┐
            │ P3: koba-report ビルド       │
            │ /tasks/ /ideas/ /knowledge/ │
            └────────────────────────────┘
                              │
                              ▼  Cloudflare Pages 公開
                              │
                              ▼  毎朝7:00 launchd: com.koba.sns.briefing
            ┌────────────────────────────┐
            │ P4: 今日のタスク3件 選定     │
            │ Telegram BOSS日報通知       │
            └────────────────────────────┘
                              │
                              ▼  しずやさん消化
                              │  "秘書、task-XXX、完了"
            ┌────────────────────────────┐
            │ P4: Telegram Bot コマンド   │
            │ 完了マーク書き戻し           │
            └────────────────────────────┘
                              │
                              ▼
            ┌────────────────────────────┐
            │ P5: ループ品質改善          │
            │ needs_review / past_decisions│
            │ 月次:誤分類率レポート       │
            └────────────────────────────┘

2. データフロー

ステージ 入力 処理 出力
Fetch Cookie state playwright sns_archive/<sns>/raw_*.jsonl
Parse raw_*.jsonl 既存 08_parse_x.py 拡張 sns_archive/<sns>/{likes,bookmarks,tweets}.jsonl
Diff 上記 + _seen.json id差集合 sns_archive/<sns>/new_<date>.jsonl
Classify new_.jsonl Haiku 4.5 sns_archive/classified/<date>.jsonl
Build classified/*.jsonl koba-report build_sns.py koba-report-site/dist/{tasks,ideas,knowledge_index}/*.html
Brief classified/*.jsonl + 完了履歴 task_picker.py Telegram通知 + today/index.html
Resolve Telegram Botコマンド tg_bot_listener.py classified/<date>.jsonl 上書き + resolved.jsonl 追記
Loop resolved.jsonl past_decisions注入 次回 P2 プロンプトに混入

3. ファイル構造(既存 + 新規)

/Users/ish/Claude/40_claude/sns_archive/
├── scripts/                    [既存]
│   ├── 04_scrape_x_v2.js
│   ├── 05_scrape_tiktok.js     [config無効化]
│   ├── 06_scrape_ig_v2.js      [config flag依存]
│   ├── 08_parse_x.py
│   ├── 09_aggregate.py         [P3で置き換え予定]
│   ├── 10_diff_detect.py       [新規 / P1]
│   ├── 11_classify_haiku.py    [新規 / P2]
│   ├── 12_build_sns_hub.py     [新規 / P3]
│   ├── 13_task_picker.py       [新規 / P4]
│   └── 14_metrics.py           [新規 / P5]
├── config.json                 [新規]
│   {
│     "sns": {
│       "x":       {"enabled": true,  "username": "sengoku_yayaya"},
│       "tiktok":  {"enabled": false, "username": "96shi96",       "reason": "bot検知"},
│       "instagram":{"enabled": false, "username": "meganenoshizu", "reason": "休眠中"},
│       "threads": {"enabled": false},
│       "note":    {"enabled": false},
│       "youtube": {"enabled": false}
│     }
│   }
├── x/                          [既存]
│   ├── raw_*.jsonl
│   ├── {likes,bookmarks,tweets}.jsonl
│   └── _seen.json              [新規 / P1]
├── instagram/                  [既存]
│   └── _seen.json              [新規 / P1]
├── classified/                 [新規 / P2]
│   ├── 2026-06-30.jsonl
│   └── ...
├── done/                       [新規 / P4]
│   └── tasks_done.jsonl
├── needs_review/               [新規 / P5]
│   └── classifier.json
└── resolved/                   [新規 / P5]
    └── classifier_resolved.jsonl

~/.claude/scripts/loop/
├── sns_classifier.txt          [新規 / P2: Haikuプロンプト]
└── (既存) loop_save.py / loop_resolve.sh / loop_past_decisions.sh

~/Claude/40_claude/koba-report-site/
├── build.py                    [既存 / 拡張]
├── src/templates/
│   ├── tasks.html              [新規 / P3]
│   ├── ideas.html              [新規 / P3]
│   ├── knowledge_index.html    [新規 / P3]
│   └── today.html              [新規 / P4]
└── dist/
    ├── tasks/index.html
    ├── ideas/index.html
    ├── knowledge_index/index.html
    └── today/index.html

~/Library/LaunchAgents/
├── com.koba.sns.fetch.plist    [新規 / 6:00]
├── com.koba.sns.classify.plist [新規 / 6:30]
└── com.koba.sns.briefing.plist [新規 / 7:00]

4. Phase 1: 定期取得+差分検出+通知

4.1 実装ファイル

ファイル 役割
~/.claude/scripts/sns_fetch_all.sh 各SNSのscraperを config.json 駆動で逐次起動するラッパー
sns_archive/scripts/10_diff_detect.py parse済 .jsonl を前回 _seen.json と比較し new_<date>.jsonl を作る
~/.claude/scripts/sns_notify.sh 新規件数集計とCookie失効検知→ Telegram BOSS日報トピック129通知

ラッパー雛形:

#!/bin/bash
# ~/.claude/scripts/sns_fetch_all.sh
set -euo pipefail
STAMP=/Users/ish/.claude/scripts/.stamps/sns_fetch_$(date +%F).done
[ -f "$STAMP" ] && { echo "already done"; exit 0; }

CONFIG=/Users/ish/Claude/40_claude/sns_archive/config.json
DATE=$(date +%F)
LOG=/Users/ish/.claude/scripts/sns_fetch.log

cd /Users/ish/Claude/40_claude/sns_archive/scripts

if jq -e '.sns.x.enabled'         "$CONFIG" >/dev/null; then node 04_scrape_x_v2.js  >> "$LOG" 2>&1 || NOTIFY_FAIL=x; fi
if jq -e '.sns.instagram.enabled' "$CONFIG" >/dev/null; then node 06_scrape_ig_v2.js >> "$LOG" 2>&1 || NOTIFY_FAIL=ig; fi
# tiktok は当面 enabled=false 固定

python3 08_parse_x.py
python3 10_diff_detect.py --date "$DATE"

~/.claude/scripts/sns_notify.sh "$DATE" "${NOTIFY_FAIL:-}"
touch "$STAMP"

4.2 launchd plist 例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>com.koba.sns.fetch</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/bash</string>
    <string>/Users/ish/.claude/scripts/sns_fetch_all.sh</string>
  </array>
  <key>StartCalendarInterval</key>
  <dict>
    <key>Hour</key><integer>6</integer>
    <key>Minute</key><integer>0</integer>
  </dict>
  <key>StartInterval</key><integer>1800</integer>  <!-- 30分ごとキャッチアップ -->
  <key>RunAtLoad</key><true/>
  <key>StandardOutPath</key><string>/Users/ish/.claude/scripts/sns_fetch.out</string>
  <key>StandardErrorPath</key><string>/Users/ish/.claude/scripts/sns_fetch.err</string>
</dict>
</plist>

冪等性スタンプ(.stamps/sns_fetch_YYYY-MM-DD.done)で同日の二重実行を防止する([[launchd-idempotent-pattern]] 準拠)。

4.3 差分検出ロジック

_seen.json 形式:

{
  "x_bookmarks": {"1234567890": "2026-06-29", "1234567891": "2026-06-29"},
  "x_likes":     {"...": "..."},
  "x_tweets":    {"...": "..."},
  "ig_saved":    {},
  "ig_likes":    {}
}

10_diff_detect.py の核:

def diff(parsed_path, seen_key, seen_state, date_str, out_path):
    new_items = []
    with open(parsed_path) as f:
        for line in f:
            it = json.loads(line)
            tid = it.get('id') or it.get('url')
            if tid and tid not in seen_state.get(seen_key, {}):
                new_items.append(it)
                seen_state.setdefault(seen_key, {})[tid] = date_str
    if new_items:
        with open(out_path, 'w') as f:
            for it in new_items:
                f.write(json.dumps(it, ensure_ascii=False) + '\n')
    return len(new_items)

新規ID判定は X はツイートID、IG は media ID、Threads は post ID。SNS追加時はこの key を増やすだけ。

04_scrape_x_v2.js 改修:

if [ "$NOTIFY_FAIL" = "x_cookie" ]; then
  ~/.claude/scripts/notify_secretary.sh 異常 SNSループ \
    "Xの認証Cookieが失効しました。下記コマンドで再エクスポート願います:
node /Users/ish/Claude/40_claude/sns_archive/scripts/01_login_capture.js
保存先: ~/.claude/secrets/sns_storage_state.json"
fi

4.5 完了基準(P1)


5. Phase 2: AI仕分け

5.1 分類プロンプト全文(~/.claude/scripts/loop/sns_classifier.txt

あなたは、しずやさん(屋号「こば」/ LINE運用代行 + AI連携が差別化軸)の専属秘書AI です。
渡された SNS の保存・いいね・自投稿アイテムを、以下の4分類に振り分けてください。

【分類】
- knowledge : 後で再利用したい知識・参考事例・調査ソース
- idea      : 自分の事業に取り込みたいアイデア・MS反映候補
- task      : 具体的なアクションが必要なもの(試す・連絡する・記事化する等)
- other     : 雑談・気分・後で見ない(=破棄候補)

【knowledge を出すとき必須項目】
- topic   : ["AI/LLM", "Web/3D", "営業/マーケ", "FX/投資", "競艇", "画像/動画生成", "その他"] から1つ
- summary : 80字以内の日本語要約
- ms_link : 紐付け候補("MS5" "MS11" "MS12" "MS13" "MS15" "なし" 等)

【idea を出すとき必須項目】
- difficulty : "S"(数時間) / "M"(数日) / "L"(数週間)
- value      : 1-5(5が事業インパクト最大)
- ms_link    : 同上

【task を出すとき必須項目】
- color      : "green"(AI完結可) / "yellow"(部分AI) / "red"(人判断必須)
- est_minutes: 推定所要分
- priority   : "high" / "mid" / "low"

【自信度】
- confidence : 0.0-1.0。0.7未満は needs_review として保留してください。

【過去の人間判断(最新10件)】
{{PAST_DECISIONS}}

【入力】
{{ITEM_JSON}}

【出力】
1アイテムにつき以下スキーマのJSONを1行出力(JSONL)。コードブロックは付けないこと。
{"id":"<source_id>","class":"knowledge|idea|task|other","confidence":0.0,...}

Haiku 4.5 を claude -p 経由で呼ぶ(並列5本程度、1呼び出しあたり10アイテムをバッチング)。

5.2 出力スキーマ(JSON)

{
  "id": "x_bookmark_1734567890",
  "source": "x_bookmarks",
  "url": "https://x.com/.../status/...",
  "fetched_at": "2026-06-30",
  "class": "idea",
  "confidence": 0.82,
  "topic": "Web/3D",
  "summary": "Three.jsで物理演算+滑らかカメラ移動を実現したサンプル",
  "difficulty": "M",
  "value": 4,
  "ms_link": "MS13",
  "color": null,
  "est_minutes": null,
  "priority": null,
  "needs_review": false,
  "raw_text": "..."
}

class に応じて null 項目が変わる。needs_review=true のものは P5 の保管対象。

5.3 失敗時フォールバック

失敗パターン フォールバック
Haiku API タイムアウト キーワード分類(既存 09_aggregate.py の TOPICS 辞書)で class:"knowledge" 固定、confidence:0.3, needs_review:true
JSON パースエラー 該当行を classified/_errors_<date>.jsonl に退避、Telegram通知
全件失敗 その日の classify はスキップ、翌日に再試行(_seen.json は更新しない)

5.4 完了基準(P2)


6. Phase 3: tasks.html ハブ(koba-report統合)

6.1 UI設計(テキストモックアップ)

/tasks/index.html

┌─────────────────────────────────────────────────────────┐
│  TASKS [緑15 / 黄8 / 赤3]   [□緑 ■黄 ■赤]  [今日のみ]   │
├─────────────────────────────────────────────────────────┤
│  ▓▓▓▓▓▓▓▓▓░░░░  完了 9/26 (今週)                       │
├─────────────────────────────────────────────────────────┤
│ □ [緑] [15分] task-2026-06-30-001  high                  │
│      Higgsfield新モデル test ジョブを2本投げる            │
│      from: X bookmark @hf_official  [元URL] [Telegram完了]│
├─────────────────────────────────────────────────────────┤
│ □ [黄] [60分] task-2026-06-30-002  mid                   │
│      漫画LP のキャラ統一感、Spline版とHiggsfield版比較    │
│      from: X bookmark @comic_lp  [元URL]                 │
├─────────────────────────────────────────────────────────┤
│ □ [赤] [-]  task-2026-06-30-003  high                    │
│      Bardの代理店登録、決済情報入力(要しずやさん判断)   │
│      from: X like  [元URL]                               │
└─────────────────────────────────────────────────────────┘

/ideas/index.html

散布図:x軸=difficulty(S/M/L)、y軸=value(1-5)。右上=「すぐ手を出すべき高価値低難度」をハイライト。

value
 5 │  ●(MS11)
 4 │     ●(MS13)  ●(MS12)
 3 │  ●(MS5)         ●(MS15)
 2 │              ●(なし)
 1 │       ●(なし)
   └────────────────────────
     S       M        L  difficulty

/knowledge_index/index.html

トピック別ツリー。

AI/LLM (12件)
  ├ Claude / Anthropic (5)
  ├ MCP (3)
  └ Agent / Cline (4)
Web/3D (8件)
  ├ Three.js (4)
  └ LP事例 (4)
営業/マーケ (4件)
...

各エントリは「タイトル + 80字サマリ + 元URL + MS紐付けタグ」。

6.2 ビルドスクリプト

sns_archive/scripts/12_build_sns_hub.py

#!/usr/bin/env python3
"""classified/*.jsonl を読み、tasks/ideas/knowledge_index/today の4ページを生成"""
import json, glob, datetime
from pathlib import Path
from jinja2 import Environment, FileSystemLoader

BASE = Path('/Users/ish/Claude/40_claude/sns_archive')
SITE = Path('/Users/ish/Claude/40_claude/koba-report-site')
DONE = BASE / 'done' / 'tasks_done.jsonl'

def load_all_classified():
    items = []
    for fp in sorted(glob.glob(str(BASE / 'classified' / '*.jsonl'))):
        with open(fp) as f:
            for line in f:
                items.append(json.loads(line))
    return items

def load_done_ids():
    if not DONE.exists(): return set()
    return {json.loads(l)['id'] for l in DONE.read_text().splitlines() if l.strip()}

def main():
    items = load_all_classified()
    done  = load_done_ids()
    tasks = [i for i in items if i['class']=='task' and i['id'] not in done]
    ideas = [i for i in items if i['class']=='idea']
    knows = [i for i in items if i['class']=='knowledge']

    env = Environment(loader=FileSystemLoader(SITE / 'src' / 'templates'))
    for name, data in [('tasks', tasks), ('ideas', ideas), ('knowledge_index', knows)]:
        html = env.get_template(f'{name}.html').render(items=data, updated=datetime.date.today().isoformat())
        out = SITE / 'dist' / name / 'index.html'
        out.parent.mkdir(parents=True, exist_ok=True)
        out.write_text(html, encoding='utf-8')

if __name__ == '__main__': main()

デプロイは既存パイプラインに乗せる:

cd /Users/ish/Claude/40_claude/koba-report-site
python3 build.py                 # 既存
python3 ../sns_archive/scripts/12_build_sns_hub.py
~/Claude/automation/wrangler pages deploy dist --project-name=koba-report --branch=main

6.3 完了基準(P3)


7. Phase 4: 朝の日次ブリーフィング

7.1 タスク選定ロジック

13_task_picker.py

"""今日のタスク3件を選ぶ
   優先順位:
   1. color=green & priority=high     → 即実行枠(最大2件)
   2. color=green & priority=mid      → 即実行枠が埋まらなければ補充
   3. color=yellow & priority=high    → 「秘書に振る」枠(最大1件)
   未完了が30件超なら、過去3日以上pendingのものを最優先で繰り上げ
"""
import json, datetime
from pathlib import Path

BASE = Path('/Users/ish/Claude/40_claude/sns_archive')
DONE_IDS = ...  # 同上ロード

def pick_today():
    today = datetime.date.today().isoformat()
    pending = []
    for fp in sorted((BASE/'classified').glob('*.jsonl')):
        for line in fp.read_text().splitlines():
            it = json.loads(line)
            if it['class']!='task' or it['id'] in DONE_IDS: continue
            it['_age_days'] = (datetime.date.today() - datetime.date.fromisoformat(it['fetched_at'])).days
            pending.append(it)

    # 古い + 高優先 を上に
    def score(it):
        c = {'green':3,'yellow':2,'red':1}[it['color']]
        p = {'high':3,'mid':2,'low':1}[it['priority']]
        return (it['_age_days'] >= 3, c, p)
    pending.sort(key=score, reverse=True)

    green_high = [i for i in pending if i['color']=='green' and i['priority']=='high'][:2]
    green_mid  = [i for i in pending if i['color']=='green' and i['priority']=='mid'][:2]
    yellow_h   = [i for i in pending if i['color']=='yellow' and i['priority']=='high'][:1]

    picks = (green_high + green_mid)[:2] + yellow_h[:1]
    return picks[:3], len(pending)

7.2 Telegram通知設計

~/.claude/scripts/sns_briefing.sh から notify_secretary.sh 経由でBOSS日報トピック129へ:

🌅 今日のタスク (2026-06-30)

✅ 残: 23件 / 完了: 9件(過去7日)

1. [緑/15分] task-2026-06-30-001
   Higgsfield新モデル test ジョブ2本
   → https://koba-report.pages.dev/tasks/#task-2026-06-30-001

2. [緑/30分] task-2026-06-30-004
   X bookmark "AI agent最新事情" を knowledge 化
   → https://koba-report.pages.dev/tasks/#task-2026-06-30-004

3. [黄/60分] task-2026-06-30-002
   漫画LPのキャラ統一比較スライド下書き
   → https://koba-report.pages.dev/tasks/#task-2026-06-30-002

完了マーク方法:
「秘書、task-2026-06-30-001、完了」とこのトピックに返信

7.3 完了マーク Bot コマンド

~/.claude/scripts/sns_bot_listener.py(launchd 5分間隔で polling、または Telegram Bot webhook):

"""Telegram BOSS日報トピック129 を polling し、
   '秘書、task-XXX、完了' 形式メッセージを検出。
   tasks_done.jsonl に追記し、リアクション ✅ を返す。
"""
import re, json, datetime, requests, os
TOKEN  = os.environ['TELEGRAM_BOT_TOKEN']
CHAT   = -1001234567890   # BOSS日報
TOPIC  = 129
DONE   = '/Users/ish/Claude/40_claude/sns_archive/done/tasks_done.jsonl'
PAT    = re.compile(r'秘書[、,\s]+(task-\d{4}-\d{2}-\d{2}-\d{3})[、,\s]+完了')

def handle(update):
    msg = update.get('message') or {}
    if msg.get('message_thread_id') != TOPIC: return
    m = PAT.search(msg.get('text') or '')
    if not m: return
    tid = m.group(1)
    with open(DONE, 'a') as f:
        f.write(json.dumps({
            'id': tid,
            'done_at': datetime.datetime.now().isoformat(),
            'message_id': msg['message_id'],
        }) + '\n')
    requests.post(f'https://api.telegram.org/bot{TOKEN}/setMessageReaction', json={
        'chat_id': CHAT, 'message_id': msg['message_id'], 'reaction':[{'type':'emoji','emoji':'✅'}]
    })

派生コマンド:

ビルド再実行は完了マーク受信時に launchd ジョブ com.koba.sns.rebuild を kickstart:

launchctl kickstart -k gui/$(id -u)/com.koba.sns.rebuild

7.4 完了基準(P4)


8. Phase 5: ループ品質改善

8.1 過去判断のプロンプト注入方式

P2 の sns_classifier.txt{{PAST_DECISIONS}} プレースホルダに、loop_past_decisions.sh sns_classifier 10 の出力を流し込む:

- "Three.jsで物理演算..." → class:idea, ms_link:MS13, value:4
- "AI agent最新事情まとめ..." → class:knowledge, topic:AI/LLM, ms_link:MS5
- "漫画LPの構成案..." → class:task, color:green, est_minutes:30
- "Switchのゲーム話..." → class:other
- "FX手法アイデア..." → class:idea, ms_link:なし, value:2

書き戻し元:

イベント 書き戻し
tasks_done.jsonl に追加 「この分類は正しかった」とラベル付け、resolved.jsonl へ
tasks_rejected.jsonl に追加 「class:taskは過剰だった」→ class:other 寄りに学習
しずやさんが手動で MS紐付け修正 resolved.jsonlms_link:XXX→YYY を記録
needs_review の人判断 loop_resolve.sh sns_classifier <id> <resolution>

8.2 メトリクス

14_metrics.py(週次 launchd):

指標 定義 良い方向
分類確定率 confidence>=0.7 件数 / 全件 高い
needs_review率 needs_review=true / 全件 適度(高すぎると人負荷、低すぎるとAI過信)
完了率(task) tasks_done件数 / task総数(直近30日) 高い(消化が回ってる証拠)
却下率(task) tasks_rejected件数 / task総数 低い(class:taskの精度指標)
アイデア採用率 ideas_adopted / idea総数 中程度(厳しすぎず緩すぎず)
誤分類率 手動修正 / 全classified 月次で下降していくのが理想
P50/P95 消化時間 task picked → done 短い

出力先:~/Claude/30_daily/週次レビュー_YYYY-WW.md に自動追記+Telegram送信。

8.3 完了基準(P5)


9. IGプラグイン対応・他SNS拡張

9.1 抽象化方針

各SNSは以下のインタフェース契約だけ満たせばよい:

契約項目 内容
scripts/<NN>_scrape_<sns>.js raw_*.jsonl 出力(または .py
scripts/08_parse_<sns>.py raw→{likes,bookmarks,posts}.jsonl 正規化
config.jsonenabled フラグ true なら fetch対象
_seen.json の key prefix ig_saved, threads_likes 等で衝突回避

正規化スキーマ(全SNS共通):

{"id":"...", "source":"x_bookmarks|ig_saved|threads_likes|...",
 "url":"...", "author":"...", "text":"...", "fetched_at":"YYYY-MM-DD",
 "likes":0, "extra":{...}}

これさえ満たせば P2/P3/P4 は無改修で動く。

9.2 IG再開時の手順

  1. config.jsonsns.instagram.enabled = true
  2. 01_login_capture.js でIG用Cookie取得(既存storage_stateに上書きされる)
  3. 翌朝の launchd が自動で 06_scrape_ig_v2.js を呼ぶ
  4. parse は既存IG用ロジックを 08系に追加(または 08_parse_ig.py)

9.3 Threads / Note / YouTube 追加

いずれも config.json に1ブロック足して enabled=true にすれば組み込まれる。


10. orchestrator 投入用 5本の依頼文ドラフト

各依頼文は ~/.claude/secretary/orchestrator.sh request "<title>" "<body>" 形式で投入可。コピペで使えるよう本文だけ列挙。

10.1 P1 投入文

タイトル: SNSナレッジループ Phase1 定期取得+差分検出+通知

設計書: /Users/ish/Claude/40_claude/koba-report-site/knowledge/2026-06-29_SNS_Knowledge_Loop_設計書.md
担当範囲: 設計書の「## 4. Phase 1」全てを実装する。

実装タスク:
1. /Users/ish/Claude/40_claude/sns_archive/config.json を新規作成(x:enabled true, tiktok:false, ig:false)
2. /Users/ish/Claude/40_claude/sns_archive/scripts/10_diff_detect.py を新規作成(_seen.json方式)
3. ~/.claude/scripts/sns_fetch_all.sh を新規作成(jq駆動ラッパー、stamp冪等)
4. ~/.claude/scripts/sns_notify.sh を新規作成(新規N件 / Cookie失効 / 異常 の3パターン通知)
5. 04_scrape_x_v2.js にログインリダイレクト検知を追加し、Cookie失効時はexit code 2を返すよう改修
6. ~/Library/LaunchAgents/com.koba.sns.fetch.plist を作成し launchctl bootstrap
7. RunAtLoad で1回走らせ、Telegram BOSS日報トピック129に通知が届くまで確認

完了基準: 設計書 4.5 のチェックリスト全項目
通知先: BOSS日報トピック129

10.2 P2 投入文

タイトル: SNSナレッジループ Phase2 AI仕分け (Haiku 4.5)

設計書: /Users/ish/Claude/40_claude/koba-report-site/knowledge/2026-06-29_SNS_Knowledge_Loop_設計書.md
担当範囲: 設計書の「## 5. Phase 2」全てを実装する。

前提: Phase 1 完了済(new_<date>.jsonl が毎日生成される状態)

実装タスク:
1. ~/.claude/scripts/loop/sns_classifier.txt を新規作成(設計書 5.1 のプロンプト全文)
2. /Users/ish/Claude/40_claude/sns_archive/scripts/11_classify_haiku.py を新規作成
   - claude -p --model claude-haiku-4-5 でバッチ10件並列5本
   - 出力スキーマは設計書 5.2 を厳守、jsonschema検証
3. フォールバック(Haiku落ち時)として 09_aggregate.py のTOPICS辞書を流用するヘルパーを内包
4. ~/Library/LaunchAgents/com.koba.sns.classify.plist を作成(6:30実行)
5. 連続3日テスト走行し、needs_review率が10-40%に収まることを確認

完了基準: 設計書 5.4 のチェックリスト全項目
通知先: BOSS日報トピック129

10.3 P3 投入文

タイトル: SNSナレッジループ Phase3 koba-report 統合ハブ (/tasks/ /ideas/ /knowledge_index/)

設計書: /Users/ish/Claude/40_claude/koba-report-site/knowledge/2026-06-29_SNS_Knowledge_Loop_設計書.md
担当範囲: 設計書の「## 6. Phase 3」全てを実装する。

前提: Phase 2 完了済(classified/<date>.jsonl が毎日生成される状態)

実装タスク:
1. koba-report-site/src/templates/ に tasks.html / ideas.html / knowledge_index.html を新規作成
   - tasks.html は緑黄赤フィルタ + チェックボックス + 進捗グラフ
   - ideas.html は難度×期待値の散布図(Plotly or 自前SVG)
   - knowledge_index.html はトピック別ツリー
2. sns_archive/scripts/12_build_sns_hub.py を新規作成(Jinja2)
3. koba-report-site/build.py を拡張し、ビルド末尾で 12_build_sns_hub.py を呼ぶ
4. wrangler でデプロイし、koba-report.pages.dev/tasks/ にアクセスできることを確認
5. tasks_done.jsonl が空の状態と50件入った状態の両方でビルド成功すること

完了基準: 設計書 6.3 のチェックリスト全項目
通知先: BOSS日報トピック129

10.4 P4 投入文

タイトル: SNSナレッジループ Phase4 朝の日次ブリーフィング + Telegram完了Botコマンド

設計書: /Users/ish/Claude/40_claude/koba-report-site/knowledge/2026-06-29_SNS_Knowledge_Loop_設計書.md
担当範囲: 設計書の「## 7. Phase 4」全てを実装する。これは中核機能のため詳細に。

前提: Phase 3 完了済(tasks.html が動いている状態)

実装タスク:
1. sns_archive/scripts/13_task_picker.py を新規作成(設計書 7.1 のロジック完全準拠)
2. ~/.claude/scripts/sns_briefing.sh を新規作成(13を呼んでnotify_secretaryに渡す)
3. ~/Library/LaunchAgents/com.koba.sns.briefing.plist を作成(毎朝7:00、StartInterval 1800)
4. ~/.claude/scripts/sns_bot_listener.py を新規作成(Telegram Bot API polling、5分間隔)
   - 「秘書、task-XXX、完了/却下/後回し」「秘書、idea-XXX、採用」を捕捉
   - tasks_done.jsonl / tasks_rejected.jsonl / ideas_adopted.jsonl に追記
   - 完了マーク受信後 com.koba.sns.rebuild を launchctl kickstart
5. ~/Library/LaunchAgents/com.koba.sns.bot.plist を作成(StartInterval 300)
6. ~/Library/LaunchAgents/com.koba.sns.rebuild.plist を作成(手動kick用、定期実行なし)
7. koba-report-site/src/templates/today.html を作成し、ブリーフィング3件を表示
8. 7日間の無人運用テスト:朝通知→完了マーク→再ビルド→翌朝に消えてる、までのループ確認

完了基準: 設計書 7.4 のチェックリスト全項目(特に7日連続無人運用)
通知先: BOSS日報トピック129
特記: 完了マーク受信時のリアクション✅は必須UX、外さないこと

10.5 P5 投入文

タイトル: SNSナレッジループ Phase5 ループ品質改善 (needs_review + 月次メトリクス)

設計書: /Users/ish/Claude/40_claude/koba-report-site/knowledge/2026-06-29_SNS_Knowledge_Loop_設計書.md
担当範囲: 設計書の「## 8. Phase 5」全てを実装する。daily-triage の loop パターンを sns_classifier に適用。

前提: Phase 4 完了済(朝の通知→完了マーク→再ビルドが7日間無人運用に耐えた状態)

実装タスク:
1. ~/.claude/scripts/loop/ の共通モジュール(loop_save.py / loop_resolve.sh / loop_past_decisions.sh)を sns_classifier system 用に統合
   - schema.json に sns_classifier フィールド追加
2. 11_classify_haiku.py のプロンプト先頭に loop_past_decisions.sh sns_classifier 10 を注入する処理を追加
3. needs_review/classifier.json への保管処理を 11_classify_haiku.py に追加
4. tasks_done.jsonl / tasks_rejected.jsonl 追加時に resolved/classifier_resolved.jsonl へ自動転記
5. sns_archive/scripts/14_metrics.py を新規作成(設計書 8.2 の指標を集計)
6. ~/Library/LaunchAgents/com.koba.sns.metrics.plist を作成(毎週月曜9:00)
   - 出力を ~/Claude/30_daily/週次レビュー_YYYY-WW.md に自動追記
   - 同時にTelegram BOSS日報へ要約通知
7. 1ヶ月運用後、誤分類率の推移をしずやさんに報告

完了基準: 設計書 8.3 のチェックリスト全項目(3ヶ月時点の誤分類率30%減は実装後の長期観測)
通知先: BOSS日報トピック129
特記: needs_review_pending が常時20件超になったらアラート通知を仕込むこと

11. 全体スケジュールとマイルストーン

Phase 着手予定 所要 依存 完了マイルストーン
P1 2026-06-30 1日 なし 「7/2朝、新規N件通知がTelegramに届いた」
P2 2026-07-03 1日 P1 「7/4朝、classified/.jsonl が自動生成」
P3 2026-07-05 1.5日 P2 「koba-report.pages.dev/tasks/ で緑黄赤タスクが見える」
P4 2026-07-08 2日 P3 「7/15まで7日間、無人で朝通知→完了→再ビルドが回った」
P5 2026-07-16 1日 P4 「7/22週次レビューにメトリクスが自動追記された」

合計 6.5日(実装)+ 7日(P4運用テスト)+ 月次以降の継続。


12. リスクと留意点

リスク 影響 対策
X Cookie 失効頻度(推定2週に1回) fetch全停止 P1で検知+Telegram即通知、再エクスポート手順を通知文に明記
Haiku 4.5 コスト 月数百円〜数千円見込 1日新規件数を50件上限でクリップ、超過分は翌日繰越
TikTok bot検知 TikTok運用継続不可 TikTokは config で常時 enabled=false。手動エクスポート時のみ単発実行
完了マークの取りこぼし しずやさんの体感UX低下 Bot polling 5分間隔 + ✅リアクションで明示返答
needs_review 滞留 学習燃料が貯まらない P5で常時20件超アラート、Telegram朝通知に滞留件数同梱
朝の3件が常に同じ系統に偏る 飽き+ナレッジ偏向 task_picker に「同topic連続3日NG」ルールをP5で追加検討
連休・出張で消化止まる tasks溜まる 朝通知に「未消化が30件超えました」アラート段階通知(P5)
個人情報・社外秘ブクマがレビュー対象に 機密漏洩 classified JSONL を git ignore、Vault のObsidian同期も対象外フォルダ化

13. 参考リンク


(設計者: 秘書 / 2026-06-29 / 次回見直し: P1完了時にP2着手前の前提整理)