diff --git a/docs/04-architecture.md b/docs/04-architecture.md index e18f316..af7a073 100644 --- a/docs/04-architecture.md +++ b/docs/04-architecture.md @@ -258,8 +258,9 @@ T-102/T-104 在搜索结果后追加一个有界候选步骤: -> 最多 5 个去重商品卡 -> 验证详情页 -> 详情页无障碍截图 - -> 唯一、安全、非交易规格入口 - -> 规格弹层只读语义和截图 + -> 受控 DISCOVERY_INSPECT 规格入口 + -> 选择目标颜色/尺码并读取组合价格 + -> 规格弹层语义和截图 -> App cache/candidate-NN-{detail,specification}.png + manifest.json -> 关闭规格弹层并复核详情页 -> 一次全局返回并复核固定词结果页 @@ -281,20 +282,23 @@ PNG/IHDR、精确字节数、尺寸和 SHA-256。每个候选回传时必须恰 2048 px。当前需求快照与搜索词必须同时匹配候选 session,否则拒绝评估;另一个 关键词的结果页只允许重新进入搜索框,不能采集候选。 -T-213 规格核验只允许精确语义为“选择规格/请选择规格/颜色分类/颜色款式/选择颜色/ -选择尺码”或“已选/请选择”前缀的唯一节点及其可点击祖先。弹层内不点击任何规格选项, -只读取最多 160 个语义节点、每组最多 30 个选项及 selected/enabled/scrollable 语义。 -颜色和尺码各自必须是唯一分组:目标值明确且可用为 `MATCH`,完整分组明确缺失或目标 -禁用为 `MISMATCH`,重复、缺组、滚动截断或无障碍语义不足为 `UNKNOWN`。 +T-213 规格核验优先使用“选择规格/请选择规格/颜色分类/颜色款式/选择颜色/选择尺码” +或“已选/请选择”前缀的唯一入口;拼多多 8.17 没有直接入口时,`DISCOVERY_INSPECT` +允许从已验证详情页点击唯一“免拼购买”语义目标。弹层最多读取 160 个语义节点、 +每组最多 30 个选项,目标颜色/尺码必须各自唯一、启用且每次点击后可复核选择状态。 +选定后读取明确人民币组合价格;重复、缺组、禁用、滚动截断、状态未变化、多价格冲突 +或无障碍语义不足一律 `UNKNOWN/MISMATCH`,不得继续到订单提交。 候选评估 schema/prompt v3 把本地规格结果作为权威输入;模型返回的颜色/尺码状态必须 逐项与本地结果相同,否则整批降级人工检查。详情和规格证据 SHA-256 同时绑定 assessment、重排身份和 outbox 资产,VLM 不能通过主图推断覆盖本地硬约束。 PKG110 上的拼多多 8.17.0 服装详情只暴露不可点击的“颜色/款式”预览;完整颜色/尺码 -弹层只能通过“单独购买/免拼购买”控件进入。自动化不得点击这两个交易语义控件,也 -不得用坐标降级,因此当前版本在没有独立可点击规格入口时返回安全阻塞。是否把购买 -语义控件重新定义为只读弹层入口,必须单独做产品/安全决策后变更本边界。 +和组合价格位于“单独购买/免拼购买”后的规格弹层。业务方已确认最终流程需要自动创建 +待付款订单,因此 T-213 重新定义两级能力中的第一层:`DISCOVERY_INSPECT` 可以从 +已验证详情页进入规格弹层并选择目标颜色/尺码以读取组合价格,但不能加入购物车、 +提交订单或触发支付。后续 `ORDER_CREATE` 必须由 Admin 对确定候选签发一次性授权, +使用独立状态机和幂等/对账边界,不能复用候选探查权限。 评估结束后 automation 不再产生动作,UI 进入 `AWAITING_CONFIRMATION`、 `MANUAL_REVIEW` 或 `NO_MATCH`。人员可以把本地建议项标记为可用,或拒绝本次候选; diff --git a/docs/current-state.md b/docs/current-state.md index 0e47a50..5c669c9 100644 --- a/docs/current-state.md +++ b/docs/current-state.md @@ -5,9 +5,9 @@ ## 当前快照 - 日期:2026-07-27 -- 阶段:T-212 已完成;T-213 只读规格核验已实现但被拼多多 8.17 入口语义阻塞 +- 阶段:T-212 已完成;T-213 已按新业务要求重开,正在实现候选 SKU 组合与价格核验 - Git:当前分支为 `main`;T-001 至 T-004、T-101 至 T-104、T-201 至 T-207、T-209、 - T-210、T-211、T-212 均已纳入 Git 历史;T-213 等待安全策略决策 + T-210、T-211、T-212 均已纳入 Git 历史;T-213 外部阻塞已解除并重新执行 - 生产代码:`android-buyer/` 已接入 Roubao Android 源码 - Android:固定 `main@c8a6d7f03422eb01744b01f3ee77bf7757741f7e`;MIT 许可证已保留 @@ -50,10 +50,9 @@ 图片进入拼多多拍照搜索;App 本地从 SKU 唯一提取颜色和尺码,schema v3 逐项返回 `MATCH/MISMATCH/UNKNOWN`。只有两项均匹配且分数/置信度不低于 `0.75` 的候选按 分数、置信度和曝光顺序回传 `0..5` 项,弱匹配和未知项不凑数。 -- T-213 规格核验:只允许唯一、非交易规格入口;弹层内不点击选项,本地根据有界的 - 颜色/尺码分组、可用/禁用和完整性语义产生硬约束结果。每个候选绑定详情/规格两张 - PNG 及两个 SHA-256/asset ID;模型不能覆盖本地状态。拼多多 8.17 服装详情的完整 - 规格弹层只挂在“单独购买/免拼购买”后,当前安全边界拒绝该入口,故真机流程阻塞。 +- T-213 规格核验:旧版只读解析、详情/规格双证据和本地硬约束已完成;新业务边界 + 允许 `DISCOVERY_INSPECT` 从“免拼购买”进入规格弹层,正在补充目标颜色/尺码选择、 + 组合价格读取和退出验证。候选探查仍不能加入购物车、提交订单或触发支付。 - Workflow:纯 Kotlin runner 已支持步骤 timeout、最多 3 次 retry、安全阻塞、 用户停止和单 runner 并发拒绝;T-102 已接入搜索加有界候选采集五步 - TaskSource:严格 CLI 已生成并验证真实私有 ProbeTask;默认 APK 不含私有 fixture @@ -84,10 +83,9 @@ 已用 CLI 真实导入并逐字段/图片哈希验证,生成物位于被忽略的 `.local/` - 标准启动路径:`$env:RUN_START_COMMAND="1"; .\init.ps1` - 标准验证路径:`.\init.ps1` -- 当前 blocker:T-213 需要确认是否允许点击“单独购买/免拼购买”仅用于打开规格弹层, - 或提供独立规格入口/受支持数据源;ColorOS 重装后需采购员手动重新启用肉包无障碍。 - 真实 VLM 服务地址、模型、设备级测试凭证、成本上限和数据留存也尚未确认;当前只 - 支持单 SKU/JPEG;候选探针截图要求 Android 11/API 30+ +- 当前 blocker:ColorOS 重装后需采购员手动重新启用肉包无障碍,才能完成 T-213 + 真机 smoke。真实 VLM 服务地址、模型、设备级测试凭证、成本上限和数据留存也尚未 + 确认;当前只支持单 SKU/JPEG;候选探针截图要求 Android 11/API 30+ ## 当前目录 @@ -114,7 +112,7 @@ | `docs/tasks/T-210.md` | DONE | 兼容拼多多 8.17 搜索结果页与长词省略显示 | | `docs/tasks/T-211.md` | DONE | 参考图召回、SKU 颜色尺码硬匹配与 0..5 候选回传 | | `docs/tasks/T-212.md` | DONE | 修复重排候选、推荐、证据与人工接受的身份映射 | -| `docs/tasks/T-213.md` | BLOCKED | 实现只读规格核验;等待拼多多购买语义入口安全决策 | +| `docs/tasks/T-213.md` | DOING | 候选阶段选择目标 SKU 并读取组合价格,不提交订单 | | `docs/design/` | 已确认 | T-202 原型索引、4 个管理页和 7 个 Android 页面 | | `deepseek总结.txt` | 已有 | 历史讨论摘要,不是正式需求权威 | | `android-buyer/` | 已有 | Roubao `main` 固定 commit 的 Android 基线 | @@ -127,9 +125,10 @@ - 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-207、T-209、T-210、T-211、 T-212。 -- 阻塞中:T-213 拼多多规格弹窗只读核验,等待购买语义入口的安全策略决策。 +- 正在进行:T-213 候选 SKU 组合与价格核验。 - 下一个可领取任务:无;T-208 依赖 T-213 真机验收完成。 -- 后置任务:解除 T-213 阻塞后再做 T-208 候选决策数据与人工理由闭环。 +- 后置任务:T-213 完成后做 T-208 候选决策数据与人工理由闭环,再依次实现商品 + 持久身份、Admin 下单授权、设备命令、订单 dry-run、单次提交对账和付款提醒。 ## 当前可运行内容 diff --git a/docs/tasks/T-213.md b/docs/tasks/T-213.md index 174de60..dec77f0 100644 --- a/docs/tasks/T-213.md +++ b/docs/tasks/T-213.md @@ -1,12 +1,12 @@ --- id: T-213 -title: 拼多多规格弹窗只读核验 +title: 拼多多候选 SKU 组合与价格核验 phase: 2 deps: - T-212 -status: BLOCKED +status: DOING created: 2026-07-27 -context_ref: edfee2c +context_ref: 9a8388f work_branch: null write_paths: - android-buyer/app/build.gradle.kts @@ -26,9 +26,10 @@ write_paths: ## 问题 / 背景 -T-211 目前只用候选详情页首屏截图判断颜色和尺码。拼多多常把实际颜色、尺码选项放在 -“选择规格”等弹窗内,首屏没有明确证据时只能返回 `UNKNOWN`,导致图片召回正确但自动 -Top 5 为空。仅凭商品主图推断颜色或尺码不满足硬约束要求。 +T-211 目前只用候选详情页首屏截图判断颜色和尺码。真机已确认拼多多 8.17.0 把完整 +颜色、尺码和组合价格放在“单独购买/免拼购买”后的规格弹层,旧版只读入口策略无法 +取得可靠证据。新业务流程明确要求候选阶段选择目标 SKU 并核对实际组合价格,再把 +匹配候选回传 Admin;Admin 授权后的真正下单由后续独立任务实现。 ## 关联需求与交互 @@ -37,38 +38,46 @@ Top 5 为空。仅凭商品主图推断颜色或尺码不满足硬约束要求 - 交互:IX-006、IX-007、IX-010 的候选检查、人工确认和安全停止。 - 架构/API:扩展 Android candidate evidence;后端沿用每个候选最多 5 个鉴权 evidence asset 的现有能力,不抓取第三方图片或商品 URL。 +- 权限:本任务只实现 `DISCOVERY_INSPECT`,不是后续 `ORDER_CREATE`。 ## 方案 -1. 在候选详情页只允许唯一识别并打开“选择规格/颜色分类/尺码”一类只读入口;增加 - 规格弹窗页面分类,登录、验证码、风控、订单和支付标记优先安全停止。 -2. 不点击任何颜色或尺码选项。只读取有界的可见分组标题、选项文本、选中/禁用语义, - 并采集一张受控规格弹窗截图;无法确认分组完整性时标为未知。 -3. 本地使用与任务 SKU 相同的颜色/尺码规范化规则核对显式选项。只有目标值在明确的 - 对应分组中可见且不为禁用时才能形成自动 `MATCH`;完整分组明确缺失才可 - `MISMATCH`,截断、无障碍文本缺失或语义冲突一律 `UNKNOWN`。 -4. 候选评估同时绑定详情证据和规格证据的 SHA-256;VLM 可解释证据,但不能覆盖本地 - 硬约束结果。Android outbox 支持一个候选关联详情和规格两份证据。 -5. 采集后关闭规格弹窗并返回图片结果页;任一步无法唯一确认时安全停止,不尝试其他 - 按钮或坐标。 +1. 从已验证商品详情页允许唯一识别“选择规格”等直接入口;没有直接入口时,允许按 + 固定优先级点击唯一“免拼购买”语义目标,仅用于进入规格弹层。不得点击“提交订单” + 或支付控件。 +2. 弹层必须识别颜色、尺码、当前选择、组合价格、库存/禁用语义。使用任务原始 SKU + 的本地规范化结果依次选择唯一颜色和尺码选项,每次点击后重新读取并验证页面状态。 +3. 目标选项缺失、重复、禁用、不可见、自绘无语义或点击后状态未改变时返回 + `UNKNOWN/MISMATCH`,不得用 VLM 猜测后继续点击。VLM 只辅助解释截图和文本。 +4. 两项选择完成后必须从当前规格弹层读取明确的已选组合和人民币价格;保存规范化 + 分值金额、原始可见价格文本、规格语义和截图。价格区间过滤在后续任务契约中使用。 +5. 采集后使用全局返回关闭弹层,复核详情页,再返回原图片结果页。若购买入口直接 + 进入订单确认页,立即返回并把候选标为不支持;不能点击页面内任何确认按钮。 +6. 候选评估同时绑定详情/规格证据 SHA-256 和所选规格、组合价格;VLM 不能覆盖本地 + SKU、价格和状态结果。 ## 验收要点 -- [x] 页面分类测试覆盖规格弹窗、普通详情、登录、验证码、风控、购物车、订单和支付。 -- [x] 自动化只点击唯一规格入口,不点击颜色/尺码选项、购买、拼单、购物车或支付控件。 -- [x] 颜色、尺码分组及选项解析有数量/文本长度边界,截断或歧义不会判为 `MATCH`。 -- [x] 单元测试覆盖两个目标均匹配、明确不匹配、禁用、缺失和未知。 -- [x] 每个候选的详情/规格证据哈希和后端 asset ID 对应正确,离线重试不重复或串位。 -- [x] Android 单元测试和 Debug 构建通过。 -- [ ] PKG110、Android 16、拼多多 8.17.0 真机 smoke 完成规格弹窗打开、只读采集、 - 关闭和返回;记录 App/拼多多版本并确认未进入订单或支付。 +- [ ] 页面分类覆盖详情、规格弹层、订单确认、订单列表、登录、验证码、风控和支付。 +- [ ] `DISCOVERY_INSPECT` 只允许进入规格弹层、选择目标 SKU、读取价格和返回;代码 + 中不存在提交订单、支付或加入购物车动作。 +- [ ] 颜色/尺码必须各自唯一匹配;依次点击后验证 selected/已选语义,禁用、重复、 + 缺失、截断和状态未变化均有测试。 +- [ ] 组合价格使用严格人民币解析并保存分值;模糊区间价、券后条件价、多价格冲突和 + 无价格均不能形成自动匹配证据。 +- [ ] 若购买入口直接进入订单确认页,自动化不点击任何页面控件并安全返回。 +- [ ] 每个候选的详情/规格证据、所选规格和价格不会在重排/outbox 中串位。 +- [ ] Android 单元测试、Debug 构建和后端回归通过。 +- [ ] PKG110、Android 16、肉包/拼多多版本真机 smoke 完成进入弹层、选择测试 SKU、 + 读取组合价格、关闭和返回;确认未创建订单、未进入支付。 ## 边界 -- 第一版不点击或组合选择具体 SKU,不判断颜色与尺码组合库存。 +- 允许在候选探查阶段选择具体颜色/尺码,但不加入购物车、不提交订单、不支付。 - 不滚动无界规格列表,不覆盖拼多多未提供无障碍语义的自绘控件。 -- VLM 截图判断只能辅助解释;没有确定性规格证据时不得自动通过。 -- 不加入购物车、不提交订单、不支付,也不实现一键连续执行。 +- VLM 截图判断只能辅助解释;SKU 选择、价格解析和执行授权必须由确定性代码完成。 +- 不判断优惠券、运费、地址和最终应付总额;这些属于后续订单预览任务。 +- 只支持一个任务 SKU 对应一个颜色和一个尺码;多维规格和组合库存扩展后置。 ## 执行记录 @@ -92,3 +101,7 @@ Top 5 为空。仅凭商品主图推断颜色或尺码不满足硬约束要求 外部解除条件是:确认允许把购买语义控件仅用于打开规格弹层,或提供不经过购买控件 的稳定规格入口/受支持数据源。重新安装后 ColorOS 也关闭了肉包无障碍服务,继续 smoke 前需采购员在系统设置手动重新启用。 +- 2026-07-27:用户确认最终业务必须在 Admin 选择候选后由 Roubao 自动选 SKU、数量 + 并创建待付款订单,采购员最后在拼多多人工确认和付款。外部决策已解除旧阻塞,本 + 任务重新置为 `DOING`,权限缩小为候选阶段的 `DISCOVERY_INSPECT`;真正 + `ORDER_CREATE` 仍须一次性 Admin 授权和独立任务。