Files
Jyotisha/docs/tasks/TASK-rectification-after-pool-empty-decision-20260913.md
T

54 lines
6.4 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.
# 决策单(草案,待产品拍板)· 带年月选择题问完之后,用什么方式继续收窄(2026-09-13)
- 基线:`origin/staging` @ `5d54d059`(已部署;含 BUG-646660
- 性质:产品决策单。**执行方不得在产品选定方案前开工。**
- 关联:`TASK-rectification-narrow-before-deliver-20260911.md`BUG-653/654)、`TASK-rectification-targeted-collect-persist-fix-20260911.md`BUG-656658
## 1. 现状(2026-09-13 03:57 真机,代码 5d54d059
同一序列(两件学业 + 实习入职/离职 + 六道带年月选择题)跑完后,系统按 09-11 的设计做了三步:
| 步 | 结果 | 证据 |
| --- | --- | --- |
| 刷新探针(按剩余 5 个候选 04:51 / 04:53 / 04:59 / 05:00 / 05:06 再向引擎要题) | **没有新题** | `inference_state.refresh_attempts[0].result = "no_new_probes"`,答题数 6,候选集不变 |
| 定向补事 | 已落成活动焦点 | `current_question = collect:targeted:relationship`:「还有4条线能把 04:51 和 05:06 分开:哪年结婚或订婚、哪年收入明显变过、哪年搬家、家里哪年添丁。记得哪件说哪件,年月大概就行。」 |
| 交付卡 | 未出(等用户回答上一步) | `can_offer_range=false`;用户答「都没有」即出「目前范围」卡 |
范围 04:4805:0720 分钟,5 簇),头名 04:53 占 32%,收敛门未开。流程没有卡住,但用户看到的是一道开放式补事题,而不是选择题,体感「死板」。
## 2. 为什么引擎给不出更多选择题(结构性原因,不是 bug)
带年月选择题由 `scripts/rectification/event_probes.py` 在**大运换运边界**上生成,一道题要同时满足:
1. 换运日期在不同候选簇之间至少差 45 天或跨年(`MIN_BOUNDARY_DAYS=45``_boundary_windows`)。Vimshottari 边界随出生分钟只移动几天,所以同年内几乎没有可用边界;Narayana 边界随本命上升变,而 04:48–05:07 内本命上升都是巨蟹座,边界完全相同。
2. 该年该领域的分盘读数在候选组之间确实不同(`_evaluate_contexts`:至少一组「会发生」一组「不会」,且两组各有候选)。
3. 该年没问过、也不挨着已知事件(`asked_years_for_domain` + `EXISTENCE_NEARBY_YEARS`:学业 / 感情 / 事业 / 搬家各 ±1 年)。
4. 家人「有没有发生」题被 0.85 的先验丢弃,只有月级边界题例外。
六题答完后,事业 2023 / 2024、感情 2023 / 2024、搬家 2015、学业 2016 都已问过,剩余 5 个候选之间的差别(04:52 D9 换升、05:00 D10 / D4 / D12 / D2 换升、05:06 D24 换升)只能变成**无年月**的分盘题——正是 09-09 产品拍板降级为「仅作参考、不参与淘汰」的那一类(BUG-629),09-11 又决定「不挡在结果前面」(BUG-651 决策 2,执行时按让步做成了完全不问)。于是引擎侧的选择题供给在这里真的用尽了,剩下唯一能收窄的信息源就是用户再给一件带年月的事。定向补事题正是为此设计的(09-11 决策 3.1)。
## 3. 可选方案
| 方案 | 做法 | 能不能收窄 | 用户体感 | 代价 / 风险 |
| --- | --- | --- | --- | --- |
| **A · 定向补事改成逐条点选**(推荐) | 把「4 条线」拆成一次一条的卡:「结过婚或订过婚吗?」有 / 没有 / 记不清;答「有」→ 追问「大概哪年几月」(口述)→ 记事件 → 引擎重算、可能生出新的带年月题;答「没有」→ 下一条;四条都「没有」→ 出「目前范围」卡 | 只有答「有」并给出年月才收窄;「没有」本身不计分(无年月的否定不参与打分,BUG-629 口径) | 像在继续答题;年份仍由用户给 | 前端两步卡 + 焦点状态机;引擎不动。约 1 单 |
| **B · 放宽引擎出题规则(仅刷新阶段)** | 刷新时允许:挨着已知事件的年份出题(去掉 ±1 年封锁);同一领域同一年按不同事件家族再出一道(入职 vs 升职 vs 离职);`MIN_BOUNDARY_DAYS` 降到 30;家人月级题按 T2(b) 已放开 | 可能多出 1~3 道题,也可能一道没有;分辨力未经验证 | 继续出选择题 | 必须先在离线 20 例公开 AA 数据上量收益(`minute_rectification_fact_ranker_v4_holdout_v3`),有提升再上;风险是多问几道没分辨力的题 |
| **C · 参考题作为可选追问** | 交付卡下给「再答两道参考题」入口(D9 相处方式 / D10 做事风格),±1 只排序不淘汰 | 不收窄,只调整头名顺序 | 有东西可点 | 已有代码(BUG-629 的 tie_break),只需入口;09-11 决策 2 原意即此 |
| **D · 只改文案** | 「还有4条线能把 04:51 和 05:06 分开」改成「现在还剩 04:48–05:07 里 5 个候选;能把它们分开的是这几条线……」,并给每条线一个按钮 + 「都没有,先看结果」 | 不变 | 不再像一句死板的模板 | 半天 |
我的建议:**A + D 一起做**,C 作为可选入口顺带做;B 单独立一张研究单,先量收益再决定,不与 A 混在一起。
## 4. 需要产品拍板的问题
1. 选 A + D(+ C)还是也要 B?
2. A 里每条线答「没有」是否要写进账本作为「该领域近年无事」(不计分,只用于不再问)?建议是。
3. 四条线都「没有」之后直接出卡(当前行为)是否接受?
## 5. 拍板后的任务分解(预案,未定不执行)
- **T1A** `collection-question-pool.ts` `targetedCollectPool` 改为逐条产出 `{domain, existence_prompt}`;焦点 `collect:targeted:<domain>` 改为 choice(有 / 没有 / 记不清);「有」→ 落 `collect:targeted:<domain>:year` 口述焦点;「没有 / 记不清」→ 话题记 skipped 并进下一条;全部 skipped → S3。
- **T2D** `rangeNarrowHint` / 定向题干文案;`agent-voice-copy-contract` 禁词不变。
- **T3(C)** 交付卡下入口 → 性格卡(`tie_break`)。
- **T4(B,独立研究单)** 离线脚本:对 20 例 AA 数据在「六题后剩余 ≤5 候选」的状态下分别按放宽规则再生成题,统计新增题数与真实分钟命中率变化;有提升才进入实现。
- 验收:真机 §1 序列六题答完后出现第一条点选题;答「有 + 年月」后引擎重算并出现新的带年月题或范围变化;四条都「没有」出「目前范围」卡;全程不出现「没有拿到下一个问题」。