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 |
|
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 接口。
方案
- 定义步骤、自动化结果、状态、失败原因、安全停止原因和运行报告。
WorkflowRunner 每次只运行一个工作流;每步使用协程 timeout,重试次数有硬上限。
- 用户停止只取消当前 automation 子任务并返回
STOPPED 报告,不取消调用方协程。
- 登录、验证码、风控、未知页面和支付边界作为不可重试的
BLOCKED 终态。
- 使用
kotlinx-coroutines-test 和 Fake automation 覆盖成功、重试、超时、阻塞、
用户停止和并发运行拒绝。
验收要点
边界
- 不实现拼多多搜索、点击或页面解析。
- 不接入 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:成功。