Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
5.9 KiB
PROGRESS · BUG-1061 双重过运跨层(D1+D9)配对按名字数字比对(2026-09-27)
- 执行方式:直接执行(产品负责人 2026-09-27 同意修复 BUG-1061,由子代理实现),无单独任务书。
- 基线:
origin/staging=9aa37197;分支codex/bug-1061-cross-layer-pairing-20260927,工作树.worktrees/bug-1061-cross-layer-pairing-20260927;未推送。 - 开工预检:
python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45退出 0,remote_visibility verified,focused tests ok。 - 冻结计分清单(ERR-110):
scripts/jyotish_engine.py、scripts/run_quality_gate.py不在sealed_holdout_rerun.pyPRODUCTION_FILES与 holdout v2/v3frozen_scoring.files里;未动scripts/jyotish_api_server.py、.gitea/**、deploy/**、迁移。
改了什么
| 文件 | 改动 |
|---|---|
scripts/jyotish_engine.py |
新增 _double_transit_target_meta(D1 / D9 目标的 layer / kind / house / planet)与 _double_transit_target_identities;cmd_double_transit_pac 跨层两段循环改为身份集合有交集才配对,删掉按名字抽数字的比较。目标名、各层结果、条目格式、摘要文案不变 |
tests/test_double_transit_cross_layer_pairing.py |
新增 8 条回归(三张公开 AA 盘真实引擎) |
scripts/run_quality_gate.py |
新测试进 CORE_PYTEST_TARGETS |
frontend/tests/fixtures/consult-evidence-card-golden.json |
用采集脚本重生成(未手改) |
配对规则逐条决定与理由见 docs/BUG_HISTORY.md BUG-1061。一句话:只认「同一宫」(D1 第 N 宫 ↔ D9 第 N 宫)与「同为 D1 第 N 宫主这颗星」(D1 宫主 ↔ 它的 D9 星座,以及它恰好也是 D9 第 N 宫主时的那项)。
试算过、未采纳的两种扩大口径(4 组输入 × 12 宫):
| 口径 | 跨层条目 | 摘要句变化 | 不采纳原因 |
|---|---|---|---|
| 采纳:同宫 + 同为 D1 第 N 宫主 | 31 → 38 | 7 / 48 | — |
| + 两层第 N 宫主互配(不同星) | 31 → 59 | 14 / 48 | 不是同一征象星,KN Rao 三点里没有 D9 宫主;扩大技法口径需产品另定 |
| + 上升主与其 D9 星座互配 | 31 → 89 | 24 / 48 | 与第 N 宫无关,同一对在 12 个宫的调用里重复出现 |
前后对照(3 张公开 AA 盘 + 报告 golden 虚构输入,各 12 宫;PYTHONHASHSEED=0,chart 缓存 TTL 0)
| 输入 | 跨层条目 修复前 | 修复后 | 变化 |
|---|---|---|---|
| barack_obama | 10 | 10 | 无 |
| elizabeth_taylor | 9 | 10 | +6 宫、+12 宫同宫条目;−9 宫误配 Jupiter(D1)9宫(Cancer) + Saturn(D9)Mars_D9(Capricorn) |
| steve_jobs | 6 | 9 | +2 / 6 / 7 宫同宫条目 |
| 虚构输入(报告 golden) | 6 | 9 | +1 / 2 / 8 宫同宫条目(报告跑的 7 宫不变,仍 4 条) |
| 合计 | 31 | 38 | +8 / −1;宫主类条目全部不变 |
d1、d9、cl、层内(D1 / D9 / CL)条目、stats 48/48 不变;摘要句 7/48 变化(6 处「❌ 无」→「⚠️ 跨层间接」,泰勒 9 宫反向)。
Golden
- D1 / CL golden:
JYOTISH_API_CHART_CACHE_TTL_SECONDS=0 PYTHONHASHSEED=0 python3 tests/test_double_transit_d9_targets.py --capture重生成,逐字节不变。 - 数据卡 golden:
JYOTISH_API_CHART_CACHE_TTL_SECONDS=0 PYTHONHASHSEED=0 python3 scripts/research/capture_consult_evidence_card_golden.py,两次运行逐字节相同。与原文件比,只有consultation_native_layers.double_transit子树变化(其余逐项相同):乔布斯结论 6 → 9、house_7_summary「❌ 无」→「⚠️ 跨层间接」;泰勒 9 → 10;奥巴马不变;family / annual / timing 三路相同。 report-density-fictional-reader.json:09-23 冻结快照、无采集脚本,本轮未重生成(报告只跑 7 宫,本轮 7 宫条目数不变)。
测试
| 项 | 基线 9aa37197 |
修复后 |
|---|---|---|
Python 门禁集(gate-pytest-args,含 growth contract / privacy markers / validation integrity)+ test_double_transit_d9_targets + test_consultation_native_layers + test_report_reader_main + test_report_density_facts(修复后另加新文件) |
978 passed / 1 skipped | 986 passed / 1 skipped(+8 新增;同一条 skip) |
tests/test_double_transit_cross_layer_pairing.py 在基线引擎上 |
3 failed / 4 errors(新函数不存在)/ 1 passed(快速门登记) | 8 passed |
| 前端受影响 5 个文件(evidence-card v1 / v2 / telemetry、projection native / timing) | — | 34/34 pass |
前端全量(Node 22.14,tsx --test tests/*.test.ts tests/*.test.tsx) |
4192 / pass 4138 / fail 24 / skipped 30 / cancelled 0 | 4192 / pass 4138 / fail 24 / skipped 30 / cancelled 0 |
前端 24 条失败两边按名字逐条相同(含嵌套子测试比对;全部是需要 Docker / PostgreSQL 的数据库与部署套件),新增失败 0。本轮没有修改任何既有断言。前端基线的做法:同一工作树临时换回基线数据卡 golden 跑全量,再换回新 golden(前端只受这份 fixture 影响)。
未做 / 另记
- 部署后 chart 缓存(15 分钟 TTL,键不含代码版本)可能短暂返回旧跨层条目。
- 环境缺口:无 Docker,数据库 / 部署套件以与基线逐条一致的失败清单代替。
- 无新增缺陷编号。
验收(Claude,2026-09-27)
基于 9aa37197 独立复跑(Node 22.14,顺序执行):tsc 0;lint 0 error;npm test 4192 / 24 fail / 0 cancelled / 30 skip,失败名单与性别单基线逐条一致、无消失测试名;Python 门禁集退出 0;tests/test_double_transit_cross_layer_pairing.py + test_double_transit_d9_targets.py + test_consultation_native_layers.py 通过;build 正常。配对规则只认「同一宫」与「同一个第 N 宫宫主」两种身份,宫主类条目与 D1/D9/CL 各层结果不变;交叉层条目 31→38(8 条新增同宫配对、1 条误配移除)。推送前 rebase 到 037cd1aa(仅文档)。