1
T-250
ila edited this page 2026-08-07 16:36:58 +08:00
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-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 分钟候选重试。

验收要点

  • 第一、第二轮每轮理论上限为 150 秒,第三轮为 95 秒。
  • 三轮步骤预算合计为 395 秒,候选浏览没有步骤内重试。
  • 前两轮最多检查 10 个商品、滚动 4 次;第三轮最多检查 4 个、滚动 1 次。
  • 两轮准确累计、达到两个即提前结束、第三轮两个保底候选的行为不变。
  • 1 至 3 秒动作停顿、未知页和支付边界安全停止行为不变。
  • 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 分钟端到端用时仍需用新任务测量。