データジャーナリストエージェント (Data2Story)
$ARGUMENTS をブログに変換します。以下の役割を順次オーケストレーションします。
セットアップ
何よりも先にパスを解決します。
- マシンのローカルパスをハードコードしたり、環境変数をエクスポートするようユーザーに依頼しないでください。
SKILL_DIR= このSKILL.mdを含むディレクトリ (.../skills/data2story) を解決します。ARCHIVE_DIR=skills/を含む上位ディレクトリ (SKILL_DIRの2階層上、すなわちSKILL_DIR/../..) を解決します。DATA2STORY_ROOT=ARCHIVE_DIRの親ディレクトリを解決します。- 以下のコマンドでは
ARCHIVE_DIRなどのシンボリックプレースホルダーを使用します。Bashを実行する前に、それらを解決済みの引用符付きパスに置き換えてください。 DATA_NAME= データセットフォルダ名 (例:pick_a_card)DATA_DIR=$ARGUMENTSが既存のパスであればそのパスを使用し、それ以外の場合はDATA2STORY_ROOT/data/{DATA_NAME}を使用します。TIMESTAMP= 現在時刻をMMDD_HHMM形式 (例:0401_1618) でフォーマットしたもの:date +%m%d_%H%M(bashで実行)PROJECT_DIR=DATA2STORY_ROOT/project/{DATA_NAME}/blog_{MODEL}_{TIMESTAMP}PROJECT_DIR/、PROJECT_DIR/assets/、PROJECT_DIR/code/を作成します。
アーカイブ
PROJECT_DIR を作成した直後に、現在のスキルをスナップショットとして保存します。
mkdir -p PROJECT_DIR/archival
cp -r ARCHIVE_DIR/skills PROJECT_DIR/archival/skills
これにより、この実行で使用された正確なスキルバージョンが保存されます。
利用可能なツール
すべてのメディアツールはOpenRouterを経由します。生成呼び出しの前に OPENROUTER_API_KEY を設定してください。
メディア生成はデザイナーの担当です。そのため、メディアツール (テキスト→画像、テキスト→動画、画像→動画、テキスト→音楽、埋め込み) は SKILL_DIR/designer/scripts/openrouter-*/ にあります。完全なリスト(デフォルトモデルと正確な python3 ... 呼び出し)は designer/references/tools.json にあります。ツールごとの完全なドキュメントは SKILL_DIR/designer/scripts/openrouter-*/ 以下にある各ツール自身の SKILL.md にあります。
パイプラインの概要
パイプラインは単一の線形シーケンスであり、生データからトレーサブルなHTMLブログを生成します。
DATA → Detective → Analyst → Editor → Designer → Programmer → Auditor → Inspector → 最終的な index.html + viewer.html
各ステージを順番に実行します。各ステージは開始前に前の成果物を読み込みます。現在の成果物が完了するまで次のステージに進まないでください。
ステージ 1 — Detective
入力: DATA_DIR
出力: PROJECT_DIR/detective.json
内容: 外部コンテキストを調査 — 背景知識、ドメインの歴史、関連する発見、このデータが重要な理由。各発見には det_xx ID が付与されます。
ステージ 2 — Analyst
入力: DATA_DIR、PROJECT_DIR/detective.json
出力: PROJECT_DIR/code/*.py、PROJECT_DIR/analyst.json
内容: Detectiveのコンテキストを考慮した、データの徹底的な定量分析。すべてのコードは実行可能なスクリプトとして code/ に保存されます。各発見には calculation (ファイル + 行 + 出力) と data_table (チャート対応データ) を含む ana_xx ID が付与されます。
ステージ 3 — Editor
入力: PROJECT_DIR/detective.json、PROJECT_DIR/analyst.json
出力: PROJECT_DIR/editor.md、PROJECT_DIR/editor.json
内容: 編集上の決定 — どの発見が重要か、ナラティブアークは何か、ブログが主張することは何か。各セクションには ana_xx の発見と det_xx コンテキストへの明示的な参照を含む edt_xx ID が付与されます。ビジュアルデザインは含みません。
ステージ 4 — Designer
入力: PROJECT_DIR/editor.md、PROJECT_DIR/editor.json、PROJECT_DIR/analyst.json
出力: PROJECT_DIR/designer.json、PROJECT_DIR/assets/*
内容: データ駆動型のクリエイティブなビジュアル決定 — チャート、画像、動画、音声、マップ、インタラクティブ要素、統計コールアウト、インスタンス、または適切な場合はテキストのみの処理を使用して各ポイントを提示する方法。メディアミックスは固定のチェックリストからではなく、データセットの特性から生まれるべきです。ページは デフォルトでマルチメディアリッチ であるべきです。共有の frontend-design スキルからビジュアル言語を借用し、チャネルの文書化されたフォールバックが捏造または純粋に装飾的でない限り、5つのチャネルすべて (チャート、画像、動画、音声、インタラクティブ/マップ) を使用してください。各ビジュアルには、データ駆動型の場合は data_source が ana_xx の data_table を指す des_xx ID が付与されます。選択されたアセットを生成します。HTMLは含みません。
ステージ 5 — Programmer
入力: PROJECT_DIR/editor.md、PROJECT_DIR/editor.json、PROJECT_DIR/analyst.json、PROJECT_DIR/designer.json
出力: PROJECT_DIR/index.html
内容: 最終的なブログをHTMLで実装します。designer.json の page_rhythm に記録されたテーマ/アクセントを適用し、frontend-design スキルからコンポーネントとトークンレシピを借用します。チャートデータは analyst.json の data_table から解決します(生データへのアクセスは禁止)。トレーサビリティのために、すべての要素に data-edt、data-ana、data-det、data-des 属性をタグ付けします。
ステージ 6 — Auditor
入力: PROJECT_DIR/index.html
出力: PROJECT_DIR/index.html (変更済み)、PROJECT_DIR/auditor.json
内容: コンテンツやデザインの意図を変更せずに、レイアウトの問題(重なり、スペーシング、配置)を検出して修正します。Programmerの後に自動的に実行され、ビジュアル要素が適切にラップされ、スペーシングが確保されていることを確認します。
呼び出し: Skill auditor PROJECT_DIR
ステージ 7 — Inspector
入力: PROJECT_DIR/index.html、すべてのJSONファイル
出力: PROJECT_DIR/inspector.json、PROJECT_DIR/viewer.html
内容: 文レベルのトレーサビリティ検証を実行し、インタラクティブビューアを生成します。2つのステップ:
python3 SKILL_DIR/inspector/scripts/verify.py PROJECT_DIR --log-errors
python3 SKILL_DIR/inspector/scripts/generate_viewer.py PROJECT_DIR
ステップ1は inspector.json (文→証拠マッピング) を生成します。ステップ2は viewer.html (自己完結型、file:// で動作 — サーバー不要) を生成します。詳細は inspector/SKILL.md を参照してください。
トレーサビリティ: パイプラインを通じたIDフロー
det_01 ──┐
det_02 ──┤
├──▶ ana_01 (based_on: [det_02]) ──┐
│ ana_02 (based_on: []) ├──▶ edt_01 (findings: [ana_01, ana_02], context: [det_01]) ──▶ des_01 (section: edt_01, data_source: ana_01)
│ ana_03 (based_on: [det_01]) │ edt_02 (findings: [ana_03], context: [det_02]) ──▶ des_02 (section: edt_02, data_source: ana_03)
└────────────────────────────────────┘
最終的なHTMLのすべての値をトレースできます: HTML data-des="des_01" → designer.json des_01.data_source="ana_01" → analyst.json ana_01.calculation.code → 検証可能。
引き継ぎルール
- 各成果物は次のステージが開始する前に完全でなければなりません。
- 成果物に必須セクションが欠けている場合は、先に進む前に修正してください。
- メディアリッチネスゲート (Designerの後、Programmerの前):
designer.jsonは5つのチャネルすべて (チャート、画像、動画、音声、インタラクティブ_または_マップ) を実行する必要があります。used:falseとマークされたチャネルについては、文書化されたフォールバックが実際に試され、データに基づく理由がmeta.media_decisionsに記録されたことを確認してください。チャネルが利便性のためにスキップされた場合(データがサポートできないためではない場合)、Programmerを実行する前にDesignerに戻してください。 - 生成されたすべてのアセットは
PROJECT_DIR/assets/にのみ配置します。 - 最終成果物:
PROJECT_DIR/index.html、PROJECT_DIR/detective.json、PROJECT_DIR/analyst.json、PROJECT_DIR/code/*.py、PROJECT_DIR/editor.md、PROJECT_DIR/editor.json、PROJECT_DIR/designer.json、PROJECT_DIR/inspector.json、PROJECT_DIR/viewer.html。