fix(rectification): stop spoken collect once the training gate opens (BUG-1084..1087)
Once the discriminator training gate is open, only choice cards are asked and the range card goes out when they are exhausted; targeted lines, their re-ask and guided windows no longer hold the card or invite more events. Delivery body says how many choice questions were used instead of the event fit percent; narration names an excluded cluster instead of "range unchanged"; a delivered turn no longer carries a collect question. Offline replay (v4, 3 radii x 2 directions): truth in range 20/20 in every cell; guided-window injections give the same width in truth and opposite directions, so red line 1 was revised by product to truth-in-range only. Skill 10.0.31 -> 10.0.32 (10.0.31 kept as deprecated for pinned cases). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
bcf0c86feb
commit
ea21743b09
+38
-26
@@ -10186,6 +10186,7 @@
|
||||
- 修复:刷新后仍无带年月题则出定向补事口述题(剩余换升层映射到领域,≥2 个具体例子,不带推算年份)。答新事则重算回 S2;答「没有了」才交付。交付条件改为收敛,或刷新与定向补事都用尽,或用户主动停。卡片标题「目前范围」,卡下「还能再收窄」取定向补事首条。禁用「这次给出」「最终」。
|
||||
- 验证:`frontend/tests/rectification-probe-pool-exhausted-20260911.test.ts` T3/T4;`rectification-collection-question-pool.test.ts` 定向补事;`agent-voice-copy-contract.test.ts` 禁词。
|
||||
- 防复发:`!separation.sufficient && !probe` 在 `refreshExhausted && targetedCollectExhausted` 之前不得 `completeWithRange` / `finish`。不得静默空载体(BUG-652)。
|
||||
- 2026-09-29 产品修订:见 TASK-rectification-futile-collect-stop-20260929 D1——训练门开后定向补事关闭,`targetedCollectExhausted` 门开后恒为真;「刷新先于交付」不变(BUG-1084)。
|
||||
- 相关记录:BUG-653、BUG-651、BUG-652、BUG-655、BUG-629
|
||||
- 复发自:BUG-651(池空即交付,未做定向补事)
|
||||
- 修复版本:待发布
|
||||
@@ -11737,6 +11738,7 @@
|
||||
- 修复:无领域轨道的窗口 `domain = "any"`,题干写「YYYY 年 M 到 M 月之间,有没有什么事,比如<开放领域口语 2~3 个>?」;口语从 `KIND_ORAL` 表取,剔除已拒答与已覆盖的领域,决策层不按领域写 `if`。`windowAlreadyAsked` 的键去掉领域,只看年 + 月区间。A 之后录入卡的芯片默认第一个仍开放的领域。`nara:d9` / `nara:d10` 保持固定领域;该领域被拒答时也退回 `any`。
|
||||
- 验证:`tests/test_event_probes_guided_windows.py`(真实引擎 20 分钟窗 golden,7 passed)断言无领域轨道窗口是 `any`、d9/d10 保留固定领域、拒答领域退回 `any`;`frontend/tests/rectification-guided-collect-20260916.test.ts` 断言开放题干的口语列表 ≤3 条、同一窗口换领域标签也不重问、芯片默认第一开放领域。
|
||||
- 防复发:窗口的 `domain` 只能来自真正带领域的轨道;一个边界窗口是一个问题,已问判定不得把领域并进键里。
|
||||
- 2026-09-29 产品修订:见 TASK-rectification-futile-collect-stop-20260929 D1——训练门开后不再问引导窗口题(BUG-1084);本条对门前仍适用。
|
||||
- 相关记录:BUG-740、BUG-741、BUG-751
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
@@ -11770,6 +11772,7 @@
|
||||
- **口径提醒**:按 D2 + D6,10 分钟门槛**不改变出卡时机**,本轮实际生效的是题源变多(引导窗口题 + 跳过线重问 + 七条线全部轮到)、线问完才出。
|
||||
- 验证:`frontend/tests/rectification-precision-gate-20260916.test.ts` 新增五条——引导池空但 `refreshExhausted=false` 不交付、门槛达标但定向线未问完继续问、所有线问完但门槛未达**照现行规则出卡(含采用)**、门槛值在采集出口也照常上报、helper 路径上报 null;`rectification-decision-authority.test.ts` 的公开字段深比较跟上 `precision_gate_met`。撤回短路后连锁打红的 41 条既有断言(16 条来自 BUG-748 的基线红 + 25 条本轮新红)全部按「原值 / 新值 / 原因」三栏处置,均为 D5「七条线全部轮到」与 D6「问完再出」的预期变化。
|
||||
- 防复发:门槛不得出现在任何采集分支的条件里,也不得成为「题源已空仍不出卡」的理由(那会造出没有题也没有卡的死角,违反 BUG-652);缺省 flag 只能表示「门槛不参与」,不能表示「放行」。
|
||||
- 2026-09-29 产品修订:见 TASK-rectification-futile-collect-stop-20260929 D1——训练门开后不再问定向七条线、跳过线重问与引导窗口题,它们不再挡卡;本条「七条线全部轮到、线问完才出」只在训练门未开时成立(BUG-1084)。
|
||||
- 相关记录:BUG-654、BUG-656、BUG-740、BUG-748、BUG-749
|
||||
- 复发自:BUG-654(刷新与定向线未穷尽不得交付,被门槛短路绕开)
|
||||
- 修复版本:待发布
|
||||
@@ -14596,54 +14599,63 @@
|
||||
|
||||
## BUG-1084 | 生时校正开场后一路邀请补经历,补来的经历不收窄范围
|
||||
|
||||
- 状态:investigating(Claude 诊断 + 离线复现;修复见 `docs/tasks/TASK-rectification-futile-collect-stop-20260929.md` T1)
|
||||
- 状态:resolved(代码与回归测试;真机待部署后按 `docs/testing/rectification-futile-collect-stop-20260929.md` 复核)
|
||||
- 首次发现 / 最近更新:2026-09-29 / 2026-09-29
|
||||
- 影响面:`core/rectification-decision.ts::mayDeliverOnPrecision`、`v9/collection-question-pool.ts::cardHoldingLinesExhausted`(七条线 + 重问挡卡)、`user-copy.ts::rangeDeliveryIndistinct`、输入框占位、右栏 `refinement_packet` 的「可再补一件…」。
|
||||
- 影响面:`v9/collection-question-pool.ts`(`guidedWindowPool` / `guidedRetryPool` / `targetedCollectPool` / `rangeNarrowHint`)、`core/rectification-decision.ts::mayDeliverOnPrecision`(经 `cardHoldingLinesExhausted` / `targetedCollectExhausted`)、`user-copy.ts::rangeDeliveryIndistinct`、`v9/step-state.ts`、`rectification-board-model.ts`(右栏阶段句)、`rectification-agentic-chat.tsx`(输入框占位)、Skill §6。
|
||||
- 用户现象:产品 staging 真机,31 分钟窗口,开场说 12 件带年份的经历、之后答约 10 张卡,界面「已对照 22 件」,范围始终是整窗;右栏和追问一直请用户再补经历。
|
||||
- 触发条件:训练门已开后,交付卡仍等七条线定向题及其重问问完;采集来的经历只进引擎先验。
|
||||
- 根因:打字经历只经 `_relative_support` 正比例先验(BUG-560),差距 1–2 分,够不到淘汰线 8 分;`buildInferenceState` 对 `classified_from === "evidence"` 的「是」跳过计分。能动分的只有点选卡 ±2。流程却按 09-16 / 09-26 决策继续索要经历。
|
||||
- 已确认事实(虚构出生日 12 例,±15 分钟,事件形状同真机):12 件经历后 11/12 例范围 = 整窗;先验 9–11 分;原始分差一倍的例子换算后只差 8、剪 2 分钟;选择题全按真值作答后宽度中位 17 分钟,≤10 分钟 2/12。
|
||||
- 修复:待执行(产品 2026-09-29 D1:采集只为开闸,门开后只问点选卡,问完即出卡)。
|
||||
- 验证:待补。
|
||||
- 防复发:待补。
|
||||
- 相关记录:BUG-560(blocked)、BUG-747~752、BUG-689、BUG-1089
|
||||
- 修复(产品 2026-09-29 D1):`COLLECT_AFTER_TRAINING_GATE = false` + `spokenCollectClosed(evidence)`:训练门开后引导窗口、跳过线重问、定向七条线三个池返回空,于是它们不再被问、也不再挡卡(`targetedCollectExhausted` / `cardHoldingLinesExhausted` 门开后为真),点选卡问完即交付。门开后的收窄提示只剩「现在还剩 … 个候选。」;右栏阶段句按 `precision_stage.current` 取前端文案(冻结文件 `refinement_packet.py` 不改);步骤条、输入框占位去掉补经历邀请。门未开时采集照旧;对照件(holdout)验证线不在 D1 范围。
|
||||
- 离线回放(硬红线 1,2026-09-29 修订为「真值在区间每格不降」):`scripts/research/futile_collect_stop_replay.py`,v4 开放集六格真值在区间全部 20/20;宽度中位 ±10 truth 14→15、±30 两格 34→33、±60 两格 53→56,truth / opposite 注入宽度几乎相同,判为无方向信息。
|
||||
- 验证:`frontend/tests/rectification-futile-collect-stop-20260929.test.ts`(七个领域表驱动:门开 → 三个池空、定向题 null、挡卡线视为问完;门关 → 重问池仍在、仍采集;收窄提示、右栏、步骤条、输入框无邀请);既有断言 20 个文件按三栏改(见 PROGRESS)。
|
||||
- 防复发:门开后不得新增任何口述补事题源;要恢复只能改 `COLLECT_AFTER_TRAINING_GATE` 一处,并先过 `TASK-rectification-typed-event-scoring-research-20260929` 的研究门。
|
||||
- 相关记录:BUG-560(blocked)、BUG-654、BUG-747~752、BUG-689、BUG-1089
|
||||
- 复发自:无(BUG-560 的用户可见后果,旧记录只处理了尺度,未处理流程)
|
||||
- 修复版本:未修
|
||||
- 修复版本:分支 `codex/rectification-futile-collect-stop-20260929`,未部署
|
||||
|
||||
## BUG-1085 | 生时校正交付正文「对照了 N 件经历,事件吻合率 P%」误导
|
||||
|
||||
- 状态:investigating
|
||||
- 状态:resolved(代码与回归测试;真实模型正文待部署后复核)
|
||||
- 首次发现 / 最近更新:2026-09-29 / 2026-09-29
|
||||
- 影响面:`user-copy.ts::deliveryTurnNarration`、`frontend/src/mastra/agentic-rectification.ts` 交付三句提示。
|
||||
- 影响面:`user-copy.ts::deliveryTurnNarration`、`mastra/rectification-v9-tools.ts::batchRangeAfterRescore`、`frontend/src/mastra/agentic-rectification.ts` 交付三句提示、Skill §7。
|
||||
- 用户现象:范围一分没缩,正文写「对照了 22 件经历,事件吻合率 95%」,读起来像很有把握。
|
||||
- 根因:N 含不参与收窄的口述经历(BUG-1084);P 是经历吻合度,与候选能否分开无关。
|
||||
- 修复:待执行(止血单 T2:删吻合率与件数,改写「用了 M 道选择题」,缩不下去时直说)。
|
||||
- 相关记录:BUG-1084
|
||||
- 修复:第二句改「用了 M 道选择题」(`scoredChoiceCount`:`classified_from === "choice"` 且不是「说不好」),M=0 时省略;范围不比开场窄时加「这个窗口按现在的方法缩不下去。」。`range_after_rescore` 去 `event_fit_percent`,加 `choice_count` / `range_not_narrowed`;Agent 提示与 Skill 10.0.32 同步。区分不开句改「这几个时刻按现在的方法区分不开。」
|
||||
- 验证:`rectification-futile-collect-stop-20260929.test.ts` 交付正文与提示 / Skill 文本两条;`agent-voice-copy-contract`、`rectification-delivery-ui-simplify-20260908`、`rectification-adopt-narration-20260904` 断言按三栏改。
|
||||
- 防复发:交付气泡不得出现「吻合率」「对照了」「补一件」「再说一件」;吻合率只留在折叠验证报告里。
|
||||
- 相关记录:BUG-1084、BUG-1055
|
||||
- 复发自:无
|
||||
- 修复版本:未修
|
||||
- 修复版本:分支 `codex/rectification-futile-collect-stop-20260929`,未部署
|
||||
|
||||
## BUG-1086 | 答题后剩余区间变成多段时,旁白仍说「范围没变」
|
||||
## BUG-1086 | 答题后中间一段被排除,旁白仍说「范围没变」
|
||||
|
||||
- 状态:investigating(代码走读确认,待执行方写失败测试复现)
|
||||
- 状态:resolved
|
||||
- 首次发现 / 最近更新:2026-09-29 / 2026-09-29
|
||||
- 影响面:`core/credible-range.ts::unionStillValidRange`、`v9/probe-explain.ts::explainRangeChange`、`v9/choice-action.ts::composeChoiceNarration`。
|
||||
- 影响面:`core/candidate-window.ts::unionWindowIntervals`、`core/credible-range.ts`、`v9/probe-explain.ts`、`v9/choice-action.ts::composeChoiceNarration`、`v9/answer-choice.ts`。
|
||||
- 用户现象:中间某段已被排除,旁白仍是「已记录,范围没变;X 领先,Y 落后」。
|
||||
- 根因(走读):多段时 `unionStillValidRange` 返回 `null`,`explainRangeChange` 遇 `null` 返回空串,旁白落到「范围没变 + 领先落后」分支。
|
||||
- 修复:待执行(止血单 T3,用 `credible_intervals` 比较)。
|
||||
- 根因(执行时更正任务书):`unionWindowIntervals` 按窗口段合并成首尾包络,同一段内中间簇掉出 8 分线时元组不变,`explainRangeChange` 判「范围没变」;只有跨午夜多段时元组才为 `null`(那时同样落到「范围没变 + 领先落后」分支)。诊断时写的「多段 → null」只覆盖后一种。
|
||||
- 修复:`stillValidCandidates` + `excludedClusterRanges(before, after)`:答题前在范围内、答题后不在的簇(相邻合并)即被排除的段;首尾不变但有排除时旁白写「已记录,排除了 HH:MM–HH:MM。」;无排除时仍是「范围没变」。
|
||||
- 验证:`rectification-futile-collect-stop-20260929.test.ts`「an interior cluster leaving the range is narrated as 排除了, never 范围没变」(首尾不变、元组为 null、无排除三种)。
|
||||
- 防复发:旁白判断「变没变」不得只比首尾元组;以候选集合为准。
|
||||
- 相关记录:BUG-569、BUG-634
|
||||
- 复发自:BUG-634 的旁白分支未覆盖多段情形
|
||||
- 修复版本:未修
|
||||
- 复发自:BUG-634 的旁白分支未覆盖「首尾不变、中间少一段」
|
||||
- 修复版本:分支 `codex/rectification-futile-collect-stop-20260929`,未部署
|
||||
|
||||
## BUG-1087 | 交付轮同时带出一道采集题(「再问下去也分不开了」+「身体这边再问一次」)
|
||||
|
||||
- 状态:investigating(真机截图;根因未定位)
|
||||
- 状态:resolved(D1 后路径不可达,回归测试保留)
|
||||
- 首次发现 / 最近更新:2026-09-29 / 2026-09-29
|
||||
- 影响面:交付轮出口、`guidedRetryPool` / 跳过线重问(候选入口,未确认)。
|
||||
- 用户现象:同一轮既显示交付状态与「再问下去也分不开了」,又在气泡末尾问一道健康线重问题。
|
||||
- 修复:待执行(止血单 T4,先按事故形状写失败测试,再定位根因写回本条)。
|
||||
- 相关记录:BUG-652、BUG-1084
|
||||
- 复发自:待定
|
||||
- 修复版本:未修
|
||||
- 影响面:`v9/answer-choice.ts::persistExhaustionCollect`、`persistNextInterviewIfIdle`、`v9/method-followup.ts::targetedCollectFollowup`(经 `guidedRetryPool`)、`core/rectification-decision.ts::classifyStop`。
|
||||
- 用户现象:同一轮既显示交付状态与「再问下去也分不开了」,又在消息里挂一道健康线重问题。
|
||||
- 触发条件:训练门已开;某条定向线被跳过一次(重问池里有它);多数点选答「记不清 / 跳过」→ `classifyStop` 给 `user_uncertainty_too_high`。
|
||||
- 根因:`user_uncertainty_too_high` 直接 `deliverRange`,不经 `mayDeliverOnPrecision`(不看重问是否问完),决策与界面都是交付态;`persistNextInterviewIfIdle` 走交付 / 耗尽分支进 `persistExhaustionCollect`,它的下一问兜底是 `targetedCollectFollowup`(不传窗口,但含跳过线重问池),于是把 `collect:targeted:health_pressure:retry` 写成活动焦点、挂在这一轮上。09-26 D2 只把引导窗口从交付后的计划里拿掉(`method-followup.ts` 注释「Retry and targeted lines are unchanged」),重问与定向线仍会跟在交付卡下面。
|
||||
- 修复:D1 后训练门开时重问池、定向池为空,这条路径不再可达;未另改交付分支。
|
||||
- 验证:`rectification-futile-collect-stop-20260929.test.ts`「incident shape: a delivering turn does not also ask the skipped-line re-ask」——同一用例在基线 `56722063` 上红(写入焦点 `collect:targeted:health_pressure:retry`,旁白「…再对照几件经历会更准」),本分支绿。
|
||||
- 防复发:交付态(`sessionOutcomeAllowsDelivery`)下不得写采集焦点;若将来恢复门开后采集(`COLLECT_AFTER_TRAINING_GATE`),必须同时让交付分支不走 `targetedCollectFollowup`。
|
||||
- 相关记录:BUG-652、BUG-1084、BUG-503
|
||||
- 复发自:无
|
||||
- 修复版本:分支 `codex/rectification-futile-collect-stop-20260929`,未部署
|
||||
|
||||
## BUG-1088 | 学业质量题一律问「那次上大学」,只记得年份的经历显示成「YYYY 年 1 月」
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,95 @@
|
||||
# PROGRESS · 生时校正止血单(2026-09-29)
|
||||
|
||||
- 任务书:`docs/tasks/TASK-rectification-futile-collect-stop-20260929.md`
|
||||
- 分支:`codex/rectification-futile-collect-stop-20260929`(基线 `origin/staging` `56722063`),**未推送**。
|
||||
- 执行方:Claude fork 子代理(直接执行模式)。
|
||||
- 结论(第一轮):硬红线 1(离线回放)按原口径未过,停工回报。
|
||||
- **2026-09-29 续做**:产品决定「删掉门开后的引导补经历题,接受回放结果」,红线 1 改为「每格真值在区间不降」(见任务书「2026-09-29 修订」)。按修订口径六格全过,继续完成 T1–T5,见文末「第二轮」。
|
||||
|
||||
## 回放(硬红线 1)
|
||||
|
||||
`PYTHONHASHSEED=0 python3 scripts/research/futile_collect_stop_replay.py`(203 秒)→ `docs/research/futile_collect_stop_replay_2026_09_29.json`。v4 开放集 20 例;基线 = 六题后注入前两道引导窗口题(线上 `GUIDED_WINDOW_CASE_LIMIT = 2`);D1 = 六题后不注入。定向七条线要真人日期,两边都不建模(同 09-26 回放)。
|
||||
|
||||
| 半径 | 注入方向 | 基线 真值在区间 | 基线 宽度中位 | D1 真值在区间 | D1 宽度中位 | 变宽例数 | 丢真值例数 | 过门 |
|
||||
| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | --- |
|
||||
| ±10 | truth | 20/20 | 14 | 20/20 | **15** | 1 | 0 | 否 |
|
||||
| ±10 | opposite | 20/20 | 15 | 20/20 | 15 | 0 | 0 | 是 |
|
||||
| ±30 | truth | 20/20 | 34 | 20/20 | 33 | 1 | 0 | 是 |
|
||||
| ±30 | opposite | 20/20 | 34 | 20/20 | 33 | 1 | 0 | 是 |
|
||||
| ±60 | truth | 20/20 | 53 | 20/20 | **56** | 5 | 0 | 否 |
|
||||
| ±60 | opposite | 20/20 | 53 | 20/20 | **56** | 5 | 0 | 否 |
|
||||
|
||||
读法:
|
||||
|
||||
1. 真值在区间六格全部 20/20,没有一例因 D1 丢真值。
|
||||
2. 宽度中位三格变宽(±10 truth +1,±60 两个方向 +3),按任务书「任何一格变差就停」判不过。
|
||||
3. **与诊断不一致的发现**:引导窗口题注入的经历确实会移动交付区间,而且与注入方向关系不大。±60 上 truth / opposite 的基线中位同为 53;个例如一例 ±60 D1 95 分钟、opposite 注入 43、truth 注入 45。任务书「门开后打字经历约等于 0」的判断对引导窗口题(落在大运边界日的经历)不成立;它们的收窄不依赖方向,更像是边界日事件改变引擎先验后把某些边缘簇推出 8 分线,而不是提供了真值信息。是否接受「区间多窄 1–3 分钟但不带信息」需要产品 / 架构重新决定,本单不调参数。
|
||||
|
||||
## 已做的代码(WIP,未对齐测试)
|
||||
|
||||
- T1:`collection-question-pool.ts` 加 `COLLECT_AFTER_TRAINING_GATE = false` / `spokenCollectClosed`,门开后引导窗口、重问、定向七条线三个池返回空;门开后不可交付时的收窄提示不再邀请补经历;右栏 `precision_stage` 按 stage id 取前端文案(`PRECISION_STAGE_BOARD_COPY`,不改冻结文件、不做中文正则);步骤条交付态 `next` 去掉「或补一件带月份的经历」;输入框默认 / 交付后占位改为不邀请。
|
||||
- T2:`deliveryTurnNarration` 删「对照了 N 件经历,事件吻合率 P%」,改「用了 M 道选择题」(`scoredChoiceCount`),范围与开场同宽时加「这个窗口按现在的方法缩不下去」;`rangeDeliveryIndistinct` 去掉补经历句;`range_after_rescore` 去 `event_fit_percent`,加 `choice_count`、`range_not_narrowed`;Agent 提示第 5 条同步。Skill 10.0.31 → 10.0.32(§6 采集规则、§7 交付三句、references/conversation-strategy.md),10.0.31 置 deprecated,registry sha `c2cab136…4cee`(10.0.31 用同一函数复算得 `51a91251…13c1`,与登记一致);18 处版本断言按三栏注释改。
|
||||
- T3:**更正任务书根因**:`unionWindowIntervals` 按窗口段合并成「首尾包络」,同一段内中间簇被排除时元组不变、也不会变成 `null`;只有跨午夜多段时才是 `null`。修法按候选比较:`stillValidCandidates` + `excludedClusterRanges`,旁白改为「已记录,排除了 HH:MM–HH:MM。」。
|
||||
- T4:未做(未写复现测试)。
|
||||
|
||||
## 测试
|
||||
|
||||
- 基线(Node 22.14,`npm test`):4335 项,4280 通过 / 24 失败 / 31 跳过;24 条失败全是 Postgres / Docker / staging 同步类环境项,清单在执行机 scratchpad `baseline-fail.txt`。
|
||||
- `tsc --noEmit`:T1–T3 后 0 错误(Skill 版本改动后未复跑)。
|
||||
- 改动后全量:跑到约 2600 项时因停工中止,已观察到 **19 条新增失败**,全部是编码旧流程(门开后仍口述采集 / 定向线挡卡)的校正测试,例如「persistNextInterviewAfterChoice after family denial collects remaining dated events」「collect-phase nonterminal exit persists a spoken collect when public can_adopt is closed」「delivery and adopt turns keep representative-minute boundary semantics」。未逐条改断言,未做三栏说明。
|
||||
- lint / build / gzip:未跑。
|
||||
|
||||
## 未做
|
||||
|
||||
T4、T3 回归测试、VOICE / DESIGN / CHANGELOG / 真机清单、BUG-1084~1087 状态更新(保持 investigating)、BUG-747~752 修订段。
|
||||
|
||||
|
||||
## 第二轮(2026-09-29,产品修订后续做)
|
||||
|
||||
### 红线 1(修订口径)
|
||||
|
||||
上表六格「真值在区间」全部 20/20 = 基线,**过**。宽度中位只上报:±10 truth +1、±30 两格 −1、±60 两格 +3。truth / opposite 注入宽度几乎一样(例:±60 一例 D1 95 分钟,truth 注入 45、opposite 注入 43;另有注入后反而变宽的 53→59、57→85、5→11),引导窗口题不带方向信息。
|
||||
|
||||
### 各项
|
||||
|
||||
| 项 | 状态 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| T1 D1 出卡时机(BUG-1084) | 完成 | `COLLECT_AFTER_TRAINING_GATE=false` + `spokenCollectClosed`:门开后三个口述池为空 → 不问、不挡卡;门开后收窄提示只剩候选数;右栏按阶段 id 取前端文案;步骤条、输入框占位去邀请。对照件(holdout)验证线不在 D1 范围,照旧。 |
|
||||
| T2 D2 交付正文(BUG-1085) | 完成 | 「用了 M 道选择题」+ 缩不下去句;`range_after_rescore` 换字段;Agent 提示、Skill 10.0.31 → 10.0.32(10.0.31 deprecated,sha `c2cab136…4cee`)。 |
|
||||
| T3 D3 旁白(BUG-1086) | 完成 | 任务书根因更正(首尾包络,不是 null),按候选集合求被排除段。 |
|
||||
| T4 D4 交付轮不带采集题(BUG-1087) | 完成 | 事故形状用例在基线 `56722063` 上红(写入 `collect:targeted:health_pressure:retry`),本分支绿;根因见 BUG-1087;D1 后路径不可达,测试保留。 |
|
||||
| T5 回放与记录 | 完成 | 回放脚本 / JSON;CHANGELOG、DESIGN §10b、VOICE、真机清单、BUG-1084~1087、BUG-654/749/751 修订段、README。 |
|
||||
|
||||
### 既有断言改动(原值 / 新值 / 原因写在测试文件里,标「(2)」)
|
||||
|
||||
共 37 个既有测试文件(不含新增文件),约 90 处带「原值」注释的改动(含 18 处版本号)。大类:
|
||||
|
||||
1. **回到 BUG-751 之前的值**(门开后定向线不挡卡):`rectification-coverage-collect`、`-provisional-adopt`、`-occupation-coverage-exit`、`-holdout-renderable`、`-convergence-budget`、`-range-offer-deadend`、`-exhaustion-exit-20260906`、`-delivery-vs-collect-20260914`、`-adopt-flow-fix-20260903`、`-collect-direction-20260904`(4 处)、`-answer-choice`(2)、`-adopt-narration-20260904`(6)、`-collect-stall`(5)、`-choice-card`、`-probe-pool-exhausted-20260911`(3)、`-eight-method`(2)、`-superseded-focus`、`-unstampable-probe-20260914`(放宽为「或落到非空范围旁白」,不念题干的核心断言不变)。
|
||||
2. **文案**:交付正文(`agent-voice-copy-contract`、`-delivery-ui-simplify-20260908`、`-range-delivery-20260907`、`-adopt-narration` 的 `assertAdoptTemplate`);区分不开句(`-fewer-probes-card-20260926`);收窄提示(`-open-collect-invite-20260914`、`-tiebreak-before-card-20260914`)。
|
||||
3. **池规则保留覆盖**:`rectification-collection-question-pool` 两条改用「门未开」的夹具(毕业那件日期不明),另断言门开夹具池为空;`-fewer-probes-card` 的挡卡用例补一条门前仍挡卡。
|
||||
4. **Skill 版本**:18 处 `RECTIFICATION_SKILL_VERSION` / `skill_version` + 5 处 `version:` 正则 / 包路径,`skill-registry` 一处。
|
||||
5. **测试写法**:`-collect-stall` 两处 `assert.ok(count >= 1)` 改 `assert.equal(count, 0)`。原因:`assert.ok` 无消息失败时 Node 会重新解析转译后的调用点拼报错,在该文件上 CPU 空转不返回,整套 `npm test` 挂住(本轮实测,第一次全量卡在第 2613 项就是它)。`-eight-method` 一处 `assert.equal(x, null)` 改布尔比较,避免 tsc 把后面的访问收窄成 never。
|
||||
|
||||
新增:`frontend/tests/rectification-futile-collect-stop-20260929.test.ts`(22 条:开关、七领域门开 / 门关各一、收窄提示、交付正文、提示与 Skill、右栏 / 步骤条 / 输入框、T3、T4、BUG-621 旧版本可解析)。
|
||||
|
||||
### 与任务书的偏离
|
||||
|
||||
- 右栏阶段句没有「按字段不渲染」,而是按 `precision_stage.current` 取前端自己的去邀请文案(未知阶段回退引擎句)。理由:整句去掉会让右栏失去「哪张盘还会换升」的信息。
|
||||
- 交付卡卡头「目前范围 …(对照了 N 件经历)」与时间轴「已对照 N 件」没改:任务书 D2 只点名交付正文。二者同样会把口述件数当进度,建议下一单处理。
|
||||
|
||||
### 验证(Node 22.14,本机 Linux)
|
||||
|
||||
| 项 | 基线 `56722063` | 本分支 |
|
||||
| --- | --- | --- |
|
||||
| `npm test` | 4335 项:4280 过 / 24 失败 / 31 跳过 | 4357 项:4302 过 / 24 失败 / 31 跳过 |
|
||||
| 失败名单 | 24 条(Postgres / Docker / staging 同步类) | 与基线逐条相同,新增失败 0 |
|
||||
| 测试名单 | — | 基线名单无一消失;新增 22 条 |
|
||||
| `tsc --noEmit` | — | 0 错误 |
|
||||
| `npm run lint` | 0 error / 126 warning | 0 error / 126 warning,告警集合与基线逐条相同 |
|
||||
| `next build` | `○ /` Static | `○ /` Static |
|
||||
| 首屏 gzip(`index.html` 引用的 26 个脚本 gzip-9 求和) | 642,283 B | 643,314 B(+1,031 B,+0.16%) |
|
||||
| Python 快速门 pytest 段 | — | 997 passed / 1 skipped |
|
||||
| 隐私标记 `tests/test_repo_privacy_markers.py` | — | 通过 |
|
||||
| BUG-621 旧版本可解析 | — | 10.0.31(deprecated)按原 sha 解析、包哈希复算一致;新增用例锁住 |
|
||||
|
||||
说明:快速门最后一步 `npm test` 曾出 42 条额外失败(路由类),那一次与两侧 `next build` 同时跑在同一工作树;构建结束后单独重跑全量为上表数字,0 新增失败。
|
||||
@@ -253,7 +253,7 @@
|
||||
| `TASK-birth-sky-polish-20260928.md` | `PROGRESS-birth-sky-polish-20260928.md` | **天空封面第三轮**:星盘页弹层只留图;封面印「日期 时刻 · 城市」(推翻「不印出生资料」);过场放慢到约 6.5 秒;兑换弹窗改到首条付费消息被拒(402)时再弹;BUG-1080 过场被兑换弹窗挡住 | 已实现待验收(分支 `codex/birth-sky-pacing-20260928`,未推送);BUG-1080 investigating(Chrome 下「弹窗盖住过场」已排除,修复不依赖根因) | BUG-1080 |
|
||||
| `TASK-self-edit-avatar-menu-20260928.md` | `PROGRESS-self-edit-avatar-menu-20260928.md` | **本人可编辑 + 各页头像菜单 + 报告页去说明**:`/people` 本人可编辑出生资料(BUG-1081,`ab6c55f8` 漏掉);次级页头像弹同一账户菜单、弹窗项跳 `/?account=`;我的报告删顶部说明与统计 | 已实现待验收(分支 `codex/self-edit-avatar-menu-20260928`,未推送) | BUG-1081 |
|
||||
| `TASK-mobile-chart-and-confirmed-edit-20260929.md` | `PROGRESS-mobile-chart-confirmed-edit-20260929.md` | **手机星盘 + 确认时间可改 + 天空定格**:iPhone 星盘被宽表撑出屏幕(BUG-1083);confirmed 状态改声明字段也重置排盘时间(推翻 BUG-264 约定);「那一刻的天空」改为重放汇聚→定格→右上角分享;去掉报告星图封面 | 已验收(Claude 2026-09-29),已推 staging | BUG-1083 |
|
||||
| `TASK-rectification-futile-collect-stop-20260929.md` | — | **生时校正停掉无效补经历循环(止血)**:打字经历不收窄(BUG-560 后果),流程却一路索要,真机 22 件整窗不动;采集只为开闸、门开后只问点选卡问完即出卡;交付正文去吻合率;多段时旁白误报「范围没变」;交付轮带采集题 | 待领取 | BUG-1084~1087 |
|
||||
| `TASK-rectification-futile-collect-stop-20260929.md` | `PROGRESS-rectification-futile-collect-stop-20260929.md` | **生时校正停掉无效补经历循环(止血)**:打字经历不收窄(BUG-560 后果),流程却一路索要,真机 22 件整窗不动;采集只为开闸、门开后只问点选卡问完即出卡;交付正文去吻合率;多段时旁白误报「范围没变」;交付轮带采集题 | 待验收(产品 09-29 修订红线 1 后续做完;分支 `codex/rectification-futile-collect-stop-20260929` 未推送) | BUG-1084~1087 |
|
||||
| `TASK-rectification-typed-event-scoring-research-20260929.md` | `PROGRESS-rectification-typed-event-research-20260929.md` | **打字经历按选择题规则计分(离线研究,不上线)**:计分通道不对称 + 已入账年份挡题;R0 学业质量题措辞 / 年精度显示成 1 月(冻结文件,需重新冻结) | 待验收(Claude 子代理直接执行,分支 `codex/rectification-typed-event-research-20260929`,未推送;R1–R3 均 no_benefit) | BUG-1088、1089 |
|
||||
| `TASK-serif-headings-20260928.md` | `PROGRESS-serif-headings-20260928.md` | **全站标题改用自托管宋体、正文保持黑体**:产品推翻 BUG-737「CJK 不用衬线」结论(保留「声明的字体必须可加载」「不落系统宋体」两条);Noto Serif SC SemiBold 按通用规范汉字表 6500 字 unicode-range 切片自托管(改名 Jyotisha Serif SC),swap 不 preload;首页宋体流量 ≤300 KB;先于天空封面单 | 已实现待验收(分支 `codex/serif-headings-20260928`,未推送) | 不开新 BUG;BUG-737 追加说明 |
|
||||
| `TASK-cend-ui-claude-alignment-20260916.md` | `PROGRESS-cend-ui-r1/r2/r3-20260916.md` | **C 端界面向 claude.ai 产品界面对齐(三轮串行 R1→R2→R3,都动 `globals.css`,不得并行)**:根因是 `frontend/CLAUDE_DESIGN.md` 扒的是 **claude.com 营销官网**,它自己在 Known Gaps 里写明 claude.ai 产品界面不在范围内,而 `DESIGN.md:3` 把它当成了产品界面的实现契约。**R1**:`--font-display` 里 Tiempos Headline / StyreneB **从未加载**(无 `@font-face`、`public/` 无字体、`layout.tsx` 只 vendor 了 Inter),中文标题全站落到 **宋体 / SimSun**,波及 20 处含助手回答的 h2/h3(BUG-737);亮色强调色 `#85432f` 与暗色 `#d78064` 不同源,产品拍板亮色换 **Claude coral `#cc785c`**,**易漏点**是 `globals.css:16` 的 `--color-ring` 硬编码在 `@theme inline` 里不跟随 `:root`,另有第四个 `:root` 亮色块(`:4358`)必须同步(BUG-738);`.composer-footer` 常驻 44px + 顶栏 68px + `--composer-reserve` 148px,每屏固定吃掉 216px,模型选择器移进输入框内部、删掉底栏、顶栏收到 46px 并删「分析对象」副标题。**R2**:空状态是营销落地页(hero 卡 + 两张 132px 入口大卡 + 3 列 156px 主题卡),输入框被压在 **800px 以上**内容之下,重排成「问候 + 居中输入框 + 两枚入口 pill + 一排 chip」。**R3**:侧栏两个 `<details>` 拍平成一条「最近」、星盘的两个入口(侧栏分组 + 账户菜单)收敛到一处、删掉逐条助手头像。**决策记录 D3 推翻 DESIGN.md「报告强调色与应用同源」一句**(报告刻意保留深棕)。原型图 https://claude.ai/code/artifact/da275da6-2954-4f50-99aa-32bb8694d38b(三套画面 + 明暗,页面标题就是建议字体栈的实际渲染)。环境缺口:无登录态无 Chrome,四项真机观感留 `docs/testing/`。BUG 段 737–738 | 待领取 | — |
|
||||
|
||||
@@ -48,6 +48,14 @@
|
||||
4. 改 Agent 提示或 Skill 文本按 CHANGELOG 规则 bump,并在 bump 后验证旧校正会话仍能打开(BUG-621 教训)。
|
||||
5. 隐私:测试夹具只用虚构数据;Bug 历史不写真机会话的任何事件内容。
|
||||
|
||||
### 2026-09-29 修订(执行中,产品决定)
|
||||
|
||||
- **产品决定:删掉门开后的引导补经历题,接受回放结果。**
|
||||
- **硬红线 1 改为:v4 开放集 ±10 / ±30 / ±60 × truth / opposite 六格里,每一格「真值在区间」都不低于基线;宽度中位只上报,不作门。** 原文「宽度中位不变宽」作废,不删。
|
||||
- 理由:执行方回放(`docs/research/futile_collect_stop_replay_2026_09_29.json`)六格真值在区间全部 20/20。引导窗口题按真值方向(truth)和按反方向(opposite)注入,得到的宽度几乎一样(例:±60 一例 D1 95 分钟,truth 注入 45、opposite 注入 43;另有注入后反而变宽的 53→59、57→85、5→11),说明它们带不来方向信息,只是把边缘簇推出 8 分线。宽度中位 ±1~3 分钟的差是噪声,不是信息。
|
||||
- **根因 4 / T3 更正**:`core/candidate-window.ts::unionWindowIntervals` 按窗口段(`segment_index`)合并成首尾包络,同一段内中间簇被排除时,`unionStillValidRange` 的元组不变,不会变成 `null`;只有跨午夜多段时才是 `null`。所以「范围没变」主要来自首尾不变,而不是 `null` 分支。T3 的修法改为按候选比较:答题前后「仍在范围内的候选」差集即被排除的段(`probe-explain.ts::excludedClusterRanges`)。
|
||||
- 对照件(holdout)验证线的口述采集题不在 D1 范围内,照旧(只在不能采用时出现)。
|
||||
|
||||
## 任务分解
|
||||
|
||||
- **T1 D1 出卡时机(BUG-1084)**
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
# 真机清单 · 生时校正停掉无效补经历(2026-09-29)
|
||||
|
||||
对应任务书 `docs/tasks/TASK-rectification-futile-collect-stop-20260929.md`,BUG-1084~1087。自动化覆盖见 `frontend/tests/rectification-futile-collect-stop-20260929.test.ts`;下面是只能在 staging 浏览器里看的部分。用受控测试账号和虚构出生资料,不用真实个人资料。
|
||||
|
||||
## 准备
|
||||
|
||||
- staging 部署的 `deployment.gitCommit` 是含本分支代码的提交。
|
||||
- 新建一个星盘档案(虚构资料),出生时间写一个大概钟点,开始生时校正。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. **开场只收一次。** 开场按提示说 3 件带年月的事,覆盖两类(例如一件毕业、两件工作)。
|
||||
- 期望:之后只出现带 A/B/C/D 的点选题;不出现「家里 / 钱 / 身体这边……」「再问一次」「YYYY 年 M 月前后有没有什么事」这类口述补事题。
|
||||
2. **点选题问完就出卡。** 一直答到没有题。
|
||||
- 期望:直接出「目前范围」交付卡。正文三句:「目前范围 …。用了 N 道选择题。……这只是代表性候选,不是已确认的唯一出生分钟。」范围和开场一样宽时多一句「这个窗口按现在的方法缩不下去。」
|
||||
- 正文和卡上都没有「事件吻合率」「对照了 N 件经历」「补一件」「再说一件」。
|
||||
3. **交付那一轮不追问。** 出卡的那条消息下面没有新的题目卡或加粗问句。
|
||||
4. **旁白不误报。** 答题过程中,若时间轴上中间某段的点变灰或消失(首尾没变),那道题的回执写「已记录,排除了 HH:MM–HH:MM。」,不写「范围没变」。
|
||||
5. **右栏、步骤条、输入框。**
|
||||
- 右栏「当前盘面」下的说明句没有「可再补一件……」。
|
||||
- 步骤条交付态写「看当前范围,对不上可以改选」。
|
||||
- 输入框占位:答题时「回答上面的问题,或直接问我…」;出卡后「对结果有疑问,直接问就行…」。
|
||||
6. **门前仍然采集。** 另开一个校正,开场只说 1 件事。
|
||||
- 期望:仍会请你再说一件带年月的事(占位「再说一件带年月的事」),够了才开始点选题。
|
||||
7. **旧会话能打开(BUG-621)。** 从会话列表打开一个 2026-09-29 之前建的生时校正会话。
|
||||
- 期望:能打开、能看历史,不报错。
|
||||
|
||||
## 结果记录
|
||||
|
||||
| 步骤 | 结果 | 备注 |
|
||||
| --- | --- | --- |
|
||||
| 1 | | |
|
||||
| 2 | | |
|
||||
| 3 | | |
|
||||
| 4 | | |
|
||||
| 5 | | |
|
||||
| 6 | | |
|
||||
| 7 | | |
|
||||
Reference in New Issue
Block a user