数据范围以 Figma「智能广告投放 2.0」向导四屏为准(广告分析对象 → 产品背景 → 运营节奏+销售目标 → 广告表现目标)。 四屏是信息范围,不是交互(D-3):A2 里这些字段由 skill 自动取数 + AskUserQuestion 按需追问收集,不做 GUI 表单。 落盘基线:workspace_operational_goal.schema.jsonv1.1(origin/dev,含 PR #1044)。本地 dev@2763ce07 仍是 v1.0,开工先git pull。 配套:A2 专家模式 Schema 工程契约 v1.0(38 字段全集、取数途径、判定引擎、落盘链路——本文只钉四屏对应的收集层)。
四屏共 16 个字段。Figma 里全靠用户填;A2 里按「系统能不能拿到」分四档:
| 处置 | 含义 | 字段数 |
|---|---|---|
| 🟢 自动取数 | 领星/listing 直接读,不出现在对话里 | 4 |
| 🔵 推导后陈述 | 系统推出结论,一句话告知,判错了用户说一声即改 | 3 |
| 🔴 必须问 | 数据里没有,AskUserQuestion 给选项 | 3 |
| ⚪ 可选补充 | 不问;用户主动给就收,给了会用上 | 6 |
默认路径下用户被问到的还是 3 题(运营任务 → 采购在途 → 成本区间),与既有契约一致。
| # | Figma 字段 | key | 类型 | A2 处置 | 来源 / 问法 | 落盘 |
|---|---|---|---|---|---|---|
| 1 | 分析对象(ASIN/站点) | primaryAsin + marketplace | string | 🟢 自动 | product_meta.json(工作区绑定即定,多产品才问) | primary_asin ✅ 已有 |
| # | Figma 字段 | key | 类型 | A2 处置 | 来源 / 问法 | 落盘 |
|---|---|---|---|---|---|---|
| 2 | 是否是新品 * | maturity | enum new / existing / unknown | 🔵 推导后陈述 | 由 listing.review_count + 30 天订单量推;阈值未定义(契约 6.6)→ 判不出时返回 unknown 并转问 | assumptions.maturity 🆕 |
| 3 | 竞争优势(可选) | competitiveAdvantages | string | ⚪ 可选补充 | 不问。用户在输入框主动说(如「我们有专利结构」)就收 | operator_inputs.jsonl(type=product_context)† |
| 4 | 产品卖点(可选) | sellingPoints | string[] | ⚪ 可选补充 | 同上;listing 只有 title 没有五点描述,不能自动取 | 同上 † |
| 5 | 历史产品状态 * | stockHealth | enum stable / stockout_risk / recovering | 🔵 推导后陈述 | 可售天数 vs 周期剩余天数 推导(置信中);「断货恢复中」推不出来,只能等用户纠正 | assumptions.stock_health 🆕 |
| 6 | 产品成本区间(可选) | costMinUsd / costMaxUsd | number ≥0 | 🔴 必须问(条件) | 仅当 task ∈ {盈利模式, 清库存}。⚠️ 从 Figma 的数字区间替换掉契约里的三档枚举——数字能算保本线区间,枚举不能 | assumptions.cost_range_usd 🆕 |
| 7 | 产品价格优势 * | pricePositioning | enum premium / mainstream / value | ⚪ 可选补充(defaultOnly) | 出价公式没有定位变量(契约 §3.4),默认 mainstream,一句话告知 | assumptions.price_positioning 🆕 |
| 8 | 评分(可选) | rating | number | 🟢 自动 | listing.rating ✅ 真实抓包已核实 | 不落目标文件(证据链引用) |
| 9 | 评论数(可选) | reviewCount | integer | 🟢 自动 | listing.review_count ✅ | 同上 |
| 10 | 产品排名(可选) | bsrRank | object {major:{rank,category}, minor:{rank,category}} | ⚪ 可选补充 | listing payload 无排名键,自动取不到;用户给了就存。⚠️ 与 linxx #7(排名 100→50 测算)同域:收数据、不做测算承诺(D-4) | operator_inputs.jsonl † |
| # | Figma 字段 | key | 类型 | A2 处置 | 来源 / 问法 | 落盘 |
|---|---|---|---|---|---|---|
| 11 | 当前运营任务 * | task | enum bsr / profit / test / clear / other + taskCustom?: string | 🔴 必须问(always,第 1 题) | 唯一的 always。Figma 的「其他·自定义」保留:选 other 时收自由文本,目标数值按 profit 口径出并明示 | assumptions.task 🆕(现只能进 status_note 散文) |
| 12a | FBA 库存(在售) | fbaStockAvailable | integer | 🟢 自动 | listing.inventory_level.fba_warehouse.breakdown.available ✅ | 不落(证据链) |
| 12b | 亚马逊未上架(预售/发货中) | fbaInboundUnits | integer | 🟢 自动(部分) | in_transit + receiving + transferring ✅ 真实抓包有此三键——PRD「领星无在途接口」需更正。自动预填后只差「采购在途」一段 | 不落(证据链) |
| 12c | —(Figma 没问,契约有) | procurementInbound | enum none / partial / covers_period / unknown | 🔴 必须问(条件,第 2 题) | 触发条件:目标总需求件数 > FBA 可用 + 已知在途。问法改窄:「除了已发往 FBA 的 X 件,工厂/供应商那边还有采购在途吗」 | assumptions.inbound 🆕 |
| 13 | 未来 30 天内是否会断货 * | stockoutRisk30d | boolean | 🔵 推导后陈述 | = 可售天数(含在途) < 周期剩余天数。Figma 让用户选,A2 直接算出来告知,可纠正 | 并入 stock_health |
| 14 | 日均销量目标(总订单数)* | dailyTotalOrdersTarget | number > 0,单/天 | 🔴 必须问(快速目标预填,专家模式确认) | 口径 = 广告+自然总和(与 Figma 一致,与后端 monthly_orders 的总订单语义一致 ✅)。快速目标轨给建议值让用户改,不空着问 | monthly_orders = round(日均 × 周期天数) ✅ 已有 |
| 15 | 期望广告订单占比 * | adOrderSharePct | number 0–100,整数 | 🔴 必须问(主输入,滑杆/选项) | 现状 34.7% 作锚点;证据区 ≤39%,39–55% 外推警告,>55% 不出数字。Figma 提示语「新品 70–80% / 成熟 20–30%」是泛化文案,与本品 evaluator 建议(37%)冲突——按品算,不用固定区间(待 Mario 确认,见 §4) | ad_order_share_pct 🆕 v1.1 没有,schema 最优先补的字段 |
† operator_inputs.jsonl 路径仓内有矛盾(后端读 products/<nickname>/operator_inputs.jsonl,SKILL.md 写 targets/ 子目录)——按后端口径,契约 6.13 待研发收口。
| # | 字段 | key | 类型 | A2 处置 | 算式 | 落盘 |
|---|---|---|---|---|---|---|
| 16a | 月广告订单目标 | advertisingOrdersMonthly | integer | 派生 | dailyTotal × 周期天数 × share | advertising_orders_target ✅ v1.1 已有({scope:"advertising", period:"month", mode:"exact", value, unit:"orders"}) |
| 16b | 目标 ACoS | targetAcosPct | number | 派生 | CPO(广告单量) ÷ 售价,CPO 走锚点插值 | target_acos_pct ✅ |
| 16c | 目标 TACoS | targetTacosPct | number | 派生(恒等式) | = ACoS × share,精确恒等 | target_tacos_pct ✅ |
| 16d | 日预算(推算) | dailyBudgetCapUsd | number | 派生 | 广告单量 × CPO ÷ 周期天数;从主输入降级为因变量 | daily_budget_cap_usd ✅ |
Step 4 在 A2 里没有任何输入——四个数全部由 #11 + #14 + #15 推出,用户只在目标卡上确认或就地改(改了记 source=operator_input)。
// goal_setup_input.schema.json —— skill 收集层的完整契约。
// known/inferred 字段由系统填充,missing 字段由 AskUserQuestion 或用户主动补充填充。
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"additionalProperties": false,
"required": ["primaryAsin", "task", "dailyTotalOrdersTarget", "adOrderSharePct"],
"properties": {
// ---- Step1 · 对象(🟢 自动)----
"primaryAsin": { "type": "string", "pattern": "^[A-Z0-9]{10}$" },
"marketplace": { "type": "string" },
// ---- Step2 · 产品背景 ----
"maturity": { "enum": ["new", "existing", "unknown"] }, // 🔵 推导,unknown 时转问
"competitiveAdvantages": { "type": "string", "maxLength": 500 }, // ⚪ 可选
"sellingPoints": { "type": "array", "items": { "type": "string" }, "maxItems": 8 }, // ⚪ 可选
"stockHealth": { "enum": ["stable", "stockout_risk", "recovering"] }, // 🔵 推导,recovering 仅可纠正
"costMinUsd": { "type": "number", "minimum": 0 }, // 🔴 条件问(profit/clear)
"costMaxUsd": { "type": "number", "minimum": 0 }, // 校验 costMax ≥ costMin
"pricePositioning": { "enum": ["premium", "mainstream", "value"], "default": "mainstream" }, // ⚪ defaultOnly
"rating": { "type": "number", "minimum": 0, "maximum": 5 }, // 🟢 自动
"reviewCount": { "type": "integer", "minimum": 0 }, // 🟢 自动
"bsrRank": { // ⚪ 可选(自动取不到)
"type": "object", "additionalProperties": false,
"properties": {
"major": { "type": "object", "properties": { "rank": {"type":"integer","minimum":1}, "category": {"type":"string"} } },
"minor": { "type": "object", "properties": { "rank": {"type":"integer","minimum":1}, "category": {"type":"string"} } }
}
},
// ---- Step3 · 运营节奏 + 销售目标 ----
"task": { "enum": ["bsr", "profit", "test", "clear", "other"] }, // 🔴 always,第 1 题
"taskCustom": { "type": "string", "maxLength": 200 }, // task=other 时必填
"fbaStockAvailable": { "type": "integer", "minimum": 0 }, // 🟢 自动
"fbaInboundUnits": { "type": "integer", "minimum": 0 }, // 🟢 自动(in_transit+receiving+transferring)
"procurementInbound": { "enum": ["none", "partial", "covers_period", "unknown"] }, // 🔴 条件问,第 2 题
"stockoutRisk30d": { "type": "boolean" }, // 🔵 推导陈述
"dailyTotalOrdersTarget": { "type": "number", "exclusiveMinimum": 0 },// 🔴 快速目标预填后确认
"adOrderSharePct": { "type": "integer", "minimum": 0, "maximum": 100 } // 🔴 主输入
}
}
双输入校验规则(Figma 的参数化是「总单 + 占比」两个自由输入,比原型的「占比单输入」多一个自由度,必须加一致性校验):
隐含月自然订单 = dailyTotal × 30 × (1 − share)
基线月自然订单 = 213(近 30 天实际)
|隐含 ÷ 基线 − 1| ≤ 15% → 通过
隐含 > 基线 × 1.15 → 警告:「这个组合假设自然单涨到 X 单/月(现在 213)——
广告带动自然单的部分我没有历史数据支撑,目标可能虚高」
隐含 < 基线 × 0.85 → 警告:「这个组合意味着自然单要跌到 X——确认是有意为之
(如撤词/改 listing),否则总单目标偏低」
这条校验就是把原型的「自然订单不变」保守假设从硬约束放松成可解释的软校验——用户可以突破它,但系统会把突破的含义说出来。
workspace_operational_goal.schema.json v1.1(origin/dev)已有:monthly_orders(总订单)、advertising_orders_target(exact/range × day/month)、target_acos_pct/target_tacos_pct/daily_budget_cap_usd、source。四屏字段还装不下的,建议一次出 v1.2:
| 优先 | 新增字段 | 形态 | 装的是 |
|---|---|---|---|
| P0 | ad_order_share_pct | integer 0–100 | #15 主输入。不落它,下轮读回目标就无法复算(契约 gap #1) |
| P0 | assumptions | object(见下) | #2/5/6/7/11/12c 六个背景答案 + 证据/外推标记。现在只能塞 status_note 散文,读不回 |
| P1 | organic_orders_baseline | integer | 恒等式分母(213)。不落它无法解释「为什么是这个数」(契约 gap #7) |
| P1 | rationale | string | 目标依据。proposal 卡有、active target 没有,确认落库即丢(契约 gap #9) |
"assumptions": {
"type": "object", "additionalProperties": false,
"properties": {
"task": { "enum": ["bsr","profit","test","clear","other"] },
"task_custom": { "type": "string" },
"maturity": { "enum": ["new","existing","unknown"] },
"stock_health": { "enum": ["stable","stockout_risk","recovering"] },
"inbound": { "enum": ["none","partial","covers_period","unknown"] },
"cost_range_usd": { "type": "array", "prefixItems": [{"type":"number"},{"type":"number"}] },
"price_positioning": { "enum": ["premium","mainstream","value"] },
"evidence_flag": { "enum": ["evidence","extrapolated"] } // share ≤39% 还是外推
}
}
竞争优势 / 卖点 / 排名 三个 ⚪ 字段不进目标文件(它们服务策略生成,不是目标数值),落 operator_inputs.jsonl。
[(售价−佣金−costMax)÷售价, (售价−佣金−costMin)÷售价],比枚举的单点估计诚实。契约 §3.4 的 cost 选项文案要对应改。task_custom,目标数值按最接近的标准口径出并明示「按盈利模式口径估算,你的自定义任务记录在案」。四个标准口径之外不另造数字。goal_setup_input.schema.json 为准,AskUserQuestion 只对 🔴 字段发问、按契约 §3.2 的判定引擎门控;🟢🔵 字段 skill 自动填。ad_order_share_pct + assumptions),改动点是 4 处不是 2 处(seed-sources JSON + operational-goal-schema.ts + submodule JSON + envelope.ts SaveInput,契约 gap #18)。task + dailyTotal + share 算出,前端不允许独立输入——用户在卡上改任何派生值即转 source=operator_input 并停跟随。