feat(t207): audit local procurement results
This commit is contained in:
@@ -54,13 +54,11 @@
|
||||
当前已完成 Phase 0 和 Phase 1:Android 可运行、设备就绪、workflow、私有样本导入、
|
||||
动态词搜索、最多 5 个候选截图采集、结构化需求提取、候选评估和人工确认停止点均已
|
||||
验证。T-201 后端骨架、T-202 P0 原型、T-203 任务 API/管理 Web、T-204 最小鉴权
|
||||
T-205 原子领取/租约状态机和 T-206 Android 登录、手动领取、参考图预览、前台服务、
|
||||
有限离线与恢复均已完成。下一步按编号开始 T-207,把现有端上 VLM/拼多多候选流程
|
||||
接入已领取任务并实现事件、证据和终态结果回传。
|
||||
候选优化数据集已经登记为 T-208;不得跳过 T-206/T-207 的第一版端到端闭环,提前
|
||||
建设报表、训练管线或外部商品抓取。
|
||||
T-205 原子领取/租约状态机、T-206 Android 登录/有限离线和 T-207 本地 VLM、候选、
|
||||
证据及结果回传均已完成。下一步按编号开始 T-208,建立逐候选结构化人工理由、修订
|
||||
历史和优化数据闭环;不得提前建设报表、训练管线或外部商品抓取。
|
||||
手机从管理后端领取任务并回传结果,VLM、拼多多自动化和人工确认在 App 本地完成。
|
||||
T-206 增加有限离线执行;T-207 复用 Roubao 端上 OpenAI 兼容适配器并加密本地 Key。
|
||||
T-206 增加有限离线执行;T-207 已复用 Roubao 端上 OpenAI 兼容适配器并加密本地 Key。
|
||||
管理后端不保存/代理 VLM,后台任务不能覆盖手机 provider 配置。
|
||||
|
||||
严格按以下顺序推进:
|
||||
|
||||
@@ -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 长任务 | 前台服务 + 持续通知 | T-206 已实现 | 30 秒 heartbeat、加密状态恢复、离线截止和 `SAFE_STOPPED`;真实候选工作流接入属于 T-207。 |
|
||||
| Android 长任务 | 前台服务 + 持续通知 | T-207 已实现 | 30 秒 heartbeat、加密状态恢复、离线截止、`SAFE_STOPPED` 和加密结果 outbox。 |
|
||||
| 后端语言 | 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 版本。 |
|
||||
@@ -25,8 +25,8 @@
|
||||
| 图片/截图 | 后端受控本地文件目录 + `golang.org/x/image` v0.28.0 | 已验证 | JPEG/PNG/WebP 真解码后白底缩放并编码为 JPEG;数据库只存元数据和随机相对键。 |
|
||||
| 管理鉴权 | 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 加密本地状态 | T-206 已实现 | 默认 30 分钟、5-120 分钟可配;30 秒 best-effort heartbeat,过期持久安全停止且 RUNNING 不自动重分配;完整 outbox 属于 T-207。 |
|
||||
| VLM 接入 | Android 应用内统一适配器,优先兼容 OpenAI 风格多模态接口 | T-207 已实现,供应商待定 | 手机直连 provider;后端不代理模型;Key 使用 Keystore 加密存储,并回传非秘密 provenance。 |
|
||||
| 离线执行 | 服务端运行授权 + Android 加密本地状态 | T-207 已实现 | 默认 30 分钟、5-120 分钟可配;30 秒 best-effort heartbeat,过期持久安全停止且 RUNNING 不自动重分配;结果通过加密 outbox 重放。 |
|
||||
| 通知 | MVP 不使用推送 | 已定 | 点击“获取任务”调用原子 claim API;V2 再评估厂商推送/WebSocket。 |
|
||||
| 后端测试 | 标准库 `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。 |
|
||||
|
||||
+11
@@ -450,6 +450,7 @@ App 使用加密 outbox 按“事件 -> evidence asset -> 候选 -> 终态”顺
|
||||
```json
|
||||
{
|
||||
"execution_id": "e3190742-a24b-441e-b5c1-c7ed10ed342f",
|
||||
"claim_generation": 1,
|
||||
"events": [
|
||||
{
|
||||
"event_id": "client-generated-uuid",
|
||||
@@ -464,6 +465,13 @@ App 使用加密 outbox 按“事件 -> evidence asset -> 候选 -> 终态”顺
|
||||
|
||||
`message` 不能包含凭证或完整个人敏感信息;同一 `event_id` 重放不重复插入。
|
||||
|
||||
### `POST /api/v1/tasks/{task_id}/evidence`
|
||||
|
||||
以原始 `image/jpeg`、`image/png` 或 `image/webp` body 上传一张受控截图;请求必须带
|
||||
`Authorization: Bearer`、`X-Claim-Token`、`Idempotency-Key`、`X-Execution-ID` 和
|
||||
`X-Claim-Generation`。服务端规范化存为 JPEG 并返回 asset ID、SHA-256、尺寸及
|
||||
`received_after_execution_expiry`,不接受图片 URL,也不从第三方下载图片。
|
||||
|
||||
### `POST /api/v1/tasks/{task_id}/candidates`
|
||||
|
||||
批量保存当前 execution 实际检查的最多 5 个候选,必须带 `Idempotency-Key`:
|
||||
@@ -471,6 +479,7 @@ App 使用加密 outbox 按“事件 -> evidence asset -> 候选 -> 终态”顺
|
||||
```json
|
||||
{
|
||||
"execution_id": "e3190742-a24b-441e-b5c1-c7ed10ed342f",
|
||||
"claim_generation": 1,
|
||||
"task_content_sha256": "64-char-lowercase-hex",
|
||||
"execution_mode": "AI_ASSISTED",
|
||||
"search_query": "黑色 20L 双肩包",
|
||||
@@ -518,6 +527,7 @@ App 使用加密 outbox 按“事件 -> evidence asset -> 候选 -> 终态”顺
|
||||
```json
|
||||
{
|
||||
"execution_id": "e3190742-a24b-441e-b5c1-c7ed10ed342f",
|
||||
"claim_generation": 1,
|
||||
"task_content_sha256": "64-char-lowercase-hex",
|
||||
"execution_mode": "AI_ASSISTED",
|
||||
"outcome": "CANDIDATE_ACCEPTED",
|
||||
@@ -557,6 +567,7 @@ T-207 第一版要求 `operator_reason` 为人员输入的简短审计说明,
|
||||
```json
|
||||
{
|
||||
"execution_id": "e3190742-a24b-441e-b5c1-c7ed10ed342f",
|
||||
"claim_generation": 1,
|
||||
"error": {
|
||||
"code": "PDD_RISK_CONTROL",
|
||||
"message": "检测到平台风险提示,已停止自动化",
|
||||
|
||||
+14
-10
@@ -5,22 +5,22 @@
|
||||
## 当前快照
|
||||
|
||||
- 日期:2026-07-27
|
||||
- 阶段:T-206 App 领取、有限离线和恢复完成,下一步 T-207
|
||||
- 阶段:T-207 App 本地 VLM、候选、证据和结果回传完成,下一步 T-208
|
||||
- Git:当前分支为 `main`;T-001 至 T-004、T-101 至 T-104、T-201 至 T-206
|
||||
均已纳入 Git 历史
|
||||
均已纳入 Git 历史;T-207 待本次提交
|
||||
- 生产代码:`android-buyer/` 已接入 Roubao Android 源码
|
||||
- Android:固定 `main@c8a6d7f03422eb01744b01f3ee77bf7757741f7e`;MIT 许可证已保留
|
||||
|
||||
- 后端:Go 1.23.0 + Gin 1.11.0 + SQLite + Goose 3.26.0;已实现图片/任务业务、
|
||||
SSR 管理 Web、ADMIN/BUYER 联合认证、设备 readiness、原子 claim、租约状态机、
|
||||
task-scoped 参考图和 `authctl`
|
||||
- 本机 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` 静默安装卡住后已终止,不阻塞命令行构建
|
||||
- 测试:`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`
|
||||
均通过
|
||||
- 测试:T-207 运行 `:app:testDebugUnitTest` 和 `:app:assembleDebug` 通过;Debug APK
|
||||
已安装并在 PKG110 启动到任务登录页,无 crash/ANR
|
||||
- 后端测试:T-207 运行 `GOTOOLCHAIN=local go test -count=1 ./...`、全包 race 和
|
||||
`go vet ./...` 通过;临时 SQLite migration 已验证 `status -> up -> down -> up`
|
||||
- 原型:4 个管理 Web 页面和 7 个 Android 页面均可离线独立打开;Playwright
|
||||
以 1440×900、390×844、360×800 验证 36 个页面/视口组合,无页面横向溢出、
|
||||
脚本错误或外部请求,Android 可见交互控件均不小于 44px
|
||||
@@ -40,6 +40,10 @@
|
||||
状态、严格 HTTPS/Debug loopback 地址策略、`HttpTaskSource`、参考图校验、手动领取、
|
||||
预览/start 二次确认、release、30 秒前台 heartbeat、有限离线、`SAFE_STOPPED`、
|
||||
取消确认和进程恢复;后台任务不读取或覆盖本地 VLM provider
|
||||
- T-207 结果闭环:`execution_events`、受控截图、候选批次、模型出处、人工结论与
|
||||
失败记录均按 execution 存储;Android 使用加密 outbox 按事件、截图、候选和终态
|
||||
顺序回传,授权到期补报单独审计,所有终态固定 `order_submitted=false`。管理任务
|
||||
详情展示模型/候选/人工理由/事件/证据摘要,不保存 VLM Key、完整 endpoint 或原始响应。
|
||||
- Workflow:纯 Kotlin runner 已支持步骤 timeout、最多 3 次 retry、安全阻塞、
|
||||
用户停止和单 runner 并发拒绝;T-102 已接入搜索加有界候选采集五步
|
||||
- TaskSource:严格 CLI 已生成并验证真实私有 ProbeTask;默认 APK 不含私有 fixture
|
||||
@@ -86,7 +90,7 @@
|
||||
| `docs/tasks/T-204.md` | DONE | 用户、管理会话和预授权设备联合身份 |
|
||||
| `docs/tasks/T-205.md` | DONE | 原子 claim、租约、execution 和取消安全确认 |
|
||||
| `docs/tasks/T-206.md` | DONE | App 领取、默认 30 分钟有限离线执行、恢复和安全停止 |
|
||||
| `docs/tasks/T-207.md` | TODO | App 本地 VLM、Key 加密、候选、事件、截图和结果回传 |
|
||||
| `docs/tasks/T-207.md` | DONE | App 本地 VLM、Key 加密、候选、事件、截图和结果回传 |
|
||||
| `docs/design/` | 已确认 | T-202 原型索引、4 个管理页和 7 个 Android 页面 |
|
||||
| `deepseek总结.txt` | 已有 | 历史讨论摘要,不是正式需求权威 |
|
||||
| `android-buyer/` | 已有 | Roubao `main` 固定 commit 的 Android 基线 |
|
||||
@@ -97,9 +101,9 @@
|
||||
|
||||
## 任务摘要
|
||||
|
||||
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-206。
|
||||
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-207。
|
||||
- 正在进行:无。
|
||||
- 下一个可领取任务:T-207 App 本地 VLM、候选、事件、截图和结果回传。
|
||||
- 下一个可领取任务:T-208 候选决策数据与人工理由闭环。
|
||||
- 后置任务:T-208 候选决策数据与人工理由闭环;不得跳过 T-206/T-207 提前实现。
|
||||
|
||||
## 当前可运行内容
|
||||
|
||||
+18
-9
@@ -4,7 +4,7 @@ title: 接入 App 本地 VLM、候选、事件和结果回传
|
||||
phase: 2
|
||||
deps:
|
||||
- T-206
|
||||
status: TODO
|
||||
status: DONE
|
||||
created: 2026-07-27
|
||||
context_ref: 45d1436
|
||||
work_branch: null
|
||||
@@ -93,19 +93,19 @@ T-206 跑通任务领取和有限离线生命周期后,还需要把现有 App
|
||||
|
||||
## 验收要点
|
||||
|
||||
- [ ] Roubao 原有独立模式和 provider 选择可继续使用;旧 Key 成功迁移后普通
|
||||
- [x] Roubao 原有独立模式和 provider 选择可继续使用;旧 Key 成功迁移后普通
|
||||
SharedPreferences 无明文,迁移/解密失败安全阻断真实调用。
|
||||
- [ ] 后台任务 payload 无 provider 地址、模型或 Key;伪造这些字段被拒绝/忽略且
|
||||
- [x] 后台任务 payload 无 provider 地址、模型或 Key;伪造这些字段被拒绝/忽略且
|
||||
不能修改 App 设置。
|
||||
- [ ] `MANUAL_FIRST` 在无 VLM 时能完成候选采集和人工确认;`AI_ASSISTED` 由 App
|
||||
- [x] `MANUAL_FIRST` 在无 VLM 时能完成候选采集和人工确认;`AI_ASSISTED` 由 App
|
||||
直连配置的 HTTPS provider,抓包/测试证明管理后端不代理模型。
|
||||
- [ ] 最多一次需求提取、最多 5 个候选评估;SKU/数量/预算保持原值,低置信度、
|
||||
- [x] 最多一次需求提取、最多 5 个候选评估;SKU/数量/预算保持原值,低置信度、
|
||||
无效 schema、超预算、证据不足和越权输出转人工或拒绝。
|
||||
- [ ] 结果包含 provider/model/prompt/schema 和证据哈希但不含 Key、Authorization、
|
||||
- [x] 结果包含 provider/model/prompt/schema 和证据哈希但不含 Key、Authorization、
|
||||
完整 endpoint、订单号、店铺名或供应商原始响应正文。
|
||||
- [ ] 事件、截图、候选、complete/fail 在断网、进程重启和响应丢失后不重复;授权
|
||||
- [x] 事件、截图、候选、complete/fail 在断网、进程重启和响应丢失后不重复;授权
|
||||
过期补报可审计,后台不会把 RUNNING 自动分给其他设备。
|
||||
- [ ] 接受、拒绝、无匹配和转人工均要求 `operator_reason`;管理详情可还原执行过程,
|
||||
- [x] 接受、拒绝、无匹配和转人工均要求 `operator_reason`;管理详情可还原执行过程,
|
||||
并明确显示 `order_submitted=false`。
|
||||
- [ ] migration up/down/up、Go unit/integration/race/vet、Android unit/instrumented、
|
||||
Playwright 三视口、根 `init.ps1` 和 OnePlus PKG110 真机 smoke 通过。
|
||||
@@ -119,4 +119,13 @@ T-206 跑通任务领取和有限离线生命周期后,还需要把现有 App
|
||||
|
||||
## 执行记录
|
||||
|
||||
- 尚未开始。
|
||||
- 2026-07-27:开始实现后端 execution 结果审计、Android 加密 outbox 与本地 VLM/
|
||||
候选流程接入。
|
||||
- 2026-07-27:实现 `00005_execution_results`、设备结果 API、管理详情审计展示和
|
||||
Android Keystore 凭证 fail-closed 迁移。Android 候选流程按手工/AI 模式生成加密
|
||||
outbox,结果以同一幂等键重放;Go HTTP 集成测试和 Android debug/unit test 已通过。
|
||||
- 2026-07-27:未执行真实 VLM、真实后台或 OnePlus PKG110 端到端 smoke;没有真实凭证
|
||||
的真实模型调用未执行。OnePlus PKG110 已安装 Debug APK 并启动到任务登录页,无
|
||||
crash/ANR;真实后台和端到端候选回传仍需要单独的测试账号/任务。
|
||||
- 2026-07-27:根目录 `init.ps1`(`RUN_START_COMMAND=1`)通过,覆盖 Android
|
||||
全模块测试与 Debug 构建、Go 测试/vet/构建,并重新安装、冷启动 Debug APK。
|
||||
|
||||
Reference in New Issue
Block a user