diff --git a/CHANGELOG.md b/CHANGELOG.md index ea578f52..0305e452 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # 印度占星 Skill 更新日志 +## 2026-10-02 — 生时校正至少要 4 件有年月的经历、覆盖 3 个方面才给时间范围;上游同步第五轮(燃烧、诅咒格措辞、Badhaka 等) + +- 生时校正:以前 3 件有年月的经历、2 个方面(例如上学和工作)就会给出生时间范围;现在至少要 4 件、覆盖 3 个方面(例如再加一件搬家或感情)才开始给范围和选择题。还不够时,提示会写清楚还差几件、还缺哪类(例:「再来两件记得大概年月的事,其中至少一件不是上学或工作的,就能开始筛」),不再一律写「再来一件」(BUG-1193)。打分方法不变,算法版本不变;以前的校正记录照常打开。 +- 行星燃烧(离太阳太近)的判断全站统一:月亮也判,逆行的行星用更小的容许度(例如逆行金星 8°),水星顺行由 12° 改为 14°(BUG-1195)。水星燃烧时,「日水合(Budha-Aditya)」格局仍会列出,但标为有条件、不再写成完整的吉格(BUG-1198)。 +- 凶星合相(诅咒格)与 Rashi Tulya 的说明不再出现「过早死亡风险」「子女早夭」「母亲早逝」这类断语;亡灵格的「障碍宫」按上升星座取第 11 / 9 / 7 宫,不再一律算第 11 宫(BUG-1192 / 1197)。 +- 8 星制 Chara Karaka 里罗睺按 30° 减度数排位(BUG-1194);Yogini 大运按出生月宿起运(BUG-1196);八分法新增三方净化、单宫主净化两层计算,原始分保留,暂不进报告与卡片。 +- Narayana 默认版本(上游只改了命令行默认值)本轮不搬,产品直接调用的函数不受影响。 +- 名人回测第七轮:父母题、禁句、纠正追问持平;事业题「不靠曝光」类读偏 9 → 13 / 18,未达通过线(8 位名人的卡与第六轮相同,属模型波动,与本轮改动无可证明的关联)。 +- Skill 版本不变;不改数据库结构。 + ## 2026-10-02 — 上游同步第四轮:婚姻计数不再断言几段婚姻;双重过运相位、Shadbala、月亮类格局、Arudha 改正 - 婚姻计数法只给「关系几何指数」,明说它不代表婚姻或关系的次数;不再出现「一次终身关系」「可能再婚」「第一段关系质量较好」这类断语,婚恋证据里这一条不再记为利好(BUG-1183)。某些盘上这一项原来整段算不出来,已修(BUG-1184)。 diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index a3a428a9..ba3df599 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -16042,3 +16042,95 @@ - 防复发:同上。 - 相关记录:无。 - 修复版本:`codex/upstream-sync4-20261002`(未推送)。 + +## BUG-1192 | 亡灵格(Preta Yoga)把第 11 宫写死为 Badhaka 宫;诅咒格「家族影响」与一条格局效果写早夭 / 早逝 + +- 状态:resolved(分支验证;未部署) +- 首次发现 / 最近更新:2026-10-02 / 2026-10-02 +- 影响面:`scripts/curse_yoga_detector.py`(`/api/yogas` 凶星合相层、健康主题证据「Curse-yoga-risk」的严重度);`references/yoga_rules.json` 母亲不利格的效果列表(格局卡、报告)。 +- 现象:同一引擎里 Badhaka 宫有两套:`yoga_engine.YogaContext.is_badhaka` 按动 / 定 / 变取 11 / 9 / 7,`curse_yoga_detector` 的 Preta Yoga 加重宫位写死 `[8, 11, 6]` 并注释「11宫=Badhaka」;固定、双体上升的盘被按错误的宫位加重。诅咒格「家族影响」写「子女早夭」「家族血脉停止」,母亲不利格效果第三条是「母亲早逝」。 +- 根因:诅咒格表是早期照讲稿抄的,没有调用引擎已有的 Badhaka 规则;措辞未经「不作确定性死亡预测」边界审查。上游 `b40c7fde`/`28f41912` 只改了 meaning 一列(本仓 `533c3a30`,见 BUG-1197)。 +- 修复:`7fb165ec`。`yoga_engine.badhaka_house()` 成为唯一定义(变动 11、固定 9、双体 7、上升未知返回 None),`is_badhaka` 与诅咒格都调用它;Preta 两条的加重宫位改为占位符按上升展开,D9 用 D9 上升,上升未知时不加重。「家族影响」改为责任 / 传承主题并写明不能据此断定;母亲不利格删去「母亲早逝 / Early loss of mother」。 +- 验证:`tests/test_curse_yoga_badhaka_house.py`(12 个上升全取对、上升未知不加重、两份诅咒格源码与实际输出无早夭 / 早逝 / 死亡风险字样);上游 `tests/test_badhaka_rules.py`(`765ff66c`)。前端两份报告阅读 fixture(`report-reader-main-fictional*.json`)是历史引擎输出,仍含「母亲早逝」,未重采。 +- 防复发:新测试按正则扫源码与输出;同一规则只留一个函数。 +- 相关记录:BUG-1197。 +- 修复版本:`codex/upstream-sync5-20261002`(未推送)。 + +## BUG-1193 | 生时校正交付门槛三处写 3 件 2 域、政策文件写 4 件 3 域(产品 10-02 定为 4 件 3 域) + +- 状态:resolved(分支验证;未部署) +- 首次发现 / 最近更新:2026-10-02 / 2026-10-02 +- 影响面:生时校正何时出时间范围卡、何时开始出选择题;Python 决策回执 `gates.event_quality` / `domain_diversity`;采集轮「还差」文案。 +- 现象:`references/rectification_policy.v1.json` 写 `minConfirmationEvents 4 / minConfirmationDomains 3`,但 `core/rectification-decision.ts` `MIN_STANDALONE_DATED_*`、`v9/evidence-model.ts` `MIN_ACCEPTANCE_*`、`core/types.ts` `MIN_TRAINING_EVENTS` 与 `scripts/rectification/decision_policy.py` `MIN_ACCEPTANCE_*` 都是 3 件 / 2 域(后者只数训练件)。3 件事、2 个领域就会给范围;采集文案永远说「再来一件……就能开始筛」。 +- 根因:区间交付门槛与唯一分钟确认门槛分开定义,四处各写常数;政策文件只被确认门引用。 +- 修复(产品决策 TASK-upstream-sync5 §2.2):`758fee95`。四处全部读政策文件同一对值,按「训练 + 留出」的全部带日期主经历计数;Python 回执的事件 / 领域门改数全部可计分经历,`POLICY_VERSION` v3 → v4(候选 UUID 命名空间随之变化);收敛判定与推断后的训练门同口径;采集缺口文案写准还差几件、还缺几个方面(VOICE.md 同步);遗留表单 `birth-time-life-events.tsx`(无引用方)文案同步。打分不变(77 例 A/B 逐分相同),`ALGORITHM_VERSION` 维持 scoring-10;记忆化 golden v3、v2 冻结。 +- 验证:前端 30 个校正测试文件(夹具补到 4 件 3 域保持原场景,或改断言写三栏)、`tests/test_rectification_confirmation_and.py`、`test_rectification_engine_memoization.py`(v2 冻结 + 分数相等);npm test 失败名单与基线相同。 +- 遗留(待产品):留出规则不变,第 3 个领域若只有一件常被留作 holdout,刚达标时实际参与打分的常是 2 个领域 3 件事。 +- 防复发:门槛只在政策文件定义;`rectification-convergence-budget.test.ts` 断言常数与政策同源。 +- 相关记录:BUG-647(训练门与留出解耦)、BUG-1048。 +- 修复版本:`codex/upstream-sync5-20261002`(未推送)。 + +## BUG-1194 | 8 星制 Chara Karaka 把罗睺按正向度数排位 + +- 状态:resolved(分支验证;未部署) +- 首次发现 / 最近更新:2026-10-02 / 2026-10-02 +- 影响面:`scripts/jaimini.py` `calc_chara_karaka_8`(全读 Jaimini 模块、报告 Karaka 表)。生时校正只用 Arudha,不读 Karaka。 +- 现象:罗睺参与 8 星制时按星座内正向度数排序,罗睺常被排错位。 +- 根因:传统规则罗睺逆行,排位用 30° 减度数;旧代码未反转。上游 yinduzhanxing `197672e3`。 +- 修复:`cb9d942b`(PM 移植):排位用有效度数,原始度数与 `rahu_reverse_applied` 同时保留。 +- 验证:`tests/test_jaimini.py` 新用例。 +- 防复发:同上。 +- 相关记录:无。 +- 修复版本:`codex/upstream-sync5-20261002`(未推送)。 + +## BUG-1195 | 燃烧容许度全引擎不一致:不含月亮、不分顺逆行 + +- 状态:resolved(分支验证;未部署) +- 首次发现 / 最近更新:2026-10-02 / 2026-10-02 +- 影响面:`scripts/jyotish_engine.py` `COMBUSTION_ORBS` / `is_combust`(全读行星表、普通对话数据卡的 graha drishti 层)、`scripts/pancha_mahapurusha.py`(五大人格格局燃烧取消)。 +- 现象:水星容许度 12°(应顺行 14° / 逆行 12°),月亮不判燃烧,逆行行星与顺行同一容许度;五大人格模块另有一张表。 +- 根因:两张表各自手写;上游 `080c286c`、`eaf6918b` 统一为顺 / 逆两列。 +- 修复:`cf78d4ca`、`bdbff99a`(PM 移植,含普通对话层按逆行传参);`03d60e29` 测试锁两张表相等并在每个容许度边界上验证两个函数。 +- 验证:`tests/test_consultation_native_layers.py`、`tests/test_combustion_orb_tables_agree.py`;名人回测 golden 只有一位逆行金星由燃烧改为不燃烧。 +- 防复发:两表相等测试。 +- 相关记录:BUG-1154(graha drishti 燃烧共用一个判断)。 +- 修复版本:`codex/upstream-sync5-20261002`(未推送)。 + +## BUG-1196 | Yogini Dasha 起运不按月宿 + +- 状态:resolved(分支验证;未部署) +- 首次发现 / 最近更新:2026-10-02 / 2026-10-02 +- 影响面:`scripts/yogini_dasha.py`(全读条件大运、报告时间系统表)。 +- 现象:起始 Yogini 不是按出生月宿 `(nakshatra + 3) mod 8` 取。 +- 根因:上游 `cb7fe017` 已修。 +- 修复:`5172620c`(PM 移植;上游对本仓不存在的测试文件的改动未带)。 +- 验证:`tests/test_yogini_seed_profile.py`。 +- 防复发:同上。 +- 相关记录:无。 +- 修复版本:`codex/upstream-sync5-20261002`(未推送)。 + +## BUG-1197 | 诅咒格 / Rashi Tulya 的含义写「过早死亡风险」「死亡之神」等确定性断语 + +- 状态:resolved(分支验证;未部署) +- 首次发现 / 最近更新:2026-10-02 / 2026-10-02 +- 影响面:`scripts/curse_yoga_detector.py`、`scripts/rashi_tulya_navamsa.py` 的 meaning 字段(凶星合相层、`orchestrator_bridge` 的 RTN 证据)。 +- 现象:Yama / Preta Yoga 含义写「死亡之神 sitting」「过早死亡风险」「可触发危险疾病或事故」。 +- 根因:照讲稿抄入,违反「不作确定性死亡预测」。上游 `b40c7fde`、`28f41912`。 +- 修复:`533c3a30`、`9959e514`(PM 移植);同类残留(家族影响、Badhaka 写死)见 BUG-1192。 +- 验证:`tests/test_curse_yoga_claim_boundary.py`、`tests/test_curse_yoga_badhaka_house.py`。 +- 防复发:两条测试扫源码。 +- 相关记录:BUG-1192。 +- 修复版本:`codex/upstream-sync5-20261002`(未推送)。 + +## BUG-1198 | 水星燃烧时 Budha-Aditya 仍按完整吉格输出 + +- 状态:resolved(分支验证;未部署) +- 首次发现 / 最近更新:2026-10-02 / 2026-10-02 +- 影响面:`scripts/yoga_engine.py` 格局列表(报告、数据卡格局行)。 +- 现象:日水合相即出 Budha-Aditya 全部吉效果,不看水星是否燃烧。 +- 根因:上游 `994638f0` 已修(本仓只取 Budha-Aditya 一段)。 +- 修复:`45d6dbf6`(PM 移植):水星燃烧时格局仍可见,`strength=conditional`、效果移到 `traditional_effects`、附 `combustion_witness`。 +- 验证:`tests/test_budhaditya_combustion_gate.py`。 +- 防复发:同上。 +- 相关记录:BUG-1195。 +- 修复版本:`codex/upstream-sync5-20261002`(未推送)。 diff --git a/docs/tasks/PROGRESS-upstream-sync5-20261002.md b/docs/tasks/PROGRESS-upstream-sync5-20261002.md new file mode 100644 index 00000000..9707ac28 --- /dev/null +++ b/docs/tasks/PROGRESS-upstream-sync5-20261002.md @@ -0,0 +1,148 @@ +# PROGRESS · 上游同步第五轮 + 生时校正 4 件 3 域(2026-10-02) + +- 任务书:`docs/tasks/TASK-upstream-sync5-20261002.md`(`origin/staging` `677d40f9`)。 +- 执行方式:产品授权直接执行。Claude(PM)先在本会话移植上游代码(U2–U8 各一或两个提交);子代理完成 U8 后续、R1、测试修复、记忆化 golden、研究记录重新冻结、评测、golden、回测与记录。只 commit,未 push。 +- 分支 / worktree:`codex/upstream-sync5-20261002` / `.worktrees/upstream-sync5-20261002`,基线 `677d40f9`(代码同已部署 `3d0c3cdf`)。 +- 上游参照:`/workspace/yinduzhanxing` `origin/main` `c593354f`(只读;未从上游复制文案,本地 ref 未改)。 +- BUG 编号:开工核对 `origin/staging` 最大号 BUG-1191;本单 BUG-1192~1198(提交前再核对,未被占用)。 + +## 提交 + +| 提交 | 项 | 内容 | BUG | +| --- | --- | --- | --- | +| `cb9d942b`(PM) | U2 | 8 星制 Chara Karaka 罗睺按 30° 减度数排位(上游 `197672e3`) | 1194 | +| `bdbff99a`(PM) | U3 | 五大人格燃烧顺 / 逆行表(上游 `eaf6918b`) | 1195 | +| `533c3a30`、`9959e514`(PM) | U6 | 诅咒格 / Rashi Tulya 健康措辞 + 测试(上游 `b40c7fde`、`28f41912`) | 1197 | +| `765ff66c`(PM) | U8 | Badhaka 12 上升测试(上游 `6abfe983`) | 1192 | +| `cf78d4ca`(PM) | U3 | 全引擎燃烧表统一到 `COMBUSTION_ORBS` / `is_combust`,含月亮、逆行与普通对话层(上游 `080c286c`,改编) | 1195 | +| `5172620c`(PM) | U5 | Yogini 按月宿起运(上游 `cb7fe017`) | 1196 | +| `45d6dbf6`(PM) | U7 | 水星燃烧时 Budha-Aditya 降为有条件(上游 `994638f0` 只取此段) | 1198 | +| `54f6930b`、`67aa1b33`(PM) | U4 | 三方净化、单宫主净化(上游 `9531d1dc`、`868f1dad`) | — | +| `7fb165ec` | U8 后续 | 诅咒格 Badhaka 宫按上升取 11/9/7、删早夭 / 早逝措辞 | 1192 | +| `758fee95` | R1 | 生时校正交付门槛 4 件 3 域;政策 v4;记忆化 golden v3;30 个前端测试文件 + 4 个 Python 测试 | 1193 | +| `1029cbaa` | R1 / ERR-110 | 研究记录重新冻结(标签 `upstream_sync5_2026_10_02`) | 1193 | +| `917e18a0` | — | 普通对话回测 golden 重生成 | — | +| `03d60e29` | U3 后续 | 两张燃烧表相等测试 | 1195 | +| `90dcafe7` | R1 后续 | 隐私扫描按行号钉的两处碰撞保持原行 | 1193 | +| (本提交) | — | 记录:BUG 历史、CHANGELOG、本文件、任务索引、回测第七轮 | — | + +## 逐项 + +### U1 Narayana 默认版本 —— **不搬**(产品延后) + +上游 `acdc3551` 只改了 `scripts/cmd_narayana_dasha.py` 一行:`variant_profile` 默认值 `legacy_local` → `kn_rao`。本仓的 `cmd_narayana_dasha.py` 根本没有 `variant_profile` 开关(上游更早加入的 K.N. Rao profile 本仓未同步),生时校正(`event_probes`、`active_rectification_event_engine`)直接调 `narayana_dasha.calc_narayana_mahadasha` 等函数,也不经过这个命令入口;要「默认 K.N. Rao」得先整体移植 profile 机制,不是一行默认值;而「产品是否改用 K.N. Rao 版本」是占星师待裁决项(乙表),改函数默认会同时改生时校正打分。本轮不移植,留待占星师确认后单独立单(需过 v5 评测与历史可打开核对)。 + +### U2 Chara Karaka 罗睺(BUG-1194) + +PM 移植。生时校正只用 `jaimini.calc_arudha_padas`,不读 Karaka;77 例 A/B 分数相同。 + +### U3 燃烧(BUG-1195) + +- PM 移植两提交。全引擎现在两张表:`jyotish_engine.COMBUSTION_ORBS`(全读、普通对话 graha drishti 层)与 `pancha_mahapurusha.COMBUSTION_ORB`(上游形状)。数值相同;`03d60e29` 加测试锁两表相等,并在每个容许度边界验证两个函数。`scripts/validate_yoga_accuracy.py` 另有一张简化表(只顺行),是离线校验脚本,不在产品路径,未改。 +- 普通对话卡上的变化:9 位回测名人中只有齐达内一颗逆行金星由燃烧改为不燃烧。 + +### U4 八分法净化 —— 函数已加,未接入输出 + +上游只新增 `calc_trikona_shodhana` / `calc_ekadhipatya_shodhana`(上游仓内也没有调用方)。本仓同样不接入报告、数据卡与生时校正,SAV 原值不变;函数可供后续调用。`scripts/ashtakavarga.py` 在生时校正冻结身份里,字节变化按 ERR-110 重新冻结。 + +### U5 Yogini(BUG-1196)、U6 诅咒格措辞(BUG-1197)、U7 Budha-Aditya(BUG-1198) + +PM 移植;测试见各提交。U5 上游对本仓不存在的测试文件的改动未带;U7 上游同一 hunk 里其它卡片闸门字段来自别的提交,未带。 + +### U8 Badhaka(BUG-1192) + +- 核对:本仓两处 Badhaka。`yoga_engine.YogaContext.is_badhaka` 已按动 / 定 / 变取 11 / 9 / 7(上游测试 `765ff66c` 通过);`curse_yoga_detector` 亡灵格(Preta Yoga 两条)加重宫位写死 `[8, 11, 6]`、注释「11宫=Badhaka」—— 记忆里说的「写死 11 并输出过早死亡风险」就是这里(「过早死亡风险」已由 U6 去掉)。 +- 修复:`yoga_engine.badhaka_house()` 成为唯一定义,`is_badhaka` 与诅咒格都调它;Preta 两条的加重宫位改为按上升展开(D9 检测用 D9 上升;上升未知时 Badhaka 宫不参与加重,原 `is_badhaka` 对未知上升返回 7 宫,现在返回 False)。 +- 死亡措辞 grep:`rg "过早死亡|死亡风险|早夭|早逝|夭折|血脉.*(中断|停止)|死亡之神" scripts references/*.json` 后剩余:诅咒格「家族影响」两条(子女早夭、家族血脉停止)→ 改为责任 / 传承主题;`references/yoga_rules.json` 母亲不利格效果「母亲早逝 / Early loss of mother」→ 删除。剩余命中只在 `scripts/misconceptions.py`、`scripts/case_validator.py`(李小龙案例笔记,供内部案例校验,不进用户输出)与 `references/*.md` 讲稿资料。前端两份报告阅读 fixture(`report-reader-main-fictional*.json`)是历史引擎输出,仍含「母亲早逝」,未重采(不影响线上)。 +- 测试:`tests/test_curse_yoga_badhaka_house.py`(12 个上升、未知上升、源码与实际输出正则扫描)。 + +### R1 生时校正 4 件 3 域(BUG-1193) + +**门槛位置(改前 → 改后)** + +| 位置 | 改前 | 改后 | +| --- | --- | --- | +| `references/rectification_policy.v1.json` `minConfirmationEvents / minConfirmationDomains` | 4 / 3(只被确认门读) | 不变,成为唯一定义 | +| `frontend/src/lib/rectification-agentic/core/types.ts` `MIN_TRAINING_EVENTS = 3`(收敛判定,只数训练件) | 3 件 | 删除;新 `MIN_DATED_EVENTS / MIN_DATED_DOMAINS` 读政策文件;收敛判定数训练 + 留出,并加领域条件 | +| `core/rectification-decision.ts` `MIN_STANDALONE_DATED_EVENTS / DOMAINS`(区间交付门、出牌前「继续采集」) | 3 / 2 | = `MIN_DATED_*`(4 / 3) | +| `v9/evidence-model.ts` `MIN_ACCEPTANCE_EVENTS / DOMAINS` + `trainingScoreableGate`(训练门:何时开始出选择题、出卡) | 3 / 2,只数训练件 | = `MIN_DATED_*`,数训练 + 留出的全部带日期主经历 | +| `v9/decision-from-dossier.ts` 推断后 `trainingGateOpen` | 训练件 3 / 2 | 训练 + 留出 4 / 3 | +| `scripts/rectification/decision_policy.py` `MIN_ACCEPTANCE_EVENTS / DOMAINS`(回执 `event_quality` / `domain_diversity`,决定 `acceptance_allowed` / `selection_allowed`) | 3 / 2,只数训练件 | = `MIN_CONFIRMATION_*`(政策文件),数全部可计分经历;`POLICY_VERSION` v3 → v4 | +| 其它(未改,含义不同) | `case_holdout.py` / `split-holdout.ts` 第 4 件起留出 1 件;`candidate_contrast.MIN_DISCRIMINATOR_*`(区分题供给);研究脚本 `holdout_v5_build` 7 件 4 域(数据集入选标准);`minute_rectification_holdout_validator` 每例 3 件(固定协议) | — | + +- **计数口径**:产品口径「至少 4 件事」按用户给出的带日期主经历算,包括被留作 holdout 的那一件(留出规则不变:第 4 件起留 1 件)。若改成只数训练件,用户要说 5 件才够。 +- **遗留(待产品)**:留出规则优先把只有一件的领域留作 holdout,刚好 4 件 3 域时,实际参与打分的常是 2 个领域 3 件事。要不要改成「训练件也要 3 个领域」(等于要 5 件以上),请产品定。 +- **打分不变**:77 例 v5 用 `score_candidates`(±10,分钟步长 2,冻结日期)A/B 逐分相同;记忆化 fixture 分数与 v2 golden 相同,只有回执变(`policy_version` v4、`event_quality.minimum` 3 → 4、`domain_diversity.minimum` 2 → 3 且 2 域不再通过、代表候选 UUID 随 policy 命名空间变、`feature_hash` 随 ERR-111 变)。按 BUG-1181 先例「同输入出不同分才升算法版本」,**不升 `rectification-v5-matrix-scoring-11`**;`ALGORITHM_VERSION` 仍 scoring-10,policy 身份 v4。记忆化 golden 按先例由 `write_golden` 写 v3,v2 冻结并按 sha256 钉住(新测试断言 v2 / v3 分数相同、只回执 policy 变)。 +- **历史 Case 能否打开(BUG-621)**:算法版本与 Skill 版本都没变;policy 版本只参与「缓存分数是否可复用」与候选 UUID,旧结果按存储的身份只读打开、重新比较时按 v4 算。前端 `rectification-history-open` / `engine-version-cross-midnight` / `dated-algorithm-generation` 等测试全过(npm test 失败名单与基线相同)。未做浏览器级验证。 +- **采集文案**:`preciseGapNarration` 不再一律「再来一件……就能开始筛」,按缺口写「再来两件记得大概年月的事,其中至少一件不是上学或工作的,就能开始筛」「再来四件……、至少涉及三个方面,就能开始筛」,只差一件时仍是「再来一件……」。保留「就能开始筛」字样(多处合同测试按它识别缺口句)。`VOICE.md` 第 293 行同步。`user-copy.ts` 的 `insufficientEventsGate` / `insufficientDomainsGate`(「再来一件……」)只被 `acceptanceGateNarration` 用,而该函数在 `answer-choice.ts` 只 import 未调用,未改(死代码,记一笔)。遗留表单 `components/birth-time-life-events.tsx`(无引用方)文案与校验同步为 4 条、3 个领域。Skill 文本里没有写 3 件 2 域(只有「propose_allowed 需要可评分事件≥4、领域≥3」),Skill 版本不变。 +- **采集流程**:训练门(`trainingScoreableGate`)同时决定「继续口述采集」与「开始出选择题 / 出卡」,门槛抬到 4 / 3 后,采集线会一直问到 4 件 3 域(原 3 件 2 域就转选择题)。BUG-1048 是出题闸门最小间隔问题,与件数无关;BUG-647 的「holdout 不饿死训练」不变(4 件时训练仍 3 件)。 + +**测试三栏(摘要;逐条注释写在测试里)** + +| 文件 | 用例 | 原值 | 新值 | 原因 | +| --- | --- | --- | --- | --- | +| `rectification-convergence-budget` | insufficient standalone evidence keeps collecting | {2/2}→dated、{3/1}→domains | {3/3}→dated、{4/2}→domains | R1 门槛下方各取一格 | +| 同上 | standalone delivery floor(改名 shares the 4/3 policy…) | 3、2 | 4、3 且与政策同源 | R1 单一定义 | +| 同上 | dossier wiring | 3 条 career → insufficient_domains | 3 career + 1 relationship → insufficient_domains | 3 件会先落 insufficient_dated_events | +| `rectification-decide-next-action` | discrimination waits for…(改名 four dated events across three domains) | three.open=true、3 件出区分题 | false、继续采集;新增 4 件 2 域门关 | R1 | +| `rectification-decision-authority` | invariant 2 | 事件 [0,2,3] × 领域 [0,1,2] | 事件 [0,2,3,4] × 领域 [0,1,2,3],3 件 2 域也必须挡 | R1(测试更严) | +| `rectification-eight-method` | three dated events with one holdout… | holdoutCount=0 | 1(补第 4 件,训练仍 3) | R1 | +| `rectification-occupation-dated-answer` | raises the training gate by one career event | 训练 2 → 3 | 训练 + 留出 = 改前 + 1,holdout=1 | R1 按训练 + 留出计 | +| `rectification-probe-pool-exhausted` | T4 标题 | 「对照了 4 件经历」 | 「对照了 5 件经历」 | 夹具多一件第 3 域经历 | +| `rectification-collect-stall` | revision 5… | holdout `e-rel-start` | holdout `e-finance`、`e-rel-start` 断言为训练 | 夹具补第 3 域后单件域被留出 | +| `rectification-block-scan` | 题名 three dated events in two domains… | — | four dated events in three domains(断言不变) | R1 | +| `tests/test_rectification_confirmation_and.py` | four events two domains(改名 neither selects nor proposes) | selection_allowed=True | False,`domain_diversity` 不过、minimum 3 | R1 | +| `tests/test_rectification_relative_support.py`、`test_rectification_v5_services.py` | policy 版本 | v3 | v4 | R1 | +| `tests/test_rectification_engine_memoization.py` | 当前 golden | v2 | v3(v2 冻结 + 分数相等测试) | R1 回执变 | + +其余 23 个前端文件只改夹具(补第 4 件 / 第 3 域,保持原场景),每处带「R1(BUG-1193)」注释;没有删断言。 + +## 生时校正评测(v5 77 例) + +- `python3 scripts/research/holdout_v5_baseline.py --dataset v5 --out-dir