---
name: banner-generator
description: 案件・LP・N1から N 枚の広告バナーを gpt-image-2 で生成する Skill。必須スロットが揃うまで画像APIを叩かない契約付き。Agentic RAGで不足スロットを自生成し、広告コンセプト15字以下・刺さる本能・ベネフィット起点キービジュアル・記憶に残るコピーを中核に、同一ニュアンスへの収束を防ぐ。
metadata:
  trigger_keywords:
    - バナーを生成
    - 広告クリエイティブ生成
    - 1:1バナー
    - 正方形広告
    - LP診断バナー
    - N案バナー
    - gpt-image-2 でバナー
    - 広告バナー4案
---

# banner-generator

## 関連資産

- このSkill固有:
  - scripts: `.agents/skills/banner-generator/scripts/` (build_brief.py, compose_prompts.py, generate.py)
  - examples: `.agents/skills/banner-generator/examples/` (banner-hooks-taxonomy.md, demo-banner-brief.md)
  - 設定: `.agents/skills/banner-generator/templates.yaml`
- 共有:
  - 共通script: `tools/run_with_gui_env.zsh`, `tools/dpro_mcp_bridge.mjs`, `tools/gemini_model_policy.mjs`
  - 共有reference: `knowledge/skill-routing.md`, `knowledge/operating-principles.md`, `knowledge/production-gates.md`, `knowledge/workflows/banner_generation.md`
  - 共有template: `templates/work_order_minimum.yaml`, `templates/work_order_examples.md`, `templates/blocked_handoff.md`
  - 運用ドキュメント: `docs/agent_operating_doctrine.md`, `docs/request_templates.md`

広告クリエイティブ（広告バナー）を **N枚 / N心理フック分岐** で gpt-image-2 から生成するSkill。コピーライティングと画像生成を**スロット駆動の契約**で繋ぎ、4案がただの言い換えに収束する事故を構造的に防ぐ。

## Image2 Quality Policy

Image2 quality policy = auto-balanced. バナーごとに `high` / `medium` を自律選定する。`high` は決定的バナー、公開本番FV/CTA相当、文字/OCR難度が高い案、キャラ/商品/公式素材の再現性が重要な案、medium QA失敗後の再生成、最終採用候補に使う。`medium` は探索、初期案、大量バリエーション、内部確認、低文字量案、dry-run/planned manifest、highでCV判断が大きく変わらない案に使う。`IMAGE2_HIGH_APPROVED` / `IMAGE2_HIGH_REASON` は任意のlegacy metadataであり、未指定を理由にhigh生成を止めない。`generated_asset_manifest.json` と `image2_prompt_pack.json` には `image_quality`、`quality_policy: balanced`、`quality_decision_reason`、`quality_decision_basis`、`quality_selected_by: agent` を残す。

最新方針: バナーの成否は、細かい構図指定ではなく **N1の脳内に残る広告コンセプト、刺さる本能、ベネフィット起点キービジュアル、忘れられないコピー** で決まる。`Scene / Metaphor / Character role` は強制しない。必要なら生成後の分析・多様性チェックで使う。

## DPro Objective Classification Policy

- DPro正式分類は `dpro_ad_objective_raw` として保存し、実制作で使う分類は `canonical_ad_objective` として分ける。
- 分類根拠は `dpro_objective_classification` に残す。
- 原則はDPro MCPの `ad_objective` を正とし、`transition_type`、LP形状、CTA、遷移URLだけで `AWARENESS` を獲得扱いにしない。
- 違和感がある場合のみ、`ad_objective_override` と `ad_objective_override_reason` をセットで残す。理由なしmanual overrideは無効。
- demo_offer / デモ住宅診断 / デモ診断オファー / `example-offer.test` / `example-offer.test` 関連itemは例外として、DPro側が `AWARENESS` でも `canonical_ad_objective=acquisition` とする。
- バナー仮説では、獲得広告はクリック/CV導線仮説、認知広告は認知形成/記憶残存仮説として分けて扱う。

## Image2 API-Only契約（最重要）

このSkillの目的は、**Image2 APIを最大限に活用して、売れる完成バナーを直接生成すること**。最終バナーの文字、CTA、レイアウト、装飾、ブランド統合はすべて Image2 API の出力画像内に含める。API未実行・API失敗・画像内文字崩れが起きた場合は、ローカル代替生成や後修正で救済せず、BLOCKED として再プロンプトまたは再生成する。

禁止:
- HTML/CSSスクショ化、Pillow文字合成、Canvas/SVG描画、ローカル画像合成
- CTA・価格・注釈・ロゴ・バッジ・強調装飾を後から載せること
- 読めない文字や崩れた日本語を後から修正すること
- API未実行時の静的モック、ローカル生成PNG、プレースホルダーでの代替

許可:
- Image2 API 返却の base64 decode
- raw PNG保存、`metadata.json` / `prompts.json` / `generation.log` の保存
- checksum 記録、ファイル名変更
- 情報を追加しない圧縮・リサイズ・形式変換（入稿用の技術処理のみ）

ロゴ・キャラ・商品画像・過去素材を使う場合も、**Image2 APIへの参照入力またはプロンプト文脈として渡すだけ**。完成画像にローカルで貼り付けない。

## Required Visual Identity Gate

公式キャラ、マスコット、人物、商品写真、ロゴ的な視覚記号がクリック仮説やブランド識別に必要な案件では、生成前に `character_asset_policy` を必ず宣言する。

- `character_asset_policy: required|optional|forbidden`
- `canonical_character_asset_ids`: 正本として使うキャラ/商品/人物/ブランド素材ID
- `generation_reference_inputs`: Image2 APIへ実際に送る参照画像
- `character_requirement_status`: `PASS|REVIEW|FAIL|BLOCKED`

`character_asset_policy=required` の場合、`REFERENCE_MODE=edit` と clean な正本参照入力が必須。`REFERENCE_MODE=none`、`generation_reference_inputs=[]`、no-character prompt、`character_visible=no`、`character_identity_status=NOT_APPLICABLE` は `BLOCKED` または `FAIL` とし、完成扱いにしない。

必須成果物に `character_presence_audit.json` を追加する。生成前に契約違反がある場合は、`blocking_issues.json`、blocked manifest、blocked `final_decision.md` を書いて停止する。`reference_asset_usage_report.status=PASS` は参照画像を実際にImage2へ送った時だけ許可する。

`Image2 mode: abstract no-character policy` と `Status: PASS` は、required visual identity の成果物では同居不可。no-character案はオーナー明示承認がある別仮説としてだけ残せるが、required-character banner の代替完了にはしない。`Scene / Metaphor / Character role` をImage2 promptの必須指定にしない方針は、実在するrequired visual assetを任意化する意味ではない。

## なぜ必要か（事故シナリオ）

**典型的失敗**: 「正方形広告4案、コンセプトはXX」と頼み、Agentが4回同じ角度から生成 → 蓋を開けるとコピーが言い換え、画も同じ構図、配信しても1案分の母数しか取れない。

**根本原因**: コピーが先で画が従、N案の差別化軸がN1心理から導出されていない。さらに、構図・役割・小物を細かく指定しすぎると、Image2の創造性が落ち、同じ「説明っぽい広告」に収束しやすい。各案は別の心理フック（経済/心理/時間/関係/知識）、別の刺さる本能、別のベネフィット、別の記憶に残るコピーで分岐する。

**この Skill は**: 必須スロットが全部揃うまで API を叩かない。揃ったら N フックを `templates.yaml` の hook_taxonomy から **次元最低3つ・連続dimension禁止・id重複禁止** で機械的に選定する。加えて `広告コンセプト15字以下`、`刺さる本能`、`benefit_key_visual`、`copy_refinement_policy` を使い、需要度・Only1性・N1記憶残存性・コアコンピタンス/USP活用度を見てから生成する。表示コピーとCTAは Image2 内で描かせる。

## いつ発火させる

以下のシグナルで本Skillを発火：

1. ユーザーが「バナーを生成」「正方形広告で N 案」「LP からバナーを起こす」「広告クリエイティブ N 案」と言ったとき
2. `output/banners/` への書き出しや `client.images.generate(...)` が「バナー」目的で呼ばれかけたとき
3. 既存の素材生成スクリプト（`generate_assets_v3.py` 系）を**バナー用に直接書き換え**ようとしたとき → 必ず本 Skill に切替

## 必須スロット契約（最重要）

`templates.yaml: required_slots` がすべて埋まるまで `client.images.generate` を**絶対に叩かない**。これは契約。

画像生成前に `search_rag(domain=creative_asset)` を必ず実行し、ロゴ・バッジ・公式素材・過去バナー・動画広告など使える自社素材を確認する。使える素材がない場合は missing として記録し、公式HP/LP取得またはImage2新規生成へ進む。

## N1 Banner Contract

バナーは装飾やLPの縮小版ではない。**1枚でactive N1の現在信念をクリック信念へ動かす装置**として扱う。

- 既存互換のため `persona` slot は残すが、実務上は `n1_profile` として扱い、現在信念、クリック後に持ってほしい信念、刺さる本能、proof/curiosity source、CTA intent を含める。
- 複数案は、同じコピーの言い換えではなく、N1の別々の心理抵抗や欲求に対応する別仮説として設計する。
- `catch_copy`, `sub_copies`, `cta_label` は後加工用素材ではなく、Image2 APIで画像内に完成させるvisible text指示。
- DProやRAGから得た広告観察は、クリック仮説と見た目の分岐を作るために使う。CVR、売上、利益、No.1の証明として扱わない。
- 生成前に、各patternへ `current_belief -> click_belief` の変化、心理フック、広告コンセプト15字以下、刺さる本能、ベネフィット起点キービジュアル、CTA framing を割り当てる。
- `Scene / Metaphor / Character role` はImage2 promptの必須指定にしない。創造性を狭めるため、必要な場合だけ生成後の見た目分類・多様性チェックとして使う。
- `demo_business` などのブランド名は自動で画像内表示しない。`must_include_phrases` に入っている場合だけvisible textへ含める。

## Banner Experiment Contract

バナーは「完成画像N枚」ではなく、N1の別々の心理抵抗を検証する実験単位として閉じる。各patternは `experiment_id` を持ち、配信前でも「何を学ぶための案か」を記録する。

各pattern必須フィールド:
- `pattern_id`
- `experiment_id`
- `voice_id`
- `current_belief`
- `click_belief`
- `psychological_hook`
- `ad_concept_15`
- `scene_metaphor`（Image2 promptへの強制指定ではなく、見た目の分岐/事後QAフィールド）
- `character_role`（Image2 promptへの強制指定ではなく、人物/役割の分岐/事後QAフィールド）
- `instinct_trigger`
- `benefit_key_visual`
- `core_competence_refs`
- `usp_refs`
- `copy_memory_score`
- `only1_vector_score`
- `evidence_ids`
- `forbidden_claims`
- `learning_question`

必須成果物:
- `banner_hypothesis_contract.json`
- `banner_experiment_matrix.json`
- `image2_prompt_pack.json`
- `generated_asset_manifest.json`
- `image_ocr_report.json`
- `image_provenance_audit.json`
- `no_image_overlay_report.json`
- `what_we_learn.json`
- `final_decision.md`

`what_we_learn.json` では、DPro由来の `market_observation`、Agentの `creative_hypothesis`、配信後の `owned_outcome` を混ぜず、次回判断に使える形で残す。

12 個の必須スロット:

| key | 意味 | 不足時の取得 |
|---|---|---|
| `project_name` | 案件名 | ask |
| `lp_url` | LP URL | ask |
| `media_format` | 媒体・サイズ・比率 | ask |
| `instinct_trigger` | N1の刺さる本能。例: 楽して稼ぎたい | macro_rag → ask |
| `benefit_key_visual` | ベネフィットを一瞬で感じる絵の核 | micro_rag → ask → web_search |
| `concept_one_line` | 広告コンセプト（≤15字、N1脳内に残る） | macro_rag → ask |
| `catch_copy` | キャッチコピー（≤30字、需要度/Only1性/記憶残存性/USP活用度で採用） | macro_rag → ask |
| `sub_copies` | サブコピー（≥2件、CTA形含む） | micro_rag → ask |
| `cta_label` | CTA文言 | ask |
| `persona` | ペルソナ8キー | macro_rag → ask |
| `pattern_count_n` | パターン数N | ask |
| `hook_assignments` | 各パターン心理フック（length=N） | derive_from_hooks |

不足を検知したら:
1. `build_brief.py --strict` で missing と acquisition_plan を出す
2. `acquire` リストの順に試す（macro_rag → micro_rag → web_search → ask）
3. RAG/web で得た値は **Pivot 1（外部依存確認）** として **confidence<0.85 をまとめて1回の AskUserQuestion** に乗せる

## Agentic RAG 仮説生成プロトコル

不足スロットの埋め方（`agentic-rag-protocol.md` の3段検索を踏襲）。

**Stage 1 — 自生成Wikiの grep**
- `knowledge/macro/{personas, winning-patterns, stp}/`
- `knowledge/micro/banner-elements/`
- 既存 `H-MACRO-WINCOPY-*.md` / `H-MICRO-BANNER-*.md` を slot 名で grep、最高 confidence のものを候補化

**Stage 2 — 二層 RAG ベクトル検索**
スロット → レイヤー routing は `templates.yaml: rag_routing` 参照:
- macro レイヤー: `concept_one_line`, `catch_copy`, `persona`, `instinct_trigger`
- micro レイヤー: `sub_copies`, `benefit_key_visual`
- ask only: `media_format`, `cta_label`, `pattern_count_n`, `project_name`, `lp_url`

**Stage 2-alt — クライアント固有 RAG 不在時**
- `WebSearch` で「<カテゴリ> 広告バナー 勝ちパターン」「<lp_url ドメイン> 競合バナー」
- `WebFetch` で `lp_url` 本体取得しキーフレーズ抽出
- `AskUserQuestion` で参考バナー画像 URL を1〜3点要求
- `confidence_caps.client_specific_rag_absent: 0.7` を適用

**Stage 3 — 仮説合成**
各候補を `{value, confidence: 0.0-1.0, source_refs: [path|url]}` で構造化。

**Stage 4 — Pivot 1: 外部依存確認**
**confidence<0.85 のスロットを1回の AskUserQuestion にまとめて提示**（オーナー指示）。
- confidence≥0.85 は「auto-accept、override する?」形式の確認1問
- それ未満は明示的な値選択

**Stage 5 — Soul 3: ナレッジ自生成**
オーナー確認後、**実案件のみ** `knowledge/micro/banner-elements/{client_slug}/H-MICRO-BANNER-{SEQ}-{slot}-{slug}.md` に書き戻し。
教材/サンプル（`examples/` 由来）は書き戻さない。

```yaml
---
hypothesis_id: H-MICRO-BANNER-014
project: <client_slug>
pattern_id: pattern-3
slot: catch_copy
value: "..."
source_refs: ["...", "..."]
confidence: 0.82
status: confirmed
owner_confirmed_at: 2026-04-30T14:22:00+09:00
hooks_used: [nihou_tairitsu, sokuji_ketsudan]
dimension: 知識
instinct_trigger: "楽して稼ぎたい"
ad_concept_15: "放置で稼働"
benefit_key_visual: "寝ている間に進む事業"
---
```

## N パターン展開ルール

`templates.yaml: hook_taxonomy` から N フックを **機械的に**選定。`compose_prompts.py` 内で:

1. `min_dimensions_used: 3`（経済/心理/時間/関係/知識のうち最低3次元）
2. `forbid_same_dimension_consecutive: true`（pattern-1 経済 → pattern-2 は別次元）
3. `forbid_duplicate_hook_id: true`（id 重複禁止）
4. 各フックを固有のキャッチコピー型にバインド（`copy_pattern` フィールド）
5. プロンプト先頭メタコメントに `hook_id + pattern_no` を焼き込み、gpt-image-2 のバリエーション幅を構造化
6. 各パターンに `ad_concept_15`、`instinct_trigger`、`benefit_key_visual`、`CTA framing` を割り当てる。`visual_archetypes` は必要時の事後分類だけに使う
7. 生成後に**コピー文の Jaccard 類似度** < 0.5 をチェック。違反ペアは「フック分岐失敗」として再生成 or オーナー警告

ペルソナ希薄で3次元確保不可なら **degraded mode**: 「dimensions covered: 2/3」を警告し、N 縮小提案 + 落としたフックを report に記載（HANDOVER.md にも追記）。

## 見た目の分岐ルール（重要）

N案バナーはコピーだけでなく、**一目で別案に見えること**を必須にする。とくに同じロゴ、同じキャラ、同じ媒体サイズ、同じ商材で生成する場合は、Image2 が同じトーンへ収束しやすい。

ただし、構図の幅を狭めるため `Scene / Metaphor / Character role` はImage2 promptへ強制投入しない。各案に必ず次の4点を付与する:

1. `ad_concept_15` — 15字以下。N1の脳内に残る広告コンセプト
2. `instinct_trigger` — 刺さる本能。例: 楽して稼ぎたい、不安を今すぐ消したい
3. `benefit_key_visual` — ベネフィットを一瞬で感じる絵の核
4. `copy_refinement_score` — 需要度・Only1性・記憶残存性・USP活用度の採点

再現パターン例:

| demand | ad_concept_15 | instinct_trigger | benefit_key_visual |
|---|---|---|---|
| 実行停止 | 放置で稼働 | 楽して進めたい | 寝ている間に進む事業 |
| 学習卒業 | 知識を稼働へ | 学び損を避けたい | 教科書が動くAIへ変わる |
| 安心委任 | もう任せていい | 全部やりたくない | 隣にいる分身AI |
| 売上直結 | ひらめき換金 | 楽して稼ぎたい | アイデアが収益導線へ流れる |

`Style:` で全案を同じ世界観に固定しない。ブランドトーンが必要な場合も、ロゴ・キャラ・商品素材は `brand_assets` として渡すだけにし、見た目の発想は `benefit_key_visual` とコピーからImage2に広げさせる。

過去生成バナーは、オーナーが明示した場合だけ参考素材に使う。指定がない限り、過去バナー画像を Image2 入力に入れない。バナー画像を参照にすると構図・CTA・配色が強く引っ張られ、N案が似る。

## Image2 prompt制約

Image2 promptは次の3層を混ぜない。

- internal construction rules: N案分岐、30字以内、Jaccard類似度、slot補完、QA閾値など、Codex側で守る規律。
- model-facing prompt: Image2 APIへ送る、用途、N1、刺さる本能、広告コンセプト15字以下、表示コピー、CTA、ベネフィット起点キービジュアル、コアコンピタンス/USP文脈、参考素材。
- QA criteria: 生成後に見る、可読性、claim safety、CTA明瞭性、N案差別化、証拠整合、後合成なし。

内部制約をそのままImage2 promptへ入れない。オーナーの具体フィードバックも、まず3層のどこに属するかを整理してから反映する。

1プロンプトは最大10項目に抑える。意図、N1、刺さる本能、広告コンセプト、表示コピー、CTA、ベネフィット起点キービジュアル、コアコンピタンス/USP文脈、参考素材程度に絞り、ピクセル単位の構図や小物を詰め込みすぎない。自社素材RAGで見つかったロゴ・バッジ・公式素材は `brand_assets` として Image2 API に渡す。代表者写真など人物素材は任意参照であり、全案固定にしない。`catch_copy`, `sub_copies`, `cta_label` は後加工用の素材ではなく、Image2 に画像内文字として描かせる visible text 指示。

同一商材で複数案を作る時の推奨フォーマット:

```text
# pattern-<N> / hook_id: <id> / dimension: <dimension>
案件・用途:
参考素材:
商品文脈:
N1:
刺さる本能:
広告コンセプト15字以下:
表示コピー:
CTA:
ベネフィット起点キービジュアル:
コアコンピタンス/USP:
任意の参考素材/人物素材:
```

## 出力契約

```
output/banners/<project_slug>/<YYYY-MM-DD>/
├── pattern-1-<hook_id>.png
├── pattern-2-<hook_id>.png
├── ...
├── pattern-N-<hook_id>.png
├── banner_hypothesis_contract.json
├── banner_experiment_matrix.json
├── image2_prompt_pack.json
├── generated_asset_manifest.json
├── image_ocr_report.json
├── image_provenance_audit.json
├── no_image_overlay_report.json
├── what_we_learn.json
├── final_decision.md
├── metadata.json
├── prompts.json
└── generation.log
```

`metadata.json` schema:
```json
{
  "project": "...",
  "lp_url": "...",
  "model": "gpt-image-2-2026-04-21",
  "media_format": "square_1x1",
  "size": "1024x1024",
  "generated_at": "2026-04-30T14:30:00+09:00",
  "api_endpoint": "images.generate",
  "generation_contract": {
    "final_visual_source": "image2_api_response",
    "visible_information_policy": "all_visible_copy_and_cta_must_be_generated_by_image2"
  },
  "patterns": [
    {
      "pattern_id": "pattern-1",
      "experiment_id": "exp-banner-001",
      "voice_id": "n1-belief-gap-a",
      "hook_id": "nihou_tairitsu",
      "dimension": "知識",
      "current_belief": "...",
      "click_belief": "...",
      "psychological_hook": "...",
      "ad_concept_15": "...",
      "instinct_trigger": "...",
      "benefit_key_visual": "...",
      "core_competence_refs": ["..."],
      "usp_refs": ["..."],
      "copy_memory_score": 0.0,
      "only1_vector_score": 0.0,
      "evidence_ids": ["..."],
      "learning_question": "...",
      "catch_copy": "...", "sub_copies": ["..."],
      "prompt": "...", "filename": "pattern-1-nihou_tairitsu.png",
      "raw_image_sha256": "...",
      "post_api_operations": ["decode_base64", "write_raw_png", "checksum"],
      "hypothesis_refs": ["..."],
      "qa_refs": ["image_ocr_report.json", "image_provenance_audit.json", "no_image_overlay_report.json"]
    }
  ],
  "copy_refinement_policy": {...},
  "run_log_path": "logs/banner_generation_runs.jsonl",
  "degraded_mode": null
}
```

**デフォルトは Image2 API 返却 raw PNG**（オーナー指示）。圧縮・リサイズなどの入稿用技術処理を行う場合も、情報追加・文字追加・CTA追加・装飾追加は禁止。

## 使い方（3 Steps）

### Step 1: partial_brief.json 用意
わかっているスロットだけ書く。

```bash
cat > /tmp/brief.json <<'EOF'
{
  "project_name": "demo-offer",
  "lp_url": "https://example.com/demo-lp",
  "media_format": "square_1x1",
  "pattern_count_n": 4,
  "instinct_trigger": "迷いを今すぐ減らしたい",
  "benefit_key_visual": "不安が選択肢に変わる",
  "concept_one_line": "まず現実ライン",
  "catch_copy": "決める前に、選べる道を見よう。"
}
EOF
```

### Step 2: スロット検証→不足を埋める
```bash
python scripts/build_brief.py --brief /tmp/brief.json --templates templates.yaml --strict
```
exit 1 + 欠落リスト + acquisition_plan が出る。Agent はリストに従い RAG / Web / ask で埋め、**confidence<0.85 を1回の AskUserQuestion でまとめて確認** → `filled_brief.json` 出力。

### Step 3: フック割当→生成
```bash
python scripts/compose_prompts.py --brief /tmp/filled.json --templates templates.yaml --out /tmp/prompts.json
python scripts/generate.py --prompts /tmp/prompts.json --templates templates.yaml --out output/banners/<slug>/<date>/
```

## やってはいけないこと

- 必須スロット未充足のまま `client.images.generate` を叩く
- N 案を1つの心理フックの言い換えで埋める
- `gpt-image-2-2026-04-21` 等のモデル ID を Python にハードコード（必ず `templates.yaml` 経由）
- `confidence < 0.6` の RAG 仮説をオーナー確認なしに採用
- 競合名の名指し（仮想敵は「古い常識」概念）
- フック1次元集中（n_pattern_rules.min_dimensions_used に違反）
- 実案件以外（教材/サンプル）の knowledge 書き戻し
- 自社素材RAGチェックなしで画像生成する
- Image2 API未実行のまま完成バナー扱いにする
- API失敗時にローカル代替PNG、HTML/CSSスクショ、Pillow/Canvas/SVG合成で救済する
- `catch_copy`, `sub_copies`, `cta_label` を後から載せる前提で、Image2には背景だけ作らせる
- 読めない文字・崩れた日本語・CTA欠落を後加工で修正する
- Image2 promptを10項目超に膨らませる
- N案すべてを同じ「ダッシュボード + カード + ロボット + CTA」の見た目に収束させる
- オーナー明示なしに過去生成バナーを参考画像として Image2 に渡す
- `Style:` だけで差別化しようとする。差別化は `ad_concept_15`、`instinct_trigger`、`benefit_key_visual`、コピーで作る
- **ピクセル配置や小物過多で構図を殺すこと** — Image2 は推論モデル。左上/右下/何個並べる等の細かい配置、過密なUI、長い小物リストは避ける。N案差別化は構図固定ではなく、刺さる本能とベネフィットから広げる。
- `避ける表現` や禁止リストをImage2 promptへ長く入れる。リスク検出は `copy_refinement_policy` とOCR後QAで扱う
- プロンプトを英語で書く（日本語LPなら日本語プロンプト。Image2 は日本語ネイティブ理解する）

## 拡張ポイント

- **Vision採点ループ**: 生成バナーを gpt-4o-vision で「文字可読性」「フックの一致度」採点 → 閾値未満は再生成
- **Reflection提案**: `banner_generation_runs.jsonl` が5ラン貯まるごとに、コンセプト型・コピー型・KV型の見直し提案を `reflection_suggestions.jsonl` に残す
- **Squad beyond 入稿連携**: 情報を追加しない入稿用のリサイズ・圧縮・ファイル命名のみ許可
- **動画バナー化**: gpt-image-2 → Sora-mini 等への接続（後日）
- **A/B テスト発射台**: `metadata.json` を Squad beyond MCP に流して articleUid 自動採番

## 連携

- `lp-image-optimizer`: 情報を追加しない圧縮・リサイズ用途のみ。バナー内の文字・CTA・装飾は必ず Image2 API 生成時点で完成させる
- `notion-bulk-insert`: 生成結果（`metadata.json`）の Notion DB 登録（オプション）
- `preflight-loop003`: 起動時に3ピボット契約検証を流用可

## 関連ファイル

- `templates.yaml` — slot/hook辞書/モデルpinの宣言核
- `examples/banner-hooks-taxonomy.md` — 12フック×5次元辞書の解説
- `examples/demo-banner-brief.md` — 抽象化の起点（教材ブリーフ）
- `scripts/build_brief.py` — slot 検証
- `scripts/compose_prompts.py` — フック割当 + プロンプト合成
- `scripts/generate.py` — gpt-image-2 呼び出し + PNG 保存
