docs: import wiki at afc651f75a3a
+84
@@ -0,0 +1,84 @@
|
||||
<!-- docs-wiki-sync:docs/tasks/T-003.md@afc651f75a3abc2676bb13aa8a80f6aa6a25a72e -->
|
||||
> 同步来源:[`docs/tasks/T-003.md`](/chengma/mroubao/src/commit/afc651f75a3abc2676bb13aa8a80f6aa6a25a72e/docs/tasks/T-003.md) · commit `afc651f75a3a`
|
||||
|
||||
---
|
||||
id: T-003
|
||||
title: 建立 Android workflow 测试骨架
|
||||
phase: 0
|
||||
deps:
|
||||
- T-001
|
||||
status: DONE
|
||||
created: 2026-07-25
|
||||
context_ref: d013ac8c84b69ab1bcf5b2cfd5385c93049d5439
|
||||
work_branch: main
|
||||
write_paths:
|
||||
- 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 覆盖成功、重试、超时、阻塞、
|
||||
用户停止和并发运行拒绝。
|
||||
|
||||
## 验收要点
|
||||
|
||||
- [x] Fake automation 下可以验证多步骤成功状态迁移。
|
||||
- [x] 单步 timeout 可确定性触发,且不会形成无界等待。
|
||||
- [x] retry 次数有明确上限,耗尽后进入结构化失败。
|
||||
- [x] 登录、验证码、风控、未知页面和支付边界不自动重试。
|
||||
- [x] 用户停止会取消当前步骤并返回 `STOPPED`,调用方测试协程仍可完成。
|
||||
- [x] 同一 Runner 拒绝并发运行。
|
||||
- [x] `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`:成功。
|
||||
Reference in New Issue
Block a user