feat(sense): T-X5 云端评判晋升表×conformal 双闸门——本地档自动接管(采纳 cortiq promotion)

- gateway/sense/promotion.py:PromotionTable 状态机(candidate/promoted/demoted)
  * 晋升门:n_total>=n_min 且 通过率>=promote_lb 且 soak 浸泡期满足
  * 退化:promoted 期间通过率<demote_lb 自动降级;降级后可凭数据恢复
  * 一票否决:tier=T3 观察不进通过率统计,已晋升者立即降级
  * 持久化 sense_promotion 表(CREATE IF NOT EXISTS 幂等)
- grader:live 模式对已晋升标签的 T2 决策(无 T3 信号/非 fallback)升级 T1,
  hard_gates.promotion_applied 如实标注;T1/T3/fallback 路径不受影响
- 回填链路:T1 审计抽样带 promo:<label> 标签 -> 人工 verdict approve=ok
  经 /review/{id} 提交时回填晋升表(失败不影响审核主流程)
- 双闸门语义:conformal 阈值保证单条决策风险率,晋升表保证标签级接管节奏;
  collect 数据不足(n_min 未满)不晋升,全部迁移可经 T-X4 留痕审计

pytest 474 passed(T-X4 后 466 + 8)
This commit is contained in:
tzt
2026-09-18 23:01:52 +08:00
parent 7e01dc9b16
commit 1aaa05cacc
7 changed files with 334 additions and 5 deletions
+16
View File
@@ -451,6 +451,22 @@ try:
raise HTTPException(status_code=400, detail=str(e))
if not ok:
raise HTTPException(status_code=404, detail=f"审核记录不存在或已审核: {review_id}")
# 晋升表回填(T-X5):带 promo 标签的 sense 审计样本,人工 verdict
# approve=ok -> 晋升表累计;失败不影响审核主流程
try:
row = get_review().get(review_id)
promo = next((t[len("promo:"):] for t in (row.get("tags") or [])
if isinstance(t, str) and t.startswith("promo:")), None)
if promo:
from gateway.sense.config import build_sense_config
from gateway.sense.promotion import PromotionTable
from gateway.sense.store import SenseStore
scfg = build_sense_config(settings_store().to_dict())
if scfg.enabled:
PromotionTable(SenseStore.init_db(scfg.db_path)).observe(
promo, ok=(verdict == "approve"))
except Exception:
pass
return {"ok": True, "review_id": review_id, "verdict": verdict}
# ---------------- 模型池(多价位异构模型) ----------------