# 生时校正:甲8 事件映射与甲9 月亮行运在 v5 77 例上的试算(2026-10-03) > 研究分支归档:代码与脚本留在分支(甲1 `codex/affliction-weight-trial-20261003` `bcaeb990`;甲8/甲9 `codex/rectification-mapping-trial-20261003` `3767b899`),不合入。staging 只收本记录。 > 研究记录,不合入、不上线。分支 `codex/rectification-mapping-trial-20261003`,基线 `origin/staging` `80160d20`(引擎与评测代码与之后的 `d0233e3c` 相同,后者只多一份任务书)。 > 提议来源:占星师侧交回的「裁决记录」(判定为其 Agent 自拟,待她本人确认),见 `docs/research/astrologer_questions_v3_2026_10_03.md` 甲8、甲9。 ## 结论 1. **甲8 映射(变体 A)明显变差**:±10 / ±30 / ±60 三档的六题回放头名分别降 13.0 / 10.4 / 7.8 个百分点(cluster 口径降 16.9 / 15.6 / 20.8),±60 六格真值在区间 76 → 72。按「任一档降 >1pt 即变差」,判 **变差**。 2. **主因是事业行把 10 宫扩成 10、6、9、11**:单独只改事业一行,±10 回放头名就降 10.4pt(cluster 口径 13.0pt),±30 降 14.3pt。宫位放宽后几乎每个候选都「命中」,题卡能分开的候选变少:±10 平均可问题数从 5.1 降到 3.8,±60 六题后淘汰的候选中位数从 15 降到 7。 3. **甲9 月亮行运按提议写法(变体 B:两锚各算、每命中 1.0 分)轻微变差**:±10 / ±30 不变,±60 回放头名降 1.3pt(1 例),六格真值在区间 76 → 74。判 **变差**(够门槛,但只差 1–2 例,属噪声边缘)。 4. **只加月亮锚、行运权重保持 0.25(变体 B0)对所有档位零影响**:77 例中 8 例先验名次挪了 1–4 位,没有一个档位的数字变。行运只看木星、土星落宫,同一时间窗里所有候选的月亮星座几乎都一样,加月亮锚近似给所有候选加同一个常数。 5. **两者都改(变体 C)最差**:±10 / ±30 / ±60 回放头名降 13.0 / 13.0 / 7.8pt,±60 真值覆盖 98.7% → 93.5%,六格真值在区间 76 → 71。 6. **建议**:甲8 不按此表上线;若占星师本人确认要用,事业行先不要扩宫,或扩宫的同时要有「只奖不罚」以外的区分机制(这一点 09-29 的打分研究已证实做不出稳定信号)。甲9 月亮行运可以按「分别记录、不改权重」的方式做成观察项(B0 无害),但它对校正几乎没有信息量,不值得为它升级打分版本。 ## 方法 - 评测:`scripts/research/holdout_v5_baseline.py --dataset v5`(v5 77 例、964 件事件;sweep / cluster_width / futile_collect 三套),`PYTHONHASHSEED=0`。基线在未改动的代码上跑;分支上开关关闭(`off`)再跑一遍,三段结果与基线逐项相同、sweep 逐例结果逐字节相同,说明开关关闭时生产行为不变。 - 变体由环境变量切换(只在 `scripts/active_rectification_event_engine.py` 导入时读取,默认关闭): - `RECTIFICATION_MAPPING_TRIAL=a`:只改甲8 映射。 - `=b`:只改甲9,行运从命宫和月亮各算一项,每命中 1.0 分(原为命宫一项、每命中 0.25 分)。 - `=b0`:只加月亮锚,行运每命中仍 0.25 分(用来把「加锚」和「加权重」拆开)。 - `=c`:a + b。 - `RECTIFICATION_MAPPING_TRIAL_DOMAINS=career` 等:只启用甲8 表中的某一行(消融)。 - 运行与对比脚本:`scripts/research/rectification_mapping_trial.py`(`run` 给每个变体用独立的临时数据集文件名,可并行;`compare` 出下表)。各档汇总数字存 `docs/research/rectification_mapping_trial_2026_10_03.json`。 - Dasha 权重(Vimshottari 2.0 / 1.5 / 0.75、Narayana 2.0 / 1.0)、分盘分摊公式 `weight / (2·分盘数)`、精度权重、功能吉凶辅助、Ashtakavarga / Shadbala 辅助、出卡与闸门全部不动;没有改打分版本号、迁移和前端。 ### 变体 A 实际实现的映射 | 事件 | 现行(网站) | 试算 A | 说明 | | --- | --- | --- | --- | | 婚恋 | 7 宫 + D9;A7、UL | 7、2、11 宫 + D9;只看 UL | 提议表没有 A7,按表去掉 | | 事业 | 10 宫 + D10;A10 | 10、6、9、11 宫 + D10;A10 | | | 财富 | 2、11 宫 + D2、D11 | 2、11、5、9 宫 + D2、D11 | 「Dhana 相关宫主」按这四宫的宫主计 | | 健康 | 6、8、12 宫 + D30 | 1、6、8、12 宫 + D6、D8、D30 | D6、D8 为试算新算,不进候选指纹 | | 学业 | 4、5、9 宫 + D24、D5 | 4、5、9 宫 + D24 | 去掉 D5 | | 迁居 | 4、12 宫 + D4 | 不变 | | | 父亲 | (六亲统一:3、4、5、9 宫 + D12、D7、D3) | 9、10 宫 + D12 | 按事件文本拆分,见下 | | 母亲 | 同上 | 4 宫 + D12 | | | 父母(未指明哪一方) | 同上 | 4、9、10 宫 + D12 | 提议表没有这一行,取父、母两行并集 | | 子女 | 同上 | 5、2、11 宫 + D7 | | | 兄弟姐妹 | 同上 | 3、11 宫 + D3 | | | 六亲中无法归类 | 同上 | 保持现行六亲映射 | | 「D1」在提议表每一行都有:现行引擎本来就按 D1 宫位和宫主计分,不需要另加。「1 宫主 / 4 宫主 / 5 宫主 / 7 宫主 / 3 宫主」都已被「目标宫的宫主」规则覆盖。「缺必要分盘不计分、不替代」与现行规则一致(缺分盘该事件跳过)。 ### 六亲拆分怎么做的 v5 事件只有 `family` 一个标签,没有子类。本轮用事件英文描述的关键词拆分(`trial_family_subdomain`,顺序:子女 → 父母 → 父亲 → 母亲 → 兄弟姐妹)。130 件六亲事件的归类: | 子类 | 件数 | | --- | --- | | 子女 | 78 | | 父亲 | 16 | | 母亲 | 10 | | 父母(未指明) | 7 | | 兄弟姐妹 | 8 | | 无法归类(配偶/伴侣去世 6 件、叔伯、祖辈、治疗师、被收养等) | 11 | 线上用户口述经历没有这样的英文描述,也没有子类字段;题卡生成的六亲探针同样只有「六亲」一类,本轮一律保持现行映射。所以六亲拆分只覆盖 v5 的口述事件,**线上要用必须先让采集环节区分父/母/子女/兄弟姐妹**。 ## 结果:基线 vs A / B / B0 / C 「回放头名」= 六张题卡答完后头名候选是真值;sweep 与 cluster 两套口径分别来自 `minute_resolution_sweep` 与 `cluster_width_probe`(后者用线上 `unionStillValidRange`)。「六格真值在区间」来自 `futile_collect_stop_replay`(truth / opposite 两个方向)。括号内为与基线之差;1 例 ≈ 1.3pt。 | 指标 | 基线 | A 甲8 | B 甲9(1.0) | B0 月亮锚(0.25) | C 甲8+甲9 | | --- | --- | --- | --- | --- | --- | | ±10 引擎先验头名 | 18.2% | 18.2% (+0.0) | 19.5% (+1.3) | 18.2% (+0.0) | 16.9% (−1.3) | | ±10 回放头名(sweep) | 63.6% | 50.6% (**−13.0**) | 63.6% (+0.0) | 63.6% (+0.0) | 50.6% (**−13.0**) | | ±10 回放头名(cluster) | 66.2% | 49.4% (**−16.9**) | 66.2% (+0.0) | 66.2% (+0.0) | 48.1% (**−18.2**) | | ±10 真值覆盖(cluster) | 98.7% | 97.4% (−1.3) | 98.7% | 98.7% | 97.4% (−1.3) | | ±10 区间宽度中位(分钟) | 13 | 15 | 13 | 13 | 15 | | ±30 引擎先验头名 | 9.1% | 9.1% | 9.1% | 9.1% | 9.1% | | ±30 回放头名(sweep) | 49.4% | 39.0% (**−10.4**) | 49.4% | 49.4% | 36.4% (**−13.0**) | | ±30 回放头名(cluster) | 55.8% | 40.3% (**−15.6**) | 55.8% | 55.8% | 37.7% (**−18.2**) | | ±30 真值覆盖(cluster) | 98.7% | 97.4% (−1.3) | 98.7% | 98.7% | 97.4% (−1.3) | | ±30 区间宽度中位(分钟) | 33 | 41 | 35 | 35 | 41 | | ±60 引擎先验头名 | 7.8% | 6.5% (−1.3) | 7.8% | 7.8% | 5.2% (−2.6) | | ±60 回放头名(sweep) | 31.2% | 23.4% (**−7.8**) | 29.9% (−1.3) | 31.2% | 23.4% (**−7.8**) | | ±60 回放头名(cluster) | 40.3% | 19.5% (**−20.8**) | 39.0% (−1.3) | 40.3% | 19.5% (**−20.8**) | | ±60 真值覆盖(cluster) | 98.7% | 96.1% (−2.6) | 98.7% | 98.7% | 93.5% (−5.2) | | ±60 区间宽度中位(分钟) | 65 | 73 | 65 | 69 | 73 | | ±10 六格真值在区间 truth / opposite | 76 / 76 | 76 / 76 | 76 / 76 | 76 / 76 | 76 / 76 | | ±30 六格真值在区间 truth / opposite | 75 / 75 | 74 / 73 | 75 / 75 | 75 / 75 | 74 / 73 | | ±60 六格真值在区间 truth / opposite | 76 / 76 | 72 / 73 | 74 / 75 | 76 / 76 | 71 / 70 | | **判定(任一档降 >1pt = 变差)** | — | **变差** | **变差**(只差 1–2 例) | **不变** | **变差** | 基线说明:本轮基线比 09-29 发布的 v5 数字(`holdout_v5_baseline_v5_all_2026_09_29.json`)略有不同(例如 ±30 先验头名 7.8% → 9.1%、±60 cluster 回放 32.5% → 40.3%),因为 staging 之后合入了功能吉凶 v2、sync4、sync5 等改动;本文所有差值都相对本轮同代码基线。 ### 为什么 A 变差:题卡失去区分力 | ±档 | 平均可问题数 基线 → A | 平均实问题数 基线 → A | 六题后淘汰候选中位 基线 → A | 引擎先验真值平均名次 基线 → A | | --- | --- | --- | --- | --- | | ±10 | 5.10 → 3.82 | 4.21 → 3.51 | 2 → 1 | 3.58 → 3.47 | | ±30 | 7.10 → 6.27 | 5.44 → 5.25 | 7 → 4 | 9.01 → 8.05 | | ±60 | 7.25 → 6.96 | 5.45 → 5.44 | 15 → 7 | 17.74 → 15.68 | A 让口述事件的先验排名略好(真值平均名次前移约 1–2 位),但宫位放宽后不同候选对同一年份的「命中/不命中」更趋一致,题卡能问的、能淘汰的都少了,六题后的头名反而大幅下降。校正的信息主要来自问答而不是先验(见 09-29 定论),所以总体是变差。 ### 消融:甲8 每一行单独启用 | 指标 | 基线 | 只改婚恋 | 只改事业 | 只改财富 | 只改健康 | 只改学业 | 只拆六亲 | | --- | --- | --- | --- | --- | --- | --- | --- | | ±10 回放头名(sweep) | 63.6% | −1.3 | **−10.4** | −1.3 | −2.6 | −1.3 | +1.3 | | ±10 回放头名(cluster) | 66.2% | +0.0 | **−13.0** | +0.0 | −1.3 | +0.0 | −2.6 | | ±30 回放头名(sweep) | 49.4% | +0.0 | **−14.3** | +0.0 | −3.9 | +3.9 | +0.0 | | ±30 回放头名(cluster) | 55.8% | −3.9 | **−15.6** | −3.9 | +1.3 | +1.3 | −3.9 | | ±60 回放头名(sweep) | 31.2% | +3.9 | −1.3 | −3.9 | +1.3 | +1.3 | +1.3 | | ±60 回放头名(cluster) | 40.3% | −2.6 | **−9.1** | −6.5 | +1.3 | −2.6 | −3.9 | | ±10 六格真值在区间 truth / opposite | 76 / 76 | 75 / 75 | 76 / 76 | 76 / 76 | 76 / 76 | 76 / 76 | 76 / 76 | | ±30 六格真值在区间 truth / opposite | 75 / 75 | 74 / 76 | 75 / 75 | 76 / 76 | 75 / 75 | 76 / 76 | 76 / 76 | | ±60 六格真值在区间 truth / opposite | 76 / 76 | 74 / 73 | 73 / 74 | 76 / 76 | 74 / 74 | 76 / 76 | 75 / 75 | 事业行是唯一一个稳定大幅变差的行;其余各行在 ±1~4 例之间来回摆,按 1pt 门槛也都算「变差」,但量级在 77 例的噪声线上,不能据此说它们有益或有害。 ### 逐例变化最大的 5 例 排序分 = 三档先验真值名次变化之和 + 每次回放头名翻转记 5 分。只列案例 id。 - **A**(75/77 例有变化):`serena_williams_1981_aa_v5_holdout`(±10 回放头名中→失)、`silvio_santos_1930_aa_v5_holdout`(三档回放头名都中→失)、`chad_everett_1937_aa_v4_holdout`(三档都中→失)、`george_w_bush_1946_aa_v5_holdout`(±60 失→中)、`lionel_messi_1987_aa_v5_holdout`(±30、±60 失→中)。 - **B**(27/77):`joseph_kennedy_iii_1980_aa_v4_holdout`(先验名次 3→1 / 9→5 / 12→5)、`audrey_hepburn_1929_aa_v5_holdout`、`cher_1946_aa_v5_holdout`、`frida_kahlo_1907_aa_v5_holdout`(±60 回放头名中→失)、`muhammad_ali_1942_aa_v5_holdout`。 - **B0**(8/77,全部只是先验名次挪 1–4 位):`cher_1946_aa_v5_holdout`、`charles_de_gaulle_1890_aa_v5_holdout`、`elizabeth_montgomery_1933_aa_v4_holdout`、`lou_diamond_phillips_1962_aa_v5_holdout`、`sigmund_freud_1856_aa_v4_holdout`。 - **C**(76/77):`serena_williams_1981_aa_v5_holdout`、`chad_everett_1937_aa_v4_holdout`、`george_w_bush_1946_aa_v5_holdout`、`lionel_messi_1987_aa_v5_holdout`、`silvio_santos_1930_aa_v5_holdout`。 ## 没实现 / 无法试算 | 项 | 状态 | 原因 | | --- | --- | --- | | 征象星:金星、DK(婚恋);AmK、太阳(事业);太阳、月亮(健康);水星、木星(学业);月亮(迁居);太阳、PiK(父亲);月亮、MK(母亲);木星(子女);火星(兄弟姐妹) | **未实现,需新增通道** | 现行引擎只有「大运主星落目标宫 / 是目标宫主 / 在分盘落目标宫」三条通道,没有「大运主星是某征象星」或「征象星受激活」的计分通道;Chara karaka(DK、AmK、PiK、MK)也没有进校正上下文。本轮只实现宫位、分盘部分。 | | 「Dhana 相关宫主」 | 近似 | 按 2、11、5、9 宫主计(目标宫宫主规则);没有实现 Dhana yoga 组合判断。 | | 父母 / 子女 / 兄弟姐妹拆分 | 只对 v5 口述事件生效 | 数据只有「六亲」标签,按英文描述关键词拆;11 件无法归类的保持现行映射。线上采集与题卡没有子类,上线前要先改采集。 | | 题卡(探针)的六亲题 | 保持现行映射 | 题卡只有「六亲」一类。其余领域的题卡随映射一起变(同一张 `DOMAIN_CONFIG`)。 | | 行运锚点记录 `transit_anchor` | 以规则名记录 | 命宫锚保持原规则名 `controlled_transit_*_domain_house`;月亮锚记为 `transit_anchor_moon_controlled_transit_*_domain_house`。没有在证据结构里加独立字段(避免动输出契约)。 | | 行运权重 1.0 的含义 | 按「每个锚点每命中一颗星 1.0 分」解释 | 提议原文只写「transit 权重 1.0」。另跑 B0(保持 0.25)把加锚和加权重分开。 | | 研究辅助模块(`minute_rectification_fact_ranker_v4`、`dynamic_rectification_*` 等) | 只随标准领域变化 | 它们直接读 `DOMAIN_CONFIG[领域]`,不认识六亲子类;本评测不经过这些模块。 | ## 测试 - `python3 -m pytest tests/test_repo_privacy_markers.py -q`:通过。 - 定向测试(本机无 `.venv`,用系统 `python3` 3.13):events / events_v4 / memoization / raman / convergence / confirmation / dated_transitions / api / 冻结身份四个文件。分支比 `origin/staging` 多 4 个失败,全部是**冻结哈希检查**(`test_sealed_holdout_contract_freshness` 三条、`test_reported_offset_research::test_recorded_specification_and_all_prespecified_cells`):引擎文件内容变了,冻结哈希对不上。这是预期结果,本分支不合入,所以没有重新冻结;真要上线须按 ERR-110 重新冻结并升级打分版本。另两条失败(`test_frozen_implementation_hash_matches_manifest`、`test_long_real_conversation_reaches_vedastro_after_local_range_is_narrow`)在 `origin/staging` 上同样失败,与本轮无关。 - 快速门 `python3 scripts/run_quality_gate.py --profile quick`(无 `.venv`,系统 `python3`):`origin/staging` 一次性检出 Python 段 1047 passed / 1 skipped,随后 `npm test` 因检出里没有 `node_modules` 失败(环境缺口);本分支 Python 段 1042 passed / 4 failed / 1 skipped,4 条失败全是 `test_rectification_validation_integrity_gate.py` 里的同一组冻结哈希检查(同上原因),门禁在 Python 段停下、未跑前端。本分支没有改前端。