feat(sense): T-G7 审计+前端(live 分流接线 + tier 指标卡 + Settings 灰度区块)

- proxy/routes:sense.mode=live 时转发前调 Grader 分流,档位 -> 池条目
  (tier_pool_hint 映射),响应头 X-Campus-Tier 透出(可解释性);
  T1 决策按 review.sample_rate 抽样入 ReviewQueue(sense_t1 标签,
  人工核"判 T1 实为更高档");分级故障不影响代理可用性(D-G4)
- /api/metrics:sense 段(enabled/mode/观察数/已标签/档位分布/shadow 一致率)
- 前端:MetricsView「语义分级」卡片(观察/标签进度/一致率/晋升门提示);
  SettingsView「Sense 灰度控制」区块(总开关 + collect/shadow/live 切换 +
  标签进度),npm run build 产物更新
- 全量 410 passed
This commit is contained in:
tzt
2026-09-05 15:06:27 +08:00
parent 204789aed6
commit a636b989e5
7 changed files with 171 additions and 6 deletions
+24
View File
@@ -1177,6 +1177,30 @@ try:
"pending": get_review().count(status="pending"),
"total": get_review().count(),
}
# 语义分析器(T-G7):灰度状态 + 观察统计 + 档位分布 + shadow 一致率
try:
from gateway.sense.config import build_sense_config
from gateway.sense.store import SenseStore
scfg = build_sense_config(settings_store().to_dict())
srows = SenseStore.init_db(scfg.db_path).all_observations(limit=100000)
by_decided: Dict[str, int] = {}
consistent = 0
labeled = 0
for r in srows:
by_decided[r["decided_tier"]] = by_decided.get(r["decided_tier"], 0) + 1
if r["executed_tier"] and r["decided_tier"] == r["executed_tier"]:
consistent += 1
if r["true_tier"]:
labeled += 1
out["sense"] = {
"enabled": scfg.enabled, "mode": scfg.mode,
"observations": len(srows), "labeled": labeled,
"by_decided_tier": by_decided,
"agreement": round(consistent / len(srows), 4) if srows else 0.0,
"min_labels": scfg.min_labels,
}
except Exception:
pass
return out
except ImportError: