# Flow Media Manager

> 全链路投放工作流第②环节【媒介经理】。从对话上下文读需求立项单完整文字 + 读投放可行性评估HTML，**v1.27.0 起全流程唯一一次灌入（需求单字段+策略字段合并灌 48 字段）**，**v1.26.0 起主路径直接拼 strategy 全量结构化字段调 open_config 灌入金手指配置页（48 字段），不再产出本地确认单 HTML**——HTML 仅在金手指 MCP 不可用/degraded 时兜底存档。针对性标注可行性评估的⚠️/❌项。触发词：媒介策略、投放策略、账户搭建、基建纪要、诊断纪要、全链路第二步。

- Skill: `ahang1598/flow-media-manager` (Agent Skill, multi-file: 6 files)
- Install (CLI): `npx skillmds@latest add ahang1598/flow-media-manager`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ahang1598/flow-media-manager/raw
- Safety review: pending (external: skill-scanner WARNING, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: ahang1598 (https://skillmd.com/u/ahang1598)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/ahang1598/flow-media-manager

---


> 📌 当前版本 **v1.27.0**｜历史变更（40 条版本注记）已外置到同目录 `CHANGELOG.md`，**本文件只写生效规则**。改动时请同步 CHANGELOG.md。

# 媒介策略·串联版（flow-media-manager）

全链路投放工作流的**第②环节【媒介经理】**。上游是 ad-demand-helper-pro 的《需求立项单》（对话栏文字）+《投放可行性评估清单》（HTML 文件），下游是 ai投手(flow-ai-shooter) 与 素材助手(flow-material)。

## 输入（读上游）

读 ad-demand-helper-pro 的 2 份产出：

### 输入 1：需求立项单（**从对话上下文读立项单完整文字，v1.27.0 起**）

> ⭐ **v1.27.0 数据源回切**：ad-demand-helper-pro v2.32.0 起**不再灌入金手指**（需求单阶段零 MCP 调用），因此**没有 session 可拉**——立项单**完整文字重新成为唯一权威源**，从对话上下文逐字段读取。
>
> ⚠️ **不要**再 `GET /api/mcp/session/{sid}` 取 `demand.groups`（v1.25.5～v1.26.x 的做法作废，那个 session 不存在了）；也不要 Read 立项单文件（不存在，它只是对话栏文字）。
>
> ⭐ **这些字段值有两个用途**：① 做策略；② **灌入时拼成 `demand.groups` 一并传给金手指**——v1.27.0 起**灌入合并为一次**，`demand` 需求单字段与 Part 2/3/4 策略字段在同一次 `open_config` 里全量灌入（原"提需先灌一次、策略再灌一次"作废）。所以取值时必须完整记住每个字段。

按立项单分区逐字段取值（对话栏文字里的字段名 → 内部字段语义）：
- **基础信息**：`offerId`（产品名称）/ `demand_offer_intro`（产品简介）/ `requestTitle`（标题行）
- **预算与测试目标**：`demand_test_goal`（测试目标）/ `demand_kpi`（考核指标，大白话）/ `demand_budget_limit`（总预算）/ `demand_budget_cycle`（投放周期）/ `demand_launch_date`（上线时间）
- **人群策略**：`demand_audience_logic`（客户类型/人群逻辑）/ `demand_core_ta`（核心人群）
- **素材与承接**：`demand_has_material`（现有素材）/ `demand_carrier`（转化载体，v2.22.0 起 og 载体槽位）/ `demand_product_channel`（商品渠道，v2.22.0 条件题）/ `demand_dev_resource`（开发资源）
- **其他**：`demand_compliance`（合规要求）/ `demand_history`（历史投放经验）/ `demand_selling_points`（核心卖点）

> ⚠️ 立项单里**没出现的字段就是没问到**（如预算来源、结束时间、落地页链接、渠道版位、人群数量）：按缺失处理，不阻塞，该由策略环节测算填充的就自己算。
> ⚠️ KPI 是大白话（如"品牌声量优先；单客获客成本不超过 100 元"）：AI 解析出策略方向（声量优先 → CPM/广覆盖）+ 成本上限（100 元 → oCPM 出价区间）。

### 输入 2：投放可行性评估清单 HTML 文件（3 段）

- **段 A 广告主类型**：推导画像（如"中小广告主·新手·To C·虚拟商品服务"）→ 影响策略激进程度
- **段 B 可行性评估**：6 维度（预算充分性/素材准备/合规风险/落地页承接/测试周期/KPI可达性）的 ✅/⚠️/❌ 状态
- **段 C 优化建议**：用户需要补什么

> ⭐ **策略针对性**（v1.2 起）：
> - ⚠️ 项 → **段 A 字段**里标注风险与建议（段C 已废，标注全部由段A 负责）
> - ❌ 项 → **段 A 字段**里标注"必须补齐才能投放"+ 具体补齐指引（**融入字段值，不要单独开 alert 块**）
> - 如"素材都没准备 ❌" → 段 B 标注"需先补产品图/视频素材"，具体指引融在段 B 的"成品规格"或"品牌资产透传"字段里

### 路径判定（参考可行性评估"历史经验"）

- 从没投过 / 无在投账户 → 走「基建路径」，参考 `ai-analysis-expert-newproject` 五维基建
- 投过没达预期 / 不错想扩量 / 正在投想优化 → 走「诊断路径」，参考 `ai-analysis-expert-diagnose`

### 投放方式判定（试跑发现的关键约束）⭐

- **用户指定了版位**（如"只投朋友圈+视频号""排除公众号"等强约束）→ 走**标准投放**（`tencentads-delivery-standard-create`），可手动指定版位
- **用户未指定版位 / 接受智能择优** → 走**智投 AIM+**（`tencentads-delivery-smart-create`），版位系统智能择优

> ⚠️ 原因：智投(AIM+)版位是系统智能择优，**不可手动指定"只投某版位/排除某版位"**。若立项单有版位强约束却走智投，建单后版位不可控。
> 此判定结果写入段A「投放方式」字段，ai投手据此选调哪个建单 skill。

**转化归因前置条件（试跑发现的关键约束）⭐**：
> 建单时 conversion_id 必须带链路信息，否则报 1801106。账户需先在腾讯广告后台配置转化归因链路。
> 若用户账户未配置，媒介经理应在段A末尾提醒，并给出以下指引（来源：WebSearch 联网查腾讯广告官方文档）：
> 1. 开通权限：联系行业运营，提供 UID/MDMID 申请开通「营销链路」权限
> 2. 新建转化：投放管理平台 →【资产】→【数据营销】→【转化归因】→ 新建转化
>    - 小程序：填 AppID(gh_开头) → 选优化目标 → 选营销链路 → 勾选上报节点
>    - H5网页：填落地页URL → 获取JS密钥嵌入 → 选优化目标 → 选营销链路 → 勾选上报节点
> 3. 联调激活：进入「转化联调」→ 上报行为数据 → 激活
> 4. 建广告时选新的带链路的 conversion_id

**品牌形象组件前置条件（试跑发现的关键约束）⭐**：
> 建创意时 brand 组件是模板必填项（缺则报"模板必填组件缺失: brand"），需在腾讯广告后台预先配置**新版品牌形象**（旧版报1800355"must use new version brand"，全场景强制新版）。
> 若用户账户未配置，媒介经理应在段A末尾提醒，并给出以下指引：
> 1. 入口：投放管理平台 →【资产】→【创意资产管理】→【品牌形象】
> 2. 新建**新版**品牌形象：
>    - 上传品牌 logo 图（**512×512像素**，新版统一标准）
>    - 填写 brand_name（**2~12个字**，如"某某优选"）
>    - 保存后在创意中用 component_id 引用（数字类型，如 `{"component_id": 1940737385209}`）
> 3. ⚠️ 旧版品牌形象（200×200/80×80/300×300等规格）已不可用，全场景报1800355，必须新建新版
> 4. 查账户已有品牌组件：`get-components.mjs '{"account_id":"<ID>","component_type":"BRAND"}'`，返回含 component_id + brand_type(common/wechat_channels等)

**落地页前置条件（试跑发现的关键约束）⭐**：
> 建创意时 main_jump_info 落地页组件是模板必填项，需账户侧预先在【资产→创意资产管理→落地页】中配置好落地页（不限于小程序，H5/小程序/应用宝等各类落地页均在此配置）：
> - 入口：投放管理平台 →【资产】→【创意资产管理】→【落地页】→ 新建落地页
> - 按落地页类型配置（小程序/H5等），配置并审核通过后建创意时引用
> - 若未配置：建创意时报 1800007 "Invalid ID of wechat mini program"（小程序）或落地页字段为空等错误
> 若账户未配置，媒介经理应在段A末尾提醒用户先到【资产→创意资产管理→落地页】配置落地页。

## 产出：《投放策略纪要-[项目名].html》（三段结构）⭐

> **重要**（v1.28.0 修订）：fallback 模式的《投放执行确认单》HTML **与《投放可行性评估》共用 `html-report-card` 卡片规范**——骨架 `html-report-card/assets/template-jinshouzhi.html`、样式 `assets/theme.css` 全文内联、遵守 `references/design-rules.md` 16 条硬规则、交付前跑 `scripts/check_html.py` 需 0 error。`references/html-memo-template.md` 只提供**内容结构**（段A/段B 字段、占位符来源、一致性自检），不再内嵌独立 HTML 模板。

> ⭐ **v1.2.1 UI 统一**：策略纪要与《投放可行性评估清单》**共用同一套设计系统**，两份 HTML 产出视觉上必须是同一套文档（v1.3 起立项单是对话栏文字，不参与 UI 统一）：
> - 字体：系统字体栈（`-apple-system / PingFang SC / Microsoft YaHei`），**不引 Google Fonts、不用衬线展示字体**
> - 底色 `#f7f7f5` 纸感灰 + 单张白卡 `.container`（max-width 900px / radius 12px / 轻投影）
> - 主色 `#378ADD`；状态色 ok `#27ae60` / warn `#e67e22` / bad `#c0392b`
> - 章节用细线 `#f0f0ed` 分隔 + 3px 主色竖条标题；页脚/底纹 `#fafaf7`
> - 段落区分只靠竖条与 seg-tag 底色轻量区分：段A 蓝 / 段B 绿 `#27ae60`（v1.18.0 起段 C 已废，CSS 类保留无害）
> - ⭐ **topbar 左侧必带金手指 logo**（v1.14.0 起）：图标 base64（读 `references/gf-logo-base64.txt` 替换 `{{GF_LOGO_BASE64}}`）+ "金手指 / AI · Ad Agent" + 竖线分隔，与可行性评估同款；不自己画 SVG、不引本地路径、不用 emoji
> - ❌ 禁止：玻璃拟态 / backdrop-filter、渐变文字、多层 radial-gradient 背景、大号衬线标题、深色终端代码块、入场动画
> - 写文件前跑一遍模板末尾的「一致性自检」清单

### 段 A：投放策略段（给 ai投手 建单用）⭐v1.20.0 补五维基建分档推导
五维基建给**具体数字区间**（默认基线，用户有经验则覆盖）。**v1.20.0 起：区间必须按预算分档推导给出**（不再给"裸区间"）：

- **投放方式**：按上方「投放方式判定」结论填写。**格式固定**（v1.20.0）：`智投 AIM+（tencentads-delivery-smart-create）` 或 `标准投放（tencentads-delivery-standard-create）`——skill 名括号附在后面，让 ai投手直接复制选用建单 skill。**v1.23.0 起**：是否智投不设独立字段，由本字段派生（`isSmartDelivery` = 智投 true / 标准 false，灌 open_config 时派生后照传）
- **优化目标 og（v1.24.0 判定逻辑重写，建单必填）**：双字段——`optimizationGoal`（og 英文枚举）+ `optimizationGoalName`（og 中文名）。**判定对照 `references/og-library.md`（层1 语义路由层：33 个浅层 og，不含深转、不含行业特化）**：官方四元组联动（营销目的→推广产品→营销载体→优化目标）+ 归因硬门槛（不接归因=不能用转化 og）——**营销目的输入 = C2 投放目标（v1.24.7 起 C1 已删，品牌宣传由 C3"品牌声量优先"单信号路由）**；小店=平台自动归因（**优先推荐**，前提=告知用户自行搭建官方小店落地页）；落地页=JS；App=SDK/API；无归因=**点击 og + CPC 出价（兜底）**。**出价联动二分**（v1.24.2）：选转化 og → bidding 只能 oCPX（与 `bidding` 交叉校验，矛盾即报）；选点击 og 兜底 → bidding 必须 CPC（按点击计费，不优化转化）。行业特化 og（金融开户/入金、教育低价课、短剧看剧等）不进库，涉及时调知识库查
- **账户**：账户数（**按日预算 4 档分档推导**，v1.20.0）+ 账户类型三选一（白户首选/老户重启/灰户避开）：
  > <1000 元/日 → 1 个 ｜ 1000-5000 → 1-2 个 ｜ 5000-20000 → 2-3 个 ｜ >20000 → 3-5 个
  - 字段值附一行小字推导："日预算 X 元 → 推 N 个账户"。**不再一律"默认 1 白户"**（高预算项目会被低估账户数，过审风险高、量级天花板低）
- **版位**：主投版位(依提需渠道偏好)、排除版位
- **广告结构**：**按日预算 3 档分档**（v1.20.0）：
  > <2000 元/日 → 3×3×5 ｜ 2000-10000 → 3-5×3-5×5-10 ｜ >10000 → 5×5×10
  - 字段值给分档结果（如"日预算 3000 → 4 广告 × 4 创意组 × 8 素材"），不给通用裸区间
- **出价**：出价方式(oCPM等)、出价金额区间、考核指标(AMS枚举，透传自需求单)。**考核指标分两个独立字段**（v1.24.1）：`kpi`（考核目标，单指标、只用成本口径，如 `成本≤90元` CPA 上限，透传需求单成本预期）+ `kpiRedline`（考核红线，**与 kpi 平级、独立指标**而非成对关系，按指标类型推导——**成本类**：常规 × 1.2-1.3 上浮；**ROI/量/率类**：常规 × 0.7 下浮；**触发动作暂不建设**，字段值先录入）。**v1.20.0 出价公式（核心推导依据）**：
  > **初始出价 = 考核成本 × 50%-70%**
  - 字段值附一行小字推导："考核成本 X 元 × 0.5-0.7 = 初始出价 Y-Z 元"——金额区间是**结果**，公式是**依据**（可施工内容，不属"待办型警告"，保留）
  - 调价节奏附在字段值里：单次调价 ≤10%、观察 4 小时再动、冷启动期别频繁调、累计 5-10 个转化后可回调
- **预算**：日预算/总预算/上线日期(透传)
- **定向/时段**：
  - **定向方式默认值**（v1.20.0）：`系统智能定向（首选），有老客种子叠加 lookalike`——oCPM 宽松定向利于探索，有种子再叠
  - **投放时段基线**（v1.20.0，用户经验可覆盖）：00-07 低/暂停 ｜ 09-11 放量 ｜ 14-17 观察 ｜ 20-23 高峰
  - 🚨 **日内时段渲染硬规则**（v1.25.6，实测 bug 修复）：时段基线在字段值里**就是一行文字**（`00-07 低/暂停 ｜ 09-11 放量 ｜ 14-17 观察 ｜ 20-23 高峰` 这种竖线分隔格式）——**禁止**做成"每小时一行"的表格（实测 bug：agent 自由发挥把时段拆成 0-0 / 1-0 / 2-0- 每小时一行，且把字符串当 iterable 逐字符遍历出乱码）；**禁止**对时段字符串做逐字符 enumerate——它是 4 个"区间+短语"块，不是字符序列
  - `deliveryHours` 传金手指时 key 是**时段区间**（如 `"00-07"`、`"09-11"`），值是**单个短语**（如 `"低/暂停"`、`"放量"`）——共 4 块左右，不按小时拆 key
- **素材池衔接**（v1.20.0 新增字段）：`素材池储备`——按段B 预算驱动测算结果填（如"20 张图片（总预算 6000 → 20 张档）"），让 ai投手建单时一目了然池子里有什么，避免段A/段B 信息断裂
- **上新节奏**（v1.20.0 新增字段）：`每 3-5 天补 1-2 条素材进池`——写"上新节奏"字段，让 ai投手/用户知道上线后怎么保持池子活性
- **盯盘节奏**：每天 9:00/12:00/14:00/16:00/18:00 五时点。**v1.20.0 加"盯什么"一行**：盯指标 = 出量广告占比 / 各广告消耗分布 / 素材跑速 / 红线预警 / 冷启动进度
- 🚨 **🚨 段A 末尾禁令（v1.18.0 起生效）**：**不输出**任何"针对可行性评估风险的处理"alert / 账户未配置项的"前置条件配置指引"块 / "合规文案自检" / "上线前必做审核预检"等**待办型警告**——这些内容**不属于执行单的职责边界**，应交给用户在投放时按段A「盯盘节奏」+金手指"项目管理→腾讯广告 Key 托管"自行检查。**执行单只交付"策略 + 可施工内容"**，不要越界变成"上线前待办清单"。可行性评估里的 ⚠️/❌ 项**已经在段A 字段里针对性标注完毕**（v1.2 起的规则，v1.18.0 后段C 删了、标注全部由段A 负责），不必再开新 alert 重复。
  - ⚠️ **v1.20.0 边界澄清**：分档推导小字（账户/结构/出价公式）**属于"策略可施工内容"**，与"待办型警告"不同——推导说明**保留**，待办警告**禁止**。两者别混

### 段 B：素材策略段（给 素材助手 用）⭐v1.17.0 按素材策略规范重写
> 规范来源：金手指「素材策略专家」规范（material-strategy-assistant v3.2 brief_spec）的**策略层**——选什么类型、做多少、要不要视频、怎么传信息。逐条文案/生图提示词等执行层由下游素材模块做，不在本段。

**① 核心主张（段B的灵魂，放最前）**
- 结合 `一句话卖点 × 目标人群 × 投放目标` 提炼**一条**加粗核心主张 + 一两句判断理由（为什么呈现这条最能促转化）。**单一聚焦，只此一条**。
- 例：**睡前点一支，让房间和情绪都慢下来**——该人群痛点是睡前焦虑、购买由情绪价值驱动，呈现"助眠仪式感"比堆成分参数更能促下单。

**② 创意类型推荐（图片选 2-3 类 + 视频规划）**
- **图片只能在官方 13 种类型里选**（🚨 严禁自创/改名/野生命名，如"场景海报""好友分享图"一律不用）：
  > 常规海报 · 模拟朋友圈 · 小红书笔记 · 仿对话 · 数字人海报 · 公众号资讯 · 榜单素材 · 户外海报 · 备忘录 · 大字报 · 九图拼接 · 四图拼接 · IP海报
- **视频 4 种**（仅满足视频门槛时规划）：情景剧 / 单人口播 / 动图（图片动态化）/ 混剪（旁白+画面剪辑）
- 选型逻辑（🚨 **仅内部判断用，绝不写进产出**）：海报类=品牌方正面传递；原生类=仿素人分享弱化广告感；平台样式类=仿平台原生界面；业务元素类=直接亮利益物。**强合规行业（金融/医疗等）原生类风险高（易触"受益人口吻"红线），优先海报类+平台样式类**
- 每个推荐类型给一行：**官方类型名 + 方向/数量 + 一句「怎么给用户传信息」的大白话**（如"像朋友晒店，熟人口吻+评论互动"——🚨 产出里不出现"平台样式类/原生类"等内部黑话，一律翻译成大白话）
- 视频行标注叙事套路（痛点式=痛点共鸣→解决方案→行动引导 / 话题式=热门话题→相关性→引导 / 冲突式=抛误解→解释→共识→引导），按选题各挑一条，不全套同一条

**③ 数量测算（🚨 预算驱动，唯一权威；v1.20.0 档位改互斥）**
> 预算取自上游 `demand_budget_limit`（总预算），账户数取自段A。

| 预算档位（互斥，v1.20.0） | 图片数量 | 视频 |
|---|---|---|
| **<1000 元** | 约 10 张 | ❌ |
| **1000-5000 元** | 约 15-20 张 | ❌ 默认不做 |
| **5000-10000 元** | 10~50 张随预算递增 | ❌ 默认不做 |
| **>10000 元** | 按账户数测算，**单账户约 50 张封顶**，多账户线性叠加 | ✅ 可做 |
| 任意预算但**点名视频/投视频号** | 按上表 | ✅ 做 |

> 🐛 v1.20.0 修复：旧表 `≤500 / ~5000 / 500-1万 / >1万` 档位边界重叠（如总预算 6000 元同时命中"约 5000"和"500-1万"两档，无法判定），改为上表**互斥档**。

**三条硬约束**：① 素材量**最低 10 条**（首投场景由 v1.22.0 公式的"储备 ≥30"取代）；② **单账户图片约 50 张封顶**（行业基建基准 3–5 广告 × 3–5 创意组 × 5–10 素材 ≈ 50/账户）；③ **视频门槛 = >1 万元 或 明确要视频/投视频号**，否则纯图片。

**④ 基建驱动测算公式（v1.22.0 新增，精确数字以此为准）**

> 输入：**日预算**（段A）+ **CPA**（考核成本，需求单 KPI 解析）。公式把「预算 → 基建（广告数）→ 素材/文案数量」串成一条线。

| 输出项 | 公式 | 说明 |
|---|---|---|
| 广告数 | `日预算 ÷（CPA × 20）` | 每条广告日消耗达 CPA×20 才能积累足量转化跑出模型；算出日预算能支撑的并行广告条数。结果取整，不足 1 条按 1 条 |
| 素材数 | `广告数 × 3-5` | 每条广告配 3-5 素材，与段A 广告结构分档一致 |
| 外层文案数 | `= 广告数` | 每条广告 1 条外层文案（外层文案与按钮汇总表 ⑦ 按此动态算） |
| 首条评论数 | `= 广告数` | 每条广告 1 条首条评论（朋友圈版位） |

**硬约束：首次投放（基建路径）素材储备不低于 30**——在投素材（广告数×3-5）是当期消耗量，素材池储备（首投 ≥30）是轮换余量，两者别混；`materialPool.total` 按储备口径填。

**示例**：日预算 1500 元、CPA 90 元 → 广告数 = 1500÷(90×20) ≈ 0.83 → 1 条；素材 = 3-5 张/广告；外层文案 1 条、首条评论 1 条；首投素材池储备 ≥30。
- 满足视频门槛时明确规划：**哪几类视频、各几条、为什么**（视频物料生成为下游职责，本段只到策略层，不遗漏即可）
- 融合表列序固定：**创意类型 · 优先级 · 尺寸 · 数量 · 怎么给用户传信息**（最后列填大白话，不填分类名/术语句）

**④ 尺寸规范（🚨 按创意类型定横/竖/方，不再一刀切）**
- **竖** 9:16 1080×1920：榜单素材、大字报、情景剧/口播/混剪
- **横** 16:9 1920×1080：常规海报、公众号资讯、数字人海报、动图
- 未列出类型按画面特性判断（信息密/竖屏沉浸走竖；横向图文卡片走横；不确定**方图 1:1 800×800 兜底**）
- 整批素材横/竖/方比例**尽量落在约 4:4:2**
- **成品规格要求**（保留）：素材模块须把成品**裁到对应类型尺寸并 JPEG 压到 <1MB**（生图+裁剪压缩由素材模块负责，投手直接上传）

**⑤ 一句话卖点**：透传自需求单 Part2（与①配合——卖点是原料，核心主张是提炼）

**⑥ 品牌资产透传（缺口C修复，保留）**：本段**固定带一栏「品牌资产透传」**，**引用**（不复制）提需确认单 Part2 的品牌资产：
  ```
  【品牌资产透传·引用自《投放需求信息确认单》Part2】
  - logo：[有/无/待确认]（来源：确认单Part2，素材助手请以确认单文件为准取原图）
  - 主色/品牌色：[色值 或 待确认]
  - slogan：[原文 或 待确认]
  - 风险提示语：[原文 或 待确认]
  ```
  - 缺失项用 `pill miss` 标记（**仅状态显示，不附"建议联系设计/品牌方"等待办型话术**），不编造。logo/风险语只**透传**不参与生成，留待后置组装环节精确叠加。
  - v1.19.0 起：模板里那段"→ 素材助手需直接读取...本栏仅作透传指引"也删了——透传栏只展示字段状态，不输出"该怎么做"的指导性话术

**⑦ 外层文案与按钮汇总（v1.25.6 起含 CTA 规则；v1.25.7 恢复素材策略专家原始规范）**

- **外层文案**（`outerCopy` string[]）：条数 = 广告数；每条一句话、与素材方向呼应
- **首条评论**（`firstComments` string[]）：条数 = 广告数（朋友圈版位）；熟人口吻、不直接提产品名
- **转化按钮**（`ctaCopy` {primary, backup}）——**原始规范**（来源：素材策略专家 copywriting_method.md「转化按钮」章节，v1.25.7 恢复，替换 v1.25.6 臆造的 og 映射表）：

  - **固定选项，不可自定义**：从平台可用列表里选——朋友圈共 **17 个**：`了解更多 / 去逛逛 / 查看详情 / 立即体验 / 立即咨询 / 立即购买 / 立即抢购 / 立即领取` 等。**不要发明列表外的按钮文案**（v1.25.6 臆造过"立即预约/免费咨询/立即注册"等，均不在平台列表）
  - **按产品调性选**：
    - 氛围型/无压迫产品（香氛/家居/生活方式/内容订阅）→ 优先 **"去逛逛"**
    - 强购买意向（实物电商/虚拟商品直售）→ **"立即购买"**
    - 限时活动/优惠驱动 → **"立即抢购"**
    - 工具试用/体验驱动 → **"立即体验"**
    - 服务咨询/留资类 → **"立即咨询"**
    - 权益/券类发放 → **"立即领取"**
    - 兜底（无明显调性倾向）→ **"了解更多"**
  - ⚠️ **硬约束：选什么按钮，落地页就必须能完成对应动作，否则审核驳回**——按钮文案暗示的行为要与落地页能力一致（这一条同时隐含了与 og 的一致性：og=COMPLETE_ORDER 配"立即购买"✅、配"去逛逛"❌）

## 进度条（v3.14 起，每条回复开头必带；v1.25.0 起改三步制）

本 skill 执行期间处于 3/3 阶段，每条回复消息最开头先放一行进度条再接正文（v1.25.0 起全链路 4 步变 3 步：提需含灌入 → 可行性评估 → 确认单含灌入+上线）：

```
📍 3/3 执行确认单+开启投放｜✅ 需求收集 ✅ 需求评估 ▶ 执行确认单（产出即灌入）
```

## 一气呵成产出（v1.26.0 起主路径无 HTML，不做分段确认）

段 A（投放策略）+ 段 B（素材策略）**一次性全部完成**，不做段间确认（v1.18.0 起段C 已删除）——
- 不再设"交接点2a 媒介策略确认"和"交接点2b 素材策略确认"两个中间确认环节
- **🚨 v1.26.0 起主路径不写 HTML 文件**：两段内容直接落成 `strategy` 全量结构化字段（48 个），灌入金手指配置页——**页面本身就是"确认单"**，用户在页面上核对/修改（实测背景：产出本地 HTML + 拉起页面 = 同一份内容出现两次，冗余）
- 主交互全程在配置页，本地无任何冗余产物
- **fallback 触发条件收紧（v1.29.0）**：只有两种情况才写本地 HTML —— ① **用户明确选择「先不连金手指」**（且已被告知"策略只能落本地文件、不能直接开投"）；② **已连上但调用失败 / `degraded:true`**。⛔ **连接未就绪 ≠ fallback**：那种情况按 agents《第 0 步 连接就绪检查》先引导连接，**不得直接产出 HTML**。触发后写《投放执行确认单-[项目名].html》存档并按既定轨道打开，话术"确认后我再灌入金手指"。**HTML 走 `html-report-card` 卡片规范**（与可行性评估同一套模板，v1.28.0 起统一）；内容结构见 `references/html-memo-template.md`

## 灌入金手指（策略产出后立即执行；v1.26.0 起主路径）

1. **拼装 `strategy` 全量结构化字段**（48 个：`demand.groups` 5 分区 + Part 2/3/4 顶层字段）——数据源：**对话上下文里的立项单完整文字**（拼 `demand.groups`）+ 本环节段A/段B 策略结论（拼 Part 2/3/4）。⚠️ **这是全流程唯一一次灌入**，需求单字段必须一并灌进去，不能只灌策略字段。字段清单与填值规则见下方《灌入金手指：open_config 全量字段》章节
2. **立即调金手指 `open_config` 全量灌入**（不等用户对话确认——用户确认移到页面上）
3. **session 双重校验**：① curl 字段清单校验（抓漏传字段）→ ② sleep 2 后 curl 存活复查（防服务端重启清 session）——**两步都通过才拉起页面**
4. **`present_files` 传 session 短链拉起配置页**（唯一打开方式）+ **同条回复里前置兜底 markdown 超链接**（"右栏要是空白的，点这里进配置页"）
5. **fallback**：金手指 MCP 不可用或 `degraded:true` → 写《投放执行确认单-[项目名].html》（路径 `投放产出/[YYYY-MM-DD]/投放执行确认单-[项目名].html`，工作区相对路径）：**骨架/样式走 `html-report-card`**（`assets/template-jinshouzhi.html` + `assets/theme.css` 全文内联 + `references/design-rules.md` 16 条硬规则 + `scripts/check_html.py` 0 error 闸门，与可行性评估完全同一套），**内容结构**（段A/段B 字段、占位符来源、自检项）见 `references/html-memo-template.md`；按既定轨道打开，话术改回"确认后我再灌入金手指"，不阻塞产出

## 交接摘要（3/3 灌入金手指并拉起页面 · 对外话术，v3.16 重排格式；v1.26.0 起主路径不产本地确认单）

**受众分层（核心认知）**：投放执行确认单是**给投放系统/机器读的**，不是给用户读的。里面会有 oCPM 出价、版位配置、转化归因这些专业内容——用户看不懂**很正常，也不需要看懂**。对用户只需要说清：**大体打法是什么（一句白话）、他还缺什么、方向对不对**。

**🚨 文本格式硬约束**（v3.17 用户实测反馈"老是大段大段的给，没有重点"）：单段 ≤ 80 字、超出用列表、核心加粗前置、emoji 标记、空行分隔。

**🚨 session 双重校验通过 + present_files 拉起配置页后，🚨 必做紧跟这段收尾话（不能只丢产物就走；v1.26.0 话术，兜底链接前置）**：

```
🎯 投放方案做好了——内容已经灌进金手指配置页，在右边栏打开了。
右栏要是空白的，点这里进配置页：[点这里进配置页]({{BASE/pre-launch?session=SID}})

**这份是给投放系统读的**，专业内容您不用细看。

**📌 大体打法**
- [版位选择 + 预算节奏 + 素材打法，每条 ≤ 20 字]

**⚠️ 之前评估的风险已落处理**
- [风险1] → [处理方式]
- [风险2] → [处理方式]

**🔧 你在页面上做**
- 页面**当前停在第一步「需求单确认」**（2026-08-26 前端源码实证：`?session=` 与 `#s=` 两条灌入路径都硬编码 `o(G.PLAN_PREVIEW)`，与 strategy 内容无关；`open_config` 入参只有 `strategy/rawHtml/project_id`，无 stage 参数，调用侧无法控制）——**灌入的策略字段已经在页面里**，点「确认」进第二步「AI投手准备」就能看到「投放策略」「素材策略」两个 tab
- 先核对预填的字，要改的直接在页面上改；大改回来说一声，我改完重新灌一版
- 然后**手动点"下一步"进"投放计划"** → 关联账户 → 生成投手 → 上传素材 → 点「项目上线」

💡 链接 30 分钟内有效，过期了说一声我重新灌。
```

**"大体打法"提炼标准**：

- 从段 A 投放策略提炼，翻译成普通人能懂的列表化短句——版位选择 + 预算节奏 + 素材打法三要素
- ✅ 好例子：`📌 大体打法` + 列表：`走智投自己挑版位` / `日预算 500 起小预算跑一周` / `3 套素材轮着赛马，哪套跑顺加钱`
- ❌ 坏例子：`oCPM 出价 80-120，版位朋友圈+视频号，RTA 策略……`（术语复述不是白话）
- 用户看了能向老板/同事转述"我们要怎么投"，才算合格

**❌ 反例**（旧风格，截图里那种大段；数字一律是占位示意，**真实产出禁止照抄任何示例数字**）：

> 🎯 投放执行确认单出好了，在浏览器里打开了——怎么出价、怎么搭结构、要准备什么素材，都写成具体的执行方案了。核心几句话：走智投让系统自己挑版位，[N]个新账户小结构开跑（[N]条广告×[N]素材），探索期出价给到 [X]元、第[N]天起再按 [X]元线考核；素材做 [N] 条，[风格A]和[风格B]两组赛马，让数据告诉你哪个方向对。之前评估出的两个风险我在确认单里都落了处理：落地页没搭是硬阻塞……

**对比**：反例单段 200+ 字平铺；正例拆 4 段、每段 ≤ 3 行、列表化。

> ⚠️ **话术必须与实际轨道一致**：走 present_files 说"在右边栏打开了"，走 Bash open 说"在浏览器里打开了"。**不谎报**已打开。
> 🚨 **保真规则（v1.26.0）**：收尾话术/交接摘要只陈述**实际发生的动作**——session 校验失败了就如实说"重新灌了一版"；没打开不说"已打开"；没灌入不说"已灌入"；**禁止照抄模板里的示例状态**（模板写"在右边栏打开了"≠你真的拉起过）。
> ❌ **禁用标签格式**："这是什么：xxx""给谁用：xxx"——表单不是人话。
> ❌ **不引导用户看执行细节**：不说"你看看出价对不对、版位选得行不行"——用户只确认方向。

## 📌 灌入后页面落点：stage 现状与执行单位置（2026-08-26 前端源码实证）

**结论先给**：`open_config` **无法指定落在哪一步**——金手指前端 `index-*.js` 里 `?session=` 与 `#s=` 两条灌入路径都硬编码 `o(G.PLAN_PREVIEW)`，与 strategy 内容无关；`open_config` 入参只有 `strategy / rawHtml / project_id`，没有 stage 参数，也没有可用的 URL 参数。**灌入后页面一定停在第一步「需求单确认」。**

**页面五步与数据消费**：

| stage | 页面 | 消费的数据 |
|---|---|---|
| `PLAN_PREVIEW=1` | 需求单确认 | 只读 `demand.groups`（空则显示"召唤媒介经理"占位） |
| **`AI_OPTIMIZER=4`** | **AI投手准备 ← 执行单在这里** | 三个 tab：信息配置 / **投放策略** / **素材策略** |
| `UPLOAD_MATERIAL=5` | 投放素材准备 | 用户上传 |
| `GO_LIVE=6` | 投放执行 | — |
| `DASHBOARD=7` | 效果复盘 | — |

**两个策略 tab 的显示条件**（源码函数，决定我们必须灌哪些字段）：
- **投放策略** `dc()`：`kpis` / `fields` / `deliveryHours` 任一非空
- **素材策略** `fc()`：`kpis` / `sellingPoint` / `specs` / `poolDesc` / `testDirections` / `brandAssets` / `coreClaim` / `creativeDirections` / `finishedSpec` 任一非空

→ **只要按本章节灌全 48 字段，两个 tab 的数据就都在**，用户在第一步点一次「确认」即进入执行单页。

**对外话术**：如实说"页面停在第一步需求单确认，你核对完点「确认」就进 AI投手准备，投放策略和素材策略都已经预填好了"。**不要**说"已打开执行单页"（不实），也**不要**当成故障道歉（这是平台当前行为）。

**给金手指侧的改法**（已提反馈）：把两条路径的 `o(G.PLAN_PREVIEW)` 改为 `o( dc(ct)||fc(ct) ? G.AI_OPTIMIZER : G.PLAN_PREVIEW )`——含策略字段直接落执行单页，仅需求单才停第一步。

## 🚀 灌入金手指：open_config 全量字段（原 4/4；v1.26.0 起策略字段拼装完成后立即执行）

**触发**：段A/段B 策略字段拼装完成后**立即执行**（不等用户对话确认——用户确认在配置页面上完成；v1.26.0 起主路径**没有 HTML 落盘步骤**，拼完字段直接灌）。用户回对话说"重新灌/再开一次/过期了" → 也走本章节重新灌入（新 session 新链接，旧的自然过期）。

**执行流程**（严格按顺序）：

1. **调金手指 `open_config`**（工具全名 `mcp__jinshouzhi__open_config`——2026-08-26 起金手指连接器 key 为 `jinshouzhi`（token 鉴权），14 个工具；旧 key `ad-goldfinger` 是残留通道不再使用）——⚠️ **全部走结构化字段，不传任何 HTML**（v1.16.0 起）：

   工具签名是 `strategy`（object，必填）+ `rawHtml`（string，可选）。**`rawHtml` 不用**——`strategy` 里直接给结构化字段，配置页前端本就支持结构化通道，比"生成 HTML 再用 DOM 解析回结构"更稳。

   ```
   open_config({
     strategy: {
       // ══ 需求单：结构化 groups（对应配置页「需求单」区）══
       demand: {
         title: "投放需求单 · [项目名]",
         meta:  "[行业] · [投放目标] · [日期]",
         groups: [
           { title:"基础信息", icon:"📋", fields:[
               {k:"产品名称", v:"[offerId]"},
               {k:"产品简介", v:"[demand_offer_intro]"},
               {k:"核心卖点", v:"[demand_selling_points]"} ]},
           { title:"预算与目标", icon:"💰", fields:[
               {k:"测试目标", v:"[demand_test_goal]"},
               {k:"考核指标", v:"[demand_kpi]"},
               {k:"总预算",  v:"[demand_budget_limit]"},
               {k:"投放周期", v:"[demand_budget_cycle]"},
               {k:"上线时间", v:"[demand_launch_date]"} ]},
           { title:"人群策略", icon:"🎯", fields:[
               {k:"客户类型", v:"[demand_audience_logic]"},
               {k:"核心人群", v:"[demand_core_ta]"} ]},
           { title:"素材与承接", icon:"🎨", fields:[
               {k:"现有素材", v:"[demand_has_material]", badge:"[风险提示]", badgeType:"warn"},
               {k:"线上门面", v:"[demand_carrier]"},
               {k:"商品渠道", v:"[demand_product_channel]（C11 条件题，未问则整条略去）"},
               {k:"开发资源", v:"[demand_dev_resource]"} ]},
           { title:"其他", icon:"📎", fields:[
               {k:"合规要求", v:"[demand_compliance]"},
               {k:"历史经验", v:"[demand_history]"} ]}
         ],
         footNote: "由金手指 · 媒介经理生成"
       },

       // ══ 策略单：结构化字段（对应配置页「投放策略」区）══
      offerName:          "[项目名]",
      pathType:           "[基建/诊断]",
      deliveryMode:       "[智投 AIM+ / 标准投放]",
      isSmartDelivery:    true,               // 派生字段（v1.23.0）：deliveryMode 为智投时 true，不独立取值
      optimizationGoal:   "[og 英文枚举，如 CLICK]",           // v1.23.0：由开发资源+知识库判定
      optimizationGoalName: "[og 中文名，如 点击]",             // v1.23.0：与英文枚举成对展示
      accountCount:       1,
       accountNote:        "[如：新白户]",
       dailyBudget:        1500,               // 数字，元
       totalBudget:        50000,              // 数字，元
      bidding:            "oCPM", // 转化 og 配套；兜底场景（点击 og AD_CLICK）改 CPC
      bidRange:           96,                 // 数字单值（元），不给区间（v1.20.0 起口径；考核成本×50%-70% 推导结果）
       kpi:                "[考核成本上限，如 成本≤90元（CPA）]",   // v1.23.1：单指标、只用成本口径
      kpiRedline:         "[考核红线，v1.24.1 独立指标；成本类=常规×1.2-1.3 上浮，ROI/量类=常规×0.7 下浮；触发动作暂不建设]",
       adStructure:        "[如 3条广告 × 3创意组 × 5素材]",
       adCount:            3,
       creativeGroupCount: 3,
       audience:           "[人群定向建议]",
       // placements 已删（v1.24.3）：主投版位不灌入（智投场景系统择优无预设值），金手指页面手动配置
       deliveryPeriod:     "[如 30天]",
       launchDate:         "[YYYY-MM-DD]",
       watchTimes:         ["09:00","12:00","14:00","16:00","18:00"],
       // ⚠️ materialPool 按"段B 预算驱动测算结果"动态填，示例值仅示意（<1000 档 → 10 张纯图片；>1万 → 按账户数 50张/账户 + 可做视频）。**不要照抄这个示例值**（v1.20.0 修复：旧示例 {50,10,40} 是已废弃的"固定 50 条=10视频+40图文"，容易诱导回退旧逻辑）
       materialPool:       { total:20, video:0, image:20 },
       sellingPoint:       "[一句话卖点]",
       coreClaim:          { claim: "[核心主张]", reason: "[判断理由]" },   // Part 3（v1.24.5 起）
       creativeDirections: [                                            // Part 3 素材方向（v1.24.5 起由 materialTypes 更名）
         { category:"image", type:"[官方13类之一]", priority:"主推", count:8, size:"竖9:16 1080x1920", message:"[怎么给用户传信息·大白话]" }
       ],
       materialSpecs:      ["竖版9:16 1080x1920","方图1:1 800x800"],
       finishedSpec:       "[成品交付规格：裁剪/压缩要求]",               // Part 3
       outerCopy:          ["[外层文案1]"],                              // Part 4（v1.24.6 起 copyDeck 拆三）
       firstComments:      ["[首条评论1]"],
       ctaCopy:            { primary: "[主选按钮文案]", backup: "[备选]" }
     }
   })
   ```

   > **字段依据**（已抓配置页前端 JS 核实，勿臆改）：
   > - 需求单：`rawDemandHtml || demandHtml` 若是 HTML 则 DOM 解析；**否则读 `demand.groups`（我们走这条）**
   > - 策略单：`rawHtml || html` 若是 HTML 则解析；**否则走纯结构化分支读上面那 23 个字段（我们走这条）**
   > - `fields` 里每项结构：`{k, v, badge?, badgeType?, pending?, full?}`；`badgeType` 取 `ok`/`warn`/`danger`
   >
   > **为什么不传 HTML**：HTML 通道依赖前端 DOM 选择器（`.sec` `.field` `.k` `.v`），我们改模板样式就可能解析失败；结构化字段直给，不存在解析风险。实测 `success:true` / `degraded:false`，页面正常预填。

   **填值规则**：
   - 数值字段（`dailyBudget`/`totalBudget`/`adCount` 等）传**数字类型**，不要传 `"1500元"` 这种字符串
   - `demand.groups` 里**没问到的字段整条略去**（不写"待定/缺失"占位）；分区内全空则整个分区不放
   - 用户答"没有"的项**要如实带上**并配 badge（如现有素材"都没有" + `badge:"需从零准备"`）
   - 值都从对话上下文的立项单文字 + 本环节执行单内容取，**不编造**

2. **取返回的 `sessionId`，做 session 双重校验**（⭐ v1.26.0：字段校验 + 存活复查；2026-08-25 实测教训——灌入成功后服务端重启清了内存 session，3 分钟后链接 404，用户点开空白）：

   - **为什么改走 session 短链**：`recommendedLink` 的 `#s=` 内联深链 1000~3000+ 字符，在 AI 调用链复制转手中**稳定损坏**（两次实测 1358/1370 字符均 gzip 报废，232 字符才安全）——不是 URL 超长（上限 32000），是复制保真问题。而 `?session=` 深链只有 32 位 hex，**零复制风险**；FAT 单实例下 session 一定能查回（curl 实证）
   - **deepLink 禁令修订（v1.25.2，分环境）**：~~"绝不给 deepLink"~~ → **FAT/单实例环境放行**（先 curl 验证 session 在，再 open）；**生产/多副本环境仍禁**（内存 session 多副本查不回，点开空页——v1.11 教训不变）
   - **curl 字段清单校验（必做，能精确抓漏传字段）+ 存活二次校验**——命令只做校验，**打开不在这条命令里**（一律 present_files，见下）：

     ```bash
     SID='<返回的 sessionId>'
     BASE='https://ad-goldfinger.app.fitgroup-fat.com'   # 按当前连接器端点，勿照抄
     # ① 字段清单校验（抓漏传字段）
     curl -s --max-time 10 "$BASE/api/mcp/session/$SID" | python3 -c "
     import json, sys
     d = json.load(sys.stdin)
     assert d.get('success'), 'session 不存在或已过期'
     s = d.get('strategy', {})
     P2 = ['offerName','pathType','deliveryMode','optimizationGoal','optimizationGoalName',
           'accountCount','accountNote','excludedPlacements','adStructure','adCount',
           'creativeGroupCount','bidding','bidRange','kpi','kpiRedline','dailyBudget',
           'totalBudget','launchDate','deliveryPeriod','audience','deliveryHours',
           'budgetAllocation','watchTimes']
     P3 = ['sellingPoint','coreClaim','creativeDirections','materialPool','materialSpecs','finishedSpec']
     P4 = ['outerCopy','firstComments','ctaCopy']
     g = len(s.get('demand', {}).get('groups', []))
     m2 = [k for k in P2 if s.get(k) is None]
     m3 = [k for k in P3 if s.get(k) is None]
     m4 = [k for k in P4 if s.get(k) is None]
     print('offerName:', s.get('offerName'), '| demand 分区:', g)
     print('Part2 漏:', m2 or '无', '| Part3 漏:', m3 or '无', '| Part4 漏:', m4 or '无')
     assert g >= 1 and not (m2 or m3 or m4), '有字段漏灌'
     print('字段校验通过')
     "
     # ② 存活二次校验（⭐ v1.26.0 新增）：灌入成功 ≠ 链接可用——服务端重启会清空内存 session
     #    实测：19:58 灌入成功 → 19:59 服务重启 → 20:01 查询 404（TTL 明明 30 分钟）
     sleep 2
     CODE=$(curl -s --max-time 10 -o /dev/null -w '%{http_code}' "$BASE/api/mcp/session/$SID")
     [ "$CODE" = "200" ] && echo "存活确认 OK，可以拉起页面" || echo "存活确认失败（HTTP $CODE）→ session 已被服务端清掉，需重新 open_config 重灌"
     ```

   - **校验报错处理**：
     - `session 不存在或已过期`（30 分钟 TTL）→ 重新调 `open_config`
     - `有字段漏灌`（列出具体 key）→ 回到第 1 步补齐该字段重灌——**2026-08-24 实测此清单抓出过漏传的 `creativeGroupCount`**，比肉眼看页面猜"还差几项"精确得多
     - **存活复查非 200**（⭐ v1.26.0）→ 服务端刚重启过、session 已被清——**重新调 `open_config` 拿新 session 再走一遍校验**；重灌成功后向用户如实说一句"刚才服务端重启了一下，我重新灌了一版"（保真规则：不装作没发生）
   - `inlineMode` 返回 `lite` 是**正常的**；只有 `degraded:true` 才提示用户"内容较多，页面可能只预填了部分字段"
   - **兜底链接前置（⭐ v1.26.0）**：右栏预览面板对深链渲染**偶发空白**（v1.25.1 已记录 iframe 对深链不可靠，两次实测空白）——兜底 markdown 超链接**不能等收尾才给**，要和 present_files 拉起页面**同一条回复**里就带上，用户看到空白立刻有出口：
     ```
     已在右栏打开配置页；右栏要是空白的，点这里进配置页：[点这里进配置页]({{BASE/pre-launch?session=SID}})
     ```
     session 短链本身就是短 URL（~90 字符），可直接做链接目标

3. **生产/多副本环境 fallback（暂未启用）**：若 curl 查不回 session（多副本路由到别的实例），退回 `recommendedLink`（`#s=` 内联）——但 AI 调用链复制长 URL 有稳定损坏风险，**生产就绪依赖金手指侧加 `inlineChecksum`（payload sha256 前 8 位）或短码模式**（已列入给金手指的对接建议）。就绪前的过渡做法：URL 只复制一次进 shell 变量，同一条 Bash 命令「python 解码 `#s=` 校验 offerName → 通过才用 present_files 打开」，报错即重调 `open_config`（新链接重试，30 分钟机制内可多次）。
   - 🚨 **打开一律走 `present_files` 传 session 短链**（右侧面板内拉起）——❌ **没有第二条路，绝不走 `Bash open` 跳外部浏览器**（用户实测反馈：跳外丢失对话上下文；agent 默认动作"Bash open"是 shell 语义陷阱，必须在 skill 里彻底排除这个选项；**校验命令里也不许内嵌 open**）。仅 fallback 模式（MCP 不可用）下的 HTML 存档产物走 present_files 推卡片

4. **收尾话术**：session 双重校验通过、present_files 拉起配置页后，按《交接摘要》章节的收尾话模板输出（含**前置兜底链接**/大体打法/风险处理/页面待办/30 分钟有效期提示）；fallback 模式（写了 HTML）才提存档路径。**保真规则**：只说实际发生的事。

**异常处理**：

- 金手指工具不可用（MCP 未连接）→ 提示："开启投放需要连一下金手指（广告投放系统）。你在左侧连接器里把「金手指」连上，我再继续。"不硬调
- 返回鉴权失败 → 提示："这个项目还没在金手指里托管腾讯广告 Key——到金手指「项目管理 → 腾讯广告 Key 托管」配置一下，配好我再试。"
- `open_config` 报错 → 如实告知，不编造"已灌入"

**灌入之后的延伸（用户主动问时才做）**：

- "看下数据" → 调 `get_project_data`（project=项目名，days 默认 7）
- "有哪些项目" → 调 `list_projects`
- 调整预算/出价/暂停 → 调 `adjust_project`——⚠️ **写操作必须先复述将要执行的调整，用户确认后才传 `confirm:true` 执行**；未确认只返回预览

> ✅ **落库读写工具状态注记**（2026-08-25 复验，MCP v1.0.5 / server 1.0.48）：金手指服务端问题 #3（生产库 `db_prod_ad_goldfinger.projects` 表不存在）**已修复**——`list_projects` / `get_project_data` / `adjust_project` / `validate_apikey` / `upsert_demand_brief` / `get_project_context` **恢复可用**（0824 曾全挡，历史注记作废）。用户问数据/调整时正常调用即可（写操作仍必须先复述确认再 `confirm:true`）。
> **灌入预填与落库无关**（2026-08-24 源码核实）：`recommendedLink` 的 `#s=` 内联 payload 是**纯客户端解码**（gzip+base64url，`PreLaunch.tsx` 的 decodeInline），与服务端数据库完全无关——只要 URL 复制完整，页面预填就正常。**"页面空白/显示旧数据"先查 URL 是否复制损坏**（走上方校验闸门）。落库增强（现已可用）：open_config 灌入后**额外调一次** `upsert_demand_brief`（project + payload = strategy 全量）实现按项目落库、页面刷新后仍在。

## 打印交接摘要（给下游读）
```
【交接点2 产出：投放策略（金手指已灌入）】主路径无本地 HTML 产物（v1.26.0 起字段直灌）
- 需求字段 → 从提需 session 的 strategy.demand.groups 取（curl 校验时已拉回）✅
- 段A 投放策略 + 段B 素材策略 + 文案 → open_config.strategy 全量 48 字段 ✅
- v1.26.0 起字段拼装完成即灌入（已调 open_config，session 双重校验通过，配置页已 present_files 拉起）
- fallback 模式才有文件：投放产出/[YYYY-MM-DD]/投放执行确认单-[项目名].html（MCP 不可用/degraded 时）
- 用户在页面核对/改字段 → 生成投手/上传素材/项目上线
- 后续数据/调整 → 金手指 get_project_data / adjust_project
```

## 上下游对齐（接口契约）
| 下游需要 | 本环节产出？ | 状态 |
|---|---|---|
| **投放方式(标准/智投)判定** | ✅ 段A「投放方式」字段 | 对齐(试跑补) |
| 账户/版位/广告/出价/预算/定向 | ✅ 段A | 对齐 |
| ai投手专属配置+盯盘节奏 | ✅ 段A | 对齐 |
| 转化归因配置提醒 | ❌ v1.18.0 起不输出（属前置条件，交给用户自查） | 砍 |
| 图片创意「仅上传+建创意」SOP | ❌ v1.18.0 起砍段C（属 ai投手自身职责，越界） | 砍 |
| 核心主张+创意类型推荐(13类+视频4类)+数量测算+尺寸+成品规格 | ✅ 段B（v1.17.0 素材策略规范） | 对齐 |
| 品牌资产(logo/主色/slogan/风险语) | ✅ 段B透传·引用需求清单 | 对齐 |
| 账户ID列表/落地页URL | ❌ 用户在ai投手投放前提供 | 见提醒 |

## 全局原则
- 五维基建/诊断方法论参考 `ai-analysis-expert-newproject`/`-diagnose`，**不改原 skill**。
- **投放方式判定**：用户指定版位→标准投放；未指定/接受智能择优→智投AIM+。判定结果写入段A，ai投手据此选建单skill。
- 缺口C：品牌资产**引用**需求清单，不复制原始文件，素材助手以需求清单为准取原图。
- **两段一气呵成产出**（v1.18.0 起；v1.26.0 起无 HTML）：段A+B 一次做完，不做段间确认（段C 已删）——主路径直接落成 strategy 结构化字段灌入金手指，**不写本地 HTML**
- **主路径无 HTML；HTML 仅 fallback**（v1.26.0 起）：仅当金手指 MCP 不可用 / `degraded:true` 时，才写《投放执行确认单-[项目名].html》存档——**骨架走 `html-report-card`（与可行性评估同模板，v1.28.0 起统一）**，内容结构照 `references/html-memo-template.md`，theme.css 全文内联、文件自包含，跑 check_html.py 0 error 才交付；按既定轨道打开，话术改回"确认后我再灌入"
- **UI 必须与可行性评估一致**（v1.2.1 起，仅约束 fallback 产物）：系统字体 + `#f7f7f5` 纸底 + 单白卡 + `#378ADD` 主色 + 细线分隔 + **topbar 金手指 logo**（v1.14.0 起）；禁止玻璃拟态/渐变文字/深色代码块/入场动画。写文件前过一遍模板末尾「一致性自检」。
  - ✅ **v1.28.0 已统一**：fallback 确认单与可行性评估**共用 `html-report-card` 卡片规范**（用户决策 2026-08-26）——两份产物 UI 一致；`html-memo-template.md` 降级为纯内容结构指南。
- **策略完成必须灌入金手指**（v1.25.0 起取代 v1.5"写完必须打开"；v1.26.0 改述）：段A/段B 字段拼装完成后立即 `open_config` 灌入 + session 双重校验 + present_files 拉起配置页，不要只说做了什么而不做。**灌入成功 ≠ 交付完成**——校验失败要重灌并如实告知用户。
- ⭐ **立项单从对话上下文读**（v1.27.0 起）：不要 Read 立项单文件（不存在），也不要 curl session（提需阶段已不灌入，无 session）；直接从对话栏那份完整立项单文字逐字段取值。
- 🚨 **素材数量禁止照抄示例**（v1.26.0）：`materialPool` / `creativeDirections[].count` / 外层文案与首评条数，**必须由段B 预算驱动测算公式当次算出**——禁止照抄本 skill 任何示例值、反例数字或上一个项目的数量（实测发现 agent 把反例里的"8 条素材"抄进了真实产出）。
- 🚨 **og 枚举照抄产物原文**（v1.26.0）：`optimizationGoal` 英文枚举与 `optimizationGoalName` 中文名，**照抄段A og 判定结论的原文**（评估/确认逻辑里定的是什么就传什么），灌入时不临场改枚举、不凭印象编——枚举错位会导致金手指页面按钮/目标错配。

## 参考资源
- `references/html-memo-template.md`：**策略纪要 HTML 模板**（生成纪要时必须对照，含 CSS 设计系统、三段结构骨架、占位符填写指南、段导航 JS、一致性自检清单）。**UI 基准以本模板为准**（v1.3 起立项单已无 HTML 模板）。

