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

10 KiB
Raw Blame History

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 新增失败。