Files
cmroubao/docs/tasks/T-003.md
T

3.6 KiB
Raw Blame History

id, title, phase, deps, status, created, context_ref, work_branch, write_paths
id title phase deps status created context_ref work_branch write_paths
T-003 建立 Android workflow 测试骨架 0
T-001
DONE 2026-07-25 d013ac8c84 main
android-buyer/app/build.gradle.kts
android-buyer/app/src/main/java/com/roubao/autopilot/workflow/**
android-buyer/app/src/test/java/com/roubao/autopilot/workflow/**
docs/03-tech-stack.md
docs/current-state.md
docs/tasks/T-003.md
progress.md

问题 / 背景

现有 Roubao MobileAgent 直接组合 VLM、设备控制和 UI 状态,无法在本地 JVM 中稳定 验证采购步骤的超时、重试和安全停止。T-101 开始操作拼多多前,需要先建立一个小型、 可注入 Fake automation 的工作流内核,防止自动化逻辑只能靠真机人工回归。

关联需求与交互

  • 功能:为 F-004 至 F-007 提供可测试执行骨架。
  • 用户故事:US-004 执行受限采购探针、US-006 安全失败和可恢复。
  • 交互:本任务无新界面。
  • 架构:Android workflow 层和 automation adapter 接口。

方案

  1. 定义步骤、自动化结果、状态、失败原因、安全停止原因和运行报告。
  2. WorkflowRunner 每次只运行一个工作流;每步使用协程 timeout,重试次数有硬上限。
  3. 用户停止只取消当前 automation 子任务并返回 STOPPED 报告,不取消调用方协程。
  4. 登录、验证码、风控、未知页面和支付边界作为不可重试的 BLOCKED 终态。
  5. 使用 kotlinx-coroutines-test 和 Fake automation 覆盖成功、重试、超时、阻塞、 用户停止和并发运行拒绝。

验收要点

  • Fake automation 下可以验证多步骤成功状态迁移。
  • 单步 timeout 可确定性触发,且不会形成无界等待。
  • retry 次数有明确上限,耗尽后进入结构化失败。
  • 登录、验证码、风控、未知页面和支付边界不自动重试。
  • 用户停止会取消当前步骤并返回 STOPPED,调用方测试协程仍可完成。
  • 同一 Runner 拒绝并发运行。
  • lintDebug test assembleDebug 通过。

边界

  • 不实现拼多多搜索、点击或页面解析。
  • 不接入 MainActivity 或替换现有 MobileAgent。
  • 不做任务持久化、进程恢复、后台 API 或前台服务。
  • 不允许无限 retry;maxRetries 必须为非负且由步骤显式给出。

执行记录

2026-07-25:任务开始

  • 基于 T-002 提交 d013ac8 开始。
  • T-002 已提供设备就绪和安全阻塞事实;T-003 只定义如何消费 automation 结果。

2026-07-25:实现和验证完成

  • 新增纯 Kotlin WorkflowStep、AutomationGateway、状态/结果/报告模型和 WorkflowRunner,没有 Android UI、设备或 VLM 依赖。
  • 单步强制正 timeout;maxRetries 只能是 0 至 3。timeout 作为结构化可重试失败, 重试预算耗尽后进入 FAILED。
  • 登录、验证码、风控、未知页面和支付边界统一返回 BLOCKED,即使步骤配置了重试 也只调用 automation 一次。
  • requestStop() 只取消当前 automation 子任务;runner 捕获该取消并返回 STOPPED, 不取消调用方协程。原子运行标记拒绝同一 runner 并发执行。
  • 增加 kotlinx-coroutines-test 1.7.3,用虚拟时间验证两次 100ms timeout 在 200ms 后失败,不产生真实等待。
  • 新增 6 个 workflow 测试;连同 T-002 的 5 个测试,在 Debug/Release 两个变体 共执行 22 次,0 failure、0 error、0 skipped。
  • .\gradlew.bat lintDebug test assembleDebug --no-daemon:成功。