feat: 安全应用采购规格解析结果 (#257)

This commit is contained in:
chengma
2026-08-17 17:43:25 +08:00
parent 484ce4e8ec
commit afc1cdf719
19 changed files with 1669 additions and 24 deletions
+34 -4
View File
@@ -278,8 +278,7 @@ CREATE INDEX idx_task_runs_task
[接口契约 §7.1](04-admin-api-contract.md) 定义了一个与 `task_runs.attempt_id` 绑定的一次性
规格解析命令。Admin 的 `purchase_spec_resolutions` 是服务端候选观察和最终决策的权威
审计;Client 本地仍必须在发送前保存以下最小信息,后续由工单 #257 增加 SQLite migration
和 Repository:
审计;Client 本地仍必须在发送前保存以下最小信息:
- `task_id`(本地外键)与 `attempt_id`;
- 完整且大小受限的请求 JSON、确定性 `Idempotency-Key` 和请求哈希;
@@ -292,8 +291,39 @@ CREATE INDEX idx_task_runs_task
`task_runs` 的执行期有效规格。进入过 `irreversible_action_at` 的运行不得新建或重放解析
以继续采购,只能核对订单。
#254 只冻结接口和 Admin 审计模型,当前 Client SQLite schema 不在本工单改动。未实现
#257 的旧 Client 继续按“规格不匹配即失败”运行,不调用新接口,也不会出现半持久化状态。
Client 使用 `purchase_spec_resolutions` 保存这些执行期记录:
```sql
CREATE TABLE purchase_spec_resolutions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
task_id INTEGER NOT NULL,
attempt_id TEXT NOT NULL,
idempotency_key TEXT NOT NULL UNIQUE,
request_json TEXT NOT NULL,
request_hash TEXT NOT NULL,
candidate_snapshot_hash TEXT NOT NULL,
status TEXT NOT NULL, -- pending / resolved
resolution_id TEXT,
outcome TEXT,
source TEXT,
confidence_bps INTEGER,
match_candidate_id TEXT,
match_raw_text TEXT,
match_options_json TEXT,
reason TEXT,
resolved_at TEXT,
received_at TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
FOREIGN KEY (task_id) REFERENCES pdd_tasks(id) ON DELETE CASCADE,
UNIQUE (task_id, attempt_id, candidate_snapshot_hash)
);
```
`pending` 表示请求已落库但尚未得到可验证的业务响应,不能据此继续采购;`resolved`
表示完整响应已经落库,仍须通过候选白名单和真机快照复核。网络调用不放在 SQLite
事务中。旧任务原始规格不覆盖,最终结果分别保存原始请求规格、实际采用规格和
`resolution_id`。
## 5. `outbox_events`