172 lines
11 KiB
Markdown
172 lines
11 KiB
Markdown
# 当前实现状态
|
||
|
||
> 可覆盖的项目级快照。任务执行日志写入对应任务文件。
|
||
|
||
## 当前快照
|
||
|
||
- 日期: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`
|
||
- 生产代码:`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` 静默安装卡住后已终止,不阻塞命令行构建
|
||
- 测试:`lintDebug test assembleDebug` 成功;App 两个变体、task contract 和导入器
|
||
共 26 份报告、166 次测试,0 failure、0 error、0 skipped
|
||
- 后端测试:`GOTOOLCHAIN=local go test -count=1 ./...` 共 192 个测试通过;
|
||
全包 race、`go vet ./...`、API/migration/authctl Windows 构建和根 `init.ps1`
|
||
均通过
|
||
- 原型:4 个管理 Web 页面和 7 个 Android 页面均可离线独立打开;Playwright
|
||
以 1440×900、390×844、360×800 验证 36 个页面/视口组合,无页面横向溢出、
|
||
脚本错误或外部请求,Android 可见交互控件均不小于 44px
|
||
- 管理 Web:真实 Gin/SQLite 流程已完成图片上传、任务创建、列表、详情参考图和
|
||
非终态取消;执行中只显示“请求安全停止”,ADMIN 登录/退出和安全返回路径已接入,
|
||
同三种视口无横向溢出,可见任务操作控件不小于 44px
|
||
- 鉴权:bcrypt 密码、8 小时管理 session、1 小时 App access token 和设备 secret
|
||
均不明文落库;设备首次绑定原子化,禁用/过期/撤销每次请求重新检查;管理/App
|
||
登录各自按来源地址执行内存有界限流,账号和设备支持 `authctl` 启停
|
||
- 生命周期:设备 heartbeat 记录三个版本、两个就绪位和服务端活跃任务;claim 使用
|
||
client-generated 256 bit token + 独立幂等 key、SQLite immediate transaction、
|
||
10 分钟 CLAIMED/90 秒运行租约和 2 分钟 readiness TTL。start/heartbeat/release/
|
||
cancel-ack、过期回收、跨连接并发唯一领取、管理安全停止与 task-scoped 参考图均
|
||
已实现;原 claim token/hash 不进入响应或日志
|
||
- Workflow:纯 Kotlin runner 已支持步骤 timeout、最多 3 次 retry、安全阻塞、
|
||
用户停止和单 runner 并发拒绝;T-102 已接入搜索加有界候选采集五步
|
||
- TaskSource:严格 CLI 已生成并验证真实私有 ProbeTask;默认 APK 不含私有 fixture
|
||
- VLM:需求提取与候选评估均使用严格 schema、0.75 阈值、受控证据源、安全端点和
|
||
单次调用边界;候选最多 5 个并按 ordinal 串行评估,本地产生建议并停在人工确认,
|
||
SKU/数量由本地原值回填,预算保持空,订单提交状态固定为 false
|
||
- 后置数据闭环:已登记 T-208,在第一版 T-206/T-207 跑通后分离保存候选观测、
|
||
模型预测、确定性推荐和人工标签;人工接受/拒绝使用结构化理由,20 条试验依赖它
|
||
- VLM 部署决策:手机本地调用已配置的 OpenAI 兼容 provider;管理后端只负责身份、
|
||
任务控制和结果审计,不保存/代理模型。T-207 保留 Roubao 独立模式并把端上 Key
|
||
迁移到 Keystore-backed 加密存储
|
||
- 离线执行决策:T-206 将当前 90 秒运行租约扩展为默认 30 分钟有限授权;heartbeat
|
||
best-effort,授权内可离线执行,到期安全停止,RUNNING 不自动重新分配
|
||
- 测试设备:OnePlus PKG110,Android 16/API 36;肉包 `1.4.2 (7)`;拼多多
|
||
`8.17.0 (81700)`
|
||
- 设备就绪:肉包采购无障碍已启用并连接;拼多多首页、搜索输入、固定词结果页、
|
||
双列候选卡、详情截图和返回均已通过 8.17.0 真机验证
|
||
- 版本控制内测试数据:仅有脱敏、运行时生成的单元测试 fixture;没有真实订单内容
|
||
- 本地私有样本:仓库根目录存在一组未跟踪、已本地排除的同名蝦皮文本/JPEG;
|
||
已用 CLI 真实导入并逐字段/图片哈希验证,生成物位于被忽略的 `.local/`
|
||
- 标准启动路径:`$env:RUN_START_COMMAND="1"; .\init.ps1`
|
||
- 标准验证路径:`.\init.ps1`
|
||
- 当前 blocker:真实 VLM 服务地址、模型、设备级测试凭证、成本上限和数据留存尚未确认;
|
||
当前只支持单 SKU/JPEG;候选探针截图要求 Android 11/API 30+
|
||
|
||
## 当前目录
|
||
|
||
| 路径 | 状态 | 说明 |
|
||
| --- | --- | --- |
|
||
| `AGENTS.md` | 已有 | agent 权威入口 |
|
||
| `docs/` | 已有 | Harness Coding 文档 |
|
||
| `docs/tasks/T-001.md` | DONE | Android 可构建、可安装、可启动基线 |
|
||
| `docs/tasks/T-002.md` | DONE | 设备版本、无障碍、前台和登录阻塞就绪检查 |
|
||
| `docs/tasks/T-003.md` | DONE | 可注入 Fake automation 的受限 workflow runner |
|
||
| `docs/tasks/T-004.md` | DONE | 私有蝦皮文本/JPEG 严格导入和 Debug TaskSource |
|
||
| `docs/tasks/T-101.md` | DONE | 固定脱敏词拼多多搜索和结果页真机验证 |
|
||
| `docs/tasks/T-102.md` | DONE | 最多 5 个候选详情截图、证据 manifest 和结果页返回 |
|
||
| `docs/tasks/T-103.md` | DONE | 私有任务需求 schema、硬约束、隐私边界和 VLM 适配器 |
|
||
| `docs/tasks/T-104.md` | DONE | 动态搜索、候选严格评估、本地建议和人工确认点 |
|
||
| `docs/tasks/T-201.md` | DONE | Go-Gin、SQLite、Goose migration 和健康检查骨架 |
|
||
| `docs/tasks/T-202.md` | DONE | 生成并确认 P0 Web/App 低保真原型 |
|
||
| `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-207.md` | TODO | App 本地 VLM、Key 加密、候选、事件、截图和结果回传 |
|
||
| `docs/design/` | 已确认 | T-202 原型索引、4 个管理页和 7 个 Android 页面 |
|
||
| `deepseek总结.txt` | 已有 | 历史讨论摘要,不是正式需求权威 |
|
||
| `android-buyer/` | 已有 | Roubao `main` 固定 commit 的 Android 基线 |
|
||
| `android-buyer/task-contract/` | 已有 | Android/CLI 共享 ProbeTask 与 TaskSource |
|
||
| `android-buyer/tools/shopee-importer/` | 已有 | 开发机私有 fixture 导入 CLI |
|
||
| `backend-api/` | 已有 | Go-Gin 任务 API、SQLite、图片存储、管理 Web 和 migration |
|
||
| `init.ps1` / `init.sh` | 已验证/待跨平台 | Windows 同时验证 Android/Go;Unix 入口待 Linux/WSL 复核 |
|
||
|
||
## 任务摘要
|
||
|
||
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-205。
|
||
- 正在进行:无。
|
||
- 下一个可领取任务:T-206 App 接入手动领取和执行进度。
|
||
- 后置任务:T-208 候选决策数据与人工理由闭环;不得跳过 T-206/T-207 提前实现。
|
||
|
||
## 当前可运行内容
|
||
|
||
```powershell
|
||
.\init.ps1
|
||
|
||
$env:RUN_START_COMMAND = "1"
|
||
.\init.ps1
|
||
|
||
Set-Location backend-api
|
||
$env:GOTOOLCHAIN = "local"
|
||
go run ./cmd/migrate up
|
||
$env:CMROUBAO_AUTH_PASSWORD = "至少 12 个 UTF-8 字节"
|
||
go run ./cmd/authctl create-user ADMIN admin
|
||
Remove-Item Env:CMROUBAO_AUTH_PASSWORD
|
||
go run ./cmd/api
|
||
```
|
||
|
||
2026-07-25 已在 PKG110、Android 16/API 36、拼多多 8.17.0 上完成 Debug APK
|
||
固定词搜索和 5 个候选采集。默认首屏为候选探针,用户点击后五步全部完成,5 张
|
||
匿名 PNG 与 manifest 哈希一致并返回结果页;logcat 无崩溃或 ANR。
|
||
|
||
同日用显式私有 fixture 和一次性本机 OpenAI 兼容 mock 完成 T-103 Android smoke:
|
||
只发出 1 次 POST 和 1 张 JPEG data URL,请求不含订单/店铺字段或数量键;严格响应
|
||
进入 READY,UI 保留原 SKU/数量、空预算和警告。恢复无密钥 provider 后失败状态会
|
||
清空旧结果;设备原 API provider 设置已恢复。该 smoke 只证明集成与隐私边界,不
|
||
代表真实 VLM 提取质量;真实凭证调用未执行。
|
||
|
||
同日完成 T-104 真机 smoke:结构化需求搜索词驱动拼多多搜索并采集 5 份候选证据,
|
||
本机 mock 精确收到 5 次按 ordinal 排序的单图 POST;请求未包含订单、店铺、本机
|
||
路径或数量字段。严格评估进入“等待人工确认”,人员可标记建议候选可用或拒绝,
|
||
`order_submitted` 始终为 false;日志敏感词、Base64、原始响应和 schema/prompt
|
||
命中均为 0。该结果不代表真实模型的商品匹配质量。
|
||
|
||
同日完成 T-201 后端 smoke:本机迁移执行 `status -> up -> up -> down -> up`,
|
||
第二次 `up` 应用数为 0;API 真实进程的 `GET /healthz` 返回 `200` 和稳定 JSON,
|
||
未知路由返回 `404`,错误方法返回 `405`,无默认 CORS,stdout/stderr 均为空。
|
||
`http.Server.Shutdown` 由集成测试验证在 1 秒预算内结束。当前 Windows 没有可用 WSL
|
||
发行版,因此 `init.sh` 未实际运行;Windows 标准入口已验证。
|
||
|
||
2026-07-26 完成 T-203:新增两条业务 migration、图片规范化存储、任务领域/用例/
|
||
SQLite 仓储、管理 API 和 SSR Web。创建/上传幂等,列表稳定分页,详情可读取同源
|
||
规范化参考图,只有 `PENDING` 可取消。T-204 前业务路由仅限 loopback,Web 写操作
|
||
使用双提交 CSRF;这不是正式鉴权。真实 HTTP/Playwright 和 migration CLI smoke、
|
||
99 个 Go 测试、全包 race/vet、Windows 构建与根 `init.ps1` 全部通过。
|
||
|
||
2026-07-26 完成 T-204:新增 users/devices/admin_sessions/access_tokens 与任务 actor
|
||
migration、bcrypt 密码、opaque 凭证、`authctl`、管理登录/退出和 App 联合认证。
|
||
ADMIN Cookie 与 BUYER 设备 Bearer token 完全隔离;非 loopback 监听必须配置内建
|
||
TLS。真实 SQLite/Gin smoke 验证 migration up/down/up、账号/设备预置、App token、
|
||
管理登录、任务创建 actor 和退出;Playwright 在 1440×900、390×844、360×800
|
||
验证无横向溢出,发现并修复退出路由漏装配及 T-203 旧 CSRF Cookie 路径兼容问题。
|
||
142 个 Go 测试、全包 race/vet、Windows 三入口构建与根 `init.ps1` 均通过。
|
||
|
||
2026-07-26 完成 T-205:新增设备 readiness、claim/execution/lifecycle migration,
|
||
实现 client-generated claim token 安全重放、跨连接原子领取、CLAIMED/运行租约、
|
||
start/heartbeat/release、管理取消请求、App cancel-ack 和当前 claim 参考图授权。
|
||
真实 TCP 并发测试验证同设备同时 claim 只有一个成功;迁移 CLI 完成
|
||
`status/up/up/down/up`。Playwright 连接真实服务验证管理任务详情在 1440×900、
|
||
390×844、360×800 无横向溢出、破图或取消弹窗重叠;执行中安全停止文案由 SSR
|
||
测试覆盖。192 个 Go 测试、全包 race/vet、Windows 三入口构建和根 `init.ps1`
|
||
全部通过。
|
||
|
||
## 维护规则
|
||
|
||
发生以下变化时覆盖更新本文:
|
||
|
||
- 初始化 Git 或接入上游代码。
|
||
- 获得首个可复现 Android 构建、安装或启动命令。
|
||
- 建立后端和真实测试命令。
|
||
- 设备、拼多多和 VLM 基线确定。
|
||
- 项目阶段、目录或 blocker 变化。
|
||
|
||
任务的详细状态、验证和决策写入 `docs/tasks/T-<编号>.md`,本文只保留快照。
|