From 42bed0d2c9576eb11265e04138c175dd4b170bff Mon Sep 17 00:00:00 2001 From: ila Date: Fri, 7 Aug 2026 16:37:15 +0800 Subject: [PATCH] docs: import wiki at afc651f75a3a --- T-279.-.md | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 T-279.-.md diff --git a/T-279.-.md b/T-279.-.md new file mode 100644 index 0000000..c46a767 --- /dev/null +++ b/T-279.-.md @@ -0,0 +1,88 @@ + +> 同步来源:[`docs/tasks/T-279.md`](/chengma/mroubao/src/commit/afc651f75a3abc2676bb13aa8a80f6aa6a25a72e/docs/tasks/T-279.md) · commit `afc651f75a3a` + +--- +id: T-279 +title: 跑通确认商品后的规格选择与待支付下单 +phase: 2 +deps: + - T-272 + - T-275 + - T-278 +status: DONE +created: 2026-08-01 +context_ref: 54debcd +work_branch: null +write_paths: + - docs/tasks/T-279.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/** +--- + +## 问题 / 背景 + +Admin 人工确认候选后,App 已能领取包含规范商品 URL/goods_id 的命令,但订单 dry-run +仍有三个断点:拼多多商品详情无障碍树通常不暴露 goods_id,导致定向打开后被错误拒绝; +订单链路没有复用 T-272/T-277 的节点 JSON + 本机 VLM 规格/价格兜底;确定性失败只在 +手机本地反复重试,后台长期显示执行中,界面也停留在拼多多。 + +## 行为契约 + +1. App 只执行后台已确认且通过 command hash 的 canonical Pinduoduo 商品;定向打开后, + 标题必须匹配,并用当前页 goods_id、已授权详情指纹或当前页分享链接解析出的 goods_id + 至少一项复核商品身份。分享解析必须复用受限剪贴板/网络策略,失败时不能放宽到只看标题。 +2. 颜色、尺码和当前组合价仍先走确定性无障碍规则。缺少唯一目标、选中状态、摘要或价格时, + 复用 T-272/T-277 当前节点 JSON、截图、本机模型和 node ID 复核;最多三次模型调用, + 每次点击后重新取根节点,金额仍由代码拼接节点并解析。 +3. 规格最终证据必须同时证明目标颜色、目标尺码和唯一价格;再按 T-278 冻结总额上限、 + 数量和订单确认页总额复核。模型不能点击确认订单、提交订单或支付。 +4. dry-run 的确定性终态失败必须立即幂等回传后台:授权变为 `FAILED`,记录稳定 failure code, + 任务保留在等待人工重新选择/重新授权的可恢复状态;瞬时无障碍/网络错误最多保留一次短重试。 +5. 后端已确认 dry-run READY 后才允许现有 T-218 单次提交围栏继续;只点击一次“提交订单”, + 绝不点击支付。订单号/下单时间回传后,Admin 提醒采购员到拼多多确认并付款。 +6. 成功、终态失败或安全停止后都切回 Roubao;App 不得留在拼多多继续循环。 + +## 方案 + +1. 将当前页商品身份解析抽成 dry-run driver 能调用的受限 resolver,并为 direct 路径实现 + goods_id/详情指纹/分享解析三选一的严格复核。 +2. 给 order dry-run driver 接入现有 `PinduoduoSpecificationVlmAssistant` 和同一安全快照, + 将候选链路的逐项选择及最终价格证明复用于确认商品链路。 +3. 增加设备 dry-run failure API、数据库失败状态/审计字段和 Android 加密 outbox;区分 + `IDENTITY_MISMATCH`、`SKU_UNRESOLVED`、`PRICE_UNVERIFIED`、`BUDGET_EXCEEDED`、 + `TRANSIENT_AUTOMATION` 等稳定代码。 +4. 调整执行调度:终态错误一次上报后停止本地重试并返回 Roubao;仅瞬时错误允许一次重试。 +5. 增加无 goods_id 但分享链接一致、VLM 选择/拆分价格、伪造节点、终态失败幂等上报、 + 单次提交与返回 App 的回归测试。 + +## 验收要点 + +- [x] canonical 链接打开的详情页即使节点树没有 goods_id,也能经指纹或分享链接严格确认。 +- [x] 确定性规格/价格失败时本机 VLM 可选择正确颜色和尺码,并由代码解析真实价格。 +- [x] 未知 node ID、结构变化、低置信度、身份不一致和价格超额全部失败关闭。 +- [x] 终态 dry-run 失败以固定幂等键上报,后台不再长期显示执行中,手机切回 Roubao。 +- [x] dry-run READY 后复用现有单次下单围栏,最终只生成待支付订单并回传订单信息。 +- [x] Go 全量测试/vet、Android 双变体单测、lint 和构建通过。 + +## 边界 + +- 不自动付款,不选择或修改收货地址,不处理验证码/风控绕过。 +- 不把模型配置迁移到 Admin;使用 Roubao 设置中已经测试通过的本机模型配置。 +- 不允许仅凭标题、截图相似度或模型陈述替代商品 ID/授权指纹复核。 + +## 执行记录 + +- 2026-08-01:按“严格商品身份 + 本机 VLM 规格/价格兜底 + 终态失败回传”的方案创建任务, + 状态 `TODO`。 +- 2026-08-01:direct dry-run 增加 goods_id、授权详情指纹、当前分享链接三选一严格身份 + 复核;复用裁剪节点 JSON 和 Roubao 本机模型兜底颜色、尺码和当前组合价。 +- 2026-08-01:新增设备 failure API 和五类稳定失败代码;失败先写加密本地状态,再使用 + 固定幂等键重传。瞬时自动化只重试一次,确定性失败停止操作并切回 Roubao。 +- 2026-08-01:完成商品身份、VLM node-ID 选择/价格解析、失败接口和两次尝试上限回归 + 测试;全量 Go/Android 验收通过,状态改为 `DONE`。