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
@@ -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)**
|
||||
|
||||
Reference in New Issue
Block a user