feat(android): import private Shopee probe tasks

This commit is contained in:
QiuSW
2026-07-25 19:06:28 +08:00
parent d57c4ae2d4
commit 1c1c158149
25 changed files with 1034 additions and 34 deletions
+2 -1
View File
@@ -51,7 +51,8 @@
## 当前阶段与优先路径
当前处于“Android 可运行基线完成、设备和 workflow 验证准备”阶段。
当前已完成 Phase 0:Android 可运行、设备就绪、workflow 测试和私有样本导入基线。
下一步是 T-101,用固定脱敏搜索词跑通拼多多关键词搜索并验证安全停止。
严格按以下顺序推进:
+6 -5
View File
@@ -86,9 +86,10 @@
| `quantity` | 文本 | 必须为正整数;不得由模型改写。 |
| `reference_image` | 同名图片 | 必填;缺失或匹配到多张时拒绝导入。 |
正式私有样本目录、是否允许 JPEG 以外的图片,以及一张订单包含多个 SKU 时的文本
和图片命名规则仍待 `T-004` 固定。解析器不得根据模糊内容猜测字段,也不得静默选择
重名图片;遇到不是上述四行格式的文件应明确失败,除非先通过新样例扩展契约。
T-004 已固定首版规则:推荐私有目录为被 Git 忽略的 `private-fixtures/shopee/`,
导入命令仍要求显式目录;图片扩展名允许 `.jpg`/`.jpeg`,实际内容必须是唯一且可
解码的 JPEG;一张订单只允许一个 SKU 和一张参考图。多 SKU 或其他图片类型必须先
通过新样例扩展契约。解析器不得根据模糊内容猜测字段,也不得静默选择重名图片。
## 七、MVP 验收标准
@@ -137,8 +138,8 @@
- Roubao 上游仓库、许可证和远端构建版本已核实;源码导入、分支选择和本机构建仍由
`T-001` 完成。
- 首份蝦皮样本格式已核实;正式私有目录、更多图片类型和一单多 SKU 规则仍需在
`T-004` 固定。
- 首份蝦皮样本已由 T-004 真实导入验证;当前只支持单 SKU 和 JPEG,扩展格式需新
样例和独立任务。
- 拼多多版本、页面结构、账号登录状态和测试设备尚未形成可复现基线。
- VLM 厂商、模型、成本上限、数据留存地区和图片隐私规则待确认。
- 拼多多平台条款、自动化允许范围和账号风控需要业务方确认;项目不实现绕过措施。
+1 -1
View File
@@ -12,7 +12,7 @@
| Android SDK | compileSdk/targetSdk 34;minSdk 26;SDK Build Tools 34.0.0 | 已验证 | 支持 Android 8.0+;本机使用 Command-line Tools 22.0。 |
| Android UI | Jetpack Compose + Material 3;Compose Compiler 1.5.5 | 上游已核实 | Compose BOM 为 2023.10.01。 |
| Android 自动化 | 项目目标以 `AccessibilityService` 为主,Shizuku 为兼容/增强路径 | 就绪观察基线已实现,动作待实现 | T-002 已实现只读前台/登录阻塞观察;搜索、点击和安全动作门禁由 T-101 开始实现。上游 `main` 仍保留 Shizuku 13.1.5。 |
| 第一层任务源 | UTF-8 四行蝦皮订单文本 + 同订单号 JPEG | 首份样例已核实,待实现 | 使用 Debug/测试专用 `TaskSource`;原始数据和生成物不得提交。 |
| 第一层任务源 | UTF-8 无 BOM 四行蝦皮订单文本 + 同订单号 JPEG | 已实现 | `task-contract` 共享 `ProbeTask/TaskSource`;CLI 输出到 `.local/`,只有显式 Debug 属性才注入 APK,默认构建会清除私有资产。 |
| Android 长任务 | 前台服务 + 持续通知 | 计划采用 | 降低执行中被系统挂起的风险,仍需处理进程死亡恢复。 |
| 后端语言 | Go 1.23.0 | MVP 已定 | 与现有本机工具链一致;构建测试必须设置 `GOTOOLCHAIN=local` 防止静默升级。 |
| 后端骨架 | Go Blueprint v0.10.11 生成的最小 Gin + SQLite 工程 | MVP 已定 | 只作为一次性脚手架输入;生成后立即重写版本约束。 |
+11
View File
@@ -141,6 +141,17 @@ Debug 构建或测试装载。导入必须:
- 不把完整订单号、店铺名、原图路径写入普通日志。
- 仅在用户明确配置 VLM 后发送必要的标题、SKU 和参考图;不发送订单号或店铺名。
实现边界:
- `task-contract/`:纯 Kotlin `ProbeTask`、`TaskSource` 和版本化 JSON codec。
- `tools/shopee-importer/`:开发机 CLI,严格校验并生成匿名资产名。
- `app/src/debug/.../FixtureTaskSource`:只在 Debug 代码中读取
`assets/probe-fixtures/tasks.json`。
- `ProbeWorkflowCoordinator`:只依赖 `TaskSource`,未来可无缝替换 `HttpTaskSource`。
私有 fixture 只有在构建显式设置 `-PprobeFixturesDir` 时注入 Debug APK;普通构建
必须同步清空生成资产,防止上一次真实样本残留。
### 3.2 MVP 业务闭环
```text
+2
View File
@@ -77,6 +77,8 @@
- API 权限、事务、幂等、文件校验:集成测试。
- VLM adapter:固定 fixture/契约测试,不让普通测试依赖真实付费 API。
- 蝦皮文件导入:覆盖同名配对、缺图、重复图片、未知格式、非法数量和敏感日志检查。
- 私有 ProbeTask 只允许通过 `-PprobeFixturesDir` 注入 Debug APK;验证后必须再做
一次不带属性的普通构建,并确认 APK 不含 `assets/probe-fixtures/`。
- Android workflow:用 fake automation/AI client 测状态和安全停止。
- 拼多多真实流程:指定版本测试机手工 smoke,保存脱敏截图和步骤证据。
- UI:覆盖默认、加载、空、错误、权限和中断状态。
+13 -10
View File
@@ -5,30 +5,30 @@
## 当前快照
- 日期:2026-07-25
- 阶段:T-003 Android workflow 测试骨架完成,准备执行 T-004
- Git:当前分支为 `main`;T-001 至 T-003 均已纳入 Git 历史
- 阶段:Phase 0 完成,准备执行 T-101 拼多多关键词搜索探针
- Git:当前分支为 `main`;T-001 至 T-004 均已纳入 Git 历史
- 生产代码:`android-buyer/` 已接入 Roubao Android 源码
- Android:固定 `main@c8a6d7f03422eb01744b01f3ee77bf7757741f7e`;MIT 许可证已保留
- 后端:已决定使用 Go 1.23.0 + Gin 1.11.0;Go Blueprint v0.10.11 骨架尚未接入
- 本机 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` 成功;T-002/T-003 共 11 个纯 Kotlin
测试,Debug/Release 两个变体共执行 22 次且全部通过
- 测试:`lintDebug test assembleDebug` 成功;App 两个变体、task contract 和导入器
共执行 38 次测试,0 failure、0 error、0 skipped
- Workflow:纯 Kotlin runner 已支持步骤 timeout、最多 3 次 retry、安全阻塞、
用户停止和单 runner 并发拒绝;尚未连接真实拼多多动作
- TaskSource:严格 CLI 已生成并验证真实私有 ProbeTask;默认 APK 不含私有 fixture
- 测试设备:OnePlus PKG110,Android 16/API 36;肉包 `1.4.2 (7)`;拼多多
`8.17.0 (81700)`
- 设备就绪:肉包采购无障碍已启用并连接;可观察前台包名;拼多多首页未发现登录、
验证码或风控文案,但该结果不等于账号已确认登录
- 版本控制内数据:只有 `deepseek总结.txt` 背景摘要和本套项目文档
- 版本控制内测试数据:仅有脱敏、运行时生成的单元测试 fixture;没有真实订单内容
- 本地私有样本:仓库根目录存在一组未跟踪、已本地排除的同名蝦皮文本/JPEG;
已核实 UTF-8 四行字段格式和图片可解码,真实内容未纳入 Git
已用 CLI 真实导入并逐字段/图片哈希验证,生成物位于被忽略的 `.local/`
- 标准启动路径:`$env:RUN_START_COMMAND="1"; .\init.ps1`
- 标准验证路径:`.\init.ps1`
- 当前 blocker:拼多多账号是否满足后续搜索流程仍需在 T-101 用页面状态确认;
蝦皮样本正式私有目录、更多图片类型和一单多 SKU 规则未确认;VLM 供应商和
测试凭证未确认
当前只支持单 SKU/JPEG;VLM 供应商和测试凭证未确认
## 当前目录
@@ -39,16 +39,19 @@
| `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 |
| `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、管理 Web 和数据目标目录 |
| `init.ps1` / `init.sh` | 已验证 | Android 构建入口;可选真机安装启动 |
## 任务摘要
- 已完成:T-001 Android 基线;T-002 设备就绪检查;T-003 workflow 测试骨架。
- 已完成:T-001 至 T-004,Phase 0 可运行和输入基线。
- 正在进行:无。
- 下一个可领取任务:T-004 导入本机蝦皮订单验证样本。
- 下一个可领取任务:T-101 固定任务跑通拼多多关键词搜索。
## 当前可运行内容
+55 -15
View File
@@ -3,20 +3,29 @@ id: T-004
title: 导入本机蝦皮订单验证样本
phase: 0
deps: [T-001]
status: TODO
status: DONE
created: 2026-07-25
context_ref: null
work_branch: null
context_ref: d57c4ae2d42c6e48a2d0ad0e9f295cd354dc911a
work_branch: main
write_paths:
- docs/tasks/T-004.md
- android-buyer/build.gradle.kts
- android-buyer/settings.gradle.kts
- android-buyer/task-contract/**
- android-buyer/tools/**
- android-buyer/app/build.gradle.kts
- android-buyer/app/src/main/java/com/roubao/autopilot/workflow/**
- android-buyer/app/src/debug/**
- android-buyer/app/src/test/**
- .gitignore
- README.md
- 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/current-state.md
- progress.md
---
## 问题 / 背景
@@ -39,8 +48,10 @@ JPEG。正式私有目录、额外图片类型和一单多 SKU 规则仍未固
## 方案
1. 将当前根目录样例迁移或配置到明确的私有样本目录,保持 Git 忽略。
2. 以已核实的 UTF-8 四行标签和 JPEG 为首版契约;一单多 SKU 不明确前拒绝导入。
1. 正式私有目录约定为仓库根目录 `private-fixtures/shopee/`,工具仍要求显式
`--input`;当前根目录样例保持原位并继续通过本地 exclude 隔离。
2. 以已核实的 UTF-8 四行标签和 JPEG 内容为首版契约;允许 `.jpg`/`.jpeg` 扩展名,
一张订单只允许一行 SKU 和一张参考图。
3. 实现开发机导入工具,按文件主名精确配对文本和唯一参考图。
4. 校验订单号、店铺名、标题、SKU、正整数数量、图片存在且可解码。
5. 生成与未来 HTTP `TaskSource` 同构的 `ProbeTask`,输出到被 Git 忽略的 `.local/`
@@ -49,13 +60,13 @@ JPEG。正式私有目录、额外图片类型和一单多 SKU 规则仍未固
## 验收要点
- [ ] 一组合法脱敏文本和参考图能稳定生成一个 `ProbeTask`。
- [ ] `source_order_no` 来自文件主名;标题、SKU 和数量与原文完全一致。
- [ ] 缺失或匹配到多张参考图、必填字段缺失、数量非法时导入明确失败。
- [ ] Android workflow 通过 `TaskSource` 消费结果,不依赖 Windows 路径或导入器类型。
- [ ] 真实订单文件、图片、生成物和本机绝对路径均未进入 Git。
- [ ] 日志不包含完整订单号、店铺名或原图绝对路径。
- [ ] 普通自动化测试不调用真实付费 VLM。
- [x] 一组合法脱敏文本和参考图能稳定生成一个 `ProbeTask`。
- [x] `source_order_no` 来自文件主名;标题、SKU 和数量与原文完全一致。
- [x] 缺失或匹配到多张参考图、必填字段缺失、数量非法时导入明确失败。
- [x] Android workflow 通过 `TaskSource` 消费结果,不依赖 Windows 路径或导入器类型。
- [x] 真实订单文件、图片、生成物和本机绝对路径均未进入 Git。
- [x] 日志不包含完整订单号、店铺名或原图绝对路径。
- [x] 普通自动化测试不调用真实付费 VLM。
## 边界
@@ -66,6 +77,35 @@ JPEG。正式私有目录、额外图片类型和一单多 SKU 规则仍未固
## 执行记录
尚未开始,依赖 T-001 已满足。前置检查已确认一组同名文本/JPEG 存在,文本字段结构
和图片解码有效;未记录或提交实际订单号、店铺名、商品内容及图片。实现时仍需确定
正式私有目录和一单多 SKU 规则。
### 2026-07-25:任务开始
- 基于 T-003 提交 `d57c4ae` 开始,依赖 T-001 已满足。
- 前置检查确认一组同名文本/JPEG 存在,文本字段结构和图片解码有效;未记录或提交
实际订单号、店铺名、商品内容及图片。
- 固定首版规则:推荐私有目录为 `private-fixtures/shopee/`;只接收实际内容为 JPEG
的 `.jpg`/`.jpeg`;一张订单只有一个 SKU 和一张参考图,多 SKU 必须先扩展契约。
### 2026-07-25:实现和验证完成
- 新增纯 Kotlin `task-contract` 模块,统一定义 `ProbeTask`、`ProbeReferenceImage`、
`TaskSource` 和版本化 JSON codec;Android 与开发机工具使用同一模型。
- 新增 `tools:shopee-importer` CLI。它要求显式输入/输出目录,严格解析 UTF-8 无 BOM
四行标签,只接受唯一且可解码的 JPEG,限制文本 64 KiB、图片 20 MiB,并为错误
返回稳定 code。
- 生成物使用匿名 `probe_id` 和匿名图片文件名,但私有 JSON 内保留权威
`source_order_no`、店铺名、标题、SKU、数量;参考图保存大小和 SHA-256。
- 输出目录必须为空或带工具 marker,避免清理任意目录;CLI 普通输出只有导入数量,
不打印完整订单号、店铺名或源路径。
- 新增 Debug `FixtureTaskSource` 和 `ProbeWorkflowCoordinator`。workflow 只依赖
`TaskSource`,不知道任务来自文件还是未来 HTTP。
- `syncProbeFixtures` 仅在显式传入 `-PprobeFixturesDir` 时把私有生成物放入 Debug
构建资产;不带属性的普通构建会清空先前生成资产。
- 脱敏测试覆盖 JSON round-trip、合法导入、缺图、多图、未知图片类型、非法 UTF-8、
缺字段、非法数量、损坏 JPEG、大小写重复订单号、敏感 CLI 输出和 Android
TaskSource/workflow 边界。
- 真实本地样本运行成功并生成 1 个任务;自动比较确认订单号、店铺名、标题、SKU、
数量逐字段相等,参考图复制前后 SHA-256 相等。比较结果只记录布尔值,未输出内容。
- 带私有属性的 Debug APK 包含 1 个任务文档和 1 张匿名 JPEG;随后默认重建确认 APK
中 `probe-fixtures` 条目为 0,生成资产也已清除。
- 全量 `lintDebug test assembleDebug` 成功;三个模块共 38 次测试执行,
0 failure、0 error、0 skipped。