fix(rectification): keep hour-window tail clusters and lock the search window (BUG-623, BUG-624, BUG-625)
Independent Staging Quality Gate / validate (push) Successful in 17m15s
Independent Staging Quality Gate / publish (push) Successful in 2m15s

Hour windows no longer drop later signature clusters. Credible range uses cluster coverage, and a mid-session spoken birth window gets a fixed reply without calling the model.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-09 20:45:11 +08:00
co-authored by Cursor
parent a31a5e2426
commit 6008c07c81
41 changed files with 1164 additions and 44 deletions
+48
View File
@@ -9667,3 +9667,51 @@
- 相关记录:BUG-614、BUG-615、BUG-620
- 复发自:无
- 修复版本:待发布
## BUG-623 | 一小时窗口按时间取前 12 簇,后段真实出生时间从未进入候选
- 状态:resolved
- 首次发现:2026-09-09
- 最近更新:2026-09-09
- 影响面:`scripts/rectification/candidate_contrast.py` `select_signature_representatives``MAX_PUBLIC_CLUSTERS`、公开候选集
- 用户现象:intake 填一小时窗后,第一次比较给出的范围停在窗口前段(例如 14:00–15:00 只收到约 14:04–14:43)。用户知道的更晚时段从头到尾不在候选里。
- 触发条件:分钟网格上签名簇超过 12 个。半小时窗(±15)通常 ≤12,所以以前测不到;「前后半小时」的 60 分钟窗必现。
- 根因:`cluster_contexts_by_signature` 按代表分钟时间排序后,循环里 `len(representatives) >= MAX_PUBLIC_CLUSTERS` 直接 `break`。多出的整簇被丢掉,而且永远是窗口尾部。这发生在证据评分之前。
- 修复:不再按时间截断。安全上限改为 64;超过 64 时合并相邻低分簇,不丢尾部。公开候选仍是每簇一个代表分钟。
- 验证:`tests/test_rectification_v5_services.py` 的 17 簇夹具(含 14:46–14:51)与 65 簇相邻合并保尾。
- 防复发:禁止再对时间排序后的簇做 `break` 截断;超上限只能按分数合并相邻簇。
- 相关记录:BUG-560(以前「分钟级≈随机」的校准是在 ±15 窗口上得出,一小时窗还叠加了本截断)
- 复发自:无
- 修复版本:待发布
## BUG-624 | 可信区间按代表分钟跨度算,簇内其余分钟被视觉淘汰
- 状态:resolved
- 首次发现:2026-09-09
- 最近更新:2026-09-09
- 影响面:`build_candidate_decisions`、推断层 `cluster_range``credible-range.ts`
- 用户现象:即便某簇还活着,区间右端只写到代表分钟。例如 14:40–14:45 这一簇的代表是 14:40 时,读数停在 14:40。
- 触发条件:签名簇覆盖连续多分钟,代表分钟不是簇的末端。
- 根因:引擎候选只带 `time`。推断层用换升时刻在代表分钟之间重新聚类,多数变成单分钟;`unionStillValidRange` 再取这些点的跨度。
- 修复:每个公开候选带 `cluster_times` / `cluster_start` / `cluster_end`。推断层优先用引擎簇覆盖;换升聚类只作缺字段时的兜底。可信区间是仍有效簇覆盖的并集。时间轴实心/空心点仍画代表分钟。
- 验证:Python 簇 14:4014:45、代表 14:40 → `cluster_end=14:45``frontend/tests/rectification-window-cluster-cap-20260909.test.ts` 区间右端 14:45。
- 防复发:可信区间不得只用代表分钟;缺 `cluster_times` 才允许换升兜底。
- 相关记录:BUG-623
- 复发自:无
- 修复版本:待发布
## BUG-625 | 中途说出出生时段时助手口头答应改窗口,但什么都没改
- 状态:resolved
- 首次发现:2026-09-09
- 最近更新:2026-09-09
- 影响面:`frontend/src/app/api/rectification/agent/route.ts` 自由文本、`declared-window-utterance.ts`、Skill 10.0.20、`agent-run` 正文守卫
- 用户现象:校正做到一半,用户说「我的出生时间是 14 点 45 到 14 点 50」。助手回答「明白了,以你说的为准」,搜索窗口和候选集不变。下一句「继续吧」被当成没听懂的点选题回答。
- 触发条件:点选或采集焦点下,用户用自由文本申报钟点范围或「HH:MM 左右」。
- 根因:15 个工具里没有改搜索窗口的入口;opening brief 还禁止改窗口。自由文本进意图分类器,枚举没有「申报时间段」,落 `unclear`。模型在采集焦点下会自己答应。产品否决了中途改窗口。
- 修复:自由文本在分类器和选模型之前做确定性解析。命中则落库固定回复,不调模型,不改 `candidate_range`,当前焦点保持。正文守卫删除「以你说的…为准」。Skill 写明不得口头改窗口。intake 自定义更小范围等产品答复,本单不做。
- 验证:`frontend/tests/rectification-window-cluster-cap-20260909.test.ts`(解析、路由在选模型前拦截、簇覆盖区间、禁用口头承认)。
- 防复发:中途申报时段不得进模型、不得改窗口;助手不得写「以你说的为准」。
- 相关记录:BUG-623、BUG-572
- 复发自:无
- 修复版本:待发布