diff --git a/T-277.-.md b/T-277.-.md new file mode 100644 index 0000000..134358d --- /dev/null +++ b/T-277.-.md @@ -0,0 +1,84 @@ + +> 同步来源:[`docs/tasks/T-277.md`](/chengma/mroubao/src/commit/afc651f75a3abc2676bb13aa8a80f6aa6a25a72e/docs/tasks/T-277.md) · commit `afc651f75a3a` + +--- +id: T-277 +title: 使用节点 JSON 和本机 VLM 兜底规格与价格 +phase: 2 +deps: + - T-272 + - T-276 +status: DONE +created: 2026-08-01 +context_ref: 258fc1b +work_branch: null +write_paths: + - docs/tasks/T-277.md + - docs/current-state.md + - docs/04-architecture.md + - docs/05-coding-rules.md + - docs/api.md + - android-buyer/app/src/main/** + - android-buyer/app/src/test/** + - backend-api/migrations/** + - backend-api/internal/** +--- + +## 问题 / 背景 + +确定性无障碍解析在拼多多把“券后”“¥”“10.49”拆成多个节点、规格节点没有可靠 +`selected` 状态或“已选择”摘要缺失时,会保存空 `sku_text`/`price_text`。T-272 已能用 +受限节点 JSON 和本机 VLM 定位规格选项,但最终复核只证明颜色/尺码,没有从同一快照 +恢复 SKU 摘要和拆分价格,也没有把未知状态显式回传后台。 + +## 行为契约 + +1. 颜色、尺码选择和价格读取始终先执行确定性规则;只有目标选择、已选摘要或唯一组合价 + 无法确认时,才允许调用 Roubao 本机已配置模型。 +2. 复用 T-272 当前规格快照:最多 200 个节点、深度 12、单节点文字 160 字,附带当前 + 规格截图;禁止上传完整 `AccessibilityNodeInfo.toString()`、订单、店铺或设备凭证。 +3. 模型严格返回目标颜色/尺码证据 node ID、价格 node ID、置信度和稳定状态。App 必须 + 复核 node ID 属于当前快照、节点可见/启用、结构 hash 未变化,并由代码按节点顺序拼接 + 和解析人民币价格;不接受模型独立生成的金额或坐标。 +4. 颜色和尺码仍逐项单步点击,每次点击后重新获取根节点;最终模型只能证明当前快照中 + 两项目标同时选中,不能声明历史点击成功。 +5. 候选显式回传 `sku_verification_status=MATCH|MISMATCH|UNVERIFIED`、 + `price_verification_status=VERIFIED|UNVERIFIED` 和 + `value_source=DETERMINISTIC|LOCAL_VLM`。空 SKU/价格必须对应 `UNVERIFIED`,不得伪装 + 成匹配或已验证。 +6. Admin 保存并展示上述状态。`LOCAL_VLM` 只表示值的解析来源,不降低商品身份、证据、 + 人工确认、授权、下单或支付边界。 +7. 第二轮 `FALLBACK` 不调用规格模型;只显式回传 `UNVERIFIED`,供采购员人工判断。 + +## 方案 + +1. 将规格 VLM schema 升级,最终 `verify` 响应增加受限价格节点集合;通过当前节点原文 + 计算 `selectedSummary`,通过共享人民币解析器计算 `PinduoduoSpecificationPrice`。 +2. 当确定性目标已选但摘要/价格缺失时也执行一次最终复核;接受后把 proof、摘要、价格 + 和 `LOCAL_VLM` 来源绑定同一截图 SHA-256 并写入现有进度快照。 +3. Android 候选 outbox 增加三个状态字段;Go API 严格校验状态组合,migration 为候选 + observation 增加审计列,仓储和 Admin 详情透传展示。 +4. 增加模型输出伪造价格、未知 node ID、结构变化、低置信度、空价格和 fallback 禁用模型 + 的回归测试。 + +## 验收要点 + +- [x] 确定性规格和价格完整时零模型调用,状态为 `MATCH/VERIFIED/DETERMINISTIC`。 +- [x] 拆分价格节点可经最终 VLM 选择后由代码解析,SKU 和价格不再为空。 +- [x] 未知节点、模型自报金额、旧快照、低置信度和不安全内容全部失败关闭。 +- [x] 无法读取价格时可回传 `UNVERIFIED` 候选,但不能显示为价格已验证。 +- [x] 第二轮 fallback 不调用模型并显式回传两个 `UNVERIFIED` 状态。 +- [x] Admin 保存并显示验证状态和来源;历史候选默认按 `UNVERIFIED` 读取。 +- [x] migration up/down/up、Go 全量测试、Android 双变体单测、lint 和构建通过。 + +## 边界 + +- 本任务不修改任务价格为空时的授权上限策略,该策略由 T-278 完成。 +- 不把模型配置移到 Admin,不把节点 JSON、截图或模型原始响应写日志/数据库。 +- 不在订单 dry-run 使用本兜底;确认商品后的下单链路由 T-279 接入。 + +## 执行记录 + +- 2026-08-01:复用 T-272 安全节点快照和本机模型边界创建任务,状态 `TODO`。 +- 2026-08-01:完成规格/价格节点复核、显式验证状态、数据库审计列和 Admin 展示; + Go 全量测试及 Android Debug/Release 共 934 项测试、lint、构建通过,状态 `DONE`。