fix(rectification): keep targeted collect cards tappable after snapshot reread (BUG-669~671)
GET dropped the A–D card when the recast had no choice_frame, so a refresh left a disabled card and a collect-wait. Project from the persisted copy, rebuild the keep frame, and send a dead choice to repair-exit. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -10356,3 +10356,51 @@
|
||||
- 相关记录:BUG-653、BUG-654、BUG-661、BUG-664
|
||||
- 复发自:BUG-653(刷新只复用首轮边界层)
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-669 | 定向补事快照投影拿不到 choice_card,刷新后卡点不动
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-13
|
||||
- 最近更新:2026-09-13
|
||||
- 影响面:`projectRectificationChoiceCard`、GET `/api/rectification/cases/[caseId]` `choice_card`、内嵌 `RectificationChoiceCard`
|
||||
- 用户现象:六道带年月题后出现定向补事四点选;第一次能答,刷新或再拉快照后卡看得见、选项是灰的。
|
||||
- 触发条件:活动焦点为 `collect:targeted:<domain>`(含 persist 撞号后的 `:next`),schema 为服务端四点选且 `targeted_collect: true`。
|
||||
- 根因:`buildMethodFollowupPlan` 承接 `collect_method_evidence` 时不重建 `choice_frame`。`projectRectificationChoiceCard` 只把 `persistedVerifyCard()` 留给 `reverse_verify` / `out_of_sample_check`,无 frame 就返回 null。`projectCurrentQuestion` 仍给出 `kind: "choice"`,前端 `liveQuestion` 要求 GET 卡 `focus_id` 一致,于是 `disabled={!liveQuestion}`。`:next` 还会被「questionId 与 frame 全等」挡掉。
|
||||
- 修复:活动焦点 schema 满足 `targeted_collect === true` 且能解析出四点选时,直接按持久化文案投影 `choice_card`(`question_id` / `focus_id` 用焦点的、`scoring: false`、`stop_label`「这题跳过」),不依赖计划层 frame,也不做 questionId 全等比较。
|
||||
- 验证:`frontend/tests/rectification-targeted-card-live-20260913.test.ts`;`:next` 同样出卡。
|
||||
- 防复发:定向存在题的 GET 卡必须能从已持久化 schema 投影;不得只用计划层重建 frame 当唯一身份。区分题 `semantic_key` / `candidate_split_hash` 全等判定不得放宽(BUG-559 / BUG-581)。
|
||||
- 相关记录:BUG-661、BUG-654、BUG-591、BUG-510、BUG-498
|
||||
- 复发自:BUG-661(采集焦点 + 点选卡是新组合,落入 BUG-510 只修了核对题的洞)
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-670 | 承接焦点分支让模型把定向题改写成口述题
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-13
|
||||
- 最近更新:2026-09-13
|
||||
- 影响面:`buildMethodFollowupPlan` 承接当前焦点分支、`user_prompt_hint`
|
||||
- 用户现象:定向卡出现前先冒出一道 UI 不一样的口述题,回答后才变成点选卡。
|
||||
- 触发条件:活动焦点是定向存在题,计划层 `method_id: "active_focus"` 且 `choice_frame` 为空,提示词要求模型用 `spokenPrompt` 自己写题干。
|
||||
- 根因:承接分支只为 `reverse_verify` / `out_of_sample_check` / `distinguish_candidates` 重建点选。定向补事是史上第一个「采集焦点 + 点选卡」。
|
||||
- 修复:识别 `targeted_collect` schema 时用 `buildTargetedCollectExistenceFrame` 加持久化文案重建 `choice_frame`;`user_prompt_hint` 改为「照发服务端卡片,不要自己写题干。」
|
||||
- 验证:`frontend/tests/rectification-targeted-card-live-20260913.test.ts` 活动焦点为定向存在题时 `next_followup.choice_frame` 非空且 `question_id` 等于焦点题号。
|
||||
- 防复发:定向存在题的题干与选项仍是服务端自有;模型不得改写。不得因此放宽区分题身份校验。
|
||||
- 相关记录:BUG-669、BUG-661、BUG-559、BUG-581
|
||||
- 复发自:BUG-661
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-671 | 选择题无卡时不得停在采集等待态
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-13
|
||||
- 最近更新:2026-09-13
|
||||
- 影响面:`rectification-agentic-chat` 问题缺口、`interviewChoiceCardUnavailable`、`repair-exit`
|
||||
- 用户现象:卡点不动时,时间轴写「再说一件带年月的事就能继续」,没有修复入口。刷新页面后选项依旧是灰的。
|
||||
- 触发条件:`current_question.kind === "choice"` 且 GET `choice_card` 为空。
|
||||
- 根因:有持久化选择题时走 `persisted_question` / 采集等待,不进 `unavailable`。刷新只重取同一份缺卡快照,救不回来。未答的死卡还会用消息里的选项画成 disabled。
|
||||
- 修复:选择题缺卡时不记为采集等待、不记为已持久化可见题,直接进现有 `unavailable` + `repair-exit`(「接着问」);未答的死卡不再画成 disabled 点选。
|
||||
- 验证:`frontend/tests/rectification-targeted-card-live-20260913.test.ts`;表面合同锁 `deadChoice`、`unansweredDeadChoice` 与 repair-exit 路径。
|
||||
- 防复发:`kind=choice` 且无 `choice_card` 不得静默停在「再说一件带年月的事」,也不得画看不见的可点卡。BUG-669 修好后这条是兜底。
|
||||
- 相关记录:BUG-669、BUG-627、BUG-652、BUG-510
|
||||
- 复发自:BUG-669
|
||||
- 修复版本:待发布
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
# 进度 · 定向补事卡刷新后点不动(P0,2026-09-13)
|
||||
|
||||
## 范围
|
||||
|
||||
- 工作树:`.worktrees/rectification-targeted-card-dead-20260913`(未改原仓脏工作区 `codex/minute-rectification-p0`)
|
||||
- 分支:`codex/rectification-targeted-card-dead-20260913` tracking `origin/staging` @ `3c75643b`(含任务书;代码基线仍是已部署的 `ab1ade59`)
|
||||
- 任务单:`docs/tasks/TASK-rectification-targeted-card-dead-20260913.md`
|
||||
- BUG-669:GET 按持久化文案出定向卡
|
||||
- BUG-670:承接焦点重建 `choice_frame`,禁止模型改写题干
|
||||
- BUG-671:`choice` 无卡时走 repair-exit,不画灰卡、不进采集等待
|
||||
- 不改 `SCORE_DELTA`、确认门、区分题 `semantic_key` / `candidate_split_hash` 全等
|
||||
- Skill 版本不变(10.0.25)
|
||||
|
||||
## 完成
|
||||
|
||||
- T1:`projectRectificationChoiceCard` 在 `targeted_collect` 四点选 schema 上直接投影,`:next` 同样出卡,`scoring: false`,`stop_label`「这题跳过」,不用计划层 frame,也不做 questionId 全等
|
||||
- T2:`buildMethodFollowupPlan` 承接 `collect_method_evidence` 定向存在题时用 `buildTargetedCollectExistenceFrame` 重建 frame,hint 为「照发服务端卡片,不要自己写题干。」
|
||||
- T3:`interviewChoiceCardUnavailable`;聊天把死卡当成 `unavailable` + 「接着问」;未答死卡不再以 disabled 点选画出
|
||||
- T4:`frontend/tests/rectification-targeted-card-live-20260913.test.ts`;BUG-669~671;场景 0d 加刷新仍可点 / 不得看得见点不动
|
||||
|
||||
## 验收(本机,未部署)
|
||||
|
||||
- `cd frontend && ./node_modules/.bin/tsc --noEmit`:0 错
|
||||
- `cd frontend && npm run lint`:0 error / 120 warning(既有)
|
||||
- 相关 TAP fail=0:`rectification-targeted-card-live-20260913` + `rectification-targeted-collect-cards-20260913` + `rectification-question-ownership` + `rectification-v9-contracts` + `rectification-surface-state` + `rectification-choice-card`:**82 / 82**(新文件 4/4)
|
||||
- 全量 `cd frontend && ./node_modules/.bin/tsx --test tests/*.test.ts tests/*.test.tsx`:tests **3144**(≥ `ab1ade59` 实测 3139);pass 3139 / fail 5 / skipped 0。5 条失败均为并行 Docker 夹具:槽位超时或 `database migration failed`(`database-admin-identity`、admin customer reset、`rectification-pr4-database`、`rectification-v9-database` 两条),本单未改迁移/后台。
|
||||
- `cd frontend && ./node_modules/.bin/next build --webpack`:退出 0;`/` 仍 `○ Static`。默认 Turbopack 仍不适配 worktree 外 `node_modules` 软链。standalone 复制 `rishi-ai-mcp/.cursor|.vscode` 有 EPERM 警告,不影响路由表。
|
||||
- 首屏 `rootMainFiles` gzip-9:**130934 B** vs `ab1ade59` 的 130872 B(**+62 B / +0.047%**,±2% 内)
|
||||
- 预检:`pre_work_check.py` 一次因 fragment_scan 90s / focused_tests 45s 超时失败;`remote_visibility=verified`,`external_engine_adapters_ok=true`。随后用主仓 `.venv` 跑 focused pytest(不含整机 fragment scan)20 passed。
|
||||
- 未做登录态真机场景 0d(无本地会话)
|
||||
|
||||
## 未做
|
||||
|
||||
- 未 commit / 未 push
|
||||
- 未部署、未真机刷新走查
|
||||
- 未执行 `TASK-rectification-tie-break-entry-fix-20260913.md`(按串行排在本单之后)
|
||||
@@ -182,7 +182,7 @@
|
||||
|
||||
| `TASK-rectification-tie-break-entry-fix-20260913.md` | — | 修复单:参考题入口只读 `window_scan` 标志位 → 两道答完后仍显示、再点弹「现在没有可答的参考题」;并按产品拍板改成点一次连出 D9+D10(BUG-666~668) | 待执行 | `codex/rectification-tie-break-entry-fix-20260913` |
|
||||
|
||||
| `TASK-rectification-targeted-card-dead-20260913.md` | — | **P0**:定向补事卡在快照投影里拿不到 `choice_card`(承接焦点分支不重建 `choice_frame`),卡片看得见点不动、流程停在采集等待态;模型还会把定向题改写成口述题(BUG-669~671)。先于 tie-break 修复单执行 | 待执行 | `codex/rectification-targeted-card-dead-20260913` |
|
||||
| `TASK-rectification-targeted-card-dead-20260913.md` | `PROGRESS-rectification-targeted-card-dead-20260913.md` | **P0**:定向补事卡在快照投影里拿不到 `choice_card`(承接焦点分支不重建 `choice_frame`),卡片看得见点不动、流程停在采集等待态;模型还会把定向题改写成口述题(BUG-669~671)。先于 tie-break 修复单执行 | 待验收 | `codex/rectification-targeted-card-dead-20260913` |
|
||||
|
||||
## 命名与归档
|
||||
|
||||
|
||||
@@ -62,6 +62,8 @@
|
||||
- 四条线都点「没有」后出「目前范围」卡;卡下有「还能再收窄」
|
||||
- 不点「再答两道参考题微调排序」时不得出现 D9/D10 性格对照卡
|
||||
- 点了该入口后才出现性格对照卡;答完后头名可变,但 `can_adopt` 不变、没有淘汰
|
||||
- 答完一张定向卡后刷新页面,卡片仍可点
|
||||
- 整轮不得出现看得见点不动的卡
|
||||
- 全程不出现「这次给出」「最终」
|
||||
|
||||
## 1. 范围:家人说两点到四点
|
||||
|
||||
Reference in New Issue
Block a user