feat(t206): connect Android procurement tasks
This commit is contained in:
@@ -54,8 +54,9 @@
|
||||
当前已完成 Phase 0 和 Phase 1:Android 可运行、设备就绪、workflow、私有样本导入、
|
||||
动态词搜索、最多 5 个候选截图采集、结构化需求提取、候选评估和人工确认停止点均已
|
||||
验证。T-201 后端骨架、T-202 P0 原型、T-203 任务 API/管理 Web、T-204 最小鉴权
|
||||
和 T-205 原子领取/租约状态机均已完成。下一步按编号开始 T-206,把 Android
|
||||
`HttpTaskSource`、前台服务和已确认的任务页面接到设备 API。
|
||||
T-205 原子领取/租约状态机和 T-206 Android 登录、手动领取、参考图预览、前台服务、
|
||||
有限离线与恢复均已完成。下一步按编号开始 T-207,把现有端上 VLM/拼多多候选流程
|
||||
接入已领取任务并实现事件、证据和终态结果回传。
|
||||
候选优化数据集已经登记为 T-208;不得跳过 T-206/T-207 的第一版端到端闭环,提前
|
||||
建设报表、训练管线或外部商品抓取。
|
||||
手机从管理后端领取任务并回传结果,VLM、拼多多自动化和人工确认在 App 本地完成。
|
||||
|
||||
@@ -167,7 +167,8 @@ T-004 已固定首版规则:推荐私有目录为被 Git 忽略的 `private-fi
|
||||
或结构化错误;无权限用户不可访问。
|
||||
- F-003/US-003/IX-005:App 点击“获取任务”后原子领取一条任务;重复点击或多请求
|
||||
不得领取第二条或把同一任务分配两次。T-205 已完成后端 heartbeat、原子 claim、
|
||||
client-generated token 安全重放、参考图授权和租约;Android 接入属于 T-206。
|
||||
client-generated token 安全重放、参考图授权和租约;T-206 已完成 Android 手动
|
||||
领取、安全存储、预览、start/release、前台 heartbeat 和恢复。
|
||||
- F-004/US-004/IX-006:解析结果包含搜索词、识别属性、预算、数量、置信度和警告;
|
||||
原始输入保留,硬约束与输入一致。T-103 已实现版本化 schema、0.75 置信阈值、
|
||||
冲突转人工以及 SKU/数量的本地确定性回填;当前样本未提供预算,因此预算保持空。
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
| Android 自动化 | `AccessibilityService` 语义节点动作;Shizuku 保留为上游兼容路径 | 搜索与 5 个候选已真机验证 | T-101/T-102 已完成精确输入、结果页确认、候选卡识别、详情截图和验证返回;没有坐标或 shell 降级。上游 `main` 仍保留 Shizuku 13.1.5。 |
|
||||
| Android 候选证据 | API 30+ `AccessibilityService.takeScreenshot` + App cache JSON/PNG | 已真机验证 | 匿名 PNG 与只含 SHA-256、计数、尺寸的 manifest;转换/压缩使用独立 executor,文件 IO 使用 `Dispatchers.IO`。API 26-29 明确不支持该截图探针。 |
|
||||
| 第一层任务源 | UTF-8 无 BOM 四行蝦皮订单文本 + 同订单号 JPEG | 已实现 | `task-contract` 共享 `ProbeTask/TaskSource`;CLI 输出到 `.local/`,只有显式 Debug 属性才注入 APK,默认构建会清除私有资产。 |
|
||||
| Android 长任务 | 前台服务 + 持续通知 | 计划采用 | 降低执行中被系统挂起的风险,仍需处理进程死亡恢复。 |
|
||||
| Android 长任务 | 前台服务 + 持续通知 | T-206 已实现 | 30 秒 heartbeat、加密状态恢复、离线截止和 `SAFE_STOPPED`;真实候选工作流接入属于 T-207。 |
|
||||
| 后端语言 | Go 1.23.0 | MVP 已定 | 与现有本机工具链一致;构建测试必须设置 `GOTOOLCHAIN=local` 防止静默升级。 |
|
||||
| 后端骨架 | Go Blueprint v0.10.11 生成的最小 Gin + SQLite 工程 | 已接入并收敛 | 只作为一次性脚手架输入;演示路由、默认 CORS、`.env` 自动加载、单例和 fatal 行为均已删除。 |
|
||||
| 后端框架 | Gin v1.11.0 | MVP 已定 | 这是 `go.mod` 明确支持 Go 1.23.0 的最高已核实 Gin 版本。 |
|
||||
@@ -26,10 +26,10 @@
|
||||
| 管理鉴权 | bcrypt + 8 小时 opaque 服务端会话 Cookie | T-204 已验证 | `authctl` 预置 ADMIN;数据库只存密码 hash 与 session SHA-256,完整 RBAC 为 V2。 |
|
||||
| App 鉴权 | BUYER 密码 + 预授权设备 secret + 1 小时 opaque token | T-204 已验证 | 首次原子绑定空闲设备;数据库只存 token SHA-256,不提供自助登记/refresh。 |
|
||||
| VLM 接入 | Android 应用内统一适配器,优先兼容 OpenAI 风格多模态接口 | 需求提取与候选评估已实现,供应商待定 | 手机直连 provider;后端不代理模型。T-207 把 Key 迁移到 Keystore-backed 加密存储,并回传非秘密 provenance。 |
|
||||
| 离线执行 | 服务端运行授权 + Android 加密本地状态/outbox | T-206 待实现 | 默认 30 分钟、5-120 分钟可配;30 秒 best-effort heartbeat,过期安全停止且 RUNNING 不自动重分配。 |
|
||||
| 离线执行 | 服务端运行授权 + Android 加密本地状态 | T-206 已实现 | 默认 30 分钟、5-120 分钟可配;30 秒 best-effort heartbeat,过期持久安全停止且 RUNNING 不自动重分配;完整 outbox 属于 T-207。 |
|
||||
| 通知 | MVP 不使用推送 | 已定 | 点击“获取任务”调用原子 claim API;V2 再评估厂商推送/WebSocket。 |
|
||||
| 后端测试 | 标准库 `testing` + `httptest` | T-205 已验证 | 当前 192 个测试覆盖配置、迁移、图片限制、任务事务、鉴权隔离、设备就绪、原子领取、幂等重放、租约状态机、取消确认、跨连接与真实 TCP 并发。 |
|
||||
| Android 测试 | Gradle `test` + `kotlinx-coroutines-test` 1.7.3 + 真实设备 smoke | Phase 1 探针已验证 | 166 次测试覆盖 runner、动态页面分类、受控证据、VLM schema、人工确认策略与隐私;OnePlus PKG110 上完成私有 fixture + 本机 mock 的需求提取和 5 候选评估 smoke。 |
|
||||
| 后端测试 | 标准库 `testing` + `httptest` | T-206 已验证 | 当前含子测试 193 次覆盖配置、迁移、图片限制、任务事务、鉴权隔离、设备就绪、原子领取、幂等重放、有限离线租约、取消确认、跨连接与真实 TCP 并发。 |
|
||||
| Android 测试 | Gradle `test` + `kotlinx-coroutines-test` 1.7.3 + MockWebServer 4.12.0 + 真实设备 smoke | T-206 已验证 | 184 次测试覆盖 runner、页面分类、VLM schema、人工确认、后台端点/JSON/图片同源契约和离线时钟;PKG110 完成私有 fixture/VLM mock 及后台登录、领取、95 秒断线、恢复、取消真机 smoke。 |
|
||||
| 部署 | 单机局域网 Go 服务;容器化后置 | MVP 已定 | Android 测试机必须能通过 HTTPS 或受控测试网络访问。 |
|
||||
|
||||
## Roubao 上游版本基线
|
||||
|
||||
+13
-5
@@ -314,20 +314,28 @@ CLAIMED/RUNNING/WAITING_CONFIRMATION
|
||||
规则:
|
||||
|
||||
- `SUCCEEDED` 是验证结果成功,不代表已下单;`order_submitted=false`。
|
||||
- `CLAIMED` 默认租约为 10 分钟;T-206 将 `RUNNING/WAITING_CONFIRMATION` 默认
|
||||
授权从当前 90 秒扩展为 30 分钟,允许范围 5 至 120 分钟。App 每 30 秒
|
||||
best-effort heartbeat,成功后按服务端时间滑动续期。
|
||||
- `CLAIMED` 默认租约为 10 分钟;`RUNNING/WAITING_CONFIRMATION` 默认授权为
|
||||
30 分钟,允许范围 5 至 120 分钟。App 每 30 秒 best-effort heartbeat,成功后
|
||||
按服务端时间滑动续期。
|
||||
- 只有当前设备和有效 claim token 能启动、续租、上报或结束任务。
|
||||
- 终态不可回退;重试创建新的 execution attempt,不篡改历史证据。
|
||||
- App 在 claim 前生成并安全保存 256 bit Raw URL token;后端只存 SHA-256,
|
||||
token 与 `Idempotency-Key` 相互独立。
|
||||
- 过期 `CLAIMED` 可以原子回收;过期 `RUNNING/WAITING_CONFIRMATION` 保持原状态,
|
||||
不自动回队列。App 到达服务端授权截止时间必须安全停止,但原设备可以在重连后
|
||||
补报已产生的终态结果并留下过期补报审计标志。
|
||||
不自动回队列。App 到达服务端授权截止时间持久化 `SAFE_STOPPED` 并停止前台
|
||||
执行;原设备重连 heartbeat 只同步状态且不延长已过期授权。T-207 才允许原设备
|
||||
补报授权内已产生的终态结果并留下过期补报审计标志。
|
||||
- 管理取消 `PENDING/CLAIMED` 立即终态;执行中只设置停止请求,App 在下一个安全
|
||||
检查点停止并调用 `cancel-ack` 后才进入 `CANCELED`。离线期间不能保证即时取消,
|
||||
App 恢复连接后必须先同步取消状态再继续页面动作。
|
||||
|
||||
T-206 Android 使用独立 `ProcurementSecureStore` 保存 backend URL、BUYER access
|
||||
token、设备 secret、claim token、各操作幂等 key、任务快照和 execution。存储创建
|
||||
失败时整个后台采购入口 fail closed,不回退普通 `SharedPreferences`。登录密码只
|
||||
存在于当前 Compose 输入和一次请求中;后台任务不能读取或修改 Roubao provider。
|
||||
`HttpTaskSource` 只把已领取任务和经过 MIME/JPEG/大小/SHA-256 校验的内部参考图
|
||||
映射为现有 `ProbeTask`,不参与领取策略。
|
||||
|
||||
### 4.2 Android 工作流状态
|
||||
|
||||
```text
|
||||
|
||||
@@ -192,8 +192,10 @@
|
||||
|
||||
**范围**
|
||||
|
||||
- 包含:App 本地 provider 配置、Keystore 加密、手动/AI 模式、有限离线授权、加密
|
||||
outbox、结果 provenance 和恢复同步。
|
||||
- T-206 已包含:后台任务安全登录/领取、有限离线授权、前台 heartbeat、状态恢复和
|
||||
安全停止。
|
||||
- T-207 待包含:App 本地 provider 接入后台任务、Key 迁移、手动/AI 模式、加密
|
||||
outbox、结果 provenance 和恢复补报。
|
||||
- 不包含:无限离线执行、离线即时取消、后端模型代理、多设备统一模型或自动下单。
|
||||
|
||||
**验收场景**
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
| IX-001 | US-007 | 管理 Web 登录 | 提交账号密码 | 建立管理会话或显示通用错误 | P0 | 已定 |
|
||||
| IX-002 | US-001 | 新建任务表单 | 填写并提交 | 创建 `PENDING` 任务 | P0 | 已定 |
|
||||
| IX-003 | US-002 | 任务列表/详情 | 打开、刷新、取消 | 查看最新状态、证据和允许动作 | P0 | 已定 |
|
||||
| IX-004 | US-007 | App 登录/设备绑定 | 登录或会话恢复 | 建立人员+设备身份 | P0 | 已定 |
|
||||
| IX-005 | US-003 | App 任务页 | 点击“获取任务” | 就绪检查后领取一条任务或显示原因 | P0 | 已定 |
|
||||
| IX-004 | US-007 | App 登录/设备绑定 | 登录或会话恢复 | 建立人员+设备身份 | P0 | T-206 已实现 |
|
||||
| IX-005 | US-003 | App 任务页 | 点击“获取任务” | 就绪检查后领取一条任务或显示原因 | P0 | T-206 已实现 |
|
||||
| IX-006 | US-004 | App 执行页 | 确认开始/自动步骤 | 显示步骤并有界执行搜索与候选判断 | P0 | 已定 |
|
||||
| IX-007 | US-005 | App 候选确认 | 接受/拒绝/转人工 | 停止自动化并回传人员结论 | P0 | 已定 |
|
||||
| IX-008 | US-006 | App/管理端错误状态 | 自动失败、取消、重试上传 | 显示结构化原因和恢复动作 | P0 | 已定 |
|
||||
| IX-009 | US-008 | App 候选理由/管理端决策详情 | 接受、拒绝、改选或修正 | 保存逐候选结构化人工标签 | P1 | 已定,T-208 后置 |
|
||||
| IX-010 | US-009 | App 独立执行设置/同步状态 | 配置模式、离线执行或补报 | 授权内独立执行并可审计同步 | P0 | 已定,T-206/T-207 |
|
||||
| IX-010 | US-009 | App 独立执行设置/同步状态 | 配置模式、离线执行或补报 | 授权内独立执行并可审计同步 | P0 | T-206 离线控制已实现,结果补报待 T-207 |
|
||||
|
||||
## IX-001 管理 Web 登录
|
||||
|
||||
|
||||
+7
-4
@@ -353,9 +353,9 @@ generation/token 且租约未过期的活跃任务可以读取。成功返回匿
|
||||
|
||||
同 key、同请求重放返回同一 execution;错误用户/设备/token 返回 `403`,过期租约、
|
||||
状态或版本冲突返回 `409`。成功响应包含更新后的 `task`、`execution`、`replayed`
|
||||
和 `server_time`。T-206 将默认 running lease 从当前 90 秒改为 30 分钟(允许配置
|
||||
5 至 120 分钟),并显式返回 `execution_expires_at`。该时间是 App 可以离线继续
|
||||
自动化的上限,不是后台自动重分配时间。
|
||||
和 `server_time`。默认 running lease 为 30 分钟(允许配置 5 至 120 分钟),
|
||||
`execution.execution_expires_at` 是 App 可以离线继续自动化的上限,不是后台自动
|
||||
重分配时间。
|
||||
|
||||
### `POST /api/v1/tasks/{task_id}/heartbeat`
|
||||
|
||||
@@ -392,7 +392,10 @@ generation/token 且租约未过期的活跃任务可以读取。成功返回匿
|
||||
只接受 1 至 64 字节的大写 ASCII step。heartbeat 使用服务端 UTC 更新 execution、
|
||||
设备最近在线时间、任务 version 和 `execution_expires_at`,不写高频任务事件。
|
||||
App 每 30 秒 best-effort 调用;网络失败时可执行到上一次服务端截止时间。截止时间
|
||||
过期后拒绝续作,任务保持原非终态且绝不回到领取队列。
|
||||
到达后 App 持久化 `SAFE_STOPPED` 并停止外部动作,任务保持原非终态且绝不回到
|
||||
领取队列。原设备重连后可以用同一 execution/claim heartbeat 同步状态;后端不延长
|
||||
已经过期的授权,且此时只接受 `step=SAFE_STOPPED`。若响应包含取消请求,App 可以
|
||||
继续调用 `cancel-ack`;没有取消时仍保持安全停止,不自动恢复采购。
|
||||
|
||||
### `POST /api/v1/tasks/{task_id}/release`
|
||||
|
||||
|
||||
+19
-13
@@ -5,9 +5,9 @@
|
||||
## 当前快照
|
||||
|
||||
- 日期:2026-07-27
|
||||
- 阶段:T-205 原子领取、租约和状态机完成,下一步 T-206
|
||||
- Git:当前分支为 `main`;T-001 至 T-004、T-101 至 T-104、T-201 至 T-205
|
||||
均已纳入 Git 历史;T-205 提交为 `ce875af`
|
||||
- 阶段:T-206 App 领取、有限离线和恢复完成,下一步 T-207
|
||||
- Git:当前分支为 `main`;T-001 至 T-004、T-101 至 T-104、T-201 至 T-206
|
||||
均已纳入 Git 历史
|
||||
- 生产代码:`android-buyer/` 已接入 Roubao Android 源码
|
||||
- Android:固定 `main@c8a6d7f03422eb01744b01f3ee77bf7757741f7e`;MIT 许可证已保留
|
||||
- 后端:Go 1.23.0 + Gin 1.11.0 + SQLite + Goose 3.26.0;已实现图片/任务业务、
|
||||
@@ -16,9 +16,9 @@
|
||||
- 本机 Android 工具:JDK 17.0.13、Command-line Tools 22.0、SDK 34、
|
||||
Build Tools 34.0.0、Platform Tools/ADB 37.0.0;用户级 SDK 环境变量已设置
|
||||
- Android Studio:未安装;`winget` 静默安装卡住后已终止,不阻塞命令行构建
|
||||
- 测试:`lintDebug test assembleDebug` 成功;App 两个变体、task contract 和导入器
|
||||
共 26 份报告、166 次测试,0 failure、0 error、0 skipped
|
||||
- 后端测试:`GOTOOLCHAIN=local go test -count=1 ./...` 共 192 个测试通过;
|
||||
- 测试:`test assembleDebug` 成功;App 两个变体、task contract 和导入器
|
||||
共 32 份报告、184 次测试,0 failure、0 error、0 skipped
|
||||
- 后端测试:`GOTOOLCHAIN=local go test -count=1 ./...` 含子测试共 193 次通过;
|
||||
全包 race、`go vet ./...`、API/migration/authctl Windows 构建和根 `init.ps1`
|
||||
均通过
|
||||
- 原型:4 个管理 Web 页面和 7 个 Android 页面均可离线独立打开;Playwright
|
||||
@@ -32,9 +32,14 @@
|
||||
登录各自按来源地址执行内存有界限流,账号和设备支持 `authctl` 启停
|
||||
- 生命周期:设备 heartbeat 记录三个版本、两个就绪位和服务端活跃任务;claim 使用
|
||||
client-generated 256 bit token + 独立幂等 key、SQLite immediate transaction、
|
||||
10 分钟 CLAIMED/90 秒运行租约和 2 分钟 readiness TTL。start/heartbeat/release/
|
||||
10 分钟 CLAIMED/默认 30 分钟运行授权和 2 分钟 readiness TTL。start/heartbeat/release/
|
||||
cancel-ack、过期回收、跨连接并发唯一领取、管理安全停止与 task-scoped 参考图均
|
||||
已实现;原 claim token/hash 不进入响应或日志
|
||||
已实现;运行授权允许配置 5-120 分钟并显式返回截止时间,过期状态同步不延长旧
|
||||
授权;原 claim token/hash 不进入响应或日志
|
||||
- Android 后台采购:新增独立“任务”入口、BUYER/设备登录、Keystore-backed 加密
|
||||
状态、严格 HTTPS/Debug loopback 地址策略、`HttpTaskSource`、参考图校验、手动领取、
|
||||
预览/start 二次确认、release、30 秒前台 heartbeat、有限离线、`SAFE_STOPPED`、
|
||||
取消确认和进程恢复;后台任务不读取或覆盖本地 VLM provider
|
||||
- Workflow:纯 Kotlin runner 已支持步骤 timeout、最多 3 次 retry、安全阻塞、
|
||||
用户停止和单 runner 并发拒绝;T-102 已接入搜索加有界候选采集五步
|
||||
- TaskSource:严格 CLI 已生成并验证真实私有 ProbeTask;默认 APK 不含私有 fixture
|
||||
@@ -46,8 +51,9 @@
|
||||
- VLM 部署决策:手机本地调用已配置的 OpenAI 兼容 provider;管理后端只负责身份、
|
||||
任务控制和结果审计,不保存/代理模型。T-207 保留 Roubao 独立模式并把端上 Key
|
||||
迁移到 Keystore-backed 加密存储
|
||||
- 离线执行决策:T-206 将当前 90 秒运行租约扩展为默认 30 分钟有限授权;heartbeat
|
||||
best-effort,授权内可离线执行,到期安全停止,RUNNING 不自动重新分配
|
||||
- 离线执行:默认 30 分钟有限授权和 30 秒 best-effort heartbeat 已实现;PKG110
|
||||
真机断开临时后端 95 秒后保持同一 execution,重连后滑动续期;到期持久安全停止,
|
||||
RUNNING 不自动重新分配
|
||||
- 测试设备:OnePlus PKG110,Android 16/API 36;肉包 `1.4.2 (7)`;拼多多
|
||||
`8.17.0 (81700)`
|
||||
- 设备就绪:肉包采购无障碍已启用并连接;拼多多首页、搜索输入、固定词结果页、
|
||||
@@ -79,7 +85,7 @@
|
||||
| `docs/tasks/T-203.md` | DONE | 图片/任务 API、SQLite 业务层和 SSR 管理 Web |
|
||||
| `docs/tasks/T-204.md` | DONE | 用户、管理会话和预授权设备联合身份 |
|
||||
| `docs/tasks/T-205.md` | DONE | 原子 claim、租约、execution 和取消安全确认 |
|
||||
| `docs/tasks/T-206.md` | TODO | App 领取、默认 30 分钟有限离线执行、恢复和安全停止 |
|
||||
| `docs/tasks/T-206.md` | DONE | App 领取、默认 30 分钟有限离线执行、恢复和安全停止 |
|
||||
| `docs/tasks/T-207.md` | TODO | App 本地 VLM、Key 加密、候选、事件、截图和结果回传 |
|
||||
| `docs/design/` | 已确认 | T-202 原型索引、4 个管理页和 7 个 Android 页面 |
|
||||
| `deepseek总结.txt` | 已有 | 历史讨论摘要,不是正式需求权威 |
|
||||
@@ -91,9 +97,9 @@
|
||||
|
||||
## 任务摘要
|
||||
|
||||
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-205。
|
||||
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-206。
|
||||
- 正在进行:无。
|
||||
- 下一个可领取任务:T-206 App 接入手动领取和执行进度。
|
||||
- 下一个可领取任务:T-207 App 本地 VLM、候选、事件、截图和结果回传。
|
||||
- 后置任务:T-208 候选决策数据与人工理由闭环;不得跳过 T-206/T-207 提前实现。
|
||||
|
||||
## 当前可运行内容
|
||||
|
||||
@@ -50,6 +50,8 @@ Android 导航名称是逻辑目的地,具体 Compose/Fragment 形式待接入
|
||||
|
||||
claim/start/release/cancel-ack 使用相应幂等规则;参考图、start、task heartbeat、
|
||||
release 和 cancel-ack 都必须匹配当前 `X-Claim-Token` 与 `claim_generation`。
|
||||
运行授权过期后只有 task heartbeat 状态同步和已请求取消的 cancel-ack 允许原设备
|
||||
继续调用;它们不赋予 App 恢复外部动作的权限。
|
||||
T-207 的 events/candidates/complete/fail 接受原设备对授权内已产生结果的离线补报,
|
||||
并由服务端记录是否在执行授权过期后收到;后端不提供 VLM 代理路由。
|
||||
|
||||
|
||||
+46
-11
@@ -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。
|
||||
|
||||
Reference in New Issue
Block a user