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

8.0 KiB
Raw Blame History

PROGRESS · 记录与校正区间冲突:记录优先,分歧如实呈现(BUG-691)

  • 任务书:docs/tasks/TASK-rectification-record-conflict-copy-20260914.md
  • 分支:codex/rectification-record-conflict-copy-20260916worktree .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.tsreportedTimeOffsetCopyhospital_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_LABELswitchToRectifiedConfirmCopy()FORBIDDEN_RECORD_VERDICT_PHRASED4 锁)
frontend/src/lib/rectification-agentic/v9/divergence-panel.ts RangeDeliveryProjectionrecord_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):冲突态文案与确认句都没有出现「已确认 / 确定就是 / 唯一出生分钟是」,由测试正则锁住;采用仍是「校正采用时间」。
  • D5recordRangeConflict 只读 source / reportedTime / range 三个已有量,不参与任何排序或淘汰;测试里额外断言冲突态与非冲突态的候选列表和代表分钟完全相同。
  • Skill 未 bump(仍 10.0.26),按任务书 §5 让步顺序 2 只改 references。理由:本单不改 Agent 的工具链或判据,只补一条表达规则;bump 会让存量 Case 绑旧版本,按 BUG-621 教训得额外验历史可打开,收益不抵风险。docs/testing/ 清单里仍保留一条「历史 Case 能打开」的人工检查。

3. 验收数字

  • ./node_modules/.bin/tsc --noEmit0 错

  • npm run lint0 error120 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 会话做。