LUCKEELUC-1485 · 交研发 · 收集层契约 ← 返回工作台

A2 目标设定 · 四屏字段 Schema 定稿 v1.1

交研发FOR ENG
目录
  1. 0. 一张图读懂处置原则
  2. 1. 四屏字段总对照表
  3. 2. 收集层 JSON Schema(AskUserQuestion 取数依据)
  4. 3. 落盘 delta:v1.1 之后还缺什么
  5. 4. 与 Figma 四屏的差异(需要确认的 4 处)
  6. 5. 同步给技术时的三句话
数据范围以 Figma「智能广告投放 2.0」向导四屏为准(广告分析对象 → 产品背景 → 运营节奏+销售目标 → 广告表现目标)。 四屏是信息范围,不是交互(D-3):A2 里这些字段由 skill 自动取数 + AskUserQuestion 按需追问收集,不做 GUI 表单。 落盘基线:workspace_operational_goal.schema.json v1.1(origin/dev,含 PR #1044)。本地 dev@2763ce07 仍是 v1.0,开工先 git pull。 配套:A2 专家模式 Schema 工程契约 v1.0(38 字段全集、取数途径、判定引擎、落盘链路——本文只钉四屏对应的收集层)。

0. 一张图读懂处置原则

四屏共 16 个字段。Figma 里全靠用户填;A2 里按「系统能不能拿到」分四档:

处置含义字段数
🟢 自动取数领星/listing 直接读,不出现在对话里4
🔵 推导后陈述系统推出结论,一句话告知,判错了用户说一声即改3
🔴 必须问数据里没有,AskUserQuestion 给选项3
⚪ 可选补充不问;用户主动给就收,给了会用上6

默认路径下用户被问到的还是 3 题(运营任务 → 采购在途 → 成本区间),与既有契约一致。


1. 四屏字段总对照表

Step 1 · 广告分析对象

#Figma 字段key类型A2 处置来源 / 问法落盘
1分析对象(ASIN/站点)primaryAsin + marketplacestring🟢 自动product_meta.json(工作区绑定即定,多产品才问)primary_asin ✅ 已有

Step 2 · 产品背景

#Figma 字段key类型A2 处置来源 / 问法落盘
2是否是新品 *maturityenum new / existing / unknown🔵 推导后陈述由 listing.review_count + 30 天订单量推;阈值未定义(契约 6.6)→ 判不出时返回 unknown 并转问assumptions.maturity 🆕
3竞争优势(可选)competitiveAdvantagesstring⚪ 可选补充不问。用户在输入框主动说(如「我们有专利结构」)就收operator_inputs.jsonl(type=product_context)†
4产品卖点(可选)sellingPointsstring[]⚪ 可选补充同上;listing 只有 title 没有五点描述,不能自动取同上 †
5历史产品状态 *stockHealthenum stable / stockout_risk / recovering🔵 推导后陈述可售天数 vs 周期剩余天数 推导(置信中);「断货恢复中」推不出来,只能等用户纠正assumptions.stock_health 🆕
6产品成本区间(可选)costMinUsd / costMaxUsdnumber ≥0🔴 必须问(条件)仅当 task ∈ {盈利模式, 清库存}。⚠️ 从 Figma 的数字区间替换掉契约里的三档枚举——数字能算保本线区间,枚举不能assumptions.cost_range_usd 🆕
7产品价格优势 *pricePositioningenum premium / mainstream / value⚪ 可选补充(defaultOnly)出价公式没有定位变量(契约 §3.4),默认 mainstream,一句话告知assumptions.price_positioning 🆕
8评分(可选)ratingnumber🟢 自动listing.rating ✅ 真实抓包已核实不落目标文件(证据链引用)
9评论数(可选)reviewCountinteger🟢 自动listing.review_count ✅同上
10产品排名(可选)bsrRankobject {major:{rank,category}, minor:{rank,category}}⚪ 可选补充listing payload 无排名键,自动取不到;用户给了就存。⚠️ 与 linxx #7(排名 100→50 测算)同域:收数据、不做测算承诺(D-4)operator_inputs.jsonl †

Step 3 · 运营节奏 + 销售目标

#Figma 字段key类型A2 处置来源 / 问法落盘
11当前运营任务 *taskenum bsr / profit / test / clear / other + taskCustom?: string🔴 必须问(always,第 1 题)唯一的 always。Figma 的「其他·自定义」保留:选 other 时收自由文本,目标数值按 profit 口径出并明示assumptions.task 🆕(现只能进 status_note 散文)
12aFBA 库存(在售)fbaStockAvailableinteger🟢 自动listing.inventory_level.fba_warehouse.breakdown.available ✅不落(证据链)
12b亚马逊未上架(预售/发货中)fbaInboundUnitsinteger🟢 自动(部分)in_transit + receiving + transferring ✅ 真实抓包有此三键——PRD「领星无在途接口」需更正。自动预填后只差「采购在途」一段不落(证据链)
12c—(Figma 没问,契约有)procurementInboundenum none / partial / covers_period / unknown🔴 必须问(条件,第 2 题)触发条件:目标总需求件数 > FBA 可用 + 已知在途。问法改窄:「除了已发往 FBA 的 X 件,工厂/供应商那边还有采购在途吗」assumptions.inbound 🆕
13未来 30 天内是否会断货 *stockoutRisk30dboolean🔵 推导后陈述= 可售天数(含在途) < 周期剩余天数。Figma 让用户选,A2 直接算出来告知,可纠正并入 stock_health
14日均销量目标(总订单数)*dailyTotalOrdersTargetnumber > 0,单/天🔴 必须问(快速目标预填,专家模式确认)口径 = 广告+自然总和(与 Figma 一致,与后端 monthly_orders 的总订单语义一致 ✅)。快速目标轨给建议值让用户改,不空着问monthly_orders = round(日均 × 周期天数) ✅ 已有
15期望广告订单占比 *adOrderSharePctnumber 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 待研发收口。

Step 4 · 广告表现目标

#字段key类型A2 处置算式落盘
16a月广告订单目标advertisingOrdersMonthlyinteger派生dailyTotal × 周期天数 × shareadvertising_orders_target ✅ v1.1 已有({scope:"advertising", period:"month", mode:"exact", value, unit:"orders"})
16b目标 ACoStargetAcosPctnumber派生CPO(广告单量) ÷ 售价,CPO 走锚点插值target_acos_pct ✅
16c目标 TACoStargetTacosPctnumber派生(恒等式)= ACoS × share,精确恒等target_tacos_pct ✅
16d日预算(推算)dailyBudgetCapUsdnumber派生广告单量 × CPO ÷ 周期天数;从主输入降级为因变量daily_budget_cap_usd ✅

Step 4 在 A2 里没有任何输入——四个数全部由 #11 + #14 + #15 推出,用户只在目标卡上确认或就地改(改了记 source=operator_input)。


2. 收集层 JSON Schema(AskUserQuestion 取数依据)

// 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),否则总单目标偏低」

这条校验就是把原型的「自然订单不变」保守假设从硬约束放松成可解释的软校验——用户可以突破它,但系统会把突破的含义说出来。


3. 落盘 delta:v1.1 之后还缺什么

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:

优先新增字段形态装的是
P0ad_order_share_pctinteger 0–100#15 主输入。不落它,下轮读回目标就无法复算(契约 gap #1)
P0assumptionsobject(见下)#2/5/6/7/11/12c 六个背景答案 + 证据/外推标记。现在只能塞 status_note 散文,读不回
P1organic_orders_baselineinteger恒等式分母(213)。不落它无法解释「为什么是这个数」(契约 gap #7)
P1rationalestring目标依据。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。


4. 与 Figma 四屏的差异(需要确认的 4 处)

  1. 9 个字段不再让用户填:评分、评论数、FBA 库存、未上架在途(自动取)+ 是否新品、历史状态、30 天断货(推导陈述)+ 价格优势、ASIN(默认/绑定)。Figma 16 个字段用户要填 14 个,A2 默认路径只碰 3 题 + 2 个预填确认。
  2. 成本从三档枚举改回数字区间(Figma 的形态更好):保本 ACoS 给区间 [(售价−佣金−costMax)÷售价, (售价−佣金−costMin)÷售价],比枚举的单点估计诚实。契约 §3.4 的 cost 选项文案要对应改。
  3. 占比提示语冲突待拍板:Figma 写「新品初期建议 70–80%,成熟产品建议降至 20–30%」。但本品(成熟)evaluator 按结构算出来的建议是 37%,且 >55% 模型直接不出数字。泛化区间和按品计算不能共存——建议删掉固定区间提示,改为显示「现状 X% · 建议 Y%(按你的数据算)」。需 Mario 确认。
  4. 「其他·自定义运营任务」保留但降级:自由文本收下、写进 task_custom,目标数值按最接近的标准口径出并明示「按盈利模式口径估算,你的自定义任务记录在案」。四个标准口径之外不另造数字。

5. 同步给技术时的三句话

  1. 收集层以 §2 的 goal_setup_input.schema.json 为准,AskUserQuestion 只对 🔴 字段发问、按契约 §3.2 的判定引擎门控;🟢🔵 字段 skill 自动填。
  2. 落盘先补 v1.2 两个 P0 字段(ad_order_share_pct + assumptions),改动点是 4 处不是 2 处(seed-sources JSON + operational-goal-schema.ts + submodule JSON + envelope.ts SaveInput,契约 gap #18)。
  3. 派生四件套(广告订单/ACoS/TACoS/日预算)全部由 task + dailyTotal + share 算出,前端不允许独立输入——用户在卡上改任何派生值即转 source=operator_input 并停跟随。