docs(tasks): keep procurement execution on device
This commit is contained in:
+66
-51
@@ -1,13 +1,13 @@
|
||||
---
|
||||
id: T-206
|
||||
title: App 接入手动领取和执行进度
|
||||
title: App 接入领取、有限离线执行和进度
|
||||
phase: 2
|
||||
deps:
|
||||
- T-202
|
||||
- T-205
|
||||
status: TODO
|
||||
created: 2026-07-27
|
||||
context_ref: 45d4d11
|
||||
context_ref: 45d1436
|
||||
work_branch: null
|
||||
write_paths:
|
||||
- README.md
|
||||
@@ -15,6 +15,7 @@ write_paths:
|
||||
- backend-api/**
|
||||
- docs/00-ai-start-here.md
|
||||
- docs/02-requirements.md
|
||||
- docs/03-tech-stack.md
|
||||
- docs/04-architecture.md
|
||||
- docs/05-coding-rules.md
|
||||
- docs/07-user-stories.md
|
||||
@@ -29,75 +30,89 @@ write_paths:
|
||||
## 问题 / 背景
|
||||
|
||||
T-205 已实现 BUYER + 设备联合鉴权、readiness heartbeat、原子 claim、任务参考图、
|
||||
start、租约 heartbeat、release 和取消确认,但当前 Android 仍只消费本地 fixture。
|
||||
管理员创建的 `PENDING` 任务无法在手机领取,真实端到端流程因此被阻塞。
|
||||
start、90 秒运行租约、release 和取消确认,但 Android 仍只消费本地 fixture。
|
||||
管理员创建的 `PENDING` 任务无法在手机领取。
|
||||
|
||||
现有 Roubao 基线包含端上模型服务商、Base URL 和 API Key 设置。正式采购工作流必须
|
||||
把模型调用收口到肉包后端,避免采购手机持有供应商密钥或由执行员改变模型策略。
|
||||
90 秒运行租约要求手机持续连接管理后端,与“手机独立完成采购,只从管理后端领取并
|
||||
回传结果”的目标冲突。T-206 需要接入后端任务,同时把运行租约扩展为有限离线执行
|
||||
授权;后台失联不能导致任务被另一台设备重复执行,也不能让手机无限离线运行。
|
||||
|
||||
Roubao 原有独立模式和端上 VLM 设置必须保留。后台任务不得下发或覆盖 VLM provider、
|
||||
Base URL、model、prompt 或 API Key。
|
||||
|
||||
## 关联需求与交互
|
||||
|
||||
- 功能:F-003、F-007、F-009。
|
||||
- 用户故事:US-003、US-006、US-007、US-009。
|
||||
- 交互:IX-004、IX-005、IX-006、IX-008、IX-010。
|
||||
- 架构/API:`HttpTaskSource`、设备联合身份、claim 租约状态机、前台服务和后端托管
|
||||
VLM 边界。
|
||||
- 架构/API:`HttpTaskSource`、设备联合身份、claim/运行租约、有限离线执行、前台服务
|
||||
和本地 outbox。
|
||||
|
||||
## 已定合约
|
||||
|
||||
1. 采购 App 只配置肉包后端 HTTPS 地址,不直接配置或调用 VLM 服务商。模型名称、
|
||||
Base URL 和 API Key 不进入生产采购页面、任务缓存、日志或网络响应。
|
||||
2. Debug 技术探针可保留本机直连 OpenAI 兼容 mock,但必须位于 Debug source set,
|
||||
不得进入 Release APK,也不得用于后端任务。
|
||||
3. BUYER 登录必须同时提交预授权 device ID/secret;access token、device secret、
|
||||
claim token 和幂等 key 使用 Android Keystore 支撑的安全存储。敏感值不进入
|
||||
SavedState、普通 SharedPreferences、崩溃报告或日志。
|
||||
4. App 每次领取前先发设备 heartbeat。无障碍未连接、拼多多未安装、网络不可用、
|
||||
服务端认为设备不就绪或已有活跃任务时不生成新的 claim 请求。
|
||||
5. claim token 和幂等 key 必须在请求前持久化;结果不确定时原样重放,不能生成新
|
||||
token。领取成功后下载 task-scoped 参考图并校验媒体类型、大小和解码结果。
|
||||
6. 用户在预览页确认后调用 start 并启动前台服务;运行中每 30 秒 heartbeat。服务端
|
||||
version、generation、execution 和租约是权威状态。
|
||||
7. T-206 先验证登录、领取、预览、start、前台步骤、续租、release、取消安全停止和
|
||||
进程恢复。真实后端 VLM、候选/截图/事件/结果回传属于 T-207。
|
||||
8. T-206 的执行进度使用 fake/受控步骤到达明确的“等待 T-207 AI 接入”结果,不把
|
||||
未上传的本地结果伪装成服务端完成,也不触发拼多多不可逆操作。
|
||||
1. 管理后端只负责身份、任务分配、状态、取消和结果审计;App 独立负责 VLM、拼多多
|
||||
自动化、人工确认、本地状态和待上传结果。
|
||||
2. BUYER 登录同时提交预授权 device ID/secret;access token、device secret、
|
||||
claim token 和幂等 key 使用 Android Keystore 支撑的加密存储,不进入 SavedState、
|
||||
普通 SharedPreferences、崩溃报告或日志。
|
||||
3. App 每次领取前发送设备 heartbeat。未就绪、已有活跃任务或服务端离线时不能领取;
|
||||
用户点击后才生成并持久化 claim token 与幂等 key。
|
||||
4. `CLAIMED` 默认租约仍为 10 分钟。start 后默认运行授权从 T-205 的 90 秒调整为
|
||||
30 分钟,可在 5 至 120 分钟范围配置;成功 heartbeat 使用服务端时间滑动续期。
|
||||
5. App 计划每 30 秒 best-effort heartbeat,以同步步骤和取消请求。heartbeat 失败时
|
||||
可在服务端下发的 `execution_expires_at` 前继续,不能因为短时断网停止或生成新
|
||||
execution;到期仍未恢复连接时必须在安全检查点停止自动化。
|
||||
6. `RUNNING/WAITING_CONFIRMATION` 无论授权是否过期都不自动回队列。重新分配必须先
|
||||
由人员结束旧 execution,避免两台手机同时操作同一任务。
|
||||
7. 管理取消在 App 离线期间不能保证即时生效。恢复连接后 App 必须先 heartbeat,
|
||||
收到取消标志便在下一个安全检查点停止并 `cancel-ack`,不得先继续页面动作。
|
||||
8. App 在授权内完成但暂时无法上传时,把结果、事件和证据引用写入加密 outbox。
|
||||
T-207 允许原设备在授权过期后补交终态结果,并标记
|
||||
`received_after_execution_expiry=true`;过期后不得继续自动化。
|
||||
9. App 重启先恢复加密本地 execution,再与服务端核对。无法证明任务归属、授权时间
|
||||
或本地步骤安全时停止并等待人工处理,不领取第二条任务。
|
||||
10. Roubao 独立模式与后台任务共享现有本地 workflow/VLM 能力,但任务源和同步边界
|
||||
独立。后台任务不能携带 provider 配置,也不能触发 App 修改本地模型设置。
|
||||
11. T-206 验证登录、领取、预览、start、前台步骤、有限离线、恢复、release 和取消;
|
||||
真实候选/截图/事件/终态回传由 T-207 完成。
|
||||
|
||||
## 方案
|
||||
|
||||
1. 在 Android 增加严格的后端配置、认证 client、token 安全存储和稳定错误映射;
|
||||
Release 只接受 HTTPS,Debug 可显式信任开发证书或使用受控本机测试路径。
|
||||
2. 实现 `HttpTaskSource`,把 claim 响应和参考图规范化为现有 `ProbeTask`/领域输入,
|
||||
workflow 不判断任务来自 fixture 还是 HTTP。
|
||||
3. 按已确认原型接入登录、任务主页、任务预览、运行和结果状态;重复点击、空队列、
|
||||
登录过期、租约过期和服务端冲突都有稳定反馈。
|
||||
4. 使用前台服务持有当前 execution、定时 heartbeat 并轮询取消标志;取消只在
|
||||
workflow 安全检查点停止,再调用 `cancel-ack`。
|
||||
5. App 重启后先用 heartbeat/任务详情核对服务端活跃任务;不能证明可恢复时停止
|
||||
自动化并显示人工处理,不自行领取第二条任务。
|
||||
6. 后端如缺少 App 当前任务查询所需字段,只做兼容性最小补充,不改变 T-205 的
|
||||
token、幂等、租约和状态机语义。
|
||||
1. 增加严格的后端地址、认证 client、Keystore-backed secret store、持久 task state
|
||||
和稳定错误映射。Release 后端地址只接受 HTTPS;开发证书路径与生产隔离。
|
||||
2. 实现 `HttpTaskSource`,把 claim 和 task-scoped 参考图规范化为现有领域输入;
|
||||
workflow/AI/automation 不判断任务来自 fixture 还是 HTTP。
|
||||
3. 接入登录、任务主页、预览、运行和恢复状态;重复点击、空队列、登录失效、授权
|
||||
到期和服务端冲突均使用已确认页面反馈。
|
||||
4. 扩展后端运行租约配置及 start/heartbeat 响应,显式返回
|
||||
`execution_expires_at`;保持 RUNNING 不自动回收的 T-205 安全规则。
|
||||
5. 前台服务持有 execution,best-effort heartbeat 并使用服务端时间偏移判断离线
|
||||
截止点。网络恢复后先同步取消/归属,再恢复允许的步骤。
|
||||
6. 增加加密本地状态/outbox 基础接口;T-206 只验证恢复和安全停止,不实现 T-207
|
||||
的完整结果 payload。
|
||||
|
||||
## 验收要点
|
||||
|
||||
- [ ] 预授权 BUYER 在真机登录成功,错误账号、错误设备、禁用和过期状态均不能进入
|
||||
任务页;敏感值不出现在日志和普通存储。
|
||||
- [ ] 真机 heartbeat 后点击“获取任务”能领取管理 Web 创建的一条 `PENDING` 任务,
|
||||
- [ ] 预授权 BUYER 在真机登录成功;错误账号、错误设备、禁用和过期均被拒绝,秘密
|
||||
不出现在日志和普通存储。
|
||||
- [ ] 真机 heartbeat 后点击“获取任务”只领取管理 Web 创建的一条 `PENDING` 任务,
|
||||
显示标题、SKU、数量、描述和参考图;无任务显示空状态。
|
||||
- [ ] 重复点击和模拟响应丢失不会重复领取;App 重启后能继续同一 `CLAIMED` 任务。
|
||||
- [ ] 预览可开始或释放;开始后前台服务显示步骤并按约 30 秒续租,不领取第二条任务。
|
||||
- [ ] 管理 Web 请求安全停止后,App 在安全检查点停止并确认,服务端最终为
|
||||
`CANCELED`;过期租约不会被 App 擅自续作。
|
||||
- [ ] 生产采购页面没有 VLM 服务商、Base URL 或 API Key 输入;后端任务不会读取
|
||||
Roubao 旧的端上 provider 配置;Release APK 不含 Debug mock 配置。
|
||||
- [ ] Android 单元/集成测试、后端回归测试、根 `init.ps1` 和 OnePlus PKG110
|
||||
Android 16 真机端到端 smoke 通过。
|
||||
- [ ] 重复点击和模拟响应丢失不会重复领取;App 重启能恢复同一 `CLAIMED`/RUNNING。
|
||||
- [ ] start 返回默认约 30 分钟 `execution_expires_at`;断开管理后端超过 90 秒后,
|
||||
受控 fake workflow 仍能在授权内继续,任务不会分配给第二台设备。
|
||||
- [ ] 离线授权到期后 App 安全停止;恢复网络先同步服务端状态,不擅自续作。
|
||||
- [ ] 管理取消在在线时及时处理;离线时恢复连接后的首个同步点处理并确认。
|
||||
- [ ] Roubao 原独立模式、端上 provider 选择和本地 fixture 探针回归通过;后台任务
|
||||
不下发、覆盖或读取来自任务内容的 provider 配置。
|
||||
- [ ] Android/后端测试、根 `init.ps1` 和 OnePlus PKG110 Android 16 真机 smoke
|
||||
通过,验证过程中不提交订单。
|
||||
|
||||
## 边界
|
||||
|
||||
- 不实现真实 VLM 代理、候选/截图/事件、complete/fail 和人工理由回传;属于 T-207。
|
||||
- 不实现后台推送、自动领取、自动下单、支付、多任务并行或跨设备调度。
|
||||
- 不允许生产 App 绕过后端直连任意模型地址,不提交真实账号、设备 secret 或订单。
|
||||
- 不实现候选、截图、事件、complete/fail 和人工理由回传;属于 T-207。
|
||||
- 不把模型调用代理到管理后端,不实现后台 provider 配置、推送、自动领取或多任务。
|
||||
- 不承诺离线期间即时取消;不允许离线授权无限延长、自动下单或支付。
|
||||
- 不提交真实账号、设备 secret、VLM Key、订单或证据。
|
||||
|
||||
## 执行记录
|
||||
|
||||
|
||||
Reference in New Issue
Block a user