From 0499065623869340687e8f79e42a7a8f2d291bde Mon Sep 17 00:00:00 2001 From: ila Date: Fri, 7 Aug 2026 16:36:58 +0800 Subject: [PATCH] docs: import wiki at afc651f75a3a --- T-250.-.md | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 T-250.-.md diff --git a/T-250.-.md b/T-250.-.md new file mode 100644 index 0000000..f8c7f0d --- /dev/null +++ b/T-250.-.md @@ -0,0 +1,109 @@ + +> 同步来源:[`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 分钟端到端用时仍需用新任务测量。