docs: import wiki at afc651f75a3a

ila
2026-08-07 16:36:58 +08:00
parent 77a29cf159
commit 0499065623
+109
@@ -0,0 +1,109 @@
<!-- docs-wiki-sync:docs/tasks/T-250.md@afc651f75a3abc2676bb13aa8a80f6aa6a25a72e -->
> 同步来源:[`docs/tasks/T-250.md`](/chengma/mroubao/src/commit/afc651f75a3abc2676bb13aa8a80f6aa6a25a72e/docs/tasks/T-250.md) · commit `afc651f75a3a`
---
id: T-250
title: 缩短三轮图片搜索预算并移除重复内层重试
phase: 2
deps:
- T-248
status: DONE
created: 2026-07-30
context_ref: 40d15fc
work_branch: null
write_paths:
- docs/tasks/T-250.md
- docs/current-state.md
- android-buyer/app/src/main/**
- android-buyer/app/src/test/**
---
## 问题 / 背景
当前参考图候选工作流的候选浏览步骤单次 timeout 为 600 秒,并允许一次步骤内重试;
连同图片搜索准备步骤,每轮理论最长 21 分 5 秒,三轮可超过 63 分钟。候选搜索外层已经
由 execution-scoped attempt gate 限制为两轮精确匹配和一轮保底搜索,候选步骤再次完整
重试形成重复预算,不符合低客单价采购的时间成本。
本任务缩短三轮预算,但不改变 T-248 的累计候选、严格 SKU、第三轮保底、增量回传、
1 至 3 秒动作停顿和支付边界。
## 关联需求与交互
- 功能:F-004、F-005、F-006、F-007
- 用户故事:US-003、US-004、US-006
- 交互:沿用候选搜索进度和安全停止页面,不新增 UI
- 架构/API:沿用 T-248 三阶段搜索和候选累计 API,不修改服务端契约
## 时间与数量契约
### 通用图片搜索步骤
- 打开拼多多:每次 8 秒,保留一次有限重试,理论最多 16 秒。
- 进入图片搜索:每次从 15 秒缩短为 10 秒,保留一次有限重试,理论最多 20 秒。
- 选择已准备参考图:4 秒,不重试。
- 确认图片搜索结果:从 15 秒缩短为 10 秒,不重试。
- 现有 1 至 3 秒随机动作停顿计入各步骤 timeout,不额外延长预算。
### 分轮候选预算
- 第一、第二轮严格 SKU 匹配:候选浏览最多 100 秒,不做步骤内重试;每轮最多检查
10 个商品、滚动 4 次。单轮所有步骤理论最多 150 秒,即 2 分 30 秒。
- 第三轮保底:候选浏览最多 45 秒,不做步骤内重试;最多检查 4 个商品、滚动 1 次,
取得两个身份和证据完整的默认候选后立即结束。全轮理论最多 95 秒,即 1 分 35 秒。
- 三轮步骤预算总计最多 395 秒,即 6 分 35 秒。加上外层轮次调度、图片准备和候选
outbox 回传,正常端到端上限目标为 7 至 8 分钟,不将网络时间伪装成工作流 timeout。
### 失败与恢复
- 候选浏览 timeout 结束当前轮,由既有 attempt gate 记录失败并进入下一轮;不得在同一
轮内部再执行完整 100/45 秒重试。
- 已增量保存的准确候选继续跨轮累计;累计两个准确候选立即完成,不消耗剩余轮次。
- 页面未知、验证码、登录失效、风控、订单确认或支付边界继续立即安全停止,不因缩短
timeout 而放宽页面识别。
## 方案
1. 在拼多多候选模块增加按 `search_round` 返回的不可变预算策略,集中维护候选 timeout、
最大检查数和最大滚动数。
2. 图片候选 workflow 按轮次构造步骤:通用图片步骤使用缩短后的 timeout,候选步骤使用
精确轮或保底轮预算并固定 `maxRetries=0`。
3. `MainActivity` 使用同一轮次策略同时配置 workflow 与 `PinduoduoCandidateAutomation`,
避免时间上限和动作数量上限脱节;非后台探针保持原行为。
4. 单元测试固定每轮步骤、重试次数、候选/滚动限制和理论总时长,防止后续无意恢复
20 分钟候选重试。
## 验收要点
- [x] 第一、第二轮每轮理论上限为 150 秒,第三轮为 95 秒。
- [x] 三轮步骤预算合计为 395 秒,候选浏览没有步骤内重试。
- [x] 前两轮最多检查 10 个商品、滚动 4 次;第三轮最多检查 4 个、滚动 1 次。
- [x] 两轮准确累计、达到两个即提前结束、第三轮两个保底候选的行为不变。
- [x] 1 至 3 秒动作停顿、未知页和支付边界安全停止行为不变。
- [x] Android 单测、lint、Debug 和 Release 构建通过。
## 边界
- 不改变参考图、SKU、数量、预算、候选 API、Admin 展示或后端状态机。
- 不在本任务实现跨轮保存全部被拒候选;第二轮跳过所有已检查商品另行落任务。
- 不减少最终下单前的商品身份、SKU、数量、价格和订单确认页复核。
- 不启动真实拼多多采购,不进入订单提交或支付。
## 执行记录
- 2026-07-30:冻结差异化时间和动作数量预算;外层已有三轮门禁,因此移除候选浏览
步骤内完整重试,保留冷启动和图片入口的一次有限恢复。
- 2026-07-30:新增 `PinduoduoImageCandidateRoundPolicy`,并由 `MainActivity` 使用
同一轮次预算配置候选 timeout、最大检查数和滚动数;非后台手动探针保持原配置。
- 2026-07-30:新增策略单测,固定图片准备 50 秒、精确轮 150 秒、保底轮 95 秒、
三轮合计 395 秒及候选步骤零重试。首次直接运行 Gradle 因当前 shell 未设置
`ANDROID_HOME` 在依赖解析前失败;设置仓库标准 SDK 路径后,测试源码又因误用项目
未引入的 `kotlin.test` 编译失败,改用仓库既有 JUnit 4 后通过。
- 2026-07-30:实际运行 `gradlew.bat testDebugUnitTest`、`gradlew.bat lintDebug
assembleDebug assembleRelease` 和根 `.\init.ps1`,均成功;根入口同时通过 Android
Debug/Release 单测、Debug APK 构建和 Go 后端全量测试。
- 2026-07-30:实现提交前未安装 APK、未启动 Roubao 或拼多多,也未执行真实采购
smoke;因而没有进入订单确认、提交或支付。
- 2026-07-30:用户连接 PKG110 后,以 `adb install -r` 覆盖安装 T-250 Debug APK,
保留既有 App 数据。手机 `base.apk` 与本地构建产物 SHA-256 一致,安装后 Roubao
进程保持停止;真实 7 至 8 分钟端到端用时仍需用新任务测量。