Page:
T-247
Pages
00-ai-start-here
01-vision
02-requirements
03-tech-stack
04-architecture
05-coding-rules
06-tasks
07-user-stories
08-interaction-checklist
Design
Home
Integrations-shunyunbao-contract
PPT
T-001
T-002
T-003
T-004
T-101
T-102
T-103
T-104
T-201
T-202
T-203
T-204
T-205
T-206
T-207
T-208
T-209
T-210
T-211
T-212
T-213
T-214
T-215
T-216
T-217
T-218
T-219
T-220
T-221
T-222
T-223
T-224
T-225
T-226
T-227
T-228
T-229
T-230
T-231
T-232
T-233
T-234
T-235
T-236
T-237
T-238
T-239
T-240
T-241
T-242
T-243
T-244
T-245
T-246
T-247
T-248
T-249
T-250
T-251
T-252
T-253
T-254
T-255
T-256
T-257
T-258
T-259
T-260
T-261
T-262
T-263
T-264
T-265
T-266
T-267
T-268
T-269
T-270
T-271
T-272
T-273
T-274
T-275
T-276
T-277
T-278
T-279
T-280
T-281
Task-Template
Tasks
agent-context
api
clean-state-checklist
current-state
routes
Clone
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
同步来源:
docs/tasks/T-247.md· commitafc651f75a3a
id: T-247 title: 修复图片搜索循环并完成两个 SKU 候选回传 phase: 2 deps:
- T-211
- T-213
- T-246 status: DONE created: 2026-07-30 context_ref: e38ff08 work_branch: null write_paths:
- docs/tasks/T-247.md
- docs/current-state.md
- android-buyer/app/src/main/**
- android-buyer/app/src/test/**
Bug / 背景
Admin 分派真实采购任务后,Roubao 会每约 10 秒重新开始一次拼多多图片搜索。部分轮次只
进入摄像头扫描页,没有选择已经写入系统相册的参考图;部分轮次回到拼多多主页后重新
搜索。连续十余轮仍没有候选回传,后台任务保持 RUNNING。
2026-07-30 真机日志确认:
- Roubao 在
08:46:19、08:46:29、08:46:39、08:46:49分别创建新的Pictures/RoubaoSearch/roubao-search-*.jpg,周期与 App 的 10 秒自动轮询一致。 - 每张临时图片约 1 秒后被删除;同一时间拼多多摄像头被打开。
- 每轮
openApp()使用FLAG_ACTIVITY_CLEAR_TASK重启拼多多 Activity 栈,导致当前 摄像头页、结果页或详情页被丢弃并回到主页。 - 单轮工作流失败后只清空进程内 Job;后台 execution 仍为
RUNNING,自动调度下一轮 没有任务级累计次数、熔断状态或稳定失败事件。 - 图片搜索页和相册网格已有真机 UI 基线,但页面切换期间的短暂未知状态会过早结束 单轮流程。
- 候选详情当前只读取首屏语义和首屏 OCR,没有按既定方案滚动到商品详情/参数区域读取
goods_id;缺少 ID 的真实商品被静默丢弃。 - 规格选择返回部分证据时仍可能保存候选,没有在保存前再次证明目标颜色和尺码均已 唯一选中。
修订契约
自动尝试与熔断
- 自动图片搜索按 execution 持久化尝试状态,进程重启后继续同一计数。
- 首版最多自动尝试 2 次;成功回传候选、execution 改变或任务终止时停止继续搜索。
- 两次均失败后进入本地熔断,不再启动拼多多;记录步骤、稳定失败码和尝试次数,并通过 既有 execution event outbox 回传后台。
- 人工故障重试必须是显式动作;不能由 10 秒 heartbeat/claim 轮询隐式清除熔断。
图片搜索交接
- 拼多多已在前台时复用当前 Activity;从 Roubao 首次打开时只使用
NEW_TASK | SINGLE_TOP,不得清空拼多多任务栈。 - 为主页到摄像头/相册页、相册到结果页提供受工作流总 timeout 约束的稳定等待窗口;
短暂
UNKNOWN只能等待,不能立即重新启动整轮。 - 只在确认当前页为图片搜索页、准备图仍是系统相册最新 JPEG 且找到唯一“最近项目” 网格后点击第一张图片。
- 同一轮复用同一个 MediaStore URI;只在确认结果、明确失败或停止后清理。不得在拼多多 仍可能异步读取时创建下一张参考图。
商品身份、SKU 与两个候选
- 本次闭环固定收集 2 个候选;单轮最多扫描 120 个不同商品、滚动结果页 30 次, 候选步骤最长 10 分钟,不凑数。
- 规格面板只在目标颜色、尺码均唯一、可用且动作后 复读为已选择时,才允许保存 SPECIFICATION 证据。
- 规格验证完成后才保存 DETAIL 截图并解析商品身份;先在商品详情页有界向下滚动,
逐屏读取无障碍语义,必要时使用本地
ML Kit OCR;只接受唯一、带
goods_id/商品编号/商品 ID语义的纯数字 ID。 - 拼多多 8.17 详情页不暴露 ID 时,允许打开原生分享面板、点击“复制链接”,并在 App
内解析唯一 HTTPS 链接。只允许
p.pinduoduo.com和mobile.yangkeduo.com, 最多 3 次跳转、单次 6 秒、正文 64 KiB;不携带 Cookie,不记录原始链接。解析到 唯一 ID 后生成规范 URLhttps://mobile.yangkeduo.com/goods.html?goods_id=<id>。 - 两个候选均须包含规范链接、标题、已验证 SKU、组合价格、DETAIL/SPECIFICATION 本地 图片证据、采集指纹和时间,并通过既有候选批次接口保存到 Admin。
- 候选批次成功后后台进入待采购员确认阶段,Roubao 不再搜索。
方案
- 增加 execution-scoped 搜索尝试 gate,使用小型持久化状态记录 execution ID、已开始 次数和最终失败;将 gate 判断放在自动调度器启动 Job 之前。
- 移除图片搜索 driver 的
CLEAR_TASK,前台已是拼多多时不重复启动 launcher;放宽 页面切换的稳定等待,但保持每步 timeout 和未知页 fail-closed。 - 将候选目标设为 2,并把候选扫描预算与成功候选数分离,允许跳过不匹配 SKU 或缺少
goods_id的商品。 - 新增详情页受控滚动和身份解析;规格关闭后再扫描 ID,因此无需为了打开规格返回顶部。
- 新增严格的最终 SKU 匹配策略;不满足颜色和尺码两个硬约束时关闭面板并返回结果页, 不写候选证据。
- 在失败/熔断和成功回传处增加结构化日志及 execution event;Admin 候选数据继续使用 现有 API、数据库与鉴权图片路由,不新增 PDD 服务端抓取。
- MainActivity 使用
singleTask,每轮写入前清理肉包专属相册目录的崩溃遗留临时图; 320×320 ERP 图只在临时搜索副本中等比例放大,原始任务图和哈希证据不变。 - 自动后台任务默认
MANUAL_FIRST;旧AI_ASSISTEDexecution 中,VLM 提取与图片 搜索并行,VLM 失败或软警告不能阻断可由原始 ERP SKU 唯一解析的硬匹配。
验收要点
- Roubao 被 force-stop 后进程不存在且不再创建参考图或拉起拼多多。
- 同一 execution 自动图片搜索最多启动 2 轮,进程重启不能重置次数。
- 拼多多已在摄像头、图片结果或详情页时不因 launcher 清栈回主页。
- 真机自动选择任务参考图并进入“搜图片同款”结果页,不误用摄像头拍照内容。
- 不匹配目标颜色或尺码的商品不会保存为候选。
- 详情滚动只接受唯一
goods_id,生成的规范 URL 与 ID 一致。 - 恰好 2 个真实 SKU 匹配候选回传后台;Admin 可查看标题、链接、SKU、价格及两张 本地图片证据。
- 候选回传后任务进入后台确认阶段,手机停止搜索并等待 Admin 选择。
- 失败达到上限后手机停止外部动作,并排队回传步骤、失败原因和尝试次数。
- Android 单测、Debug/Release 构建通过,真机 smoke 不触发下单或支付。
边界
- 本任务先证明 2 个候选闭环,不宣称 Top 5 已完成真实验收。
- 不自动付款,不点击最终提交订单,不改变 T-218 submission fence。
- 不保存或读取拼多多 Cookie、Token;分享短链只在 App 内按域名、跳转、超时和正文上限 解析,不由后端请求拼多多商品页。
- 页面、SKU、商品 ID、价格或证据任一不确定时跳过或熔断,不通过增加无限重试提高成功率。
- 真机 smoke 到 Admin 出现两个候选即停止;采购员确认后的下单链路另行复核。
执行记录
- 2026-07-30:通过 ADB 强制停止
com.roubao.autopilot,确认进程不存在;拼多多留在主页。 - 2026-07-30:读取真机 logcat、SQLite execution/candidate 状态和 T-246 代码,确认本次 循环由 10 秒调度、整轮无熔断和 launcher 清栈共同造成,不是 Admin 分派、参考图下载、 VLM 网络或后台候选接口失败。
- 2026-07-30:实现 execution-scoped 两轮持久化 gate、单任务 Activity、图片搜索状态
恢复、临时图清理/放大、ERP SKU
草莓 + M提取、严格规格选择、两个候选批次、 分享链接受限解析和 execution event。 - 2026-07-30:PKG110 / Android 16 / 拼多多 8.17 真机确认自动选择参考图并进入
“搜图片同款”;连续多轮只执行每 execution 两次。真实规格日志自动选中过
短袖草莓套装 M 建议70-90斤和短七字母草莓套装 M 建议70-90斤,不匹配项均关闭 规格后返回结果页;全程未进入下单或支付。 - 2026-07-30:真机确认拼多多 8.17 分享面板稳定暴露“复制链接”,并据此增加受限分享
解析路径;最后一次真实搜索未同时得到两个可保存候选,因此 Admin 两候选批次、规范
URL 和等待确认阶段仍未完成端到端验收。系统返回
TARGET_NOT_READY并停止,没有凑数。 - 2026-07-30:
./gradlew.bat :app:testDebugUnitTest :app:assembleDebug :app:assembleRelease通过;Debug APK 已覆盖安装到 PKG110。