Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014Ad9rqAB8pXXvyzh7f4X8v
9.1 KiB
任务书:full-reading 补齐上游 5 个模块(2026-10-18)
基线与顺序
origin/staging=47b4a2317(开工前git fetch origin --prune,以最新为准)。- 分支:
codex/full-reading-module-parity-20261018;工作树:.worktrees/full-reading-module-parity-20261018。 - 顺序:纯 Python,和 #78(档案上限,只改前端与迁移)没有文件冲突,可以先做。和 #79(婚恋合盘引擎)都可能动
scripts/jyotish_engine.py,两边都只加不改,后合入的一方解决冲突。必须在TASK-synastry-full-report-20261018.md开工前合入。 - 上游参照:占星师仓库
yinduzhanxing提交bde5d615。上游仓库私有,本单需要的文件副本在docs/research/upstream_full_reading_parity_bde5d615/(.py.txt搬入时去掉.txt)。
现状实证
Claude 10-18 用两位公开名人(布拉德·皮特、安吉丽娜·朱莉,出生资料来自公开星盘库)在两边各跑一次 full-reading(--ayanamsa lahiri --node-mode mean --today 2026-10-18):我们 81 个模块,上游 86 个。
| # | 模块(modules.<key>) |
我们现状 | 上游 | 定位 |
|---|---|---|---|---|
| 1 | unified_western_reading |
永远 blocked:No module named 'unified_western_reading'。引擎里有调用,文件从没搬过来 |
parameter_sensitive,有原始结果 |
我们 scripts/jyotish_engine.py 里 from unified_western_reading import build_unified_western_reading(full-reading 内);上游 scripts/unified_western_reading.py |
| 2 | lagna_vargottamamsa |
没有这个键 | D1 / D9 上升是否同星座 | 上游引擎 _calc_lagna_vargottamamsa |
| 3 | pushkara_planets |
没有这个键(原始 pushkara 有) |
落在 Pushkara 的行星简表 | 上游引擎 _summarize_pushkara_planets |
| 4 | punarphoo |
没有这个键;scripts/punarphoo.py 与上游逐字相同,只是 full-reading 没调用 |
observation_only |
上游 full-reading 里 detect_punarphoo(planets) |
| 5 | navamsha_dasha |
没有这个键 | Goel Method 1(goel_method_1_v1) |
上游 scripts/navamsha_dasha.py(依赖上游 dasha_profile_arbitration、rashi_dasha_explicit_contract,我们都没有) |
| 6 | niryaana_shoola_dasha |
没有这个键 | 上游 scripts/niryaana_shoola_dasha.py |
见下条 |
我们已有更好的两套:Navamsha Dasha 与 Niryaana Shoola 在 scripts/rashi_dashas_native.py(_navamsha 用 goel_method_1_v1,Niryaana Shoola 用 goel_nirayana_shoola_v1),完整数据版报告经 scripts/rashi_dasha_report.py 在用。BUG-1283 已定:上游那份 niryaana_shoola_dasha.py(按 365.25636 日一年、上升与第 7 宫平手就停)不得再被新路径调用;上游 bde5d615 的版本仍是 YEAR_DAYS = 365.25636。
影响:上游合盘证据包的「次要大运互证」一项因 navamsha_dasha 缺失整项 blocked;西占层在个人报告与合盘里都拿不到。
根因
前几轮上游同步只按提交范围挑,这几处是上游 7~9 月加进 full-reading 的(fad247d4、568d8d20、2ff139de、680f94e5 等),我们同步时漏了;unified_western_reading 则是调用搬了、文件没搬。
决策记录(产品负责人 2026-10-18)
| # | 决定 |
|---|---|
| F1 | 比上游少的模块都补上,让我们的 full-reading 是上游的超集 |
| F2 | navamsha_dasha、niryaana_shoola_dasha 两个键用我们自己的 rashi_dashas_native 结果填,不搬上游那两份文件(BUG-1283 的红线不变)。键名与上游一致,形状按上游合盘校验器能识别的方式包一层(见 T3) |
| F2b | 10-18 更正(占星师 7a773d13):我们 rashi_dashas_native 里的 Niryaana Shoola(goel_nirayana_shoola_v1)其实是 Shoola 的规则,正确口径另立单 TASK-niryaana-shoola-pvr-20261018.md。所以本单 niryaana_shoola_dasha 键不再用它填,只写占位 {"execution_status": "blocked", "reason": "口径更正中,见 TASK-niryaana-shoola-pvr-20261018"};合盘校验器对这一行本来就固定判「不适用」,不影响合盘。navamsha_dasha 照原计划 |
| F3 | 西占层(unified_western_reading)按上游搬入。它在报告里的用途与上游一致:只作补充,合盘报告不得出现方法名(合盘任务书红线 3) |
| F4 | 个人报告里如果因为西占层从 blocked 变成有结果而多出内容,这是预期的修复,不是回归;改动的断言写三栏说明 |
硬红线
scripts/jyotish_api_server.py不动。scripts/jyotish_engine.py只在 full-reading 组装处加键,不改既有键的值。- 不得 import
scripts/niryaana_shoola_dasha.py(BUG-1283 的语法树断言tests/test_rashi_dashas_native.py必须仍然绿)。 - 生产不 import PyJHora。验收会屏蔽 PyJHora 模拟生产(见
feedback-acceptance-prod-deps)。 - 运行时不得联网、不得调外部程序(T1 测试②守住)。
- full-reading 耗时:两位名人各跑 3 次取中位数,前后对比写进 PROGRESS。增加超过 20% 要说明来源,超过 50% 停下报 Claude。
- 全量 pytest 与开工基线逐条比对,无新增失败。改既有断言写「原值 / 新值 / 原因」三栏。
任务分解
| # | 内容 | 验收标准 |
|---|---|---|
| T1 | 西占层:搬上游 scripts/unified_western_reading.py。它在导入时需要 scripts/classical_astrology.py(上游约 1.3 万行,我们没有这个文件)以及 western_chart_engine.py、western_timing_engine.py 里的若干函数(这两份与上游有差异)。做法:classical_astrology.py 原样整份搬入(Claude 已用语法树核对:build_classical_astrology_packet 走不到任何 urlopen / subprocess.run;联网和调外部程序的只有 OCR、Astrolog、公开案例抓取那几个研究用函数,full-reading 不调用);western_* 只补 unified_western_reading 与 classical_astrology 需要的函数,其余差异记进 PROGRESS,不顺手同步 |
两位名人 modules.unified_western_reading.status 不再是 blocked;新增测试:① full-reading 里该模块能导入(防止再出现「调用搬了、文件没搬」);② 把 urllib.request.urlopen 和 subprocess.run 打桩成抛错后跑一次 full-reading,仍然成功(证明运行时不联网) |
| T2 | 三个简单键:从上游引擎搬 _calc_lagna_vargottamamsa、_summarize_pushkara_planets 两个函数,并在 full-reading 里写 lagna_vargottamamsa、pushkara_planets、punarphoo(调用现有 scripts/punarphoo.py,包法照上游,异常时写 {"status": "blocked", "reason": …}) |
每个键各一条测试;名人结果与上游同一输入逐字段一致 |
| T3 | 两个大运键:用 rashi_dashas_native.calculate_rashi_dashas 的 Navamsha 与 Niryaana Shoola 结果填 navamsha_dasha、niryaana_shoola_dasha。保留我们的 profile id 和期间表;外层加上游校验器读的状态字段(以上游 skills/jyotish-full-synastry-reading/scripts/validate_full_synastry_packets.py 的 _status 为准:不能是 blocked / not_available / unavailable / skipped,也不能只有 error) |
用上游 validate_full_synastry_packets.py 跑两位名人:Navamsha Dasha、Niryaana Shoola Dasha 两行都是 executed 或 parameter_sensitive;合盘任务「secondary-dasha convergence」不再是 blocked;名人的 Navamsha 大运首段与上游 goel_method_1_v1 一致(不一致写进 PROGRESS 交 Claude 仲裁) |
| T4 | 超集断言:新增测试固定 full-reading 的模块键清单(至少包含上游 86 个键名),以后少了会红 | 测试绿 |
| T5 | 记录:BUG_HISTORY(下节编号)、CHANGELOG(报告里西占层恢复)、PROGRESS(耗时对比、未同步的西占差异、上游与我们 Navamsha 首段对比) | 文档齐 |
让步顺序
T3 → T2 → T1 → T4。T1 若因依赖差异过大做不完,先交 T2–T4,T1 写进 BLOCKED 并单独回报,不得为了搬它而整份覆盖我们的 western_* 文件。
开工前置命令
git fetch origin --prune
git worktree add -b codex/full-reading-module-parity-20261018 .worktrees/full-reading-module-parity-20261018 origin/staging
cd .worktrees/full-reading-module-parity-20261018
ls docs/research/upstream_full_reading_parity_bde5d615/
grep -n "from unified_western_reading" scripts/jyotish_engine.py
grep -n "BUG-1[0-9][0-9][0-9]" docs/BUG_HISTORY.md | tail -3
python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45
验证:全量 pytest tests -n 4 与开工基线逐条比对;run_quality_gate.py --profile quick;屏蔽 PyJHora 后再跑一遍 tests/test_rashi_dashas_native.py 与新增测试。
BUG 编号
#79 已预留 BUG-1370~1374。本单从 BUG-1375 起(开工时核对最大号,冲突整体顺延):
| 建议编号 | 事实 |
|---|---|
| BUG-1375 | full-reading 的西占层永远 blocked:引擎调用了 unified_western_reading,文件没搬(实证 1) |
| BUG-1376 | full-reading 比上游少 5 个模块键,合盘证据包「次要大运互证」整项 blocked(实证 2~6) |