feat(sense): T-G5 Grader 决策组合(特征门×概率×conformal + /v1/route + 三态 mode)

- features.py:gate() 纯函数——轮数/字符估算/意图黑名单/仓库级信号/长度门
  -> t1_hard_ok(任一硬门不过即 False,D-G1)
- grader.py:Grader.decide §8 时序(embed 降级检查 -> 特征门 -> LinearHead 概率
  -> conformal 阈值:p1>=τ1 且 t1_hard_ok->T1,p3>=τ3 或 repo_signals->T3,
  其余 T2 默认;collect/shadow 只写观察 executed=现行为,live 决策即执行;
  全模式 observer.log);工件/阈值缓存 + invalidate;D-G4 规则门退化
- routes:/v1/route 契约(D-G6 不落 query 原文)
- fix(observer):embedding list -> BLOB 转换(修 sqlite 绑定)
- 测试 +6(门矩阵/shadow 不改流/live 决策/降级/保守阈值/写观察),全量 405 passed
This commit is contained in:
tzt
2026-09-05 14:17:44 +08:00
parent 2a4cb529de
commit 4575025056
6 changed files with 376 additions and 1 deletions
+4
View File
@@ -97,6 +97,10 @@ class Observer:
def _write_rows(self, rows: List[Dict[str, Any]]) -> None:
for row in rows:
emb = row.get("embedding")
if isinstance(emb, list):
# 量化值以 0..255 无符号表示 -> BLOB
row["embedding"] = bytes(bytearray(x & 0xFF for x in emb))
self.store.insert_observation(row)