diff --git a/docs/00-ai-start-here.md b/docs/00-ai-start-here.md index a698675..848b941 100644 --- a/docs/00-ai-start-here.md +++ b/docs/00-ai-start-here.md @@ -54,9 +54,11 @@ 当前已完成 Phase 0 和 Phase 1:Android 可运行、设备就绪、workflow、私有样本导入、 动态词搜索、最多 5 个候选截图采集、结构化需求提取、候选评估和人工确认停止点均已 验证。T-201 后端骨架、T-202 P0 原型、T-203 任务 API/管理 Web、T-204 最小鉴权 -T-205 原子领取/租约状态机、T-206 Android 登录/有限离线和 T-207 本地 VLM、候选、 -证据及结果回传均已完成。下一步按编号开始 T-208,建立逐候选结构化人工理由、修订 -历史和优化数据闭环;不得提前建设报表、训练管线或外部商品抓取。 +T-205 原子领取/租约状态机、T-206 Android 登录/有限离线、T-207 本地 VLM/候选/ +证据回传以及 T-211 参考图召回和 SKU 硬匹配均已完成。下一步先做 T-212,修复 Top 5 +重排后的候选、证据和人工接受映射;再做 T-213,只读采集拼多多规格弹窗。两项完成后 +再开始 T-208 的逐候选结构化人工理由、修订历史和优化数据闭环;不得提前建设报表、 +训练管线或外部商品抓取。 手机从管理后端领取任务并回传结果,VLM、拼多多自动化和人工确认在 App 本地完成。 T-206 增加有限离线执行;T-207 已复用 Roubao 端上 OpenAI 兼容适配器并加密本地 Key。 管理后端不保存/代理 VLM,后台任务不能覆盖手机 provider 配置。 diff --git a/docs/06-tasks.md b/docs/06-tasks.md index e73ee03..e8e3f72 100644 --- a/docs/06-tasks.md +++ b/docs/06-tasks.md @@ -40,7 +40,12 @@ | T-205 | 实现原子 claim、租约和状态机 | T-203、T-204 | 并发领取不重复;非法迁移、过期租约和错误设备被拒绝 | | T-206 | App 接入领取、有限离线执行和进度 | T-202、T-205 | 用户点击后领取一条;默认 30 分钟离线授权;到期/取消安全停止;不重复执行 | | T-207 | 接入 App 本地 VLM、候选、事件和结果回传 | T-206 | 保留独立模式;Key 加密;后端不代理模型;幂等补报且管理详情可审计 | -| T-208 | 建立候选决策数据与人工理由闭环 | T-207 | 观测/预测/推荐/人工标签分离;逐候选结构化理由;截图受控留存;不阻塞第一版流程 | +| T-208 | 建立候选决策数据与人工理由闭环 | T-207、T-213 | 观测/预测/推荐/人工标签分离;逐候选结构化理由;截图受控留存;不阻塞第一版流程 | +| T-209 | 登录失败保留采购配置输入 | T-206 | 登录失败可直接修正重试;敏感值不持久化或写日志 | +| T-210 | 兼容拼多多 8.17 搜索结果页 | T-101、T-206 | 新旧结果页均可靠识别;其他查询和安全边界不放宽 | +| T-211 | 参考图召回与 SKU 硬匹配 Top 5 | T-207、T-210 | 参考图进入拼多多图片搜索;颜色/尺码均匹配才回传 `0..5` 个候选 | +| T-212 | 修复 Top 5 ordinal 与证据映射 | T-211 | 重排、推荐、证据和人工接受引用同一原始候选 | +| T-213 | 拼多多规格弹窗只读核验 | T-212 | 只读采集颜色/尺码显式选项;不选择规格,不进入订单或支付 | ## Phase 3:端到端验证 diff --git a/docs/current-state.md b/docs/current-state.md index d6d4b47..aed7e91 100644 --- a/docs/current-state.md +++ b/docs/current-state.md @@ -5,7 +5,8 @@ ## 当前快照 - 日期:2026-07-27 -- 阶段:T-211 参考图召回、SKU 颜色尺码过滤与 Top 5 回传完成,下一步 T-208 +- 阶段:T-211 参考图召回与 SKU 硬匹配完成;下一步 T-212 修复候选重排映射, + 随后 T-213 只读核验拼多多规格弹窗 - Git:当前分支为 `main`;T-001 至 T-004、T-101 至 T-104、T-201 至 T-207、T-209、 T-210、T-211 均已纳入 Git 历史 - 生产代码:`android-buyer/` 已接入 Roubao Android 源码 @@ -107,6 +108,8 @@ | `docs/tasks/T-209.md` | DONE | 登录失败保留采购员和设备输入以便直接重试 | | `docs/tasks/T-210.md` | DONE | 兼容拼多多 8.17 搜索结果页与长词省略显示 | | `docs/tasks/T-211.md` | DONE | 参考图召回、SKU 颜色尺码硬匹配与 0..5 候选回传 | +| `docs/tasks/T-212.md` | TODO | 修复重排候选、推荐、证据与人工接受的身份映射 | +| `docs/tasks/T-213.md` | TODO | 只读采集拼多多规格弹窗中的颜色和尺码证据 | | `docs/design/` | 已确认 | T-202 原型索引、4 个管理页和 7 个 Android 页面 | | `deepseek总结.txt` | 已有 | 历史讨论摘要,不是正式需求权威 | | `android-buyer/` | 已有 | Roubao `main` 固定 commit 的 Android 基线 | @@ -119,8 +122,9 @@ - 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-207、T-209、T-210、T-211。 - 正在进行:无。 -- 下一个可领取任务:T-208 候选决策数据与人工理由闭环。 -- 后置任务:T-208 候选决策数据与人工理由闭环;不得跳过 T-206/T-207 提前实现。 +- 下一个可领取任务:T-212 修复 Top 5 候选 ordinal 与证据映射。 +- 后置任务:T-213 拼多多规格弹窗只读核验;完成后再做 T-208 候选决策数据与人工 + 理由闭环。 ## 当前可运行内容 diff --git a/docs/tasks/T-212.md b/docs/tasks/T-212.md new file mode 100644 index 0000000..def171c --- /dev/null +++ b/docs/tasks/T-212.md @@ -0,0 +1,64 @@ +--- +id: T-212 +title: 修复 Top 5 候选 ordinal 与证据映射 +phase: 2 +deps: + - T-211 +status: TODO +created: 2026-07-27 +context_ref: edfee2c +work_branch: null +write_paths: + - docs/tasks/T-212.md + - docs/current-state.md + - android-buyer/app/src/main/java/com/roubao/autopilot/MainActivity.kt + - android-buyer/app/src/main/java/com/roubao/autopilot/procurement/** + - android-buyer/app/src/main/java/com/roubao/autopilot/vlm/** + - android-buyer/app/src/test/java/com/roubao/autopilot/procurement/** + - android-buyer/app/src/test/java/com/roubao/autopilot/vlm/** +--- + +## 问题 / 背景 + +T-211 对通过 SKU 硬约束的候选重新排序并生成连续回传 ordinal,但人工接受仍使用 +VLM 原始候选 ordinal 查找已经重排的 `ExecutionCandidateDraft`。当原始候选 3 得分 +最高并被重排为回传候选 1 时,现有查找可能错误选择回传候选 3,导致人工结论与推荐、 +截图证据不一致。 + +## 关联需求与交互 + +- 功能:F-007、F-008、F-009。 +- 用户故事:US-005、US-008。 +- 交互:IX-007、IX-009 的建议候选接受、拒绝和结果回传。 +- 架构/API:不修改后端 candidate batch schema;修复 Android 本地从原始曝光 + ordinal 到回传 ordinal、证据和人工终态候选的映射。 + +## 方案 + +1. 增加纯 Kotlin 的候选重排结果模型,同时保存 `source_ordinal`、连续 + `ranked_ordinal`、评估结果和证据 SHA-256,不再靠两个列表的位置或相同整数隐式关联。 +2. 候选批次、推荐项和人工接受结果从同一份重排结果生成。非空批次推荐固定指向排序 + 后的候选 1;人工接受候选也必须使用该候选及其同源证据。 +3. 拒绝、无匹配和空候选路径不携带候选;不得回退到“找不到就取第一个”掩盖映射错误。 +4. 保持 T-211 的 `0..5`、颜色/尺码硬约束、阈值和排序规则不变。 + +## 验收要点 + +- [ ] 原始候选 3 得分最高时,回传候选 1、推荐项和人工接受终态都引用原候选 3 的证据。 +- [ ] 过滤后只剩原始候选 2、5 时,回传 ordinal 为 1、2,证据分别保持 2、5 的来源。 +- [ ] 相同分数按置信度和原始曝光顺序稳定排序,重试不会改变映射。 +- [ ] 空候选、单候选、拒绝和无匹配路径不产生越界或错误 fallback。 +- [ ] 后端 schema v2 的推荐首项、连续 ordinal 和证据资产校验继续通过。 +- [ ] Android 单元测试和 Debug 构建通过;人工接受仍保持 + `order_submitted=false`。 + +## 边界 + +- 不改变拼多多页面自动化、VLM prompt 或 SKU 匹配含义。 +- 不增加候选数量,不实现 T-208 人工标签数据集。 +- 不加入购物车、不选择规格、不提交订单或支付。 + +## 执行记录 + +- 2026-07-27:从 T-211 完成后的代码审查登记。先修复结果身份映射,再扩展规格弹窗 + 采集,避免把错误候选写入后续优化数据。 diff --git a/docs/tasks/T-213.md b/docs/tasks/T-213.md new file mode 100644 index 0000000..d4e4d2b --- /dev/null +++ b/docs/tasks/T-213.md @@ -0,0 +1,75 @@ +--- +id: T-213 +title: 拼多多规格弹窗只读核验 +phase: 2 +deps: + - T-212 +status: TODO +created: 2026-07-27 +context_ref: edfee2c +work_branch: null +write_paths: + - docs/tasks/T-213.md + - docs/04-architecture.md + - docs/current-state.md + - android-buyer/app/src/main/java/com/roubao/autopilot/MainActivity.kt + - android-buyer/app/src/main/java/com/roubao/autopilot/accessibility/** + - android-buyer/app/src/main/java/com/roubao/autopilot/pinduoduo/** + - android-buyer/app/src/main/java/com/roubao/autopilot/procurement/** + - android-buyer/app/src/main/java/com/roubao/autopilot/ui/screens/SearchProbeScreen.kt + - android-buyer/app/src/main/java/com/roubao/autopilot/vlm/** + - android-buyer/app/src/test/java/com/roubao/autopilot/pinduoduo/** + - android-buyer/app/src/test/java/com/roubao/autopilot/procurement/** + - android-buyer/app/src/test/java/com/roubao/autopilot/vlm/** +--- + +## 问题 / 背景 + +T-211 目前只用候选详情页首屏截图判断颜色和尺码。拼多多常把实际颜色、尺码选项放在 +“选择规格”等弹窗内,首屏没有明确证据时只能返回 `UNKNOWN`,导致图片召回正确但自动 +Top 5 为空。仅凭商品主图推断颜色或尺码不满足硬约束要求。 + +## 关联需求与交互 + +- 功能:F-005、F-007、F-009。 +- 用户故事:US-004、US-005、US-009。 +- 交互:IX-006、IX-007、IX-010 的候选检查、人工确认和安全停止。 +- 架构/API:扩展 Android candidate evidence;后端沿用每个候选最多 5 个鉴权 + evidence asset 的现有能力,不抓取第三方图片或商品 URL。 + +## 方案 + +1. 在候选详情页只允许唯一识别并打开“选择规格/颜色分类/尺码”一类只读入口;增加 + 规格弹窗页面分类,登录、验证码、风控、订单和支付标记优先安全停止。 +2. 不点击任何颜色或尺码选项。只读取有界的可见分组标题、选项文本、选中/禁用语义, + 并采集一张受控规格弹窗截图;无法确认分组完整性时标为未知。 +3. 本地使用与任务 SKU 相同的颜色/尺码规范化规则核对显式选项。只有目标值在明确的 + 对应分组中可见且不为禁用时才能形成自动 `MATCH`;完整分组明确缺失才可 + `MISMATCH`,截断、无障碍文本缺失或语义冲突一律 `UNKNOWN`。 +4. 候选评估同时绑定详情证据和规格证据的 SHA-256;VLM 可解释证据,但不能覆盖本地 + 硬约束结果。Android outbox 支持一个候选关联详情和规格两份证据。 +5. 采集后关闭规格弹窗并返回图片结果页;任一步无法唯一确认时安全停止,不尝试其他 + 按钮或坐标。 + +## 验收要点 + +- [ ] 页面分类测试覆盖规格弹窗、普通详情、登录、验证码、风控、购物车、订单和支付。 +- [ ] 自动化只点击唯一规格入口,不点击颜色/尺码选项、购买、拼单、购物车或支付控件。 +- [ ] 颜色、尺码分组及选项解析有数量/文本长度边界,截断或歧义不会判为 `MATCH`。 +- [ ] 单元测试覆盖两个目标均匹配、明确不匹配、禁用、缺失和未知。 +- [ ] 每个候选的详情/规格证据哈希和后端 asset ID 对应正确,离线重试不重复或串位。 +- [ ] Android 单元测试和 Debug 构建通过。 +- [ ] PKG110、Android 16、拼多多 8.17.0 真机 smoke 完成规格弹窗打开、只读采集、 + 关闭和返回;记录 App/拼多多版本并确认未进入订单或支付。 + +## 边界 + +- 第一版不点击或组合选择具体 SKU,不判断颜色与尺码组合库存。 +- 不滚动无界规格列表,不覆盖拼多多未提供无障碍语义的自绘控件。 +- VLM 截图判断只能辅助解释;没有确定性规格证据时不得自动通过。 +- 不加入购物车、不提交订单、不支付,也不实现一键连续执行。 + +## 执行记录 + +- 2026-07-27:根据 T-211 真机链路的证据缺口登记。任务依赖 T-212,避免规格证据被 + 关联到错误的重排候选。