feat(t208): close candidate decision feedback loop
This commit is contained in:
@@ -56,8 +56,9 @@
|
||||
验证。T-201 后端骨架、T-202 P0 原型、T-203 任务 API/管理 Web、T-204 最小鉴权
|
||||
T-205 原子领取/租约状态机、T-206 Android 登录/有限离线、T-207 本地 VLM/候选/
|
||||
证据回传、T-211 参考图召回和 SKU 硬匹配、T-212 候选身份映射,以及 T-213 受控
|
||||
规格组合/价格核验均已完成。当前正在实现 T-208 的逐候选结构化人工理由、修订历史
|
||||
和优化数据闭环;不得提前建设报表、训练管线或外部商品抓取。
|
||||
规格组合/价格核验均已完成。T-208 的原始候选观测、模型评估、确定性推荐、逐候选
|
||||
结构化人工理由和修订历史也已完成;下一步需先把商品持久身份和 Admin 下单授权落成
|
||||
独立任务,不得直接把候选链接当成下单授权。
|
||||
手机从管理后端领取任务并回传结果,VLM、拼多多自动化和人工确认在 App 本地完成。
|
||||
T-206 增加有限离线执行;T-207 已复用 Roubao 端上 OpenAI 兼容适配器并加密本地 Key。
|
||||
管理后端不保存/代理 VLM,后台任务不能覆盖手机 provider 配置。
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
| 功能 | 说明 | 阶段 |
|
||||
| --- | --- | --- |
|
||||
| F-008 候选决策数据闭环 | 保存每次搜索实际曝光的最多 5 个候选、模型评估、系统推荐和人工理由,为离线评估与优化提供可信样本。 | P1,T-208;不阻塞第一版流程 |
|
||||
| F-008 候选决策数据闭环 | 保存每次搜索实际曝光的最多 5 个候选、模型评估、系统推荐和人工理由,为离线评估与优化提供可信样本。 | P1,T-208 已实现 |
|
||||
| 完整 RBAC | 采购管理员、执行员、审核员和系统管理员的细粒度权限。 | V2 |
|
||||
| 多设备容量调度 | 在当前原子领取/租约基础上增加优先级、容量、运营监控和跨实例调度。 | V2 |
|
||||
| 后台通知 | WebSocket/厂商推送只通知有任务,App 仍通过 claim 领取。 | V2 |
|
||||
@@ -61,11 +61,11 @@
|
||||
| 多平台比价 | 淘宝、1688、京东等平台。 | V3 |
|
||||
| 支付自动化 | 不在当前规划内,除非另行完成资金和合规评审。 | 未规划 |
|
||||
|
||||
### F-008 候选决策数据闭环(后置)
|
||||
### F-008 候选决策数据闭环
|
||||
|
||||
T-206/T-207 先跑通领取、执行、候选/证据和最小结果回传;T-208 再实现可用于优化的
|
||||
完整数据闭环。不能为了建设未来训练数据阻塞第一版端到端流程,但 20 条真实任务试验
|
||||
开始前必须完成 T-208,避免试验结束后才发现缺少曝光和人工标签。
|
||||
T-206/T-207 已跑通领取、执行、候选/证据和最小结果回传;T-208 已实现可用于优化
|
||||
的完整数据闭环。20 条真实任务试验必须使用这条结构化链路,避免试验结束后才发现
|
||||
缺少曝光和人工标签。
|
||||
|
||||
1. 每次 search run 保存需求快照、精确搜索词、App/拼多多版本、采集时间以及最多
|
||||
5 个实际曝光候选的原始 ordinal。该集合只是特定账号、地区、时间和平台排序下的
|
||||
|
||||
@@ -528,9 +528,10 @@ T-205 的最小 execution 表中提前伪造。
|
||||
- 任务参考图上传可接受 JPEG/PNG/WebP,但后端必须先真实解码、限制字节与像素,再
|
||||
统一规范化为匿名 JPEG;未来 Android 读取的资产不能依赖原始扩展名或声明 MIME。
|
||||
|
||||
### 后置候选决策数据集(T-208)
|
||||
### 候选决策数据集(T-208)
|
||||
|
||||
T-207 先完成候选、事件、截图和最小结果回传。T-208 在 `task_executions` 下增加
|
||||
T-208 已在 T-207 的候选、事件、截图和最小结果回传基础上,于
|
||||
`task_executions` 下增加
|
||||
独立、不可变的数据层,不把整批候选塞进 `task_events`、`purchase_tasks` JSON 或
|
||||
一段不可查询的自由文本:
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
| 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-009 | US-008 | App 候选理由/管理端决策详情 | 接受、拒绝、改选或修正 | 保存逐候选结构化人工标签 | P1 | T-208 已实现 |
|
||||
| IX-010 | US-009 | App 独立执行设置/同步状态 | 配置模式、离线执行或补报 | 授权内独立执行并可审计同步 | P0 | T-206 离线控制已实现,结果补报待 T-207 |
|
||||
|
||||
## IX-001 管理 Web 登录
|
||||
@@ -255,8 +255,8 @@
|
||||
|
||||
- 页面:Android“候选确认”、管理 Web“任务详情/候选决策”。
|
||||
- 角色:采购执行员、采购管理员/优化人员。
|
||||
- 前置条件:T-207 第一版流程已完成;T-208 reason schema 已固定。
|
||||
- 服务依赖:T-208 幂等 human review API。
|
||||
- 前置条件:T-207 第一版流程和 T-208 reason schema 已完成。
|
||||
- 服务依赖:已实现的 T-208 幂等 human review API。
|
||||
|
||||
**正常路径**
|
||||
|
||||
|
||||
+51
-7
@@ -438,7 +438,8 @@ candidate evidence SHA-256 和结构化模型判断。结果不得包含 Key、A
|
||||
|
||||
## 执行事件与结果
|
||||
|
||||
App 使用加密 outbox 按“事件 -> evidence asset -> 候选 -> 终态”顺序提交。所有写接口
|
||||
App 使用加密 outbox 按“事件 -> evidence asset -> 候选 -> 人工 review -> 终态”
|
||||
顺序提交。所有写接口
|
||||
重新校验 BUYER/device/task/execution/claim 和幂等键。原设备可以在
|
||||
`execution_expires_at` 后补报授权内已经产生的结果;后端记录
|
||||
`received_after_execution_expiry=true`,但这不允许 App 在过期后继续自动化。
|
||||
@@ -474,7 +475,7 @@ App 使用加密 outbox 按“事件 -> evidence asset -> 候选 -> 终态”顺
|
||||
|
||||
### `POST /api/v1/tasks/{task_id}/candidates`
|
||||
|
||||
批量保存当前 execution 实际检查后通过策略的 `0..5` 个候选,必须带
|
||||
批量保存当前 execution 实际检查的 `0..5` 个原始曝光候选,必须带
|
||||
`Idempotency-Key`。正式参考图检索使用固定审计值 `PDD_IMAGE_SEARCH`,不把标题或
|
||||
SKU 伪装成图片检索词:
|
||||
|
||||
@@ -533,11 +534,54 @@ SKU 伪装成图片检索词:
|
||||
```
|
||||
|
||||
`MANUAL_FIRST` 时 `provenance` 和 `evaluation` 为空,但候选观察、搜索审计值和人工
|
||||
结果仍可提交。`AI_ASSISTED` 的非空 `evaluation` 必须同时包含唯一的 `COLOR` 和
|
||||
`SIZE`,且全部为 `MATCH`;schema v2 还要求分数和置信度均不低于 `0.75`,非空批次的
|
||||
推荐必须指向排序后的第 1 项。没有候选满足条件时提交空 `candidates` 和空
|
||||
`recommendation`,不得用弱匹配或未知项凑数。后端校验 ordinal 连续唯一、最多 5 个和
|
||||
任务内容哈希;不请求 `product_url` 或 `image_url`,主要证据必须是已鉴权 asset。
|
||||
结果仍可提交。`AI_ASSISTED` 为每个原始 observation 保存 evaluation;颜色/尺码状态
|
||||
可以是 `MATCH/MISMATCH/UNKNOWN`,模型拒绝项也必须保留。schema v2 的
|
||||
`recommendation` 只能指向颜色和尺码均为 `MATCH`、分数和置信度均不低于 `0.75`
|
||||
且没有拒绝原因的原始 ordinal;没有满足项时只省略 recommendation,不能删除原始
|
||||
候选。后端在同一事务内写入 search run、observation、model evaluation 和
|
||||
recommendation,并保留旧 JSON 审计副本;不请求 `product_url` 或 `image_url`,
|
||||
主要证据必须是已鉴权 asset。
|
||||
|
||||
### `POST /api/v1/tasks/{task_id}/human-reviews`
|
||||
|
||||
采购员确认候选后、提交终态前调用。请求使用设备 Bearer token、`X-Claim-Token`
|
||||
和 `Idempotency-Key`:
|
||||
|
||||
```json
|
||||
{
|
||||
"execution_id": "e3190742-a24b-441e-b5c1-c7ed10ed342f",
|
||||
"claim_generation": 1,
|
||||
"task_content_sha256": "64-char-lowercase-hex",
|
||||
"reason_schema_version": 1,
|
||||
"outcome": "CANDIDATE_ACCEPTED",
|
||||
"selected_candidate_ordinal": 2,
|
||||
"primary_reason_code": "SELECTED_BEST_MATCH",
|
||||
"note": "",
|
||||
"supersedes_review_id": null,
|
||||
"items": [
|
||||
{
|
||||
"candidate_ordinal": 1,
|
||||
"label": "REJECT",
|
||||
"primary_reason_code": "NOT_BEST_MATCH",
|
||||
"reason_codes": ["NOT_BEST_MATCH"],
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"candidate_ordinal": 2,
|
||||
"label": "ACCEPT",
|
||||
"primary_reason_code": "SKU_MATCH",
|
||||
"reason_codes": ["SKU_MATCH"],
|
||||
"note": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
非空 review 必须恰好覆盖本次所有 observation;接受时只有所选 ordinal 为
|
||||
`ACCEPT`,其余全部为 `REJECT`。零候选只允许 `NO_MATCH` 或
|
||||
`MANUAL_REQUIRED` 且 items 为空。理由使用 T-208 版本 1 allowlist;任务没有预算时
|
||||
禁止价格类理由,`OTHER` 必须带 4-200 字备注。同一幂等键重放返回原 review;
|
||||
修订必须通过 `supersedes_review_id` 引用当前最新版本,服务端追加版本并保留历史。
|
||||
|
||||
### `POST /api/v1/tasks/{task_id}/complete`
|
||||
|
||||
|
||||
+20
-20
@@ -5,9 +5,9 @@
|
||||
## 当前快照
|
||||
|
||||
- 日期:2026-07-28
|
||||
- 阶段:T-208 候选决策数据与人工理由闭环进行中
|
||||
- 阶段:T-208 候选决策数据与人工理由闭环已完成
|
||||
- Git:当前分支为 `main`;T-001 至 T-004、T-101 至 T-104、T-201 至 T-207、T-209、
|
||||
T-210、T-211、T-212、T-213 均已纳入 Git 历史
|
||||
T-208、T-210、T-211、T-212、T-213 均已纳入 Git 历史
|
||||
- 生产代码:`android-buyer/` 已接入 Roubao Android 源码
|
||||
- Android:固定 `main@c8a6d7f03422eb01744b01f3ee77bf7757741f7e`;MIT 许可证已保留
|
||||
|
||||
@@ -17,11 +17,10 @@
|
||||
- 本机 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` 静默安装卡住后已终止,不阻塞命令行构建
|
||||
- 测试:T-213 Android Debug 25 个 suite、148 个测试、0 失败,Debug/Release 回归、
|
||||
`assembleDebug` 和根 `init.ps1` 通过;Debug APK `1.4.10 (15)` 已安装并冷启动于
|
||||
PKG110
|
||||
- 后端测试:T-213 运行 `go test ./...` 通过;T-207 的全包 race 与 migration
|
||||
验证继续有效
|
||||
- 测试:T-208 Android 单元测试、Debug/Release 构建和根 `init.ps1` 通过;
|
||||
Debug APK `1.4.11 (16)` 已安装并启动于 PKG110
|
||||
- 后端测试:T-208 运行 `go test ./...`、`go test -race ./...`、migration
|
||||
`up/down/up` 和带 review 数据的降级保护均通过
|
||||
- 原型:4 个管理 Web 页面和 7 个 Android 页面均可离线独立打开;Playwright
|
||||
以 1440×900、390×844、360×800 验证 36 个页面/视口组合,无页面横向溢出、
|
||||
脚本错误或外部请求,Android 可见交互控件均不小于 44px
|
||||
@@ -47,10 +46,15 @@
|
||||
失败记录均按 execution 存储;Android 使用加密 outbox 按事件、截图、候选和终态
|
||||
顺序回传,授权到期补报单独审计,所有终态固定 `order_submitted=false`。管理任务
|
||||
详情展示模型/候选/人工理由/事件/证据摘要,不保存 VLM Key、完整 endpoint 或原始响应。
|
||||
- T-208 决策数据:候选批次同事务规范化为 search run、原始 observation、逐项
|
||||
model evaluation 和确定性 recommendation;模型拒绝项不再被过滤或重排。App 在
|
||||
COMPLETE 前提交幂等 HUMAN_REVIEW,接受项和其余拒绝项均有结构化理由;修订按
|
||||
supersedes/version 追加。Admin/API 分区显示 observation、prediction、
|
||||
recommendation 和完整人工 review 历史。
|
||||
- T-211 图片检索:后台任务固定使用经 SHA-256 校验的参考 JPEG,经一次性 MediaStore
|
||||
图片进入拼多多拍照搜索;App 本地从 SKU 唯一提取颜色和尺码,schema v3 逐项返回
|
||||
`MATCH/MISMATCH/UNKNOWN`。只有两项均匹配且分数/置信度不低于 `0.75` 的候选按
|
||||
分数、置信度和曝光顺序回传 `0..5` 项,弱匹配和未知项不凑数。
|
||||
`MATCH/MISMATCH/UNKNOWN`。实际曝光的 `0..5` 项全部按原 ordinal 回传;只有两项
|
||||
均匹配且分数/置信度不低于 `0.75` 的候选能成为确定性 recommendation。
|
||||
- T-213 规格核验:`DISCOVERY_INSPECT` 可从唯一“免拼购买”进入规格弹层,按任务
|
||||
SKU 唯一选择颜色/尺码并复核 selected/已选摘要,最多滚动 2 次;严格保存单一
|
||||
人民币组合价和详情/规格双证据,并允许明确的“首件¥金额”当前单件价。区间、
|
||||
@@ -63,15 +67,13 @@
|
||||
单次调用边界;候选最多 5 个并按 ordinal 串行评估,本地产生建议并停在人工确认,
|
||||
SKU/数量由本地原值回填,颜色/尺码硬约束由本地生成,预算保持空,订单提交状态固定
|
||||
为 false
|
||||
- 后置数据闭环:已登记 T-208,在第一版 T-206/T-207 跑通后分离保存候选观测、
|
||||
模型预测、确定性推荐和人工标签;人工接受/拒绝使用结构化理由,20 条试验依赖它
|
||||
- VLM 部署决策:手机本地调用已配置的 OpenAI 兼容 provider;管理后端只负责身份、
|
||||
任务控制和结果审计,不保存/代理模型。T-207 保留 Roubao 独立模式并把端上 Key
|
||||
迁移到 Keystore-backed 加密存储
|
||||
- 离线执行:默认 30 分钟有限授权和 30 秒 best-effort heartbeat 已实现;PKG110
|
||||
真机断开临时后端 95 秒后保持同一 execution,重连后滑动续期;到期持久安全停止,
|
||||
RUNNING 不自动重新分配
|
||||
- 测试设备:OnePlus PKG110,Android 16/API 36;肉包 `1.4.10 (15)`;拼多多
|
||||
- 测试设备:OnePlus PKG110,Android 16/API 36;肉包 `1.4.11 (16)`;拼多多
|
||||
`8.17.0 (81700)`
|
||||
- 设备就绪:拼多多首页、文字/图片搜索、双列候选卡、详情截图和返回均已通过 8.17.0
|
||||
真机验证;采购员已在 ColorOS 设置中手动启用肉包采购无障碍,APK 覆盖安装后授权
|
||||
@@ -86,7 +88,7 @@
|
||||
已用 CLI 真实导入并逐字段/图片哈希验证,生成物位于被忽略的 `.local/`
|
||||
- 标准启动路径:`$env:RUN_START_COMMAND="1"; .\init.ps1`
|
||||
- 标准验证路径:`.\init.ps1`
|
||||
- 当前 blocker:T-213 无阻塞。真实 VLM 服务地址、模型、设备级测试凭证、成本上限
|
||||
- 当前 blocker:T-208 无阻塞。真实 VLM 服务地址、模型、设备级测试凭证、成本上限
|
||||
和数据留存尚未确认;当前只支持单 SKU/JPEG;候选探针截图要求 Android 11/API 30+
|
||||
|
||||
## 当前目录
|
||||
@@ -115,7 +117,7 @@
|
||||
| `docs/tasks/T-211.md` | DONE | 参考图召回、SKU 颜色尺码硬匹配与 0..5 候选回传 |
|
||||
| `docs/tasks/T-212.md` | DONE | 修复重排候选、推荐、证据与人工接受的身份映射 |
|
||||
| `docs/tasks/T-213.md` | DONE | 真机选择目标 SKU、读取组合价并安全返回 |
|
||||
| `docs/tasks/T-208.md` | DOING | 归一化候选决策数据并增加结构化人工 review |
|
||||
| `docs/tasks/T-208.md` | DONE | 归一化候选决策数据并增加结构化人工 review |
|
||||
| `docs/design/` | 已确认 | T-202 原型索引、4 个管理页和 7 个 Android 页面 |
|
||||
| `deepseek总结.txt` | 已有 | 历史讨论摘要,不是正式需求权威 |
|
||||
| `android-buyer/` | 已有 | Roubao `main` 固定 commit 的 Android 基线 |
|
||||
@@ -126,12 +128,10 @@
|
||||
|
||||
## 任务摘要
|
||||
|
||||
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-207、T-209、T-210、T-211、
|
||||
T-212、T-213。
|
||||
- 正在进行:T-208 候选决策数据与人工理由闭环。
|
||||
- 下一个可领取任务:无;先完成 T-208。
|
||||
- 后置任务:T-208 完成后依次实现商品
|
||||
持久身份、Admin 下单授权、设备命令、订单 dry-run、单次提交对账和付款提醒。
|
||||
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-213。
|
||||
- 正在进行:无。
|
||||
- 下一步:先落独立任务,依次实现商品持久身份、Admin 下单授权、设备命令、
|
||||
订单 dry-run、单次提交对账和付款提醒。
|
||||
|
||||
## 当前可运行内容
|
||||
|
||||
|
||||
+26
-9
@@ -5,7 +5,7 @@ phase: 2
|
||||
deps:
|
||||
- T-207
|
||||
- T-213
|
||||
status: DOING
|
||||
status: DONE
|
||||
created: 2026-07-28
|
||||
context_ref: 4c3b962
|
||||
work_branch: null
|
||||
@@ -131,15 +131,15 @@ T-207 已能回传候选批次、模型评估、本地推荐和一段 `operator_
|
||||
|
||||
## 验收要点
|
||||
|
||||
- [ ] migration `up/down/up` 可重复;有 review 数据时破坏性 down 明确失败。
|
||||
- [ ] 最多 5 个原始曝光 observation 按原 ordinal 可查询,模型拒绝项不会丢失。
|
||||
- [ ] observation、model evaluation、recommendation 和 human label 分表且引用一致。
|
||||
- [ ] human review API 校验理由 allowlist、标签兼容、预算适用性、全候选覆盖、唯一
|
||||
- [x] migration `up/down/up` 可重复;有 review 数据时破坏性 down 明确失败。
|
||||
- [x] 最多 5 个原始曝光 observation 按原 ordinal 可查询,模型拒绝项不会丢失。
|
||||
- [x] observation、model evaluation、recommendation 和 human label 分表且引用一致。
|
||||
- [x] human review API 校验理由 allowlist、标签兼容、预算适用性、全候选覆盖、唯一
|
||||
接受项、幂等重放和追加式 supersedes。
|
||||
- [ ] App 支持选择推荐项、改选、全部拒绝和零候选;每种路径都产生结构化逐候选理由。
|
||||
- [ ] 模型理由不会预填人工理由,旧 `operator_reason` 只保留兼容审计含义。
|
||||
- [ ] Admin/API 能读取当前 review 和历史版本,外链不会触发任何服务端网络请求。
|
||||
- [ ] Android/Go 单元测试、race、migration、Debug/Release 构建和根验证通过。
|
||||
- [x] App 支持选择推荐项、改选、全部拒绝和零候选;每种路径都产生结构化逐候选理由。
|
||||
- [x] 模型理由不会预填人工理由,旧 `operator_reason` 只保留兼容审计含义。
|
||||
- [x] Admin/API 能读取当前 review 和历史版本,外链不会触发任何服务端网络请求。
|
||||
- [x] Android/Go 单元测试、race、migration、Debug/Release 构建和根验证通过。
|
||||
|
||||
## 边界
|
||||
|
||||
@@ -155,3 +155,20 @@ T-207 已能回传候选批次、模型评估、本地推荐和一段 `operator_
|
||||
`execution_candidate_batches`/`execution_outcomes` 只能提供 JSON 审计副本和自由
|
||||
文本说明,AI 模式还会过滤拒绝候选;因此冻结以上归一化数据层和结构化 review
|
||||
合约后再开始实现。
|
||||
- 2026-07-28:新增 v6 migration 和规范化仓储,在候选批次同一事务内保存 search
|
||||
run、全部原始 observation、逐项模型评估和引用原 ordinal 的 recommendation;
|
||||
兼容 JSON 保留,但不再是唯一查询来源。空库 migration `up/down/up` 通过,存在
|
||||
review 时 down guard 经 HTTP 集成测试确认失败且不破坏数据。
|
||||
- 2026-07-28:新增设备鉴权、claim-scoped、幂等的
|
||||
`POST /api/v1/tasks/{id}/human-reviews`,验证完整覆盖、唯一接受项、reason allowlist、
|
||||
无预算价格理由、OTHER 备注、重放和 supersedes;集成测试确认同一 execution 的
|
||||
version 1/2 均可从 Admin/API 读取。
|
||||
- 2026-07-28:Android 改为上传全部实际曝光候选并保持原 ordinal;推荐只引用合格
|
||||
observation。候选确认页使用候选和理由单选控件,未选项的批量拒绝理由显式展开为
|
||||
逐候选 item;加密 outbox 严格按 CANDIDATES、HUMAN_REVIEW、COMPLETE 顺序重放。
|
||||
App 升级为 `1.4.11 (16)`。
|
||||
- 2026-07-28:`.\init.ps1`、Android Debug/Release 单元测试与构建、
|
||||
`go test -race ./...`、Go vet/format/build 全部通过。Android App Debug 和 Release
|
||||
各 26 个 suite/153 个测试、0 失败;共享模块另有 12 个测试。Debug APK 已通过
|
||||
SDK ADB 覆盖安装并启动于 PKG110,设备报告 `1.4.11 (16)`,肉包采购无障碍仍
|
||||
已启用。安装后截图确认任务首屏无重叠或裁切。
|
||||
|
||||
Reference in New Issue
Block a user