Files
Jyotisha/docs/tasks/PROGRESS-rectification-futile-collect-stop-20260929.md
T
Jesse_ChenandClaude Opus 5.5 ea21743b09 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
2026-09-29 10:06:57 +08:00

96 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 新增失败。