From 7837f6abd81903973aca3dc43dc0ba5b5a3b8bf6 Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Sun, 26 Jul 2026 01:44:05 +0800 Subject: [PATCH] fix: show rectification range in opening --- docs/BUG_HISTORY.md | 15 +++++++++++++++ .../conversational-rectification/orchestrator.ts | 2 +- ...versational-rectification-orchestrator.test.ts | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 510ea263..b41e426e 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -1383,3 +1383,18 @@ - 防复发:首页可点击入口必须与 `resolveBirthTimeConsultationRoute()` 的能力结果一致;服务端不得把客户端咨询模式当作出生资料真源,具体填报分钟必须进入 `unverified_birth_time`,只有 `confirmed + active_birth_time` 才能进入 `verified_chart`。 - 相关记录:BUG-009 - 修复版本:待提交(本地可测) + +## BUG-074 | 生时校正首轮隐藏已知候选范围并让用户误以为系统没有读取资料 + +- 状态:resolved +- 首次发现:2026-07-25 +- 最近更新:2026-07-25 +- 影响面:生时校正新建 case 的确定性首轮引导 +- 用户现象:用户已经填写具体出生时间和误差范围,进入生时校正后却只看到泛化的重大事件提问,不知道系统实际正在核对哪个时间窗口。 +- 触发条件:新建 `conversational-evidence-v3` case,首轮候选已经包含 `rangeStart` / `rangeEnd`,但可见 narrative 没有显示它们;旧生产版本还会调用模型生成同类泛化开场。 +- 根因:BUG-072 的快速首轮正确保留了候选范围,却只把范围写入结构化 `candidate`;首页不单独渲染该字段,固定 narrative 仍沿用了不含范围的旧提问。 +- 修复:复用首轮已经计算出的声明范围,在确定性 narrative 中明确显示当前待核对边界,并说明它不是已确认分钟;继续只问一件带年月的重要经历,不恢复零证据模型调用或分钟扫描。 +- 验证:Orchestrator 回归断言首轮正文包含真实 `rangeStart–rangeEnd`、未确认边界和单事件提问;聚焦测试、目标 ESLint 与 `git diff --check` 通过。 +- 防复发:只要首轮已向用户展示生时校正状态,可见文案必须同时呈现结构化候选边界;不得只在隐藏状态中保存范围,也不得为了润色首问重新引入模型调用。 +- 相关记录:BUG-055、BUG-067、BUG-072 +- 修复版本:待提交(本地可测) diff --git a/frontend/src/lib/conversational-rectification/orchestrator.ts b/frontend/src/lib/conversational-rectification/orchestrator.ts index 5fbb201a..5527a344 100644 --- a/frontend/src/lib/conversational-rectification/orchestrator.ts +++ b/frontend/src/lib/conversational-rectification/orchestrator.ts @@ -603,7 +603,7 @@ function openingRectificationState(input: { journeyProtocol: "conversational-evidence-v3", status: "active", turnVersion: 0, - narrative: "我们先从一件时间最明确、影响比较大的真实经历开始。请只说一件,并告诉我大约发生在哪一年、哪一月?", + narrative: `根据你填写的出生时间信息,当前先核对 ${range.startTime}–${range.endTime}。这只是待核对范围,还不能把其中某一分钟当作已确认出生时间。请先说一件时间最明确、影响比较大的真实经历,并尽量告诉我发生的年月。`, candidate: { status: "pending_validation", representativeTime, diff --git a/frontend/tests/conversational-rectification-orchestrator.test.ts b/frontend/tests/conversational-rectification-orchestrator.test.ts index 3ff1f8d6..e39ae2ad 100644 --- a/frontend/tests/conversational-rectification-orchestrator.test.ts +++ b/frontend/tests/conversational-rectification-orchestrator.test.ts @@ -523,6 +523,9 @@ test("start creates a deterministic opening without scanning or narrative genera assert.equal(turn.candidate.representativeTime, "05:20"); assert.equal(turn.candidate.rangeStart, "04:50"); assert.equal(turn.candidate.rangeEnd, "05:50"); + assert.match(turn.narrative, /当前先核对 04:50–05:50/); + assert.match(turn.narrative, /还不能把其中某一分钟当作已确认出生时间/); + assert.match(turn.narrative, /请先说一件/); assert.deepEqual(turn.technicalReceipt, { calculationVersion: "rectification-opening-v1", stableLayers: [],