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
10 KiB
PROGRESS · 生时校正止血单(2026-09-29)
- 任务书:
docs/tasks/TASK-rectification-futile-collect-stop-20260929.md - 分支:
codex/rectification-futile-collect-stop-20260929(基线origin/staging56722063),未推送。 - 执行方: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 | 否 |
读法:
- 真值在区间六格全部 20/20,没有一例因 D1 丢真值。
- 宽度中位三格变宽(±10 truth +1,±60 两个方向 +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 shac2cab136…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 同步类环境项,清单在执行机 scratchpadbaseline-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 处版本号)。大类:
- 回到 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(放宽为「或落到非空范围旁白」,不念题干的核心断言不变)。 - 文案:交付正文(
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)。 - 池规则保留覆盖:
rectification-collection-question-pool两条改用「门未开」的夹具(毕业那件日期不明),另断言门开夹具池为空;-fewer-probes-card的挡卡用例补一条门前仍挡卡。 - Skill 版本:18 处
RECTIFICATION_SKILL_VERSION/skill_version+ 5 处version:正则 / 包路径,skill-registry一处。 - 测试写法:
-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 新增失败。