Files
Jyotisha/docs/tasks/PROGRESS-rectification-record-conflict-copy-20260916.md
T
Jesse_ChenandClaude Opus 5 6df40c322c
Independent Staging Quality Gate / validate (push) Canceled after 3m23s
Independent Staging Quality Gate / publish (push) Canceled after 0s
fix(rectification): 记录与校正区间冲突时记录优先、分歧并列(BUG-691)
医院记录那一分钟落在校正区间外时,交付卡以前只说一句「相差 N 分钟」:
没说默认按哪个时间排盘,采用按钮也仍写中性的「更像这个」,用户看不出
点下去会把之后的排盘换成另一分钟。

产品负责人 2026-09-14 拍板「记录优先,分歧如实呈现」:

- 冲突文案补满三层——默认仍按出生记录时间排盘、经历指向另一段时间相差
  N 分钟、两条路都可以走。
- 冲突态采用按钮改「改用校正结果」,按钮下按列写明
  「选它之后,排盘会从出生记录时间 hh:mm 换成 hh:mm」。
- 新增 FORBIDDEN_RECORD_VERDICT_PHRASE 锁住 D4:不得宣布记录不准,
  也不得宣布校正结果无效。

只改文案层与采用入口措辞。打分、判据、采用 RPC、置信度与确认门控、
数据库一律未动;不新增入口、不加确认弹窗;记录落在范围内或来源是
「大概时间 / 时间段」时卡片与今天完全一致。Skill 未 bump,只补
references §6.1。

验收:tsc 0 错;lint 0 error;npm test 3335 项 fail 31,失败清单与基线
37e6c519 逐条一致(全部是无 Docker / 无外网的既有环境缺口);next build
通过且 / 仍 ○ Static;首屏 chunks gzip +269 B(+0.019%)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
2026-09-16 02:02:03 +00:00

97 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PROGRESS · 记录与校正区间冲突:记录优先,分歧如实呈现(BUG-691)
- 任务书:`docs/tasks/TASK-rectification-record-conflict-copy-20260914.md`
- 分支:`codex/rectification-record-conflict-copy-20260916`worktree `.worktrees/rectification-record-conflict-copy-20260916`
- 实际基线:`origin/staging` @ `37e6c519`(任务书写的基线 `c5fbee56` 已被 staging 超车约 40 个提交)
- 执行日期:2026-09-16
## 0. 开工第一件事:事故是否仍复现
**仍然复现。** 任务书基线停在 09-14,其后 staging 合入了 BUG-721~733 等大量校正链路改动,所以先逐条核对了 §事故实证:
- `frontend/src/lib/rectification-agentic/birth-time-provenance.ts``reportedTimeOffsetCopy``hospital_record` + 记录落在范围外时,返回的仍然只有前半句:
`出生记录时间 05:12。目前范围不含这一分钟,相差 5 分钟`
D2 要求的三层(默认按哪个排盘 / 经历指向另一段时间 / 两条路都可以走)一层都没有。
- 交付卡 `frontend/src/components/rectification-range-delivery.tsx` 的采用按钮在任何来源下都写 `RECTIFICATION_USER_COPY.rangeDeliveryMoreLikeThis`(「更像这个」),没有随来源或冲突态分档;按钮附近没有任何说明「换掉的是什么」的文案。
- `docs/BUG_HISTORY.md` 里 BUG-691 查无此号(690 与 692 之间是真空号),BUG-690 的「修复」一栏还明确写着「医院记录与范围冲突时如何取舍挂给产品负责人」——本单正是那条挂起项的收口。
结论:没有被后来的轮次顺带修掉,按任务书执行。
## 1. 编号
`docs/BUG_HISTORY.md` 当前最大号是 **BUG-733**,但 691 是真空号(690 → 692)。任务书指定 BUG-691,且本单在语义上就是 BUG-690 的 D4 收口,故**填回 691 这个空号**并插在 690 与 692 之间,保持编号连续,不另起 734。
## 2. 改了什么
只动文案层与采用入口措辞。打分、判据、采用 RPC、置信度与确认门控、数据库一律未动。
| 文件 | 改动 |
|---|---|
| `frontend/src/lib/rectification-agentic/birth-time-provenance.ts` | 冲突分支文案补满 D2 三层;新增 `recordRangeConflict()` 作为唯一冲突判据;新增 `SWITCH_TO_RECTIFIED_LABEL``switchToRectifiedConfirmCopy()``FORBIDDEN_RECORD_VERDICT_PHRASE`D4 锁) |
| `frontend/src/lib/rectification-agentic/v9/divergence-panel.ts` | `RangeDeliveryProjection``record_conflict` 字段(build 与 parse 两侧对称),只是把判据结果投给 UI |
| `frontend/src/components/rectification-range-delivery.tsx` | 冲突态按钮改「改用校正结果」;按钮下按列补一行「选它之后,排盘会从出生记录时间 hh:mm 换成 hh:mm」;已采用的列不显示该行 |
| `frontend/src/app/globals.css` | 新增 `.rectification-range-delivery__switch-note`,与既有 `__provenance` 同字号同行高,未改间距与列宽 |
| `frontend/src/lib/rectification-agentic/user-copy.ts` | 新文案登记进 `listUserVisibleCopy()`,纳入机器腔词表与 D4 体检 |
| `frontend/docs/VOICE.md` | 增两行好/坏对照:D4 禁止措辞;冲突态按钮与确认句 |
| `frontend/DESIGN.md` | §11 区间交付卡补「冲突时换措辞,不换形状」一段 |
| `skills/.../references/candidate-comparison.md` | 新增 §6.1,写入 D1–D4 与拍板依据 |
### 具体文案
冲突态来源小字(原来只有第一句的前半):
> 出生记录时间 05:12,默认仍按这个时间排盘。你说的这些经历指向另一段时间,相差 5 分钟。你可以改用校正结果,也可以继续用记录
冲突态按钮:`更像这个``改用校正结果`
按钮下每列各一行:`选它之后,排盘会从出生记录时间 05:12 换成 04:53`
记录落在范围内时逐字不变:`出生记录时间 05:00,落在目前范围内`,按钮仍是「更像这个」。
### 红线自查
- 硬红线 3(不新增多余入口):复用同一个采用按钮与同一个 accept RPC,没有加第二个按钮,也没有加确认弹窗。D3 说的「确认处」落在按钮正下方的说明行——这是动手的地方,且能给出精确的 hh:mm → hh:mm。
- 硬红线 4(BUG-587):冲突态文案与确认句都没有出现「已确认 / 确定就是 / 唯一出生分钟是」,由测试正则锁住;采用仍是「校正采用时间」。
- D5`recordRangeConflict` 只读 `source` / `reportedTime` / `range` 三个已有量,不参与任何排序或淘汰;测试里额外断言冲突态与非冲突态的候选列表和代表分钟完全相同。
- Skill **未 bump**(仍 10.0.26),按任务书 §5 让步顺序 2 只改 references。理由:本单不改 Agent 的工具链或判据,只补一条表达规则;bump 会让存量 Case 绑旧版本,按 BUG-621 教训得额外验历史可打开,收益不抵风险。`docs/testing/` 清单里仍保留一条「历史 Case 能打开」的人工检查。
## 3. 验收数字
- `./node_modules/.bin/tsc --noEmit`**0 错**。
- `npm run lint`**0 error**120 warning,全部是既有的 `no-unused-vars`,不在本单范围内,未顺手修)。
- 定向:`npx tsx --test tests/rectification-record-conflict-copy-20260916.test.ts tests/rectification-birth-time-provenance-20260914.test.ts` → 9 tests / 9 pass / 0 fail。
`npx tsx --test tests/agent-voice-copy-contract.test.ts` → 18 tests / 18 pass / 0 fail。
- 全量 `npm test`
| | 基线 `37e6c519` | 本分支 |
|---|---|---|
| tests | 3329 | 3335 |
| pass | 3283 | 3288 |
| fail | **31** | **31** |
| skipped | 15 | 15 |
失败清单逐条 `diff` 后**完全一致**(31 条同名),全部是既有环境缺口:无 Docker 的数据库 / 迁移 / 计费 / RLS 套件,以及无外网的 ephemeris / VedAstro / staging 同步套件。
注:任务书硬红线写「失败数 = 基线 27 条」,那是 09-14 的数字;在实际基线 `37e6c519` 上实测就是 31 条,口径按实测基线走。
- 新增测试 6 条(`rectification-record-conflict-copy-20260916.test.ts`),测试总数只增不减。
- `npm run build`:通过,`/` 仍是 `○ (Static)`
- 首屏体积:同机各构建一次(基线用 `git stash` 把本轮改动摘掉后重建),`.next/static/chunks/**/*.js` 逐个 gzip 求和 —— 基线 **1,438,383 B**,本分支 **1,438,652 B****+269 B / +0.019 %**,在 ±2% 内。(Next 16 Turbopack 的构建输出不再打印 First Load JS 一列,故改用这个可复算的口径。)
### 改过的既有断言(AGENTS §7.3 三栏说明)
两条,都是同一个原因——被改的用例本身就处在冲突态:
| 文件 | 原值 | 新值 | 原因 |
|---|---|---|---|
| `tests/rectification-birth-time-provenance-20260914.test.ts` | `assert.ok(html.includes(RECTIFICATION_USER_COPY.rangeDeliveryMoreLikeThis))` | `assert.ok(html.includes(SWITCH_TO_RECTIFIED_LABEL))` + 断言不再出现「更像这个」 | BUG-691 D3。该用例是 05:12 对 04:48–05:07,正是冲突态。非冲突态的「更像这个」由新测试逐态锁住,不是弱化 |
| `tests/agent-voice-copy-contract.test.ts` | `assert.match(visible, /出生记录时间 05:12。目前范围不含这一分钟,相差 5 分钟/)` | 拆成三层断言(默认按记录排盘 / 指向另一段时间差 5 分钟 / 两条路都可以走)+ 按钮与确认句断言 + 全量 `FORBIDDEN_RECORD_VERDICT_PHRASE` 体检 | BUG-691 D2、D3。断言数从 1 条增到 6 条,是收紧不是放松 |
## 4. 环境缺口
- 无 Docker:数据库、迁移、计费、RLS 套件跑不了,失败清单与基线逐条一致(见上表)。
- 无外网:ephemeris / VedAstro / staging 同步套件同上。
- 无登录态与 Chrome:真实会话里「有医院记录 + 区间不含该分钟」的走查做不了,已写成 `docs/testing/rectification-record-conflict-copy-20260916.md`
- 本轮不动表,未跑 `npm run test:db`
## 5. 交付
- 只提交到 `codex/rectification-record-conflict-copy-20260916`**未推 staging**,验收与合入由 Claude 会话做。