Commit 3454c739 by luoqi

docs(召回): 刷新 f.status='active' 不变量守卫的实测依据 —— 5,034 → 109 万

reason-temperature.sql 那条注释拿早期 5,034 条证据的观测当依据,量级已差 216 倍,
读的人无从判断这道守卫今天还成不成立。

2026-08-28 生产全量实测:
  plan=active     1,092,580 条理由 —— 无 active 证据的 0
  plan=assigned       1,265        —— 0
  plan=completed         41        —— 0
  plan=abandoned        282        —— 6
即引擎重算追得上事实换代,这道过滤没有在挡真数据。

顺带记下它的信号价值:这个数掉下来 = 重算落后于摄入,矩阵格位会静默变空且不报错。

(排查缘起:误以为 evidence.factIds 大面积断链。实际 missing_tooth 的 103,980 条
理由里,真断链只有 1,297 条且全在 7 月那周的 superseded 历史快照上;先前看到的
15.4% 是 planned 类信号 occurred_at 本就为空 —— 它们有 planned_for,靠
COALESCE(occurred_at, planned_for) 取锚,并非缺失。)

纯注释,无逻辑改动。tsc 0 error,96 suites / 1602 tests 全绿。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
parent e0a12c44
...@@ -142,8 +142,12 @@ export function temperatureBucketCaseSql( ...@@ -142,8 +142,12 @@ export function temperatureBucketCaseSql(
* 关联条件变成恒真且 SQL 不报错)—— 那种场景用下方的 `labelExistsSql` / `labelTemperatureExistsSql`。 * 关联条件变成恒真且 SQL 不报错)—— 那种场景用下方的 `labelExistsSql` / `labelTemperatureExistsSql`。
* *
* ⚠️ `f.status = 'active'`:治完的诊断是 `fulfilled` 不是删除。拿它当证据 = * ⚠️ `f.status = 'active'`:治完的诊断是 `fulfilled` 不是删除。拿它当证据 =
* 对着一个已经做完的诊断说"您还没做"。当前数据 5,034 条证据全是 active, * 对着一个已经做完的诊断说"您还没做"。这条过滤是**不变量守卫** —— 治疗落库后
* 这条过滤是**不变量守卫** —— 治疗落库后引擎还没重算的窗口期里,它就是唯一防线。 * 引擎还没重算的窗口期里,它就是唯一防线。
* 2026-08-28 生产实测(全量,不再是早期 5,034 条的小样本):在跑计划的 1,092,580 条
* active 理由 + 1,265 条 assigned + 41 条 completed,**无一条**取不到 active 证据;
* 只有 abandoned 里 6/282 取不到。即引擎重算追得上事实换代,守卫没有在挡真数据。
* ⚠️ 这个数掉下来 = 重算落后于摄入,格位会静默变空(不报错),值得当信号看。
* 🔴 `anc.at IS NOT NULL` **必须留着**,即便锚点已经换成末诊、不再用它定档: * 🔴 `anc.at IS NOT NULL` **必须留着**,即便锚点已经换成末诊、不再用它定档:
* 它是「这条证据有日期」的守卫,决定**哪些 plan 进得来**。删掉行集就变了 —— * 它是「这条证据有日期」的守卫,决定**哪些 plan 进得来**。删掉行集就变了 ——
* 而多出来的那些人不会报错,只会悄悄出现在格子里。 * 而多出来的那些人不会报错,只会悄悄出现在格子里。
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment