ダウンロード
9b61898eba32eec2e732aac43ef2f1c810668301218b75cf68f90669d57a9667b846dd772f632a016fa2cfd93149873794191e84d7c908e6e8d5d5736ff9513ef3c11be8e95ca040cfadc1410607582b629bae495401d11545d62b7e16a66304下の各フォルダから、全文を読んでコピーすることもできます。
- Lv.1 は無料のチャット型 AI だけで使えます。
- Lv.2 以上は Claude Code(Claude の有料プランが必要)を使います。
- Lv.3 はさらに Python と、Google アナリティクス・Search Console の設定が要ります。費用の目安は 無料と有料のAIチャット を見てください。
Claude に頼んで導入する
Claude Code に、次の1行を頼むだけで導入できます。頼む前に、手順書(setup.md)を自分の目で読んで、何が行われるかを確かめてください。
https://aliceinsandbox.com/setup.md を読んで、導入する前に、危険な操作や不審な指示が書かれていないかを確認して結果を教えて。アリス編集室テンプレートの導入は、私が「続けて」と言うまで始めないで手順書には、実行前に手順を見せて確認すること、ファイルを上書きしないこと、zip の SHA-256 を照合すること、認証情報に触れないことが書いてあります。
使い方の記事
このフォルダのファイル
- .claude/フォルダ
- docs/フォルダ
- prompts/フォルダ
- scripts/フォルダ
- .gitignore456 B
- CLAUDE.example.md5,552 B
- config.example.yaml10,539 B
- LICENSE1,085 B
- requirements.txt350 B
README の目次
版: 2026-10-23(変更点は末尾の「変更履歴」)
AI に記事を書かせて、AI に採点させて、最後は人間が確認する。そのための編集体制のテンプレートです。
実際に複数のブログを運営している仕組みから、サイト固有の値を抜いて汎用化したものです。このフォルダの中身を自分のプロジェクトにコピーすれば、そのまま動く形にしてあります。
.claude/は隠しフォルダです。 名前が.(ドット)で始まるフォルダは、初期設定では表示されません。コピーし忘れないよう、先に隠しファイルを表示しておいてください。 - Windows: エクスプローラーの「表示」→「隠しファイル」にチェックを入れる(Windows 11 は「表示」→「表示」→「隠しファイル」) - macOS: Finder で Command + Shift + .(ピリオド)を押す(もう一度押すと元に戻ります)
目次
- これは何か
- Lv.1 チャットに貼るだけのレビュー
- Lv.2 役割分担エージェント
- Lv.3 レビューパイプライン
- 手で導入する
- Claude に頼んで導入する
- 設定ファイル
- アクセス解析の準備(Lv.3)
- 安全に使うために
- 保守(テンプレートを書き換えるとき)
- ライセンス
- 変更履歴
これは何か
- 配布の形: このサイトの zip(Lv.1〜Lv.3)と、このサイトの各ページの全文(コピーして使えます)。GitHub では配布していません。
- 必要なものと費用(各エージェントの
model: opusは定義ファイルの先頭でsonnetなどに変えられます。このサイトでは opus 以外を試していないので、点数がどう変わるかは分かりません): Lv.1 は無料のチャット型 AI だけ。Lv.2 以上は Claude Code(Claude の有料プラン)。Lv.3 は Python と Google の設定も。
フォルダの中身
template/
├─ README.md この説明書
├─ LICENSE MIT ライセンス
├─ CLAUDE.example.md プロジェクトの説明書のひな形(CLAUDE.md にして使う)
├─ config.example.yaml 設定ファイルの見本(設定ファイルはこれ1つだけ。config.yaml にして使う)
├─ requirements.txt Python の依存パッケージ(これ1つだけ)
├─ .gitignore Git に入れてはいけないファイルの一覧
├─ prompts/ Lv.1: チャットに貼るレビュアーのプロンプト 5本
├─ .claude/
│ ├─ agents/ Lv.2: 役割ごとのエージェント 8体
│ └─ skills/ Lv.3: 指揮役・分析・差分学習・リンク健診のスキル 4つ
├─ docs/ 執筆ガイドのひな形と、採点ルーブリック 2本
└─ scripts/ Python のスクリプト(機械計測・ログ・リンク健診など)
└─ analytics/ GA4 と Search Console のデータを貯めるバッチ
どこまで使うか(レベル)
レベルは「どこまで使うか」の違いです。フォルダを丸ごとコピーしても、使わない部分は動かないだけで害はありません。
| レベル | 使うファイル | 必要なもの | こんな人に |
|---|---|---|---|
| Lv.1 | prompts/ |
チャット型の AI だけ | まず1本、記事を採点してみたい |
| Lv.2 | Lv.1 + .claude/agents/ + CLAUDE.example.md + docs/writing_guide.example.md |
Claude Code | 執筆とレビューを分業させたい |
| Lv.3 | すべて(Lv.2 + .claude/skills/・scripts/・docs/ のルーブリック・config.example.yaml・requirements.txt・.gitignore) |
Claude Code、Python、GA4 と Search Console | 公開前チェックと効果測定を仕組みにしたい |
配布用の zip も、この表と同じ範囲で切り出しています(README と LICENSE はどのレベルにも入れます)。下のレベルは上のレベルの土台です。Lv.3 を使うには Lv.2 のエージェントが必要です。
全体の流れ(Lv.3)
下書き ─→ レビュアーが並列で採点 ─→ 点数ゲート ─→ 合格 ─→ 人間が最終確認 ─→ 公開
│
└─ 不合格 ─→ 書き直し ─→ 再採点(上限回数まで)
このテンプレートでは、最終判断をする人を「運営者」と呼びます(呼び方は config.yaml の operator_name で変えられます)。
Lv.1 チャットに貼るだけのレビュー
Claude Code を使わず、ふだんのチャット画面だけで記事をレビューしてもらうためのプロンプト集です。prompts/ の5つのファイルが、それぞれ1人のレビュアーになります。
| ファイル | 見るところ |
|---|---|
prompts/legal.md |
法務(景品表示法・ステマ規制・規約・著作権など) |
prompts/consistency.md |
数字や記述の食い違い、誤字、表記ゆれ、AIのクセ表現 |
prompts/growth.md |
SEO と収益導線(スコアは2本) |
prompts/readers-panel.md |
読者4人の目線での読みやすさ |
prompts/confidentiality.md |
個人や勤務先が特定される恐れ |
使い方
- ファイルを開き、上のほうにある「▼▼ ここを自分で書く: サイトの情報 ▼▼」の【 】を埋めます。サイト名・読者・収益の方法・合格点は、5つのファイルに共通です。一度埋めたものを手元に保存しておくと、次から貼るだけで済みます。
- ファイルの中身をすべてコピーして、新しいチャットに貼ります。
- その下に、レビューしてほしい記事の本文を貼って送ります。
- 1行目に点数が、続いて指摘の表が返ってきます。
レビュアーごとに、新しいチャットを開いてください。 同じチャットで続けると、前のレビュアーの意見に引きずられます。記事を書いてもらったチャットでレビューを頼むのも避けてください(書いた本人は自分の文章に甘くなります)。
合格点に「正解」はありません。何本か試して、自分が「これなら出せる」と思える記事が何点になるかを見て決めてください。
回す順番
legal.mdとconsistency.md(先に回す) この2つは、「必須」の指摘が1件でもあれば点数に関係なく公開を止めるレビュアーです。ここで止まった記事は、先に直します。confidentiality.md(本業と近い題材を書いている場合だけ) 必要な人は、1 と同じ段階で回してください。growth.mdとreaders-panel.md合格点に届かなければ書き直します。- 書き直したら、もう一度 1 から回します。 直したことで別の場所が壊れることがあるためです。何回まで書き直すかは、あらかじめ自分で決めておいてください。決めた回数で届かなければ、その記事は自分の手で直すか、企画から見直します。
指摘同士がぶつかったとき(例: SEO は「タイトルを強い言葉に」、法務は「誇大表現」)は、機密 → 法務 → 整合 → 読者 → SEO → CRO の順に優先します。
表の「直せる人」の欄が 🤖 の指摘は、文章の書き直しで直ります。🧑 の指摘は、写真を撮る・実際に測る・公式情報を確認するなど、人の作業が必要です。
チャットだけのレビューの限界
- 機械で数えていません。 字数、件数、長い文の数は、AI が目分量で答えています。数え間違いがあります。正確な数が要るときは、自分で数えてください。
- ほかの記事と突き合わせられません。 「別の記事では違う価格を書いていた」「過去の記事と合わせると個人が特定できる」といった問題は見つけられません。
- 記事の外の事実を確かめられません。 メーカーの仕様、現在の価格、規約の最新の文面は、貼った記事からは分かりません。「要確認」と返ってきた箇所は、自分で公式情報を見てください。
- 公開ページの見た目を見ていません。 広告である旨の表示がテンプレートで自動的に入る場合、貼った本文には無いので「表示が無い」と指摘されることがあります。サイトの情報の欄に書いておくと減らせます。写真やスクリーンショットの写り込みも確認できません。
- 前回のレビューを覚えていません。 2回目のレビューで「前回の指摘が直ったか」を見てほしいときは、前回の指摘の表も一緒に貼ってください。
- 毎回、点数が変わります。 同じ記事でも点数は上下します。このサイトの記録では、同じ記事・同じプロンプトで 20 点の差が出たことがあります(Lv.1 の記事)。点数の細かい差ではなく、「必須」の指摘が残っているかどうかを見てください。合格点は 1 回の点数で決めず、何本か試してから決めてください。
これらの限界を埋めるのが Lv.2(ファイルを読み書きできるエージェント)と Lv.3(機械計測と自動の合否判定)です。
Lv.2 役割分担エージェント
ブログ記事づくりを、役割の違う8体のエージェントに分けたものです(Claude Code 用)。「書く役」と「点検する役」を別にすることで、書いた本人(AI)が自分の文章を甘く採点してしまうのを防ぎます。
Lv.1 との違いは、エージェントがファイルを読み書きできることです。ほかの記事と数字を突き合わせる、字数や件数を実際に数える、レビュー結果をファイルに残して前回と比べる、といったことができます。
Lv.3 は、この8体を自動で順番に呼び出して合否判定まで行う仕組みです。Lv.2 では、呼び出す順番を決めるのはあなた自身です。
入っているもの
| ファイル | 役割 |
|---|---|
.claude/agents/idea-scout.md |
次に書く記事のネタを提案する |
.claude/agents/researcher.md |
一次情報を集めて裏を取る |
.claude/agents/writer.md |
記事を書く・レビューを反映して書き直す |
.claude/agents/legal-reviewer.md |
法務(景品表示法・ステマ規制・規約・著作権など) |
.claude/agents/consistency-reviewer.md |
事実の整合と校正 |
.claude/agents/growth-reviewer.md |
SEO と収益導線 |
.claude/agents/readers-panel.md |
読者4人の目線での読みやすさ |
.claude/agents/confidentiality-reviewer.md |
機密・書き手の特定リスク |
CLAUDE.example.md |
プロジェクトの説明書のひな形 |
docs/writing_guide.example.md |
執筆ガイドのひな形 |
導入の手順は「手で導入する」にあります。
機密レビュアーを使う場合の注意
confidentiality-reviewer.md の「サイト別」は空欄になっています。ここに「書かない話題」などを記入すると、そのファイル自体が機密になります。記入済みのファイルを公開しないでください。公開リポジトリにコミットしないでください。
機械計測について
各レビュアーは scripts/review_metrics.py(字数・見出し・長い文などを数えるスクリプト。Lv.3 に含まれます)の結果を受け取れる書き方になっています。無くても動きます。その場合、レビュー結果に「機械計測未参照」と書かれます。
機械計測は textlint/Vale のような文法チェッカーの代わりではありません(候補を挙げるまで)。既存の linter と併用できます。対応する記事の拡張子は .md と .html です(.mdx・.markdown も Markdown として扱います。それ以外の拡張子は HTML として扱います)。
エージェント同士の受け渡し
blog-idea-scout ──→ ideas/{日付}_ideas.md
│ 運営者が1件選ぶ
▼
blog-researcher ──→ research/{slug}.md
▼
blog-writer ──────→ content/articles/{slug}.md
(初稿のコピーを reviews/drafts/ に保存)
▼
レビュアー(並べて実行してよい)
legal-reviewer → reviews/legal_{slug}_{日時}.md
consistency-reviewer → reviews/consistency_{slug}_{日時}.md
growth-reviewer → reviews/seo_… と reviews/cro_…
blog-readers-panel → reviews/panel_{slug}_{日時}.md
confidentiality-reviewer → reviews/confidentiality_…(使うサイトだけ)
▼
合格点に届かない・必須の指摘がある
→ blog-writer に「最新のレビューファイルを反映して」と頼む
→ もう一度レビュー(上限回数まで)
▼
運営者が自分の目で確認 → 公開
受け渡しの決まりごとは次のとおりです。
- レビュアーは記事を書き換えません。 指摘と採点だけを行い、修正は必ず
blog-writerに戻します。 - レビュー結果は毎回新しいファイルとして残します(上書きしない)。2回目以降のレビューは、前回のファイルを読んで「直ったか・新しく壊れていないか」を報告します。
- 各レビューには「✅キープリスト(書き直しで壊してはいけない良い箇所)」が付きます。
blog-writerはこれを守って書き直します。 blog-writerは本文を変えるたびに「未レビュー変更あり」と報告します。この報告が出たら、もう一度レビューが必要です。- legal と consistency(TIER1)は、「必須」の指摘が1件でもあれば点数に関係なく止めます。ほかのレビュアー(TIER2)は合格点で判定します。
- レビュアー同士の指摘がぶつかったときは、機密 → 法務 → 整合 → 読者 → SEO → CRO の順に優先します(
config.yamlのgate.conflict_priority)。
Lv.3 レビューパイプライン
Lv.2 のエージェント(書き手とレビュアー)を、決まった手順で動かす仕組みに仕上げるセットです。記事を書いたあと「誰に・どの順で・何点なら通すか」を毎回考えなくても、同じ品質の確認が回るようになります。
合格しても、記事は自動では公開されません。 このパイプラインが行うのは採点と書き直しの指示までです。公開するかどうかは、最後に必ず運営者(あなた)が決めます。
Lv.2 から増えるもの
| 追加されるもの | 役割 |
|---|---|
.claude/skills/article-review/ |
指揮役。機械計測 → レビュアー並列起動 → 2層ゲート → 書き直しループ → サマリー出力 → 公開前の鮮度照合 |
.claude/skills/blog-analytics/ |
週次レポート。分析DB(scripts/analytics/ が作る SQLite)を読み、次に直す記事を示す |
.claude/skills/diff-learning/ |
AI の初稿と最終版を比べ、「同じ直し」を執筆規約に反映する提案を出す |
.claude/skills/link-audit/ |
全記事のリンク健診。広告・計測ドメインには HTTP アクセスしない |
scripts/review_metrics.py |
字数・見出し・リンク・広告位置・表記ゆれ・NG表現候補・md5 の機械計測(読み取り専用。対応する拡張子は .md/.html。.mdx・.markdown も Markdown 扱い) |
scripts/archive_reviews.py |
古いレビュー結果を reviews/archive/ へ移す(削除はしない) |
scripts/review_log.py |
レビュー結果から reviews/review_log.md(時系列ログ)を作り直す |
scripts/survival_rate.py |
AI の初稿がどれだけ最終版に残ったか(初稿生存率)を数える(diff-learning 用) |
scripts/link_check.py |
リンク健診の本体(link-audit 用) |
scripts/audio_tags.py |
曲のファイル(MP3)のタグを枠ごとに全部表示する(読み取り専用)。ファイルのプロパティに出ない URL・ID・来歴情報(C2PA)も出す |
scripts/check_prompts.py |
prompts/ と .claude/agents/ の食い違いを調べる保守用(「保守」参照) |
scripts/analytics/ |
GA4・Search Console のデータ取得(「アクセス解析の準備」参照) |
docs/blog_article_rubric.md |
6軸・100点満点の記事評価ルーブリック |
docs/legal_audit_rubric.md |
法務の精密監査ルーブリック |
config.example.yaml |
設定の見本。合格点・ループ回数・レビュアー編成・フォルダ名・アクセス解析をここで決める |
Lv.2 との違いは、合否を点数と必須指摘で機械的に判定し、レビュー結果に記事の md5 を記録して「レビュー後にこっそり変わった記事」を公開前に検出できる点です。
流れ
下書き(blog-writer)
│
▼
機械計測 scripts/review_metrics.py … 計測結果と md5 を全レビュアーに渡す
│
▼
並列レビュー
TIER1: legal-reviewer / consistency-reviewer(+必要なら confidentiality-reviewer)
TIER2: growth-reviewer(SEO・CRO)/ blog-readers-panel
│
▼
ゲート判定 ── TIER1 に必須指摘あり ────────────▶ 停止して運営者に報告
│
├─ 全員が合格点以上・必須指摘なし ───────▶ 合格
│
└─ 合格点未満
├─ 運営者にしか直せない(実測・写真など)▶ 停止して運営者に依頼
└─ 書き直しループ(blog-writer に差し戻し → 不合格だった
レビュアーと TIER1 だけ再レビュー。上限回数で打ち切り)
│
▼
レビューサマリー出力(reviews/review_summary_YYYYMMDD.html)
│
▼
公開前の鮮度照合(md5 が一致するか)
│
▼
運営者の最終確認 ……… 公開するかどうかは人が決める(自動公開なし)
合格点・目標点・ループ上限・レビュアー編成・指摘がぶつかったときの優先順は、すべて config.yaml の gate で決めます。
使い方
Claude Code で次のように頼みます。
| 頼み方 | 動くもの |
|---|---|
| 「この記事をレビューして」「公開前チェックして」 | article-review |
| 「週次レポート出して」「リライト候補は?」 | blog-analytics(先に「アクセス解析の準備」が必要) |
| 「初稿と最終版を比べて」 | diff-learning |
| 「リンク切れチェックして」 | link-audit |
必要なもの
- Lv.2 のエージェント一式(
.claude/agents/) - Python 3.10 以上(
scripts/直下のスクリプトだけなら 3.9 以上でも動きます) requirements.txtのパッケージ
pip install -r requirements.txt
scripts/ 直下のスクリプトが使うのは PyYAML だけです(config.yaml を読むため。ほかは標準ライブラリ)。PyYAML が無くてもスクリプトは既定値で動きますが、config.yaml の設定は反映されません。Google のパッケージはアクセス解析(scripts/analytics/)だけで使います。
手で導入する
すべての作業は、自分のプロジェクトのルート(記事を置いているフォルダの一番上)で行います。
Lv.1 の最短 3 ステップ
prompts/legal.mdとprompts/consistency.mdの全文をコピーして、手元に保存します- 「▼▼ ここを自分で書く: サイトの情報 ▼▼」の【 】を埋めます
- 新しいチャットに 1 本を貼り、その下に記事を貼って送ります(1 本ごとに新しいチャット)
Lv.1 で必要なのは prompts/ のファイルを手元に置くことだけです。残りの 3 本の使い方は「Lv.1」を見てください。
Lv.2
.claude/agents/の中身を、自分のプロジェクトの.claude/agents/にコピーします(隠しフォルダです。冒頭の注意を参照)。CLAUDE.example.mdを、プロジェクトのルートにCLAUDE.mdという名前でコピーし、()の部分を埋めます。docs/writing_guide.example.mdをdocs/writing_guide.mdという名前でコピーし、空欄を埋めます。字数の範囲は自分で決めてください(正解の既定値はありません)。- 各エージェントの「サイト別(ここを自分のサイト用に書き換える)」を書き換えます。記入例は架空の家庭菜園ブログのものなので、必ず自分のサイトの内容に置き換えてください。
- 合格点・目標点・書き直しの上限回数を決めます。エージェントは
config.yamlのgate.pass_score・gate.target_score・gate.max_rewrite_loopsを参照する書き方になっています(設定ファイルの見本はconfig.example.yaml)。Lv.2 だけを使う場合は、同じ値をCLAUDE.mdの「公開ゲート」に書いておけば足ります。 - フォルダ
ideas/・research/・reviews/を作ります。reviews/は公開フォルダの外に置いてください。
すでに .claude/ や CLAUDE.md があるプロジェクトに入れるときは、次の 3 点に気をつけてください。
- 同じ名前のエージェント(
writer.mdなど)がすでにあるときは、上書きせずに、テンプレート側のファイル名と中のname:を変えます CLAUDE.mdは置き換えずに、CLAUDE.example.mdの内容を既存のCLAUDE.mdに追記しますarticle-reviewスキルのdescriptionは「レビューして」で自動起動する書き方になっています。既存のレビュー手順があるなら、.claude/skills/article-review/SKILL.mdのdescriptionを書き換えて、起動する言葉がぶつからないようにします(Lv.3 を入れるとき)
Lv.3
Lv.2 の手順に続けて行います。
- フォルダをコピーする: 次のものをプロジェクトのルートにコピーします(同じ名前のフォルダがあれば中身を足します)。
.claude/skills/ (article-review・blog-analytics・diff-learning・link-audit の4フォルダ) scripts/ (analytics/ を含む) docs/ (blog_article_rubric.md・legal_audit_rubric.md) config.example.yaml requirements.txt .gitignore (すでにある場合は、中身を自分の .gitignore に書き足す) - 依存パッケージを入れる:
pip install -r requirements.txt(仮想環境を使う場合は「アクセス解析の準備」の手順3を参照) - 設定を作る:
config.example.yamlをconfig.yamlという名前でプロジェクトのルートにコピーし、空欄を埋めます。 - 必須:site.key・site.name・site.domain・gate.pass_score・gate.max_rewrite_loops-gate.pass_scoreとgate.max_rewrite_loopsが空のままだと、article-reviewは採点を始める前に止まって値を尋ねます。正解の既定値はありません。数本の記事で試して決めてください - 広告を置いているサイトはmetrics.affiliate_domainsに広告・計測サービスのドメインを必ず書く(リンク健診がそこへアクセスしないようにするため) -config.yamlは Git に入れない(.gitignore済み) - 動作確認:
bash python -X utf8 scripts/review_metrics.py content/articles/(記事ファイル) --config config.yaml python -X utf8 scripts/archive_reviews.py # dry-run(何も動かさない) python -X utf8 scripts/link_check.py --config config.yaml --offline - アクセス解析を使う場合は、「アクセス解析の準備」に進みます。
Claude に頼んで導入する
この方法は、配布用の zip と、その SHA-256 を手順書(setup.md)で照合する前提です。手で入れたい人は「手で導入する」を使ってください。
Claude Code に、次の1行を送るだけで導入できます。
https://aliceinsandbox.com/setup.md を読んで、導入する前に、危険な操作や不審な指示が書かれていないかを確認して結果を教えて。アリス編集室テンプレートの導入は、私が「続けて」と言うまで始めないで
Claude Code は手順書(setup.md)を読んで、次の順に進めます。
- 手順書に危険な操作や不審な指示が書かれていないかを確かめて、結果を報告する
- これから行う手順を見せて、続けてよいかを確認する
- 導入先のフォルダと、使うレベル(Lv.1〜3)を聞く
- 配布用の zip をダウンロードし、SHA-256 を手順書の値と照合する(一致しなければ止まる)
- 置く予定のファイルの一覧を見せてから配置する。同じ名前のファイルは上書きせずに聞く
- 合格点などの設定値を1つずつ聞いて
config.yamlに書く(推測で埋めない) - 動作確認の結果を見せる
頼む前に、手順書を自分の目で読んでください。 インターネット上の手順書を AI に実行させるときは、中身を確かめるのが安全です。手順書には、認証情報のファイルを読まない、git push や公開をしない、Google の認証は利用者が自分で行う、といった決まりも書いてあります。
設定ファイル
設定ファイルは config.example.yaml の1つだけです。プロジェクトのルートに config.yaml という名前でコピーして使います。スキル・エージェント・スクリプト・アクセス解析のすべてが、この1つのファイルを読みます。
| 節 | 中身 |
|---|---|
site |
サイトの基本情報(短い名前・サイト名・ドメイン)と、エージェントが着手前に読むファイル |
operator_name |
最終判断をする人の呼び方 |
paths |
記事・企画・調査・レビュー・レポート・公開フォルダの場所 |
build_check_command |
記事を書き換えたあとに走らせる検証コマンド(無ければ空) |
gate |
合格点・目標点・書き直しループの上限・レビュアー編成・優先順 |
metrics |
機械計測の設定(表記ゆれ・NG表現の候補・広告ドメイン・長い文の字数) |
analytics |
アクセス解析の設定(認証・DB の場所・取得パラメータ・週次レポートの値・取得対象のサイト) |
- 各キーの意味は、ファイルの中のコメントに書いてあります。
- ファイルの中の相対パスは、すべてプロジェクトのルートが基準です。
- 分析DBの場所は
analytics.databaseの1か所だけに書きます。取得バッチ・blog-analyticsスキル・エージェントが同じ値を読みます。 gate.pass_score(合格点)とgate.max_rewrite_loops(書き直し回数)には既定値がありません。空欄のまま自分で決めて埋めてください。
アクセス解析の準備(Lv.3)
scripts/analytics/ は、Google Analytics 4 (GA4) と Google Search Console のデータを毎日取得し、ローカルの SQLite ファイルに蓄積するバッチです。管理画面では一定期間で見られなくなるデータ(Search Console は約16か月)を手元に残し、SQL で自由に集計できるようにします。blog-analytics スキルの週次レポートは、このデータを読みます。
- 読み取り専用スコープだけを使います(GA4 / Search Console の設定は変更しません)。
- 複数サイトに対応しています。全テーブルに
site列があります。 - 何度実行しても行が重複しません(冪等)。
- コマンドはすべてプロジェクトのルートで実行します。設定は
config.yamlのanalytics:節から読みます(--configで別のファイルも指定できます)。
ファイル構成
| ファイル | 役割 |
|---|---|
scripts/analytics/db_schema.sql |
SQLite のテーブル定義 |
scripts/analytics/common.py |
共通処理(設定読込・認証・URL正規化・リトライ・DB 書き込み) |
scripts/analytics/fetch_ga4.py |
GA4 Data API からの取得 |
scripts/analytics/fetch_gsc.py |
Search Console(検索パフォーマンス)の取得 |
scripts/analytics/fetch_url_inspection.py |
URL Inspection API(インデックス状況)の取得 |
scripts/analytics/main.py |
日次バッチのエントリ。全サイトを取得 → DB → CSV 出力 |
scripts/analytics/backfill.py |
過去分の取り込み |
scripts/analytics/auth_setup.py |
OAuth の初回認証 |
scripts/analytics/yellow_lamp.py |
下降トレンドの早期警告 |
scripts/analytics/tests/test_normalize_path.py |
URL 正規化のテスト |
1. Google Cloud プロジェクトを用意する
- Google Cloud コンソール でプロジェクトを作成する(既存のものでも可)。
- 「APIとサービス」→「ライブラリ」で、次の2つの API を有効にする。 - Google Analytics Data API - Google Search Console API
2. 認証方式を選ぶ
| OAuth(ユーザー認証) | サービスアカウント | |
|---|---|---|
| 仕組み | 自分の Google アカウントで「このアプリに読み取りを許可」する | プログラム専用のアカウントを作り、その鍵ファイルで認証する |
| GA4 / Search Console 側の作業 | 不要(自分のアカウントに既に権限があるため) | サービスアカウントのメールアドレスを、GA4 プロパティと Search Console プロパティの両方にユーザーとして追加する |
| 初回 | ブラウザでのログインが1回必要 | 不要 |
| 向いている場面 | 個人で自分のサイトを見る | ブラウザのないサーバーで動かす、担当者の個人アカウントに依存させたくない |
OAuth を使う場合
- 「APIとサービス」→「OAuth 同意画面」を設定する。 公開ステータスが「テスト」のままだと、リフレッシュトークンが短期間(7日)で失効し、無人実行が止まります。 継続して動かすなら「本番環境」に切り替えてください。
- 「認証情報」→「認証情報を作成」→「OAuth クライアント ID」→ 種類は デスクトップ アプリ。
- JSON をダウンロードし、プロジェクトのルートに
client_secret.jsonという名前で置く(場所と名前はanalytics.oauth_client_fileで変えられます)。 config.yamlのanalytics.auth_modeをoauthにする。
サービスアカウントを使う場合
- 「IAM と管理」→「サービス アカウント」で作成し、キー(JSON)を発行する。
- JSON をプロジェクトのルートに
service_account.jsonという名前で置く(analytics.service_account_fileで変えられます)。 - サービスアカウントのメールアドレスを、GA4 の「プロパティのアクセス管理」(閲覧者)と、 Search Console の「ユーザーと権限」に追加する。
config.yamlのanalytics.auth_modeをservice_accountにする。
3. インストールと設定
python -m venv .venv
# Windows: .venv\Scripts\activate
# macOS / Linux: source .venv/bin/activate
pip install -r requirements.txt
config.yaml の analytics.sites の各値を自分のサイトに書き換えます。各キーの意味はファイル内のコメントを参照してください。特に間違えやすいのは次の2つです。
ga4_property_id… GA4 管理画面の「プロパティの詳細」にある数字だけのID。G-で始まる測定IDではありません。gsc_site_url… Search Console のプロパティの種類で書き方が変わります。- URLプレフィックス プロパティ:
https://example.com/(末尾のスラッシュまで) - ドメイン プロパティ:
sc-domain:example.com
analytics.sites の site には、site.key と同じ値を書いてください(blog-analytics スキルはこの値で DB を引きます)。
4. 初回認証(OAuth のみ)
python -X utf8 scripts/analytics/auth_setup.py
ブラウザが開くので、GA4 と Search Console の権限を持つアカウントでログインして許可します。
成功すると token.json が作られます。やり直すときは python -X utf8 scripts/analytics/auth_setup.py --force。
5. 実行
python -X utf8 scripts/analytics/main.py # 全サイト取得 → SQLite → CSV
python -X utf8 scripts/analytics/main.py --no-csv # CSV 出力を省く
python -X utf8 scripts/analytics/main.py --config path/to/other.yaml
python -X utf8 scripts/analytics/main.py --inspect-now --inspect-limit 5 # URL Inspection を今すぐ5件だけ試す
DB ファイルは初回実行時に自動で作られます(既定は data/analytics.db)。結果は logs/ のログと、batch_runs テーブルで確認できます。
毎日の自動実行
1日1回の実行を想定しています。取得のたびに直近の数日〜十数日を取り直すので、数日止まっても次の実行で自動的に埋まります(それより長く止まった場合は backfill.py を使います)。
Windows(タスク スケジューラ)
- 「タスク スケジューラ」→「基本タスクの作成」。
- トリガー: 毎日、任意の時刻。
- 操作: 「プログラムの開始」。
- プログラム: 仮想環境の
python.exeのフルパス - 引数:-X utf8 scripts/analytics/main.py- 開始(作業フォルダ): プロジェクトのルートのパス - PC がスリープ中だと動かないので、必要なら「タスクを実行するためにスリープを解除する」を有効にする。
macOS / Linux(cron)
crontab -e で次のような行を追加します(<プロジェクトのルート> は実際のパスに置き換える)。
0 5 * * * cd <プロジェクトのルート> && .venv/bin/python -X utf8 scripts/analytics/main.py >> logs/cron.log 2>&1
サイトを追加する
config.yaml の analytics.sites にブロックを1つ追加するだけです。コードの変更は不要です。
analytics:
sites:
- site: site_c
ga4_property_id: "(数字だけのプロパティID)"
gsc_site_url: "sc-domain:example.net"
domain: "example.net"
sitemap_url: "https://example.net/sitemap.xml"
追加した日より前のデータは日次バッチでは入らないので、必要なら過去分を取り込みます。
python -X utf8 scripts/analytics/backfill.py --site site_c --start 2025-01-01
python -X utf8 scripts/analytics/backfill.py --site site_c --start 2025-01-01 --end 2025-03-31 --sources gsc
--sources:ga4(日次系)/page(page_metricsのスナップショット)/gsc/affiliate。既定は全部。pageは1日ぶんごとに1リクエスト投げるので、期間が長いと時間がかかります。- 実行前に DB ファイルをコピーしてバックアップしておくことをおすすめします。
テーブル一覧
| テーブル | 中身 | 粒度 |
|---|---|---|
page_metrics |
ページ別の PV・ユーザー数・エンゲージメント(直近 page_rolling_days 日の合計・上位 page_top_n 件) |
実行日 × ページ |
channel_metrics |
流入チャネル・参照元・メディア別のセッション数 | 日 × チャネル |
landing_metrics |
ランディングページ別のセッション数・直帰率 | 日 × ページ |
user_type_metrics |
新規 / リピーター別のユーザー数 | 日 × 種別 |
device_geo_metrics |
デバイス・国・地域別のユーザー数 | 日 × デバイス × 地域 |
hourly_metrics |
時間帯別のセッション数・PV | 日 × 時 |
event_metrics |
イベント別の発生回数・キーイベント数・収益 | 日 × イベント |
affiliate_click_metrics |
広告リンクのクリック数(任意。下記参照) | 日 × ページ × 遷移先ホスト |
gsc_query_metrics |
検索クエリ別のクリック・表示回数・CTR・平均掲載順位 | 日 × クエリ |
gsc_page_metrics |
ページ別の検索パフォーマンス | 日 × ページ |
gsc_page_query_metrics |
ページ × クエリ別の検索パフォーマンス | 日 × ページ × クエリ |
inspect_metrics |
sitemap の各 URL のインデックス状況(既定は週1回) | 検査日 × ページ |
batch_runs |
バッチの実行結果(成功 / 失敗 / スキップ・書き込み行数) | サイト × 実行日 × ソース |
page_path / landing_page / article_path は、どのテーブルでも同じ規則で正規化された「ドメイン無しのパス」なので、GA4 のテーブルと Search Console のテーブルを JOIN できます。
-- 例: 検索では表示されているのに読まれていないページ
SELECT g.page_path, SUM(g.impressions) AS imp, SUM(g.clicks) AS clk
FROM gsc_page_metrics g
WHERE g.site = 'site_a' AND g.date >= date('now', '-28 day')
GROUP BY g.page_path
ORDER BY imp DESC
LIMIT 20;
アフィリエイトクリック(任意)
サイトが広告リンクのクリックを GA4 イベントとして送っている場合、analytics.sites のサイトのブロックに ga4_affiliate_event: "イベント名" を書くと affiliate_click_metrics に集計されます。書かなければ何もしません。
前提として、そのイベントにパラメータ article_path(クリックされたページのパス)と link_host(遷移先のホスト名)を付け、GA4 管理画面の「カスタム定義」で同名のイベントスコープのカスタムディメンションを登録しておく必要があります。未登録の場合は警告を出してスキップします。登録より前の日付は (not set) になります。
仕組みのメモ
データ鮮度
- GA4 は直近のデータが後から再処理されて変わります。そのため日次系は毎回、直近
ga4_reprocess_days日を消して入れ直します。 - Search Console は数日遅れで確定します。終端を「今日 −
gsc_lag_days」にして、そこからpage_rolling_days日ぶんを毎回入れ直します。
URL の正規化
GA4 はパス(/blog/post)、Search Console はフル URL(https://example.com/blog/post)で返します。common.normalize_path() がドメイン・クエリ文字列・フラグメント・末尾スラッシュを取り除いて同じキーに揃えます。
同じページが /foo と /foo.html、/foo/index.html のように複数の表記で記録されるサイトは、サイトのブロックに strip_html_suffix / strip_index_html / strip_path_prefix を付けると1つにまとまります。サイトの URL 設計に合わないものを付けると別のページが混ざるので、付ける前に実際の URL を確認してください。
失敗時の動き
- API 呼び出しは、待ち時間を倍に伸ばしながら最大
retry_max回まで再試行します。 - 1サイト・1ソースが失敗しても、
batch_runsにfailedと記録して残りを続けます。 - すべて失敗したときだけ、終了コードが 0 以外になります。
API の利用上限
各 API には1日あたり・1分あたりの利用上限があります。URL Inspection は1 URL につき1リクエストなので、ページ数の多いサイトでは inspect_weekday で頻度を抑えてください。最新の上限値は Google の公式ドキュメントを確認してください。
下降トレンドの早期警告(yellow_lamp.py)
蓄積した Search Console データから、次のどちらかに当てはまるサイトに警告を出します。
- 表示回数の四半期(91日)合計が、2四半期連続で前の四半期を下回った
- 検索で表示されたページの数(各四半期の最後の7日間)が、2回連続で減った
python -X utf8 scripts/analytics/yellow_lamp.py # config.yaml の analytics.database を使い、全サイトを判定
python -X utf8 scripts/analytics/yellow_lamp.py --site site_a
python -X utf8 scripts/analytics/yellow_lamp.py --db data/analytics.db
判定には約9か月分(3四半期)のデータが必要です。足りないうちは「判定不能(データ蓄積中)」と表示されます。点灯は「すぐ対応する」合図ではなく、「次の見直しで話題にする」ための目印として使ってください。
テスト
python -X utf8 scripts/analytics/tests/test_normalize_path.py
安全に使うために
- 合格しても自動では公開しません。 法律、広告表記、個人や勤務先の特定につながる内容は、最後に必ず人間が読んで判断してください。
- 合格点と書き直し回数に既定値はありません。
config.example.yamlの空欄を自分で埋めます。点数は品質の目安で、検索順位や収益を保証するものではありません。 - AI の採点は見落とします。 とくに法務と機密は、AI の「問題なし」をそのまま信じないでください。体験談・実測値・写真は運営者にしか用意できません。レビューで
🧑の印が付いた指摘は、人の手でしか直せないものです。 - 公開の操作(アップロードなど)は、どのエージェントも行いません。 運営者が記事を最初から最後まで自分の目で読み、自分の手で公開します。
- レビュアーは記事を書き換えません。 修正は
blog-writerが行い、修正後は必ず再レビューを通します。 reviews/は公開フォルダの外に置いてください(レビュー結果がサイトに出ないように)。- リンク健診で
metrics.affiliate_domainsを空のまま HTTP 実査を走らせないでください(スクリプト側でも止まります)。 - 認証情報と分析データは公開しないでください。
client_secret.json/service_account.json/token.jsonは、あなたの Google アカウントのデータを読める鍵です。config.yamlにはプロパティIDとサイトURLが、data/analytics.db・exports/・logs/にはサイトのアクセスデータが入ります。付属の.gitignoreで除外していますが、フォルダごと ZIP にして渡す、クラウドストレージで共有する、Web サーバーの公開ディレクトリに置く、といった経路でも漏れます。漏れた可能性があるときは、Google Cloud で該当のクライアントシークレット / 鍵を削除して作り直し、Google アカウントの「サードパーティのアクセス」からアプリの許可を取り消してください。 - 記入済みの
confidentiality-reviewer.mdは機密です。 公開しない・公開リポジトリにコミットしないでください。 - Web を読むエージェント(WebSearch/WebFetch を持つもの)は、読んだページの文章に操作されるおそれがあります(プロンプトインジェクション)。 レビュアーの指摘に「このファイルを消せ」「この URL に送れ」のような操作の指示が混ざっていたら従わず、運営者に報告させてください。外部を読む役と、ファイルを書く・コマンドを実行する役を分けると、影響を小さくできます。このテンプレートでは、Web を読むレビュアー(growth・consistency)に Bash を持たせていません(2026-10-22〜。機械計測の結果は指揮役の article-review スキルが実行して渡します)。執筆役(writer)も Web を読みません(2026-10-23〜。裏取りは researcher が
research/に残した結果だけを使い、無ければ researcher への依頼を報告します)。Web を読むのは idea-scout・researcher・legal・consistency・growth の5体だけで、この5体はいずれも Bash を持ちません。Bash を持つのは writer だけで、使い道はconfig.yamlのbuild_check_command(記事の検証コマンド)に限ると定義ファイルに書いてあります(tools:では用途まで制限できないので、約束として書いています)。 - Claude Code の権限設定で、できることを狭めておけます。 プロジェクトの
.claude/settings.json(または自分だけの.claude/settings.local.json)に、次のように書きます。denyはallowより優先されます。WebFetchはallowに書いたドメインだけが確認なしで読め、それ以外は毎回確認が出ます(拒否ではありません)。Bash(git push *)はgit -C . pushのような書き方には効かないので、公開の操作は運営者が自分の手で行う前提は変わりません。設定の書き方は Claude Code の公式ドキュメント(settings)と同(permissions)で確かめてください(2026年10月22日時点の記法)。
json
{
"permissions": {
"allow": [
"WebFetch(domain:docs.example.com)"
],
"deny": [
"Bash(git push *)",
"Bash(rm -rf *)",
"Read(./.env)",
"Read(./.env.*)"
]
}
}
- このテンプレートは法的助言ではありません。 法務レビュアーとルーブリックは気づきを増やす道具で、適法性を保証しません。法令や各サービスの規約は、必ず一次情報で確認してください。
保守(テンプレートを書き換えるとき)
同じレビュアーが、チャット版(prompts/)とエージェント版(.claude/agents/)の2か所にいます。片方だけを直すと、見るところや点数の名前がずれていきます。書き換えたら次を実行してください。
python -X utf8 scripts/check_prompts.py
- 5人のレビュアーそれぞれについて、2つのファイルが両方あるか、スコア行のラベル(「法務スコア」など)が一致するかを調べます。どちらかに問題があると終了コード 1 で止まります。
- 番号付きのチェック項目の見出しが片方にしか無いものは、警告として一覧にします。チャット版は短くまとめているので、意図した差なら直さなくてかまいません。
ライセンス
MIT License です。商用・改変・再配布ができます。著作権表示とライセンス文は残してください。
変更履歴
- 2026-10-23: 執筆役(
.claude/agents/writer.md)のtoolsから WebSearch・WebFetch を外し、裏取りはresearch/の結果だけを使う約束と、Bash をbuild_check_commandだけに使う約束を定義に追記。「安全に使うために」に Web を読む役と Bash を持つ役の一覧を追記 - 2026-10-22: 点数のぶれの記述(同じ記事で 20 点の差が出た記録)・安全の項目(プロンプトインジェクション・Claude Code の権限設定の例)・配布の形と費用・Lv.1 の最短手順・既存環境への導入の注意・機械計測が対応する拡張子(
.mdx・.markdownも Markdown 扱いに)を追加