feat(platform): close AI expense value loop

Add tenant-safe value, telemetry, connector, commercial, and production-readiness foundations.
This commit is contained in:
caoxiaozhu
2026-07-17 14:14:08 +08:00
parent 242d68c36f
commit 787bc3a481
507 changed files with 82072 additions and 6344 deletions

View File

@@ -0,0 +1,333 @@
# AI 分阶段发布真实遥测 概念文档
更新时间2026-07-17
## 功能一句话
把真实 shadow/Canary 规则执行、正负样本盲审真值和服务端保守聚合串成可审计证据链,只有精确率、召回率下界与运行质量同时满足门禁时才允许晋级,越界时自动回滚到稳定版本。
## 背景与问题
风险规则已经具备 Golden Case、`shadow → canary → active → rolled_back` 状态机、稳定流量路由和自动回滚能力,但线上评测仍有一个关键证据缺口:`ReleaseEvaluationInput` 由外部调用方直接提交 `total``failure_count``precision``baseline_precision` 汇总数字Release Guard 无法证明这些数字来自哪一次真实规则执行、哪一个租户、哪一个 release也无法证明精度分子和分母来自可信人工结论。
现有运行与学习链路的事实边界如下:
- `ExpenseClaimRiskRuleLoader` 能按租户和稳定路由键选择 stable、shadow 或 Canary 候选版本,并在快照损坏时保守阻断。
- `evaluate_platform_risk_rules()` 会返回 shadow 候选的 `asset_id / rule_code / rule_version / release_stage / hit / severity`Canary 命中会进入带版本和阶段的风险 flag但当前返回值不会持久化成发布样本。
- `RiskDispositionEvent` 是类型化、租户化、只追加的人工处置事实,`confirm``false_positive` 可作为正例命中的可信真值来源。
- `RiskObservationFeedback` 的自由评论、`AIDecisionFeedback``WorkflowOutcome` 可以支持业务学习,但它们没有同时绑定 `asset_id + release_id + stage + version`,不能直接作为某次发布的精度标签。
- Release Monitor 的 HMAC 能认证请求来自持有共享密钥的调用方,并限制传输重放;它不能证明请求体中的汇总数字由真实数据库 observation 和人工 label 计算得出。
因此,线上门禁必须从“相信外部汇总数字”改为“服务端从只追加事实计算指标”。本能力是 `ai-data-flywheel` 在线质量闭环和 `ai-expense-closed-loop-and-value-proof` 分阶段发布目标的证据层,不替代离线 Golden Case。
## 目标与非目标
### 目标
- [G1] 为每次真实候选规则执行记录租户、资产、release、阶段、版本、规则、命中、基线命中和结构化运行状态。
- [G2] 将专用发布复核或数据库中可信 `RiskDispositionEvent` 转换成只追加的正例判断;将独立盲审转换成与模型预测语义分离的 `risk_present / risk_absent` 真值。
- [G3] 使用稳定幂等键处理同一执行或人工动作的安全重放,不同内容复用同一来源时拒绝冲突。
- [G4] 从真实 observation 和最新可信 label 聚合运行总量、运行失败、候选 precision 和基线 precision。
- [G5] 未标注候选命中保持 `collecting`,不得把“没有人工结论”当成成功或正确。
- [G6] 聚合结果可转换成现有 `ReleaseEvaluationInput`,供 shadow/Canary 门禁、自动晋级和自动回滚使用。
- [G7] 全链路租户隔离、数据脱敏、append-only并拒绝跨租户和陈旧 release/stage/version 标签。
- [G8] 对候选未命中人群实施分层盲审:基线命中分歧样本全量复核,其余负样本按不可预测稳定分数随机抽检;证据不足时 recall/FN 仍显式不可用。
- [G9] 使用抽样漏检率估计总体 FN并以 Wilson 上界反推保守召回率下界;发布门禁只使用下界,不把点估计冒充确定事实。
### 非目标
- [NG1] 不用线上遥测替代离线 Golden Case前者验证真实分布后者验证覆盖明确预期的回归集合。
- [NG2] 不把候选未命中直接判为 false negative也不从“后续未退回”反推规则正确。
- [NG3] 不保存报销事由、票据内容、人工评论、单号、操作者账号原值或原始风险 payload。
- [NG4] 不接受客户端、浏览器或普通管理员提交的 precision/recall 作为发布真值。
- [NG5] 不因为 HMAC 校验通过就信任汇总数字HMAC 只解决传输来源和重放,不解决数据生成真实性。
- [NG6] 不让通过质量门禁的规则绕过审批、风险处置或资金动作的人类控制。
- [NG7] 不把遥测或自动回滚做成绕开共享风险循环、迁移所有权、审批控制或稳定版本保护的旁路。
## 用户与场景
### 用户
1. 风险运营/规则管理员:查看某个 release 的真实样本数、待标注数、误报率和基线比较,决定是否继续采集或人工回滚。
2. 财务审计/审批人:在既有风险处置或专用发布复核队列中给出类型化确认/误报结论,不接触发布汇总公式。
3. Release Monitor只从数据库聚合当前 release满足证据条件后把服务端计算结果交给 Release Guard。
4. 平台审计员按租户、release、版本和来源指纹回放 observation、label、评测与状态转换不读取业务正文。
### 核心场景
1. shadow 阶段同时执行 stable 和候选规则;记录候选 hit/miss并记录同一单据上 stable 是否命中。
2. 候选或 stable 命中进入人工复核;`confirm` 表示风险事实成立,`false_positive` 表示该次正向命中是误报。
3. 每条成功 observation 同步决定盲审层:候选命中全量入队、候选未命中但基线命中全量入队、双方均未命中按发布时冻结比例随机入队。
4. 复核队列混排正负样本,只提供业务单据、规则和业务阶段,不返回 candidate/baseline hit复核人只回答“存在真实风险/确认无该风险”。
5. 所有候选未命中样本必须由两个不同复核人给出一致结论;同一人的重复动作不增加法定票数,冲突时继续 collecting。
6. 候选命中仍有任何未标注项时,聚合状态保持 `collecting`Release Monitor 不提交通过评测。
7. 候选正例全部标注后,服务端计算 candidate precision基线正例也全部标注时才计算 baseline precision。
8. 负样本达到最小独立复核量后,服务端分别披露实际观察 FN、总体估计 FN、FN 置信上界、recall 点估计和 recall 置信下界。
9. Canary 路由中的候选 hit、miss 和结构化运行失败继续追加错误率、precision 或 recall 下界越界时 Release Guard 自动回滚稳定快照。
10. release 已晋级、回滚或被新 release 替代后,旧 observation/sample/label 仍保留,但不能再接收新标签或作为当前晋级输入。
## 功能能力
- [C1] 运行样本生产:消费现有 `shadow_evaluations`、Canary/active flag并提供 manifest 执行循环级 hook 记录 Canary 未命中和结构化失败。
- [C2] 可信标签:支持认证发布复核动作和数据库中真实 `RiskDispositionEvent`;不接受评论文本作为标签。
- [C3] 保守聚合:分别计算 observation、completed、runtime failure、candidate hit/labeled/pending、baseline hit/labeled/pending。
- [C4] 门禁转换:仅 `ready` 聚合可生成 `ReleaseEvaluationInput``collecting` 调用转换时明确拒绝。
- [C5] 证据隔离:运行来源、标签来源、操作者均只保存租户内、带密钥版本的
HMAC-SHA-256 指纹;原始 claim、事件和账号值不进入遥测表。
- [C6] 幂等与冲突同一租户、release、阶段、版本、规则和来源形成稳定键相同重放复用首次记录不同载荷冲突。
- [C7] 历史不可变observation 与 label 均只追加;标签纠正追加新 label聚合取最新可信标签不原地覆盖旧事实。
- [C8] 盲审抽样:候选正例和候选/基线分歧样本全量入队,其余负样本按发布策略的 `negative_sample_percent` 与 HMAC 来源伪名生成稳定随机分数。
- [C9] 真值盲化:样本表不保存明文单据 ID业务来源加密保存API 不返回 candidate/baseline hit前端也拒绝接收预测字段。
- [C10] 保守召回:证据未满足时 `false_negative_count / estimated_false_negative_count / recall / recall_lower_bound` 保持 `null`;满足后分别披露,不用点估计替代下界。
## 方案设计
### 证据链与自动判定
```text
[真实 stable / candidate 执行]
[append-only Observation]
tenant + asset + release + stage + version + hit + runtime status
[append-only Audit Sample]
正例全量 + 分歧全量 + 其余负例稳定随机抽样
[盲化可信 Label]
typed disposition / release review / blind release review
[服务端 Aggregate]
runtime + precision + baseline + sampled FN + recall lower bound
┌───────┴────────┐
│ collecting │ ready
▼ ▼
[继续采集/告警] [ReleaseEvaluationInput]
[Release Guard 判定]
shadow → canary → active
或自动 rolled_back
```
该链路中的每一层只消费上一层可验证的结构化事实。离线 Golden Case 仍是进入 shadow 前的回归门禁;线上 telemetry 是进入 Canary、active 及运行中回滚的分布证据,两者不能互相替代。
### 前端
- 发布控制台分别展示运行样本、候选待标注、候选/基线 precision、运行失败、负样本池/抽样/积压、实际 FN、估计 FN、FN 上界、recall 点估计和置信下界。
- 盲审队列只接收服务端安全字段;`candidate_hit / baseline_hit` 即使误入响应也不会进入页面状态。
- 复核按钮使用中性业务语义“存在真实风险 / 确认无该风险”,不使用“模型命中/误报”暗示预测;来源单据在新标签页打开并隔离 opener。
- `null` 指标统一显示“证据不足/暂不可用”,不得渲染成 0`collecting``ready``failed/rolled_back` 使用不同状态。
- `collecting``ready``failed/rolled_back` 使用不同状态,不把空样本或缺标签显示为 100%。
### 后端
- `AgentAssetReleaseTelemetryService.record_expense_risk_result()` 可从当前风险评测返回值生产 shadow 样本和 Canary/active 命中样本。
- `record_manifest_evaluation()` 设计为风险 manifest 执行循环 hook可记录 Candidate 未命中及 `evaluator_error / artifact_integrity_error / unsupported_evaluator / timeout` 等结构化失败。
- `record_review_label()` 只接收类型化 label、认证 actor ID 和 request IDactor 与 request 进入表前被指纹化。
- `AgentAssetReleaseSamplingService` 在 observation 同一事务内完成分层选择与来源加密;加密失败会连同 observation 一起回滚,避免留下无法复核的孤立事实。
- `AgentAssetReleaseReviewService` 只查询当前租户、当前 release 的样本,混排后输出去预测队列;发布发起人不可自审,负样本强制两个不同 actor。
- `agent_asset_release_aggregation` 将精度和召回证据拆开聚合;`agent_asset_release_recall` 使用随机层漏检率与 Wilson 上界生成总体 FN 估计和 recall 下界。
- `record_risk_disposition_label()` 会重新查询数据库中的同租户 `RiskDispositionEvent``RiskObservation`,校验 action、claim/rule 来源指纹和版本,不信任调用方提供的人工结论副本。
- `aggregate()` 只读取同租户、同资产、同 release、同阶段、同版本事实并验证它仍是资产当前 release。
- `to_release_evaluation_input()` 只允许 `ready` 聚合转换;未标注、无候选正例或空样本会抛出 collecting 错误。
- `AgentAssetReleaseMonitor` 与周期调度器只在服务端查询事实并调用上述方法HTTP 入口只接受签名触发,不再接收外部汇总数字。
- Agent 资产基础 CRUD/表格/版本接口与风险规则生成、测试、启停和发布子路由分离;
资产版本只读投影由独立序列化 mixin 承担Release Guard 只编排状态与持久化,
阈值归一化和质量门禁计算下沉为无数据库副作用的纯策略模块。
### 算法/规则
- shadow 同时保留候选与 stable 的命中信息,用同一人工真值分别估计 candidate precision 和 baseline precision。
- Canary 使用稳定路由键分流;必须在 manifest 执行循环记录候选 miss否则只从最终 flag 采集会产生“只有命中样本”的选择偏差。
- candidate 正向命中使用 `confirmed / false_positive` 计算 precision盲审统一使用 `risk_present / risk_absent` 描述业务真值,再在聚合层规范化,不向复核人暴露预测结论。
- candidate miss 只有进入服务端抽样表并完成独立双人盲审后才可形成 FN/TN 证据;未抽中的个体不能直接被标签,也不能由“后续无退回”反推正确。
- 运行失败与业务误报分开:`failure_count` 表示 evaluator/快照/超时等结构化运行失败,`false_positive_count` 只进入 precision。
- 阶段最小样本数、最大错误率、最低 precision 和最大 precision drop 仍由 `ReleaseGuardPolicy` 统一判定。
- `ReleaseGuardPolicy.reviewer_quorum``1..2` 的受控整数随 release 策略固化,
telemetry 只统计不同 actor 指纹的最新票;票数不足或不同复核人结论冲突时保持
`collecting`,不会把部分意见交给 Release Guard。
- 新发布默认开启 recall 门禁,并冻结 `negative_sample_percent / negative_min_reviewed / min_recall / recall_confidence_level`;旧 release 未携带开关时保持兼容,不追溯伪造历史抽样事实。
- recall 门禁只比较 `recall_lower_bound``min_recall`;点估计再高,只要保守下界不足也不能晋级。明显低 precision 可直接失败,不必等待召回样本凑齐。
### 数据
#### `agent_asset_release_observations`
- 身份:`tenant_id / asset_id / release_id / stage / version / rule_code`
- 运行事实:`candidate_hit / baseline_hit / runtime_status / failure_code / business_stage`
- 脱敏来源:`source_kind / source_fingerprint`;不保存 claim ID、单号或业务正文。
- 一致性:租户幂等键唯一,保存 payload fingerprint同一来源不同内容冲突。
#### `agent_asset_release_labels`
- 身份复制tenant、observation、asset、release、stage、version并通过复合外键绑定原 observation。
- 标签:正例判断使用 `confirmed / false_positive`,盲审真值使用 `risk_present / risk_absent`
- 来源:`typed_risk_disposition / release_review / blind_release_review`;数据库组合约束禁止标签语义与来源交叉使用。
- 历史:只追加;纠正写新行,不修改或删除旧标签。
#### `agent_asset_release_audit_samples`
- 身份复制tenant、observation、asset、release、stage、version通过复合外键绑定原 observation。
- 分层:`candidate_positive_census / candidate_disagreement_census / candidate_negative_random`
- 抽样事实:保存入样概率和稳定选择分数;同租户 observation 最多一条样本,重放必须匹配 payload fingerprint。
- 来源保护:原始单据引用使用 SecretBox 加密,表中不保存明文;只有通过租户与复核角色检查的队列读取才解密。
三类模型同时具备 ORM 层 UPDATE/DELETE 拒绝。`0018` 建立 observation/label后继 `0023` 建立 audit sample、扩展标签约束并复用 PostgreSQL append-only 触发器;存在盲审事实或新标签语义时拒绝有损降级。
### 权限
- 所有写入、读取和聚合以 `tenant_id` 为第一条件;租户绑定资产不允许其他租户观察或标签。
- 平台共享资产可为不同租户分别保存 observation/label但各租户样本和 precision 不混算。
- 标签前重新校验资产当前 `release_id + stage + candidate_version`;旧 release、已晋级阶段或已回滚阶段拒绝新增标签。
- 类型化处置标签必须来自数据库中真实存在且同租户的 `RiskDispositionEvent`action 只允许 `confirm / false_positive`
- 专用复核队列只允许 `manager``admin`;租户和 actor 全部来自认证上下文,
跨租户资产返回 404非复核角色返回 403发布发起人自审返回 400。
- 标签写入必须携带 `X-Request-Id`;新客户端只发送 `risk_present / risk_absent`,旧客户端的 `confirmed / false_positive` 仅在复核 API 边界映射为盲审真值。标签、
actor 指纹和 request 来源只追加保存,客户端不能覆盖 tenant、release 或 actor。
- `reviewer_quorum=2` 时必须由两个不同复核人给出相同结论;同一人的重复提交不增加票数,
冲突结论进入待仲裁状态并继续阻止晋级。
### HMAC 与数据真实性边界
- HMAC 可以证明传输请求由持有密钥的一方生成、请求在允许时间窗口内且签名未被修改。
- HMAC 不能证明调用方提交的 `total=100``precision=0.99` 真的来自 100 条数据库 observation也不能证明人工标签存在。
- 因此 HMAC 只保留为自动 Monitor 的传输认证和防重放手段;指标必须由接收端使用当前数据库 observation/label 重新计算。
- 最终 Monitor 请求应只携带受控 release 触发信息或聚合作业游标,而非可被签名后照单采用的质量汇总数字。
- 即使 HMAC 认证失败,也不得影响 stable 规则继续保护业务;应停止晋级、记录安全告警并保持 `collecting`
### 降级策略
- 遥测表或写入暂不可用:不阻断已生效 stable 风险规则和报销主流程,但当前 release 不能晋级,状态保持 collecting 并告警。
- 人工标签迟到:保留 observation待标签追加后重新聚合不使用默认正确值填补。
- 运营端同时展示待标注数量和最早积压时长;超过 24 小时生成结构化逾期告警。
- 处置事件与 observation 无法安全关联:拒绝标签,不按相似文本、姓名或评论做模糊匹配。
- baseline 标签不完整:`baseline_precision = null`;候选指标可继续采集,但不能声称已完成可靠基线比较。
- 负样本未抽中、未完成双人复核或未达到最小复核量recall、估计 FN 和置信下界保持不可用,继续 collecting 并告警;不会用零填充。
- 聚合或 Guard 判定越界:按现有冻结快照恢复 stable回滚不删除候选 observation 和 label。
- 周期聚合异常形成 `release_aggregation_failed` 告警并隔离到单资产;运行失败率、
precision 下降、baseline 不可用和自动回滚分别使用独立告警码,稳定版本继续服务。
## 算法与公式
### 候选精确率
```text
candidate_precision = candidate_confirmed / (
candidate_confirmed + candidate_false_positive
)
```
- 分母只包含候选 `candidate_hit=true` 且已有可信最新标签的 observation。
- 任一候选正向命中仍未标注时,聚合保持 `collecting`,不得将部分 precision 交给 Release Guard 作为通过证据。
### 基线精确率
```text
baseline_precision = baseline_confirmed / (
baseline_confirmed + baseline_false_positive
)
```
- 只使用同一 shadow 样本上 `baseline_hit=true` 的可信标签。
- 任一基线正向命中待标注时baseline precision 显式不可用,不用部分样本制造有利比较。
### 运行错误率
```text
runtime_error_rate = runtime_failure_count / observed_count
```
- `observed_count` 是该 release/stage/version 的真实运行 observation 数。
- `runtime_failure_count` 只统计结构化执行失败,不把业务误报混成技术错误。
- 误报通过 precision 体现;运行错误通过 `ReleaseGuardPolicy.max_error_rate` 体现。
### Recall 与 false negative
```text
recall = TP / (TP + FN)
```
线上负样本分为两层,不能把抽检样本数直接当总体 FN
```text
disagreement_FN = 全量复核(candidate_hit=false, baseline_hit=true)中的真实风险数
random_FN_rate = 随机盲审层真实风险数 / 已完成双人复核的随机样本数
estimated_FN = disagreement_FN + random_FN_rate * random_negative_population
recall_point = TP / (TP + estimated_FN)
random_FN_rate_upper = WilsonUpper(random_FN, reviewed, confidence)
FN_upper = disagreement_FN + random_FN_rate_upper * random_negative_population
recall_lower_bound = TP / (TP + FN_upper)
```
- `false_negative_count` 仅表示已完成法定复核样本中实际观察到的 FN不等于总体 FN。
- `estimated_false_negative_count` 是总体点估计,`false_negative_upper_bound` 是保守上界,二者必须分字段展示。
- 随机层存在但尚无已复核样本、仍有抽中样本待审或未达到最小复核量时,上述估计统一保持 `null`
- 没有随机负例人群时可使用全量复核的精确 recall否则发布门禁只消费 `recall_lower_bound`
- 离线 Golden Case recall 只证明测试集表现,不能冒充线上 recall线上抽样也不能替代 Golden Case 的边界覆盖。
## 测试方案
- 模型:租户/release 复合身份、sample/label 到 observation 复合外键、标签来源组合约束和 append-only。
- 样本生产shadow hit/miss、stable baseline hit、Canary hit、manifest 循环 Canary miss 和结构化运行失败。
- 标签:专用复核、真实 `RiskDispositionEvent`、盲审语义、负样本双人法定票、来源/actor 脱敏。
- 幂等:相同 observation/label 稳定重放;同一来源不同载荷返回冲突。
- 租户与时效:跨租户隐藏、陈旧 release/stage/version 拒绝、错误规则/单据来源拒绝。
- 聚合无样本、无候选正例、无标签、部分标签、完整标签、baseline 部分标签、运行失败和 precision drop。
- 运营告警:待标注数量/最早时长、24 小时积压、运行失败率、聚合失败、baseline
不可用、precision 下降和自动回滚使用去敏结构化告警。
- 证据边界:未抽中负样本拒绝标签;预测字段不进入队列/API抽样不足时 recall/FN 为 null充分时点估计与下界分离。
- 组合回归Telemetry 生成的 `ReleaseEvaluationInput` 可被现有 Release Guard 消费,且不改变 shadow/Canary/回滚状态机。
- PostgreSQL0018/0023 upgrade/downgrade、复合外键、标签组合约束、数据库 append-only、并发同幂等键单赢家、同 actor 去重和标签/阶段竞争。
- 所有验证在 `local-x-financial-linux` 容器内执行,单条命令最大 60 秒。
## 指标与验收
- [A1] 每条线上发布样本可追溯到 tenant、asset、release、stage、version、rule 和来源指纹,且不含业务正文。
- [A2] 相同运行/标签重放只保留一条事实;不同载荷复用同一来源 100% 拒绝。
- [A3] 任一候选正向命中未标注时状态为 collecting不能生成 Release Guard 通过输入。
- [A4] precision 和 baseline precision 只由真实 observation 与可信类型化标签计算,外部汇总值不作为权威事实。
- [A5] recall/FN 证据不足时明确 unavailable充分时同时披露实际 FN、估计 FN、FN 上界、recall 点估计和置信下界,门禁只使用下界。
- [A6] 跨租户、陈旧 release/stage/version、错误处置来源和纯负样本伪标签均被拒绝。
- [A7] 质量越界时自动回滚 stable遥测故障或 HMAC 故障时停止晋级但不关闭既有稳定保护。
- [A8] PostgreSQL 迁移、append-only、并发、后端组合回归、Ruff 和 `git diff --check` 全部在容器内通过。
## 风险与开放问题
- 模型注册、真实 manifest hook、类型化处置标签、盲审抽样、服务端聚合、即时 Guard、
租户周期调度、发布复核队列和运营控制台已经接通;`0023` 后继迁移与完整 PostgreSQL
循环仍须完成最终验证后才能关闭本能力。
- 租户调度器只自动处理租户绑定资产。平台共享资产可以按租户保存隔离样本,但在建设跨租户、加权且可审计的聚合口径前,不能由单租户样本自动回滚全局版本。
- 线上标签可能集中在高风险或有争议样本precision 仍可能受人工复核选择偏差影响;控制台必须同时披露 hit、labeled 和 pending 数量。
- 规则稀有时可能长期没有候选正例;不能为了晋级降低为“零命中等于 100% precision”需要延长 shadow 或补充经审核 Golden Case。
- 标签纠正采用追加新事实和“每个 actor 最新票”聚合;数据库索引、复合外键和只追加
约束已在 PostgreSQL 验证,同 observation/label 的并发单赢家、阶段晋级竞争和调度器
advisory leader lease 均有 PostgreSQL 并发验证。
- HMAC 密钥泄露会让攻击者通过传输认证,但仍不应允许其伪造数据库 observation/label服务端重算是不可省略的第二道边界。
- 线上 recall 已有分层抽样、预测盲化、双人复核、冲突保持 collecting、最小样本量和置信下界仍需用试点数据校准抽样比例、人工一致率与业务风险容忍度不能把默认阈值当行业通用真理。
## 本轮实现记录
- 2026-07-16完成现有 Loader、平台风险评测、shadow_evaluations、风险处置和 AI workflow feedback/outcome 的只读审计,确认 `RiskDispositionEvent` 是当前最可信线上人工标签源,通用学习结果缺少 release 身份不能直接用于门禁。
- 2026-07-16新增独立 observation/label 模型与服务完成脱敏、append-only、稳定幂等、租户/陈旧 release 拒绝、shadow/Canary 样本生产、可信标签和保守聚合。
- 2026-07-16独立切片阶段新增遥测测试 7 项,与当时 Release Guard/Runtime 组合共 19 项通过;该阶段留下的共享注册、迁移和运行 hook 已在后续记录中完成。
- 2026-07-16完成主模型注册、迁移所有权与 `0018`;一次性 PostgreSQL 17 完整迁移循环、复合外键和数据库 append-only 探针通过。
- 2026-07-16真实 shadow/Canary/active manifest 执行已写 observation类型化风险处置自动追加标签并即时触发 Guard相同聚合快照幂等复用测试运行低 precision 或运行失败自动恢复 stable。
- 2026-07-16Release Monitor HTTP 改为空触发 + HMAC禁止调用方提交 precision/total新增租户级周期调度作为即时监控失败的补偿链。发布组合回归 44 项、调度/风险定向回归 24 项通过。
- 2026-07-16完成后端大文件职责拆分`agent_assets.py` endpoint 降至 714 行、
`AgentAssetService` 降至 675 行、`AgentAssetReleaseGuardService` 降至 636 行;
风险规则子路由、资产序列化和发布纯策略分别独立,旧路由路径、公开类型导入和状态机行为保持兼容。
- 2026-07-16发布纯策略新增 `reviewer_quorum`(默认 1、范围 1..2)并随 release state 保存,
专用去敏复核队列按独立 actor 计票,禁止发布人自审,双人同意前或结论冲突时保持 collecting。
- 2026-07-16发布控制台展示真实样本、命中、待审、最早积压时长、运行失败率、
candidate/baseline precision 和 recall 不可用;新增积压、超时、运行故障、聚合失败、
precision 下降、baseline 不可用和自动回滚结构化告警。
- 2026-07-16新增 append-only 盲审样本、正例/分歧全量与其余负例稳定随机抽样来源引用加密保存observation 与 sample 同事务写入,保护失败整体回滚。
- 2026-07-16发布复核队列改为预测盲化混排负样本强制两个不同复核人新增实际/估计 FN、Wilson FN 上界、recall 点估计与保守下界Release Guard 只消费下界。
- 2026-07-16前端拒绝 prediction hit 字段,使用中性业务真值动作,并显示负样本池、抽样进度、积压及置信方法;证据缺失保持不可用,不渲染为零。
- 2026-07-16新增 `0023` 后继迁移和标签来源组合约束;最终 PostgreSQL 全链升级/降级、并发和全量回归结果待验证后回填。

View File

@@ -0,0 +1,120 @@
# AI 分阶段发布真实遥测 开发 TODO
更新时间2026-07-17
## 使用规则
- 每项必须回链 `CONCEPT.md` 对应章节;没有代码、迁移、接口或容器证据不得勾选。
- observation、label、聚合和 Release Guard 输入必须按证据层分开,不能用 HMAC 请求或客户端汇总值替代数据库事实。
- `collecting` 不得包装成通过recall/false-negative 没有达到独立盲审证据阈值时必须保持 unavailable。
- 所有后端、迁移和并发验证只在 `local-x-financial-linux` 容器内执行,单条命令最长 60 秒。
## 1. 调研与边界
- [x] [CONCEPT: 背景与问题] 审计 Loader、平台风险评测、shadow_evaluations、风险处置和 AI workflow feedback/outcome 链路,确认线上发布评测缺少持久真实样本。
证据:`expense_claim_risk_rule_loader.py``expense_claim_platform_risk.py``risk_dispositions.py``expense_workflow_learning.py``ai_learning.py` 只读审计。
- [x] [CONCEPT: 背景与问题] 确认 `RiskDispositionEvent confirm/false_positive` 是当前可绑定风险命中的可信人工结论,通用 feedback/outcome 缺少完整 release 身份。
证据:`risk_disposition.py``risk_dispositions.py``agent_asset_release_telemetry.py` 的可信事件查询和关联校验。
- [x] [CONCEPT: HMAC 与数据真实性边界] 冻结 HMAC 只负责传输认证、防篡改和防重放,不证明汇总指标的数据真实性。
证据:`CONCEPT.md`“HMAC 与数据真实性边界”;现有 `agent_asset_release_monitor_auth.py``ReleaseEvaluationInput` 契约对照审计。
- [x] [CONCEPT: 目标与非目标] 明确未标注 collecting、敏感数据不落遥测表、线上 recall/FN 证据不足不可用。
证据:`CONCEPT.md`“目标与非目标”“Recall 与 false negative”。
## 2. 契约与设计
- [x] [CONCEPT: 数据] 定义 observation 与 label 的 tenant/asset/release/stage/version 复合身份、稳定幂等键和只追加边界。
证据:`server/src/app/models/agent_asset_release_telemetry.py`
- [x] [CONCEPT: 证据链与自动判定] 定义 observation → trusted label → aggregate → ReleaseEvaluationInput → Release Guard 的证据链。
证据:`CONCEPT.md`“证据链与自动判定”、`ReleaseTelemetryAggregate.to_release_evaluation_input()`
- [x] [CONCEPT: 算法/规则] 分开定义运行失败、业务误报、candidate precision、baseline precision 和缺失负样本真值。
证据:`agent_asset_release_telemetry.py``aggregate()``test_agent_asset_release_telemetry.py` 的 collecting、baseline 和 FN 不可用断言。
- [x] [CONCEPT: 权限] 冻结专用发布复核接口的角色矩阵、双人复核阈值和跨租户 HTTP 错误契约。
证据:`require_rule_reviewer_user` 只允许 manager/admin跨租户 404、非角色 403、
发布人自审 400`reviewer_quorum` 限制 1..2 且按不同 actor 指纹计票。
## 3. 独立模型与服务
- [x] [CONCEPT: 数据] 新增 append-only observation/label ORM 模型、复合租户/release 外键和更新/删除拒绝。
证据:`server/src/app/models/agent_asset_release_telemetry.py`
- [x] [CONCEPT: 后端] 实现真实 shadow 结果、Canary/active 命中和 manifest 执行循环样本生产器。
证据:`AgentAssetReleaseTelemetryService.record_expense_risk_result()``record_manifest_evaluation()`
- [x] [CONCEPT: 后端] 实现专用发布复核标签和可信 `RiskDispositionEvent` 标签转换,不接收自由评论。
证据:`record_review_label()``record_risk_disposition_label()`
- [x] [CONCEPT: 后端] 实现租户隔离、陈旧 release/stage/version 拒绝、来源关联校验和稳定幂等冲突。
证据:`_require_current_release()``_observation_replay()``_label_replay()` 及对应测试。
- [x] [CONCEPT: 算法与公式] 实现保守聚合;未标注候选命中保持 collecting基线标签不完整时 baseline precision 不可用。
证据:`ReleaseTelemetryAggregate``aggregate()``to_release_evaluation_input()`
- [x] [CONCEPT: 数据] 实现 claim、事件、actor 来源指纹化,不保存业务正文、评论和账号原值。
证据:模型无自由文本业务字段;`_fingerprint()`;脱敏测试断言。
## 4. 共享注册、迁移与运行接入
- [x] [CONCEPT: 数据] 在 `db/base.py``models/__init__.py` 注册 `AgentAssetReleaseObservation``AgentAssetReleaseLabel`,保证主应用 metadata 与迁移所有权检查可见。
证据:`db/base.py``models/__init__.py``schema_ownership.py``migration_preflight.py` 已登记两张迁移自有表;前置检查 77 项通过。
- [x] [CONCEPT: 数据] 新增后继 `20260716_0018` Alembic 迁移,创建两张表、复合租户/release 约束、检查约束、索引和数据库级 append-only UPDATE/DELETE 触发器。
证据:`20260716_0018_agent_asset_release_telemetry.py`;一次性 PostgreSQL 17 完整升级/降级循环 1 项通过,静态迁移/schema owner 回归 112 项通过。
- [x] [CONCEPT: 算法/规则] 在真实候选 manifest 执行循环接入 `record_manifest_evaluation()`,完整记录 shadow/Canary hit、miss 和结构化执行失败。
证据:`expense_claim_platform_risk.py``expense_claim_release_telemetry.py``test_agent_asset_release_runtime.py` 覆盖 shadow、Canary、active 和损坏快照,`test_agent_asset_release_telemetry.py` 覆盖结构化运行失败。
- [x] [CONCEPT: 后端] 在类型化风险处置事务接入 release label按同租户、同 claim/rule、当前 release 精确关联 observation关联失败保守拒绝。
证据:`agent_asset_release_disposition_labels.py``risk_disposition_release_sync.py`;风险确认/误报会追加标签,误报越界自动回滚 stable。
- [x] [CONCEPT: 后端] 将现有 Release Monitor 从“提交外部汇总数字”改为“触发服务端聚合”,只在 aggregate ready 时构造 `ReleaseEvaluationInput`
证据:`AgentAssetReleaseMonitor.evaluate_current()` 只接受 release 身份HTTP body 为禁止额外字段的空触发契约,真实聚合未 ready 时不调用 Guard。
- [x] [CONCEPT: HMAC 与数据真实性边界] 保留 HMAC 作为 Monitor 传输认证,但禁止签名请求覆盖数据库聚合结果,并补充签名通过但汇总伪造的反向测试。
证据:`agent_asset_releases.py``AgentAssetReleaseMonitorTriggerWrite`;带有效签名的伪造 `precision/total` 请求仍返回 422。
- [x] [CONCEPT: 降级策略] 遥测持久化或聚合失败时保持 stable 规则、停止晋级并记录结构化告警,不让观测故障阻断正常报销。
证据:`ExpenseClaimReleaseTelemetryRecorder``risk_disposition_release_sync.py` 将遥测/标签/监控故障隔离并记录日志;未获得 ready 真实聚合不会写 passed也不会改变 stable 路由。
- [x] [CONCEPT: 后端] 按职责拆分 Agent 资产接口、版本只读投影和 Release Guard 纯策略计算,保持公开 API 与状态机行为稳定。
证据:`agent_assets.py` endpoint 714 行、`agent_asset_risk_rules.py` 534 行、`agent_assets.py` service 675 行、`agent_asset_serialization.py` 217 行、`agent_asset_release_guard.py` 636 行、`agent_asset_release_policy.py` 201 行,相关核心文件均低于 800 行;纯策略模块保存范围为 1..2 的 `reviewer_quorum`,第 5 节已完成复核执行与运营闭环。
## 5. 自动聚合、告警与运营闭环
- [x] [CONCEPT: 证据链与自动判定] 实现按 tenant/asset/release/stage/version 的周期聚合作业与幂等快照。
证据:`agent_asset_release_scheduler.py` 按租户有界扫描;`AgentAssetReleaseMonitor._existing_evaluation()` 复用相同 release 聚合快照,不重复生成测试运行。
- [x] [CONCEPT: 证据链与自动判定] aggregate ready 后自动调用 Release Guardcollecting 只更新采集状态,不写虚假 passed test run。
证据:人工标签提交后即时触发 monitor后台 scheduler 提供失败补偿;`test_agent_asset_release_monitor.py` 覆盖 collecting 不调用 Guard、低 precision/运行失败自动回滚与相同快照幂等。
- [x] [CONCEPT: 降级策略] 增加待标注数量/时长、运行失败率、precision 下降、baseline 不可用、聚合失败和自动回滚告警。
证据:`agent_asset_release_alerts.py``AgentAssetReleaseMonitor._metrics()`24 小时
待审逾期和单资产聚合失败均返回结构化告警,定向 Monitor/Telemetry/Runtime 29 项通过。
- [x] [CONCEPT: 前端] 在发布控制台展示 observed/hit/labeled/pending、候选/基线 precision、运行失败和召回证据。
证据:`AuditReleaseMonitorPanel.vue` 展示负样本池、抽样进度、积压、实际/估计 FN、FN 上界、recall 点估计/下界/置信方法;空值不渲染为零。
- [x] [CONCEPT: 权限] 实现认证发布复核队列、操作审计和需要时的双人复核,不允许规则发布人独自伪造所有标签。
证据:`agent_asset_release_review.py``agent_asset_release_label_votes.py`、专用 GET/POST
API`X-Request-Id`、append-only label、actor HMAC 指纹、发布人隔离和独立双人同意均有测试。
- [x] [CONCEPT: Recall 与 false negative] 实现独立分层负样本抽样、预测盲化、双人标注、冲突保持 collecting 和保守召回估计。
证据:`agent_asset_release_sampling.py``agent_asset_release_review.py`
`agent_asset_release_aggregation.py``agent_asset_release_recall.py`;前端只发送
`risk_present / risk_absent`,负样本要求两个不同 actor门禁只读取 recall 下界。
- [x] [CONCEPT: 数据] 完成 `0023` audit sample 迁移注册、数据库标签组合约束、append-only 触发器和无损降级验证。
证据:`20260716_0023_agent_asset_release_blind_audit.py``release_telemetry_migration_assertions.py`fresh PostgreSQL 完整迁移链、约束、触发器及降级/再升级均通过。
## 6. 测试与验证
- [x] [CONCEPT: 测试方案] 独立模型/服务测试覆盖 shadow、Canary、baseline、真实 typed disposition、脱敏、幂等、租户、陈旧 release、append-only、collecting 和 FN 不可用。
证据:容器内 `test_agent_asset_release_telemetry.py` 7 项通过。
- [x] [CONCEPT: 测试方案] 与现有 Release Guard 和 Runtime 组合回归通过。
证据:容器内 `test_agent_asset_release_guard.py``test_agent_asset_release_runtime.py``test_agent_asset_release_telemetry.py` 共 19 项通过Ruff 通过,`git diff --check` 通过。
- [x] [CONCEPT: 测试方案] 新增 0018 upgrade/downgrade、schema owner、复合外键和数据库 append-only PostgreSQL 验证。
证据:一次性 `pgvector/pgvector:pg17` 数据库中完整迁移循环 1 项通过;迁移运行探针验证复合租户外键、幂等唯一约束和两张表的数据库级 UPDATE/DELETE 拒绝。
- [x] [CONCEPT: 测试方案] 新增 PostgreSQL 并发同 observation、同 label、标签与阶段晋级竞争和幂等冲突测试。
证据:一次性 PostgreSQL 17 中 `test_agent_asset_release_telemetry_concurrency_postgres.py` 4 项通过;相同重放只保留一条,不同载荷单赢家,阶段转换持锁后旧标签保守拒绝。
- [x] [CONCEPT: 测试方案] 验证 audit sample 并发单赢家、同 actor 重复不增加负样本法定票、第二独立 actor 完成双人复核,以及预测字段不进入前端队列状态。
证据:`test_agent_asset_release_telemetry_concurrency_postgres.py` 覆盖单赢家和独立双人票;`test_agent_asset_release_telemetry.py``agent-release-monitor-panel.test.mjs` 验证队列不暴露 candidate/baseline 命中预测。
- [x] [CONCEPT: 测试方案] 跑通真实风险循环 → observation → disposition label → aggregate → Release Guard 回滚端到端。
证据:`test_agent_asset_release_runtime.py``test_risk_dispositions.py` 覆盖真实执行样本、类型化处置标签、服务端聚合、低 precision 自动恢复 stable发布组合回归 44 项通过。
- [x] [CONCEPT: 测试方案] 验证职责拆分后的资产服务、风险规则子路由、Release Guard/Runtime、Monitor/Scheduler/Telemetry 和 API schema 兼容性。
证据:容器内资产服务 27 项、Guard/Runtime 13 项、Monitor/Scheduler/Telemetry 22 项、风险规则生成/解释 30 项、修订/反馈 14 项通过;迁移后的既有 publish HTTP 防绕过用例通过Ruff 与 `git diff --check` 通过。
- [x] [CONCEPT: 指标与验收] 验证 HMAC 失败、遥测库失败、标签积压和聚合失败均停止晋级但不破坏 stable 业务保护。
证据:`test_agent_asset_release_runtime.py` 覆盖签名失败;`test_agent_asset_release_monitor.py` 覆盖 collecting、积压和聚合失败`ExpenseClaimReleaseTelemetryRecorder` 隔离遥测持久化异常stable 报销路径继续服务。
- [x] [CONCEPT: 指标与验收] 完成相关后端全量回归、Ruff、迁移完整循环和 `git diff --check`,逐项回填 A1-A8 证据。
证据:遥测组合 45 项通过fresh PostgreSQL 总探针 `87 passed / 0 skipped / 0 failed`,其中发布遥测并发 7 项Web 全量 815 项及 Vite build 通过;新增 Python 文件 Ruff 与 `git diff --check` 通过。全仓既有 Ruff 基线债不伪装为本轮新增错误。
## 7. 文档收尾
- [x] [CONCEPT: 本轮实现记录] 新建独立 CONCEPT/TODO记录证据边界、已实现切片和共享集成缺口。
证据:`document/development/2026-07-16/feature/ai-release-real-telemetry/CONCEPT.md``TODO.md`
- [x] [CONCEPT: 风险与开放问题] 共享集成完成后回填 0018、运行 hook、自动作业、PostgreSQL 和端到端证据。
证据:本 TODO 第 4-6 节与 `CONCEPT.md`“本轮实现记录”已回填发布面板已展示积压、失败、precision 和 recall生产运营效果由下一条真实流量验收单独保留。
- [x] [CONCEPT: 指标与验收] 与上位 AI 闭环 TODO 对齐代码与容器验证状态。
证据:`document/development/2026-07-13/feature/ai-expense-closed-loop-and-value-proof/TODO.md` 已回填 Golden、Canary、盲审和回滚的工程证据。
- [ ] [CONCEPT: 指标与验收] 使用生产真实流量、独立复核样本和试点阈值验证 Golden/Canary/自动回滚运营效果。
证据要求:目标企业生产 observation/label、盲审样本、阈值签字和真实回滚演练本地测试不得替代。