feat(t206): connect Android procurement tasks

This commit is contained in:
QiuSW
2026-07-27 11:11:16 +08:00
parent 9e698c1b6c
commit 45b66eeea7
35 changed files with 2634 additions and 81 deletions
+46 -11
View File
@@ -5,10 +5,10 @@ phase: 2
deps:
- T-202
- T-205
status: TODO
status: DONE
created: 2026-07-27
context_ref: 45d1436
work_branch: null
work_branch: main
write_paths:
- README.md
- android-buyer/**
@@ -93,18 +93,18 @@ Base URL、model、prompt 或 API Key。
## 验收要点
- [ ] 预授权 BUYER 在真机登录成功;错误账号、错误设备、禁用和过期均被拒绝,秘密
- [x] 预授权 BUYER 在真机登录成功;错误账号、错误设备、禁用和过期均被拒绝,秘密
不出现在日志和普通存储。
- [ ] 真机 heartbeat 后点击“获取任务”只领取管理 Web 创建的一条 `PENDING` 任务,
- [x] 真机 heartbeat 后点击“获取任务”只领取管理 Web 创建的一条 `PENDING` 任务,
显示标题、SKU、数量、描述和参考图;无任务显示空状态。
- [ ] 重复点击和模拟响应丢失不会重复领取;App 重启能恢复同一 `CLAIMED`/RUNNING。
- [ ] start 返回默认约 30 分钟 `execution_expires_at`;断开管理后端超过 90 秒后,
- [x] 重复点击和模拟响应丢失不会重复领取;App 重启能恢复同一 `CLAIMED`/RUNNING。
- [x] start 返回默认约 30 分钟 `execution_expires_at`;断开管理后端超过 90 秒后,
受控 fake workflow 仍能在授权内继续,任务不会分配给第二台设备。
- [ ] 离线授权到期后 App 安全停止;恢复网络先同步服务端状态,不擅自续作。
- [ ] 管理取消在在线时及时处理;离线时恢复连接后的首个同步点处理并确认。
- [ ] Roubao 原独立模式、端上 provider 选择和本地 fixture 探针回归通过;后台任务
- [x] 离线授权到期后 App 安全停止;恢复网络先同步服务端状态,不擅自续作。
- [x] 管理取消在在线时及时处理;离线时恢复连接后的首个同步点处理并确认。
- [x] Roubao 原独立模式、端上 provider 选择和本地 fixture 探针回归通过;后台任务
不下发、覆盖或读取来自任务内容的 provider 配置。
- [ ] Android/后端测试、根 `init.ps1` 和 OnePlus PKG110 Android 16 真机 smoke
- [x] Android/后端测试、根 `init.ps1` 和 OnePlus PKG110 Android 16 真机 smoke
通过,验证过程中不提交订单。
## 边界
@@ -116,4 +116,39 @@ Base URL、model、prompt 或 API Key。
## 执行记录
- 尚未开始。
### 2026-07-27:任务开始
- 基于提交 `9e698c1` 开始,工作区干净;T-202/T-205 依赖均已完成。
- codebase-memory MCP 本轮未暴露 graph 工具,按仓库规则回退到 `rg` 和定点读取。
- 开工基线 `.\init.ps1` 通过:Android Debug/Release 测试与 Debug APK 构建成功,
Go 全包测试、vet、gofmt 检查和 API/migration/authctl 构建成功。
- 先固定并实现后端默认 30 分钟运行授权和 `execution_expires_at`,再让 Android
登录、领取、恢复和前台服务依赖该契约。
### 2026-07-27:实现与验证完成
- 后端默认运行授权改为 30 分钟、允许 5-120 分钟;start/task heartbeat 的
`execution` 显式返回 `execution_expires_at`。授权过期后原设备 heartbeat 只同步
状态、不延长旧授权;匹配原 execution/claim 的取消确认仍可完成,RUNNING 不回队列。
- Android 新增独立“任务”入口、严格 backend 地址策略、无明文 fallback 的
`ProcurementSecureStore`、`ProcurementApiClient`、`HttpTaskSource`、参考图
MIME/JPEG/20 MiB/SHA-256 校验和加密 task/execution 恢复。密码不存储;设备
secret、access/claim token 和各操作幂等 key 只进加密存储。
- 前台服务每 30 秒 best-effort heartbeat;使用保守的服务端时钟偏移和持久
`SAFE_STOPPED` 判断离线截止。登录 token 过期时只允许同后台、同 BUYER、同设备
重新认证;过期恢复同步不会自动继续外部动作。
- 领取前先持久化 256 bit claim token/独立幂等 key,响应不确定时复用;参考图和
task 快照落盘后才可预览。start 增加二次确认和至少 2 秒稳定预览门禁,避免页面
重组或自动化注入导致误启动;T-206 受控步骤不打开拼多多、不调用 VLM、不提交订单。
- MockWebServer 覆盖 Android 登录、幂等领单、参考图 hash/同源限制和 start 到期契约;
端点策略与服务端时钟/预览门禁有纯 Kotlin 单测。最终根 `.\init.ps1` 通过:
Android 32 份报告、184 次测试零失败,Go 含子测试 193 次通过,vet、gofmt 和
API/migration/authctl Windows 构建成功。
- PKG110 Android 16 真机使用临时 18080 后端、一次性 DPAPI 保护凭证和脱敏任务
完成:BUYER 登录、readiness、领取、字段/参考图预览、start、前台通知、95 秒
后端断线、恢复滑动续期、管理取消/`cancel-ack`、release 和进程重启恢复。断线
后仍为同一 `CONTROLLED_WORKFLOW`,倒计时从约 29:38 到 27:54;重连恢复到约
29:41。验证未打开拼多多、未调用 VLM、未提交订单。
- 最终 Debug APK 已覆盖安装;一次性 API/数据库/DPAPI 凭证和 App 临时后台登录
状态已清理,Roubao 其他设置保留,采购无障碍恢复启用。T-207 接入真实端上
VLM/候选并实现事件、证据、结果和完整加密 outbox。