feat(t208): close candidate decision feedback loop

This commit is contained in:
QiuSW
2026-07-28 11:57:25 +08:00
parent 2a5ded42b5
commit e7f4c3e114
35 changed files with 2854 additions and 203 deletions
+51 -7
View File
@@ -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`