fix(rectification): unblock range-card tsc and restore post-adopt windows (BUG-583)
Independent Staging Quality Gate / validate (push) Successful in 13m23s
Independent Staging Quality Gate / publish (push) Successful in 30m54s

Null-check the candidate result before reading resultId so next build can ship. Adopt reconnects prospective windows on the first verify turn, and dismissing the range card now shows the collect hint.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-07 20:22:24 +08:00
co-authored by Cursor
parent f3e7270237
commit a00b069dcc
13 changed files with 194 additions and 16 deletions
+16
View File
@@ -9030,5 +9030,21 @@
- 复发自:BUG-558
- 修复版本:待发布(`codex/rectification-stop-rescore-fix-20260907`
## BUG-583 | 区间交付卡判空顺序使 tsc 失败,staging 无法部署
- 状态:resolved
- 首次发现:2026-09-07
- 最近更新:2026-09-07
- 影响面:`rectification-agentic-chat.tsx` 区间卡渲染、采用后首轮旁白、`RectificationRangeDelivery`「再补一件经历」
- 用户现象:staging 门禁与 `next build` 因 TypeScript 失败,BUG-581~582 的修复无法部署。采用后看不到承诺过的预测窗口。点「再补一件经历」后卡片消失、输入框上方没有下一句。
- 触发条件:`ab57d03f` 合入后跑 `tsc --noEmit`;或交付轮点「再补一件经历」;或采用后进入核对。
- 根因:渲染条件先读 `candidateResult.resultId` 再写 `candidateResult &&`,收窄发生在属性读取之后。`prospectiveWindowsNarration` 从交付旁白撤掉后没有接到采用后首轮。`onContinue` 只改本地 dismiss,不给采集提示。步骤条类名 `rectification-step-state` 已由 BUG-575 禁止,不能靠加回步骤条过关。
- 修复:判空提到 `dismissedRangeResultId` 之前。`persistNextInterviewIfIdle` 在已采用时把 `prospective_probes` 接到首轮旁白末尾;`deferredCareerWindow` 仍留在交付旁白。收起卡片后用 `RangeDeliveryContinueHint` 显示「第 1 步·收集经历」加 `continueCollectFallback`,不用被禁的步骤条类名。
- 验证:`frontend/tests/rectification-range-delivery-20260907.test.ts``tsc --noEmit` 原文见 `PROGRESS-rectification-range-delivery-fix-20260907.md`
- 防复发:区间卡渲染源码必须先出现 `candidateResult &&` 再读 `resultId`。采用后首轮 idle persist 必须调用 `appendPostAdoptProspectiveWindows`。聊天源码仍不得出现 `rectification-step-state`
- 相关记录:BUG-575、BUG-581、BUG-582
- 复发自:无(区间卡 `ab57d03f` 引入;任务书 4.2 验收未过)
- 修复版本:待发布(`codex/rectification-range-delivery-fix-20260907`
@@ -0,0 +1,50 @@
# PROGRESS · 区间交付卡修复单(2026-09-07
工作树:`.worktrees/rectification-range-delivery-fix-20260907`
分支:`codex/rectification-range-delivery-fix-20260907`
任务书:`docs/tasks/TASK-rectification-range-delivery-fix-20260907.md`
基线:`origin/staging` @ `f3e72702`(任务书写 `ab57d03f`;其上有验收文档提交)
本单状态:**待验收**。未 commit、未 push。
未改:采用 RPC 校验、确认门、`MIN_SEPARATION_LEAD``_relative_support``page.tsx`、Skill 版本(仍 10.0.15)、聊天源码不出现 `rectification-step-state`BUG-575)。
## 做了什么
- **3.1** `rectification-agentic-chat.tsx` 渲染条件改为 `showSelectionCards && candidateResult && dismissedRangeResultId !== candidateResult.resultId && …`
- **3.2** 选「接上」:`persistNextInterviewIfIdle``acceptedTime` 时把 `prospectiveWindowsNarration(receipt.prospective_probes)` 接到首轮旁白末尾。交付旁白仍留 `deferredCareerWindow`。跳过最后一道核对题的 `postAdoptVerifyDone` 不走 idle 包装,仍是原句。
- **3.3** 「再补一件经历」收起卡片后,输入框上方 `RangeDeliveryContinueHint` 显示 `STEP_STATE_COPY.collect.headline` + `continueCollectFallback`。不用被禁的 `.rectification-step-state`
- **3.4** BUG-583、CHANGELOG、本文件、场景第 5 条、DESIGN / VOICE。
## 三栏(被触碰断言)
| 用例 | 原值 | 新值 | 理由 |
| --- | --- | --- | --- |
| 区间卡渲染条件 | 先读 `candidateResult.resultId``candidateResult &&` | 先 `candidateResult &&` | TS18047 |
| 采用后首轮旁白 | 无 `prospectiveWindowsNarration` 调用点 | idle persist 已采用时追加 | 决策 2 接上 |
| 「再补一件经历」 | 只 `setDismissedRangeResultId` | 另显示收集经历提示 | 决策 3;不恢复步骤条类名 |
## 测试
开工前 `frontend` `./node_modules/.bin/tsc --noEmit; echo "tsc exit $?"` 原文:
```
src/components/rectification-agentic-chat.tsx(1655,67): error TS18047: 'candidateResult' is possibly 'null'.
tsc exit 2
```
修复后同一命令原文(stdout 为空,只有 echo):
```
tsc exit 0
```
- 任务书指定 TS 套件(`rectification-*.test.ts` + `consultation-*.test.ts` + `agent-voice-copy-contract.test.ts` + `skill-registry.test.ts`,排除 database):**1230 passed / 0 failed**`ab57d03f` 同切片 1227;本单 +3
- 本单改动文件 eslint**0 error**chat 上 2 条既有 hooks warning
- Docker `database-rectification-*.test.ts`:本机未跑,记 blocked
- 浏览器点选「再补一件经历」:无登录态 / Chrome 驱动,记环境缺口,见 `docs/testing/rectification-scenarios-20260907.md` §5
## 偏离
1. 步骤条文案用 `RangeDeliveryContinueHint``.rectification-continue-hint`),没有恢复 `.rectification-step-state`。BUG-575 防复发与 `rectification-step-state-20260906.test.ts` 禁止该类名。
2. 预测窗口挂在 `persistNextInterviewIfIdle`(采用 RPC 之后的首轮),不挂 `applyRectificationChoice` 的跳过核对收尾,以免改掉 `postAdoptVerifyDone` 全等断言。
+1 -1
View File
@@ -71,7 +71,7 @@
| `TASK-rectification-stale-compare-fix-20260907.md` | `PROGRESS-rectification-stale-compare-fix-20260907.md` | **P0**BUG-559 把过长 `candidate_split_hash` 塞进引擎比较键,答完性格/边界卡后比较静默失败;快照过期压过用户停止;holdout 用过期领域被改写成「再说一件事」;采集轮正文双写 | 已验收通过(P2 正文双写根因未拆、P3 重算节流 Map 只增不减) | `4e0db55f`(落地编号 BUG-577580);staging 未部署 |
| `TASK-rectification-stop-rescore-fix-20260907.md` | `PROGRESS-rectification-stop-rescore-fix-20260907.md` | **P0**:BUG-579 的停止路径用「裸重算」(`rescoreMinuteAfterWindowChange` 不重建 `inference_state`、不重放已答探针、不写 transition),停止后范围变宽、卡片变成引擎裸支持度、采用 RPC 报 `candidate_state_inconsistent`;无框区分题经 `spokenCollectFallbackFollowup` 变成 domain=other 的采集题,再次冒出开场句 `GENERIC_COLLECT_QUESTION`;holdout 采集排在带年月采集之前 | 已验收通过(逻辑);但同提交含区间卡 tsc 错,整体不可部署 | `ab57d03f`BUG-581582 |
| `TASK-rectification-range-delivery-card-20260907.md` | `PROGRESS-rectification-range-delivery-card-20260907.md` | 结尾重设计:四张分钟卡 + 相对支持度换成一张区间交付卡(范围、代表分钟、稳定/敏感主题、边界句)+ 只列未问 D9/D10/月宿分歧的 2~3 列对比面板(文案只取类型表),动作只有「按这个范围用 / 再补一件经历」;删交付旁白里三行预测窗口;Skill §9 口径改、bump 10.0.15 | **未通过**:tsc 1 错(判空顺序);P2 预测窗口句兑现不了;P3 再补经历无提示 | `ab57d03f`;修复单 `TASK-rectification-range-delivery-fix-20260907.md` |
| `TASK-rectification-range-delivery-fix-20260907.md` | `PROGRESS-rectification-range-delivery-fix-20260907.md` | 区间卡修复单:`candidateResult` 判空提到最前(tsc 阻断);预测窗口接到采用后首轮或删句;「再补一件经历」隐藏卡后给采集提示;进度记录须贴 tsc 原文 | 待领取(当天须合入,否则 BUG-581 无法部署) | `codex/rectification-range-delivery-fix-20260907`BUG-583 |
| `TASK-rectification-range-delivery-fix-20260907.md` | `PROGRESS-rectification-range-delivery-fix-20260907.md` | 区间卡修复单:`candidateResult` 判空提到最前(tsc 阻断);预测窗口接到采用后首轮或删句;「再补一件经历」隐藏卡后给采集提示;进度记录须贴 tsc 原文 | 待验收 | `codex/rectification-range-delivery-fix-20260907`BUG-583 |
| `TASK-api-not-configured-mislabel-20260904.md` | `PROGRESS-api-not-configured-mislabel-20260904.md` | 16 处路由把数据库瞬断(部署切换窗口)兜底翻译成 503「服务尚未配置」;改为仅配置错误用该文案,其余 `service_unavailable`,收敛为共享 helper | 已验收 | `5483649b`(BUG-542);2 条子进程测试留 CI Node 22 复核 |
| `TASK-rectification-ux-20260902.md` | `PROGRESS-rectification-ux-20260903.md` | 会话面空白假死与交互摩擦 | 已验收 | `d159f08e`(09-03 在新基线重做后合入,BUG-505509 |
@@ -88,5 +88,5 @@
- 若有分歧面板,每列只有 1~3 行,且都是没问过的 D9 / D10 / 月宿层
- 不见「相对支持度」「当前推荐」「采用此时间」
- 点「按这个范围用」成功,设置页出生时间状态变为已采用
- 点「再补一件经历」卡片收起,服务端范围不变
- 点「再补一件经历」卡片收起,输入框上方出现「第 1 步·收集经历」和「请继续说下一件…」,服务端范围不变