SNS ナレッジループ・システム 全体設計書
0. エグゼクティブサマリ
- 全SNSの「いいね・ブクマ・自投稿」を毎日自動取得し、Haiku 4.5でナレッジ/アイデア/タスクに3分類、koba-report.pages.dev に統合ハブを生やす5フェーズ設計。
- 中核は 朝7:00 の「今日のタスク3件」自動通知 と Telegram完了マークBotコマンド で日々の消化動線を作ること。これにより「保存しただけ放置」を物理的に潰す。
- ループ・ゴール型(needs_review→人判断→次回プロンプト注入)を P5 で組み込み、月次で誤分類率を計測しながらAI判断精度を継続改善する。
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_ |
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 を増やすだけ。
4.4 Cookie失効対応
04_scrape_x_v2.js 改修:
- ログインリダイレクト検知(
page.url()に/login含む → cookie失効) console.error('COOKIE_EXPIRED')で exit code 2- ラッパー側で exit code 2 を捕捉し
NOTIFY_FAIL=x_cookieをセット sns_notify.sh内で:
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)
- [ ]
com.koba.sns.fetchplist 登録、6:00定時+30分インターバルキャッチアップが動く - [ ] 同日二重実行が
.stamps/で防がれている - [ ] 新規N件 → Telegram BOSS日報トピック129に件数通知
- [ ] X Cookie 失効時に再エクスポート依頼Telegramが飛ぶ
- [ ] 連続3日間、新規取得+通知が無人で回る
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)
- [ ]
11_classify_haiku.pyが new_.jsonl を入力に classified/<date>.jsonlを出力 - [ ] JSON出力がスキーマ準拠(jsonschemaで検証)
- [ ] 新規20件以上の日でも5分以内に完了
- [ ] needs_review=true の件数が Telegram 通知に含まれる
- [ ] フォールバックが想定通り動く(Haiku落とした状態で手動テスト)
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)
- [ ] koba-report.pages.dev/tasks/ が緑黄赤フィルタ+チェックボックスで動く(チェック=Telegramコマンドへの導線)
- [ ] /ideas/ に散布図表示
- [ ] /knowledge_index/ にトピック別件数表示
- [ ] 完了済タスクは tasks 一覧から自動で消える(DONE jsonl 連携)
- [ ] ビルド~デプロイが2分以内
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':'✅'}]
})
派生コマンド:
秘書、task-XXX、却下→done/tasks_rejected.jsonlに記録(P5の学習燃料)秘書、task-XXX、後回し→priorityを low に下げる秘書、idea-XXX、採用→done/ideas_adopted.jsonlに記録、MS紐付け確定
ビルド再実行は完了マーク受信時に launchd ジョブ com.koba.sns.rebuild を kickstart:
launchctl kickstart -k gui/$(id -u)/com.koba.sns.rebuild
7.4 完了基準(P4)
- [ ] 毎朝7:00 にTelegram通知 3件+残件数+URL が届く
- [ ]
秘書、task-XXX、完了で done/tasks_done.jsonl に追記、✅リアクション返却 - [ ] 完了済タスクが tasks.html から消える(再ビルド時)
- [ ] 却下/後回しコマンドも動く
- [ ] 連続7日間、朝の通知→消化→再ビルドが無人で回る
- [ ] koba-report.pages.dev/today/ に同じ3件が表示される
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.jsonl に ms_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)
- [ ] resolved/classifier_resolved.jsonl に毎日新規エントリが入っている
- [ ]
{{PAST_DECISIONS}}がP2プロンプトに毎回注入されている - [ ] 月次でメトリクスがObsidianの週次レビューに自動追記
- [ ] needs_review_pending が常時20件以下に保たれる(運用破綻していない指標)
- [ ] 3ヶ月運用後、誤分類率が初月比で30%以上低下している
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.json で enabled フラグ |
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再開時の手順
config.jsonのsns.instagram.enabled = true01_login_capture.jsでIG用Cookie取得(既存storage_stateに上書きされる)- 翌朝の launchd が自動で 06_scrape_ig_v2.js を呼ぶ
- parse は既存IG用ロジックを 08系に追加(または 08_parse_ig.py)
9.3 Threads / Note / YouTube 追加
- Threads: IG資産流用、API似ているので 06系をベースに 15_scrape_threads.js 新設
- Note: 公開API利用、scrape不要、
16_fetch_note.py単発 - YouTube: Data API v3、いいね&コメント履歴、
17_fetch_youtube.py
いずれも 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/ |
| 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. 参考リンク
- 既存スクリプト群:
/Users/ish/Claude/40_claude/sns_archive/scripts/ - 既存統合サマリ(2026-06-29時点):
/Users/ish/Claude/40_claude/sns_archive/summary_2026-06-29.md - ループ・ゴール型 共通設計:
/Users/ish/Claude/40_claude/koba-report-site/knowledge/2026-06-28_ループゴール型_秘書システム適用パターン設計.md - daily-triage(同パターン先行実装): https://daily-triage.pages.dev/
- koba-report 公開ハブ: https://koba-report.pages.dev/
- 通知スクリプト:
~/.claude/scripts/notify_secretary.sh(BOSS日報トピック129) - Telegram BOSS日報グループ:
[[telegram-groups-structure]] - launchd冪等パターン:
[[launchd-idempotent-pattern]] - 関連メモリ:
[[daily-triage-system]][[secretary-orchestrator]][[higgsfield-mcp]][[fx-weekly-skill]][[newspicks-design-skill]]
(設計者: 秘書 / 2026-06-29 / 次回見直し: P1完了時にP2着手前の前提整理)