TL;DR
-
content_briefsテーブル(Supabase)をコンテンツキューとして使い、weekly-content-planner が INSERT → content-executor が取り出して執筆するパイプラインを構築 - CLAUDE.md に executor の制約(1日1本・捏造禁止・エラー時の挙動)を明記することで、Claude Code が自律実行可能になる
- 失敗した 3 つのケース:project_id 混在・スクリプト missing で止まる・ExperienceBox 内の数字捏造
なぜ Supabase をブリーフキューに使ったか
記事テーマを「メモに書き溜める」運用では、毎回「今日何を書く?」を自分で決める必要があります。これが Claude Code への指示より先にある意思決定コストになり、結局アドホック執筆が続く。
Supabase の content_briefs テーブルをキューにすることで:
- weekly-content-planner(週次 routine)が GSC・GA4 データから priority 付きブリーフを自動生成
- content-executor(毎日 02:00 JST)が
ORDER BY priority ASC LIMIT 1で 1 件だけ取り出して記事を書く - status(planned → in_progress → published)でキューの状態管理
テーブル定義
CREATE TABLE content_briefs (
id SERIAL PRIMARY KEY,
brief_type TEXT NOT NULL, -- 'new' | 'rewrite'
priority INTEGER NOT NULL,
title_proposal TEXT,
slug_target TEXT,
rationale TEXT,
data_evidence JSONB,
source_type TEXT,
status TEXT DEFAULT 'planned',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
rationale と data_evidence に根拠を書くことで、executor が記事を書く際の一次情報として使える。根拠のないブリーフは executor に拾わせない設計。
executor の CLAUDE.md 記述(抜粋)
## content-executor
- 実行タイミング: 火-土 02:00 JST
- Step 1: content_briefs から planned を 1 件取得(0件なら Slack 通知して終了)
- Step 2: status を in_progress に更新
- Step 3: brief に従って MDX 記事執筆(1500-3000字)
- Step 4: 誇張 grep + lint-article-claims で品質チェック
- Step 5: git commit & push
- 禁止: 1日2本以上書かない / rationale を無視 / 数字捏造
踏んだ 3 つの失敗
-
Supabase project_id 混在 — 本番・ステージングを混在。CLAUDE.md に
project_id: xxxx(本番)と直書きで解決 - スクリプト missing で止まる — lint スクリプト不在時にエラー終了。「存在しなければ skip」を明記
-
ExperienceBox 内の捏造数値 — 「登録者 200 人」等を Claude Code が生成。
体験捏造禁止ルールを CLAUDE.md に追記
参考
詳細な実装ログ: https://masatoman.net/articles/claude-code-weekly-content-planner-routine-2026