fix(rectification): match the delivery inside the acknowledged reply (BUG-1241)
Independent Staging Quality Gate / validate (push) Successful in 14m30s
Independent Staging Quality Gate / publish (push) Successful in 3m52s

The answered choice persists the acknowledgement, a blank line, and the
rewritten delivery. The exit fill-in required equality and wrote the
deterministic delivery again. Check containment instead, and pin it on the
real answer path. The suspected widen staleness regression did not hold;
keep a guard test.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
This commit is contained in:
Jesse_Chen
2026-10-06 16:14:24 +08:00
co-authored by Claude Opus 5.5
parent 6e16dc5e16
commit e62d0a3257
6 changed files with 296 additions and 13 deletions
+6 -6
View File
@@ -16677,17 +16677,17 @@
## BUG-1241 | 校正交付后同一轮又补出第二段回答
- 状态:resolved(分支 `codex/rectification-delivery-dup-adopt-20261006`)
- 首次发现 / 最近更新:2026-10-06 / 2026-10-06
- 来源:10-06 测试环境真机。任务书 `docs/tasks/TASK-rectification-delivery-dup-adopt-20261006.md`。
- 首次发现 / 最近更新:2026-10-06 / 2026-10-06(验收修复单后)
- 来源:10-06 测试环境真机。任务书 `docs/tasks/TASK-rectification-delivery-dup-adopt-20261006.md`;验收修复单 `docs/tasks/TASK-rectification-delivery-dup-adopt-fix-20261006.md`。
- 影响面:生时校正答完最后一题后的交付。不改引擎,不改数据库。
- 现象:同一轮出现两段助手回答。前一段是采用旁白的改写。后一段是确定性兜底,带分钟范围和「还剩几个候选」。刷新后两段都在。
- 触发条件:答题路径已经把改写后的交付句写入本轮;收尾补位找不到已问轮次编号,又用子串去比对。改写句不是兜底原文的子串,于是再写一条。
- 根因:BUG-1153 的防重只看「上一条是否包含确定性原文」。当时的测试把上一条写成已经包含这段原文,所以没覆盖「上一条是另一句改写」。60 秒内不重复记账的标记也没有拿来比对这句已经写下的交付。
- 修复:答题回复在落库前记下这句交付原文。收尾补位若发现上一条助手原文(去掉空白后)就是这句,就不再写。子串比对保留。没有任何回复承载这句时,补位仍写 1 条。不把旁白函数传进收尾,也不改旁白提示词。选择题 JSON 在已有轮次编号时带上 `x-rectification-turn-id`,作为额外保险;真库验收不依赖这个头。
- 验证:`frontend/tests/rectification-delivery-dup-adopt-20261006.test.ts` 覆盖「上一条是改写句则 0 条新写入」和「上一条不是这句则仍写 1 条」。BUG-1153 原测试仍通过。真 PostgreSQL 17 上,种好的并列卷宗走同一条收尾后,助手交付消息恰好 1 条。本机没有星历引擎,收尾里的刷新失败得很快,失败之后也没有写出第 2 条。
- 防复发:上述测试。跳过条件是「上一条等于已记下的交付句」,不能只靠加长子串。
- 修复:答题回复在落库前记下这句交付原文。收尾补位若发现上一条助手原文(去掉空白后)就是这句,就不再写。子串比对保留。没有任何回复承载这句时,补位仍写 1 条。**验收修复(b977f482 之后)**:首版要求上一条「等于」这句,但答题回复真实落库是「已记录,…」+ 空行 + 改写句(`persistApplied` 在 `skippedNextInterview` 时拼接答题回执),于是事故原样仍补出第二条;改为「上一条包含这句」(去空白比子串,不足 8 字不匹配)。不把旁白函数传进收尾,也不改旁白提示词。选择题 JSON 在已有轮次编号时带上 `x-rectification-turn-id`,作为额外保险;真库验收不依赖这个头。
- 验证:`frontend/tests/rectification-delivery-dup-adopt-20261006.test.ts` 覆盖「上一条是改写句则 0 条新写入」和「上一条不是这句则仍写 1 条」;修复单补「回执前缀 + 改写」两种回执各 0 条、「只有回执」仍 1 条。`frontend/tests/rectification-answer-choice.test.ts`「a rewritten delivery reply is not followed by a second exit fill-in turn」走真实答题路径(`applyRectificationChoice` + 改写旁白)取实际落库文本再调收尾:b977f482 上 1 条(红),修后 0 条。BUG-1153 原测试仍通过。真 PostgreSQL 17 上,种好的并列卷宗走同一条收尾后,助手交付消息恰好 1 条。本机没有星历引擎,收尾里的刷新失败得很快,失败之后也没有写出第 2 条。
- 防复发:上述测试。跳过条件是「上一条包含已记下的交付句」,比对对象必须取自真实答题路径的落库文本,不得手写只含改写句的夹具(首版回放就是这样漏掉回执前缀的)。
- 相关记录:BUG-596、BUG-1149、BUG-1153。
- 复发自:BUG-1153。旧测试的上一条已经包含确定性原文,改写句走不到那条断言。
- 复发自:BUG-1153。旧测试的上一条已经包含确定性原文,改写句走不到那条断言。首版修复的测试与真库回放都只写了改写句、没有答题回执前缀。
- 修复版本:待发布
## BUG-1242 | 点采用被拒,因为采用和读取没用答题时的出生日期