docs(rectification): narrower delivery brief + width funnel and karaka-interval research

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Ad9rqAB8pXXvyzh7f4X8v
This commit is contained in:
Jesse_Chen
2026-10-16 23:21:23 +08:00
co-authored by Claude Opus 5.5
parent 9b7509155f
commit 712a0fd2a1
11 changed files with 736 additions and 0 deletions
+1
View File
@@ -36,6 +36,7 @@
| 任务书 | 进度 | 主题 | 状态 | 落点 |
| --- | --- | --- | --- | --- |
| `TASK-rectification-narrower-delivery-20261016.md` | — | **交付区间收窄**:显示改按活着的簇分段(±60 显示 71→实际 42 分钟)、按剩余候选对半出题并放宽到 12 轮(少数侧 <20% 不出题)、新增 `DELIVERY_RANGE_LEAD=6` 只管进区间(`MIN_SEPARATION_LEAD=8` 不动,写读同口径)。红线:PG 回放真值保留全对 ≥基线−1、答错一题 ≥基线−5pp,不过则该档回 8。证据 `docs/research/rectification_width_funnel_2026_10_16.md`(含象征星区间求交复现=随机)。BUG 1367 起 | 待领取 | — |
| —(子代理直接执行,无任务书) | `PROGRESS-bug-1060-d9-double-transit-20260927.md` | **双重过运 D9 目标错配(BUG-1060)**:D9 第 N 宫目标误用 D9 上升、D9 宫主目标误用 D1 度数,改为标签所写的 D9 星座;D1 / CL 层逐字节不变;数据卡 golden 重采集(一张盘跨层结论 9→10);另记 BUG-1061 跨层数字比对(未修) | 已验收(待部署) | `codex/bug-1060-d9-double-transit-20260927`(未推送) |
| —(子代理直接执行,无任务书;产品 2026-09-27 授权) | `PROGRESS-bug-1061-cross-layer-pairing-20260927.md` | **双重过运跨层配对按名字数字比对(BUG-1061)**:改为结构化身份配对(D1 第 N 宫↔D9 第 N 宫;D1 第 N 宫主↔同一颗星的 D9 目标);各层结果与 D1/CL golden 逐字节不变;48 样本跨层条目 31→38;数据卡 golden 重采集(乔布斯 6→9、泰勒 9→10) | 已验收(待部署) | `codex/bug-1061-cross-layer-pairing-20260927`(未推送) |
| `TASK-rectification-fewer-probes-card-20260926.md` | [PROGRESS](PROGRESS-rectification-fewer-probes-card-20260926.md) | **减少无效追问 + 卡片区间为主**:引导补件离线新增达标 0 → 上限 6→2、定向题问完门槛未达直接出卡;卡片区间为主标题、代表分钟副标题,第一二名差距 ≥5 个百分点才显示百分比,否则写「目前区分不开」。不放宽任何置信度。先做 | 已验收(真机清单欠) | `4e6e8d87` + 验收补改 `7203d94e`(区分不开时隐藏「最可能」),deploy-staging run 2933 已部署;回放真值 ±30/±60 19→20、宽度中位 ±1 分钟、提问 11.4→7.8;Skill 10.0.30;真机清单 `docs/testing/rectification-fewer-probes-card-20260926.md` 未走 |
@@ -0,0 +1,89 @@
# TASK:生时校正交付区间收窄(分段显示 + 对半出题 + 交付门槛 8→6)2026-10-16
## 0. 基线
- `origin/staging` @ `9b7509155`(开工时以最新 `origin/staging` 为准,并在进度记录里写实测基线 SHA)。
- 证据与脚本:`docs/research/rectification_width_funnel_2026_10_16.md`,以及 `docs/research/artifacts/rectification-width-funnel-2026-10-16/`(`funnel_summary.json` 是本单的预期数字来源)。
## 1. 事故实证
产品反馈:前后各 60 分钟的窗口问完题,交付约 75 分钟,用户觉得「跟没校正一样」。v5 回放(77 例、模拟答对)现状:
| 窗口 | 显示宽度(中位) | 实际剩余分钟(中位) | 真值在区间 | 答错一题真值在区间 |
|---|---|---|---|---|
| ±10 | 13 | 14 | 76/77 | 98% |
| ±30 | 35 | 26 | 76/77 | 95% |
| ±60 | 71 | 42 | 75/77 | 93% |
## 2. 根因(按符号定位)
1. **显示按段内外包络。** `scripts/rectification/candidate_window.py::interval_union_width` 的 docstring 写着「Keep historical within-segment envelope」。前端 `frontend/src/lib/rectification-agentic/core/candidate-window.ts::unionWindowIntervals` 按 `segment_index` 把同一段内所有区间合成最早–最晚。`segment_index` 是用户声明的窗口段(只在跨午夜等情况下才有多段),不是候选簇。所以交付卡 `frontend/src/components/rectification-range-delivery.tsx` 的 `rangeLabel`(经 `windowIntervalsLabel`)把中间已出局的空档一起显示了出来。±60 窗口显示 71 分钟,实际只剩 42 分钟。
2. **题目切不动、题数少。** 可出题中位只有 7~8 道(`scripts/rectification/event_probes.py`:`MAX_PROBES=8`、`REFRESH_MAX_PROBES=12`、`MAX_PROBES_PER_DOMAIN=3`)。Q5–Q6 时剩余候选中 76–90% 与真值同侧,一题只排除一两成。前端轮数上限是 `core/types.ts::DEFAULT_MAX_DISCRIMINATION_ROUNDS = 8`。
3. **进区间门槛 8 分。** `core/credible-range.ts::unionStillValidIntervals / unionStillValidRange / stillValidCandidates` 用 `MIN_SEPARATION_LEAD = 8`(`core/candidate-separation.ts`)。一道题只拉开 4 分(`SCORE_DELTA` ±2),所以一个候选至少要两道题都反向才出区间。
4. **物理下限(不修)。** 1 分钟约 3.8 天,加上月级记忆和 `REFRESH_MIN_BOUNDARY_DAYS=30`,问答路线最好约 10 分钟。
## 3. 决策记录(产品 2026-10-16 授权)
- **D1 交付分段显示,推翻「段内外包络」。** 用户可见的范围(交付卡标题、盘型交付 `RectificationSegmentDelivery` 的 `rangeLabel`、旁白和 spoken-grounding 里的范围句、报告里的范围、会话标题)一律按**实际活着的簇区间**显示。间隔 ≤4 分钟的相邻区间合并。合并后超过 3 段时,只显示最靠前的 3 段,再加「等 N 段,共约 X 分钟」。宽度统计(遥测 `width`、交付文案里的「约 X 分钟」)改用实际剩余分钟数。`interval_union_width` 等**决策层**的宽度口径本轮不改(收敛判定、档位、闸门仍按旧口径),在进度记录里列清所有调用点和各自采用的口径。
- **D2 题数上限放宽 + 按剩余候选对半出题。** `DEFAULT_MAX_DISCRIMINATION_ROUNDS` 从 8 提到 12,探针供给相应放宽(`REFRESH_MAX_PROBES`、每域上限由执行方实测后定,写进进度记录)。每出一题都按当前未淘汰候选的后验质量选题,优先取两侧质量最接近 50:50 的。**少数一侧质量 < 20% 的题不出**,宁可停。这条和 09-26 fewer-probes「减少无效追问」不冲突:那一单管的是引导补件,本单只加能切开剩余候选的点选题。
- **D3 交付区间门槛 8→6,`MIN_SEPARATION_LEAD` 不动。** 新增常量 `DELIVERY_RANGE_LEAD = 6`,只用于「谁进交付区间」:`credible_range`、`credible_intervals`、`stillValidCandidates` 的交付用途,以及 D1 的显示。下面这些继续用 `MIN_SEPARATION_LEAD = 8`:分离状态(`evaluateCandidateSeparation`)、采用 / 确认 / 熔断门、`segment-summary.ts` 的盘型段汇总(其档位按 8 校准)。
- 这样不违反 BUG-560 的防复发条「不得改 `MIN_SEPARATION_LEAD=8`」,也不违反 BUG-423 的「不得用改 `MIN_SEPARATION_LEAD` 绕过死锁」。
- 但 BUG-423 的教训必须遵守:**写盘与读盘的 `credible_range` / `credible_intervals` 必须用同一个 lead。** `inference-adapter.ts` 里 `consistent` 的比对两边都换成 `DELIVERY_RANGE_LEAD`,不得出现一边 8、一边 6。
- **D4 窗口分档回退。** 验收回放里某一档(±10 / ±30 / ±60)在门槛 6 下过不了 §4 红线 2,该档就回到 8。分档写成一张表,挂在 `DELIVERY_RANGE_LEAD` 旁边。
- **D5 口径。** 交付文案不得承诺「定到分钟」。可以写「剩余约 X 分钟,分 N 段」。
## 4. 硬红线
1. 不改引擎打分:`SCORE_DELTA`、`STRONG_CONFLICT_ELIMINATION_COUNT=3`、`MIN_BOUNDARY_DAYS=45` / `REFRESH_MIN_BOUNDARY_DAYS=30`、`_relative_support`、采用 / 确认门全部不动。不放宽任何置信度。
2. **真值保留**:v5 77 例,用生产代码路径回放(PG 持久回放 `frontend/tests/research/rectification-segment-persisted-replay.ts` + `scripts/research/varga_resolution_persisted_replay.py`,按段选题开关保持默认)。每档同时满足两条:
- 全答对时,真值在交付区间内的例数 ≥ 基线 −1;
- 答错一题(分别翻转第 1、3、5 题)时,真值在区间内的比例 ≥ 基线 −5 个百分点。
基线在同一 harness 上用改动前代码实测,不用本单研究数字代替。
3. 预期(研究回放,静态题单,仅作参照):门槛 6、12 题时实际剩余分钟 ±10 约 10、±30 约 18、±60 约 28。生产回放达不到也不得为了凑数改红线 1 的任何一项,如实报告即可。
4. 前端按 AGENTS §7:tsc 0、lint 0 error、测试总数不减,既有断言改动写「原值 / 新值 / 原因」,`/` 保持 Static,gzip ±2%。
5. 校正 Skill 若 bump,必须验证旧 Case 能从列表打开(BUG-621)。
6. 不动数据库结构;遥测只是写入的数值换口径,若需新列,单独说明并跑 test:db。
## 5. 任务分解
- **T0 基线**:在开工 SHA 上跑 §4 红线 2 的回放,三档 × {全对, 翻 1/3/5},产出 `docs/research/rectification_narrower_delivery_baseline_2026_10_16.json`。
- 验收:数字齐全;有可复跑的命令。
- **T1 分段显示(D1)**:在 Python 与前端各加一个「活着的区间合并」函数(间隔 ≤4 分钟合并),只供显示与遥测使用;按 D1 列出的所有用户可见出口逐个切换;`windowIntervalsLabel` 支持「等 N 段」。
- 验收:
- 单测覆盖三种情况:单段、跨空档两段、5 段截 3 段;
- 用 golden 中一例 ±60 回放得到的候选构造交付卡,标题段数与实际剩余分钟数和回放一致;
- 列出所有 `interval_union_width` / `unionWindowIntervals` 调用点及各自采用的口径;
- `frontend/DESIGN.md` 与 `frontend/docs/VOICE.md` 同步更新。
- **T2 对半选题(D2)**:刷新探针时按剩余后验质量的对半程度排序,少数一侧 < 20% 的题不出;放宽轮数和供给上限。
- 验收:
- 回放报告给出每题「真值同侧占比」中位,Q4–Q8 必须比基线更接近 0.5;
- 平均提问数与问满题的例数写进报告;
- 不出现「少数一侧 < 20%」的题(加断言)。
- **T3 交付门槛(D3 / D4)**:新增 `DELIVERY_RANGE_LEAD` 及分档表,写盘、读盘同口径。
- 验收:
- BUG-423 合同测试仍绿,并新增「写 6 读 6」的一致性测试;
- 分离状态、采用门、segment-summary 仍用 8 的断言;
- 回放过 §4 红线 2,否则按 D4 回退并在报告里写明是哪一档。
- **T4 回放判定**:T1+T2+T3 合起来跑 §4 红线 2 的全套,结果写进 `docs/research/rectification_narrower_delivery_replay_2026_10_16.json`。
- 验收:三档逐格对照基线,给出实际剩余分钟、显示宽度、头名命中、平均提问数。
- **T5 记录**:写 `PROGRESS-rectification-narrower-delivery-20261016.md`、`BUG_HISTORY`(3 条:显示包络、选题不对半、交付门槛)、`CHANGELOG`;真机清单写到 `docs/testing/rectification-narrower-delivery-20261016.md`(±30 窗口完整走一次,看段数和题数)。
## 6. 让步顺序
时间不够时:先交 T0+T1(纯显示,风险最低,单独就能把 ±60 从 71 降到约 42),再交 T3,最后交 T2。任何一项过不了红线 2 就撤掉该项,不能为了保住其他项去放宽红线。
## 7. 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/rectification-narrower-delivery-20261016 .worktrees/rectification-narrower-delivery-20261016 origin/staging
cd .worktrees/rectification-narrower-delivery-20261016
grep -n "BUG-423\|BUG-560\|BUG-653\|BUG-1143\|BUG-1144" docs/BUG_HISTORY.md # 读完命中记录
grep -rn "unionWindowIntervals\|interval_union_width\|unionStillValid\|MIN_SEPARATION_LEAD\|DEFAULT_MAX_DISCRIMINATION_ROUNDS" frontend/src scripts tests frontend/tests | wc -l
```
本机没有 Docker 时,PG 回放按 `docs/research/` 中盘型口径研究记录的「无 Docker 验收法」(预编译 PG17 + psql / docker 替身)跑。
## 8. BUG 编号起点
BUG-1367 起,开工时用 `docs/BUG_HISTORY.md` 的最大号核对一遍。