fix(rectification): emit finer dated probes on refresh only (BUG-664/665)
Independent Staging Quality Gate / validate (push) Successful in 10m11s
Independent Staging Quality Gate / publish (push) Successful in 7m26s

After six dated answers, refresh can use 30-day same-year windows plus pratyantar and D9/D10 Narayana. First-round probe rules stay at 45 days.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-13 18:19:46 +08:00
co-authored by Cursor
parent 530f260f76
commit ab1ade59b7
7 changed files with 403 additions and 43 deletions
+32
View File
@@ -10324,3 +10324,35 @@
- 相关记录:BUG-629、BUG-651、BUG-661
- 复发自:BUG-629(性格题降权后没有可选入口)
- 修复版本:待发布
## BUG-664 | 刷新阶段同年换运间隔可收到 30 天,首轮仍是 45 天
- 状态:resolved
- 首次发现:2026-09-13
- 最近更新:2026-09-13
- 影响面:`scripts/rectification/event_probes.py` `_boundary_windows` / `_union_boundary_dates` / `discriminating_event_probes`
- 用户现象:六道带年月题答完后,刷新经常立刻 `no_new_probes`,即使剩余候选的同年换运只差三十多天。
- 触发条件:训练门已开、带年月池空、`refresh_probes=true`、剩余候选上存在 30–44 天的同年边界。
- 根因:生产 `MIN_BOUNDARY_DAYS=45` 对首轮和刷新共用。离线 20 例测量里,只把刷新阈值降到 30 平均多 1.0 个独立划分、头名不降;首轮保持 45。
- 修复:新增 `REFRESH_MIN_BOUNDARY_DAYS=30`。仅 `request.refresh_probes is True` 时传给 `_union_boundary_dates`;首轮调用签名与阈值不变。不改 `EXISTENCE_NEARBY_YEARS`、R1/R2、`SCORE_DELTA`
- 验证:`tests/test_rectification_refresh_r3_r4.py`40 天同年窗首轮不出、刷新出 `dasha_boundary`。既有 `tests/test_rectification_event_probes.py``tests/test_candidate_discriminator_contract.py` 首轮断言不放宽。
- 防复发:默认 `MIN_BOUNDARY_DAYS` 必须仍是 45;不得把研究脚本接到 API;刷新仍走 distinguish 合同。
- 相关记录:BUG-653、BUG-657、BUG-665
- 复发自:BUG-653(刷新已按剩余候选出题,但边界阈值与首轮相同)
- 修复版本:待发布
## BUG-665 | 刷新阶段并入 pratyantar 与 D9/D10 上升 Narayana 边界
- 状态:resolved
- 首次发现:2026-09-13
- 最近更新:2026-09-13
- 影响面:`scripts/rectification/event_probes.py` `_vim_start_dates` / `_union_boundary_dates`
- 用户现象:六道带年月题答完后,本命上升相同、D9/D10 或第三级换运已不同时,刷新仍无新的带年月题。
- 触发条件:`refresh_probes=true`,剩余候选 Vimshottari pratyantar 或 D9/D10 上升 Narayana 有可分辨边界。
- 根因:首轮并集只用 Vimshottari MD/AD 与本命上升 Narayana。`_vim_start_dates(..., include_pratyantar=)` 已存在但刷新默认仍为 false。离线测量 R4 单独 +1.084 独立划分,头名不降。
- 修复:仅刷新阶段 `include_pratyantar=True`,并对剩余候选 D9/D10 上升再算 Narayana 边界并入并集。首轮不传这些参数,`_vim_start_dates` 调用保持原签名以免旧 mock 失败。本命上升 Narayana 与 MD/AD 不变。
- 验证:`tests/test_rectification_refresh_r3_r4.py`pratyantar 与 D9 上升不同时刷新出新年月、首轮不出。研究脚本 `scripts/research/probe_supply_after_six.py` 仍离线。
- 防复发:不得对首轮打开 pratyantar 或分盘 Narayana;不得全局改 `MIN_BOUNDARY_DAYS`。刷新 0 题时仍走定向补事(BUG-654 / BUG-661),不得报「没有拿到下一个问题」。
- 相关记录:BUG-653、BUG-654、BUG-661、BUG-664
- 复发自:BUG-653(刷新只复用首轮边界层)
- 修复版本:待发布
@@ -0,0 +1,36 @@
# 进度 · 刷新阶段放宽换运边界 R3 + R42026-09-13
## 范围
- 分支:`codex/rectification-refresh-r3-r4-20260913`(基于 `origin/staging` @ `530f260f`
- 任务单:`docs/tasks/TASK-rectification-refresh-r3-r4-20260913.md`
- 研究结论:`docs/research/probe_supply_after_six_2026_09_13.md`;只实现 R3 + R4
- BUG-664:刷新 `MIN_BOUNDARY_DAYS` 45→30
- BUG-665:刷新并入 pratyantar 与 D9/D10 上升 Narayana
- 不实现 R1/R2;不改 `EXISTENCE_NEARBY_YEARS``SCORE_DELTA`、确认门、性格题计分(BUG-629)
- 研究脚本 `scripts/research/probe_supply_after_six.py` 保持离线
- Skill 不升版:用户路径仍是「刷新带年月题 → 定向补事 → 目前范围」,只是刷新可能多几道同类题;10.0.25 口径已覆盖
## 完成
- T1 `REFRESH_MIN_BOUNDARY_DAYS=30`;仅 `refresh_probes is True` 时传入 `_union_boundary_dates`。首轮仍调用 `_union_boundary_dates(reps, birth_date=..., lo=lo, hi=hi)``MIN_BOUNDARY_DAYS` 仍为 45。
- T2 仅刷新:`include_pratyantar=True`(首轮不把该关键字传给 `_vim_start_dates`,以免旧 mock 失败);D9/D10 上升 Narayana 与本命上升并集。
- T3 `tests/test_rectification_refresh_r3_r4.py`40 天同年窗、pratyantar、D9 上升不同;年份用 2019,避开搬家/婚恋年龄下限与邻近年封锁。
- T4 BUG-664/665、CHANGELOG、本文件、任务板、手测 0b/0c 补「刷新有题则先出带年月题」。
## 验收(本机,未部署)
- `tests/test_rectification_refresh_r3_r4.py`4 passed
- `tests/test_rectification_refresh_r3_r4.py` + `tests/test_rectification_event_probes.py` + `tests/test_candidate_discriminator_contract.py`51 passed
- `tests/test_rectification_*.py`171 passed / 0 failed
- `run_quality_gate.py --profile quick`738 passed / 1 skipped / 1 failed
- 失败项:`test_block_scan_seven_events_finishes_within_fifteen_seconds` 壁钟 46.2s > 15s
- 与本单无关(未改 `block_scan`);任务板 `TASK-rectification-capability-fix-20260907.md` 已记为 P2 间歇红
- 未做登录态真机 0b(无本地会话)
## 未做
- 未把研究脚本接到 API
- 未改首轮出题、未实现 R1/R2
- 未升 Skill 10.0.26
- 未做登录态真机 0b(无本地会话)
+1 -1
View File
@@ -178,7 +178,7 @@
| `TASK-rectification-after-pool-empty-decision-20260913.md` | — | 决策单草案:六道带年月题问完、引擎刷新无新题后,定向补事是开放式口述题,体感死板。给出 A 逐条点选 / B 放宽引擎出题(先离线量收益)/ C 参考题可选入口 / D 文案 四个方案,建议 A+D(+C) | 已拍板 2026-09-13A+D+C 进 `TASK-rectification-targeted-collect-cards-20260913.md`B 进研究单 | — |
| `TASK-rectification-targeted-collect-cards-20260913.md` | `PROGRESS-rectification-targeted-collect-cards-20260913.md` | 定向补事改逐条点选卡(有/没有/记不清 → 有则口述年月;没有不计分只防复问;全没有出卡)+ 文案说清剩余候选与线 + 卡下「再答两道参考题」入口(BUG-661663Skill 10.0.25 | 待验收 | `codex/rectification-targeted-collect-cards-20260913` |
| `TASK-rectification-probe-supply-research-20260913.md` | — | 研究单:六题后引擎在剩余候选上再出带年月题的四种放宽规则,20 例公开 AA 数据离线量收益,有收益才立实现单 | 已合入(离线测量,不改线上) | `b063c668` |
| `TASK-rectification-refresh-r3-r4-20260913.md` | | 刷新阶段 R3MIN_BOUNDARY_DAYS 45→30+ R4pratyantar 与 D9/D10 上升 Narayana);首轮出题不变。即使放宽仍有 0 题例子,定向补事另线保留(BUG-664/665 | 待领取 | |
| `TASK-rectification-refresh-r3-r4-20260913.md` | `PROGRESS-rectification-refresh-r3-r4-20260913.md` | 刷新阶段 R3MIN_BOUNDARY_DAYS 45→30+ R4pratyantar 与 D9/D10 上升 Narayana);首轮出题不变。即使放宽仍有 0 题例子,定向补事另线保留(BUG-664/665 | 待验收 | `codex/rectification-refresh-r3-r4-20260913` |
## 命名与归档
@@ -28,6 +28,7 @@
期望:
- 第六题答完不得直接出卡;先出现新的带年月题(家人 / 财务 / 迁居等换运边界),或一张定向补事点选卡(先问有没有)
- 若剩余候选只在 D9/D10 或更短的同年换运上有差别,第六题后仍应先看到带年月选择题,而不是立刻跳到「结过婚或订过婚吗?」;仍无题才走定向补事
- 刷新后若引擎给出新的带年月题,下一张卡必须真正出现;不得只是决策选中了探针、落库被拒后停在「没有拿到下一个问题」
- 答一件家人事后应重算并回到带年月题;答「没有了 / 就这些」后才出卡
- 卡片标题为「目前范围 …(对照了 N 件经历)」,卡下有「还能再收窄:如果记得 …」
@@ -41,7 +42,7 @@
期望:
- 第六题答完必须看到定向补事点选卡(例如「结过婚或订过婚吗?」);旁白写剩余范围和候选个数,不得写「能把两端钟点分开」;题干种类必须能写入焦点表,不得静默失败
- 第六题答完必须看到下一问:优先新的带年月选择题;引擎没有新题时才是定向补事点选卡(例如「结过婚或订过婚吗?」);旁白写剩余范围和候选个数,不得写「能把两端钟点分开」;题干种类必须能写入焦点表,不得静默失败
- 引擎若没有新的带年月题,界面走定向补事或已有载体;同一候选集、同一已答数下引擎刷新只调用一次,不得反复打约 20 秒的刷新
- 引擎若有新题,下一问必须出现;不得「GET 已有探针、界面没有下一问」
- 刷新不得把候选集改空或换成另一套 `candidate_set_id`