# PROGRESS — 完整数据版补齐(二)(#92) - 分支:`codex/full-data-parity-2-20261021` - 开工基线:`origin/staging` = `85e8adddbc9c14e31c687c91ad8666afe3290e64`(#91 已合入)。本地先合并的就是这个 staging,没有 rebase。 - 工作树:代理循环指定的 `G:\Ferti\Jyotisha\.worktrees\agent-loop`,没有另建 `.worktrees/full-data-parity-2-20261021`。 - 最大 BUG 号仍是 BUG-1426。本单没有新开缺陷编号。 ## 做了什么 完整数据版在原有六章之后加三块,渲染时现算,不写进资料包,不进对话卡,不进校正打分。 1. **补充推运计算数据**:Tithi Ashtottari 本命顺逆、年度三年里每一对 300 到 400 天的回归(角距和时间余额,顺逆,只到子运)、Yoga Vimshottari 本命、目标年内的 Yoga / Nakshatra 回归以及每个回归之后 300 到 400 天里的后继和 360 个太阴月年、七分盘星座主、Buddhi Gati、Kaala、Sudasa 出生周期、Sudasa 已确认起点(只写原因)、Varnada、Karana 三种(目标年里的每一次 Tithi 回归)。 2. **辅助大运次小运数据**:Sthira、Drig、Shoola、Navamsha 的次小运。主运和子运的生产者没有改,次小运加在副本上。Niryaana Shoola 不列子运和次小运。Kalachakra 只加第三层,沿用简化模型,不改已有主运和子运。 3. **研究型分盘**:D81、D108、D144,有 D150 时一并列出。普通分盘数值表里不再印这三盘。 每一节都重复研究口径那一句,因为阅读页按二级标题翻页,章首那句可能会被翻走。 位置用我们自己的星历和真岁差。没有搬视位置、Moshier、真位置开关,也没有搬 PyJHora 运行时对照模块。 ## T0 盘点 | 方法 | 上游 | 输入 | 出处或 blocked | 我方改动 | | --- | --- | --- | --- | --- | | Tithi Ashtottari 本命顺/逆 | `tithi_ashtottari.py` | 出生日月角距,108 年 | 教程没有写第三层 | 经度改我方函数;次小运不列 | | Tithi 年度 | `customer_timing_supplement.py` 的三年配对 | 目标年起三年,每一对间隔 300–400 天 | 同上,深度只到 2 | 同上;不拿「下一次短回归」冒充年 | | Yoga Vimshottari 本命 | `yoga_annual_dasha.py` | 日月之和,120 年,三层 | 固定年长 | 经度改我方函数 | | Yoga / Nakshatra 回归 | `annual_pravesha.py`、`pravesha_return_year.py` | 只要目标年里的回归;后继取之后 300–400 天内的全部,另加 360 太阴月年;三层 | 研究页 | 求根和时钟都用我方经度 | | 七分盘星座主 | `aayu_sripati_periods.py` | 本命经度 | 关系表,不是大运 | 用我方经度 | | Buddhi Gati | `buddhi_gati.py` | 上升与行星 | Atri 原文没有规定子运 | 不列子运和次小运 | | Kaala | `kaala_dasha.py` | 日出日落 | 笔记没有规定子运 | 日出日落用星历文件,不用 Moshier | | Sudasa 出生 | `sudasa.py` | 上升与行星 | 土星和计都同星座时该主运不列子运 | 我方经度 | | Sudasa 已确认起点 | 同上 | 需要另有确认过的起点 | blocked:出生资料里没有这个起点 | 只写原因,不上空表 | | Varnada | `varnada_dasha.py` | 两个备选起点分开 | JSS | 我方经度 | | Karana 三种 | `karana_annual_dasha.py` | 目标年每次 Tithi 回归 | 材料没有子运 | 只列主运 | | 四种星座大运次小运 | `rashi_dasha_explicit_contract.py` 的顺行等分 | 子运星座起顺行,十二等分 | 接既有星座大运出处表 | 只加在副本上 | | Niryaana Shoola 子运 | `niryaana_shoola_dasha.py` | 主运 | blocked:上游写明子运规则没有单独出处;冻结引擎的行不能当书页 | 不列 | | Kalachakra 第三层 | #91 已有的简化模型 | 现有主运 | 产品定:只加第三层,不改主运和子运 | 按比例从现有主运分出 | | D81 / D108 / D144 / D150 | 我方分盘函数 | 本命经度 | 研究口径 | 只在研究章渲染 | ## 体量(Windows,虚构盘 0 / 1 / 9) 中英两份一起算,含排盘。都低于前端 180 秒。 | 盘 | 排盘(秒) | 英文(秒) | 中文(秒) | 中英合计(秒) | 连排盘(秒) | 中文字符 | 英文字符 | 中文字节 | 英文字节 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | 0 | 42.4 | 43.6 | 17.3 | 60.9 | 103.3 | 1,917,563 | 2,491,902 | 2,695,716 | 2,493,514 | | 1 | 20.7 | 12.6 | 20.5 | 33.0 | 53.7 | 1,919,551 | 2,490,711 | 2,691,687 | 2,492,316 | | 9 | 18.7 | 15.7 | 16.7 | 32.3 | 51.0 | 2,060,310 | 2,639,451 | 2,858,271 | 2,641,071 | 0 号盘只算研究章、不算原来的长文:中文 26.4 秒、1,015,374 字符;英文接着算 0.1 秒(同一份计算复用)、1,055,738 字符。目标年起三年 Tithi 回归 3 次,目标年 Yoga 1 次,Nakshatra 1 次。 0 号盘四种星座大运的次小运都是 1728 行(主运 12、子运 144,每个子运再等分成 12)。生产者里的主运和子运没有 `pratyantar` 字段。 没有删行,没有抽样,也没有把 1e-6 度的回归容差放宽。时钟在一天的格子里先按斜率走几步,残差仍要求不超过 1e-6 度;和原先 45 次二分相比,时刻差不超过百万分之一天。这一条有测试。 ## 章节怎么拆 阅读页按 `##` 翻页。三章各自是一节,每个方法、每一对回归、每一种 Karana、每一种星座大运、Niryaana、Kalachakra、研究分盘也各是一节。每节都重复研究口径那一句。 参考时刻取报告月历第一行的当月 1 日正午。资料包没有另存「今天」。天文用儒略日,显示的时刻用历书换算,两者差一个闰秒量级,表上仍写到秒。 岁差按每个时刻重算,不拿一个岁差值套一整年。 ## 让步和偏离 - **T5(修复单补上)**:这一轮先把 `origin/staging` 的 `bc6795e2a353f6a10fa65ab79766aeb578714b0b` 合并进来,没有 rebase。对照文件 `docs/tasks/research-timing-pyjhora-20261023.json`,状态 `compared`,10 张固定种子虚构盘,PyJHora 4.8.7。15 个体系里:一致 1,无此方法 1,不一致 13。回归时刻差在 1 分钟内写进 `within_tolerance`,不算不一致;这 10 张本命 Tithi 顺行的回归差都在 0.003 分钟以内。两边岁差和星历文件不同,所以留这一分钟。 - 没有让出盘数(仍是 10,不是下限 5),没有让出 Karana 的 360 太阴月年,也没有让出 Tithi 的时间余额。 - 已知差别写在该方法标题下。中文是「与 PyJHora 不一致:差在 {类别}」,英文是「Differs from PyJHora: {category}」。句子加在按行清理之后,清理器本身没改,所以英文版能留下这句。整份英文不会因为这一句被丢掉。 - 顺序整段相反才标「方向」。这一轮没有「方向」,也没有超出 1 分钟的「回归时刻」。开头主星相同、只是同一圈又多走了几步的,改去比年数,不再写成起点不同。 - Karana 三种都对 PyJHora 里那一个公开函数,比的是出生当下那一圈,不是目标年里的回归。Varnada 的两个起点合成一条,标题按前缀对上。Sudasa 已确认起点没有书面锚点,不参与对照,也不标不一致。Niryaana Shoola 按 10 月 23 日的决定仍不列子运。年度 Tithi、Yoga、Nakshatra 不在这次对照名单里。 - 本命 Tithi 逆行:PyJHora 的公开函数没有大运逆行这一项,标成「无此方法」,不算不一致。 | 体系 | 结果 | 差在 | | --- | --- | --- | | 本命 Tithi Ashtottari 顺行 | 一致 | 回归都在 1 分钟内 | | 本命 Tithi Ashtottari 逆行 | 无此方法 | 公开函数没有这一项 | | 本命 Yoga Vimshottari | 不一致 | 子运划分 | | Buddhi Gati | 不一致 | 起点 | | Kaala | 不一致 | 年数 | | Sudasa 出生周期 | 不一致 | 年数 | | Varnada | 不一致 | 起点 | | Julene 主星 / PVR 象限主星 / PVR 360 太阴月年 | 不一致 | 年数 | | Sthira / Drig / Shoola / Navamsha | 不一致 | 起点 | | Kalachakra | 不一致 | 起点 | - 表头用「层级 | 主星/名称 | 起始 | 结束」,与任务书用词一致。 - Kalachakra 的中文是:「次小运按简化模型,从现有主运按比例分出。主运和子运与原来的表相同。」 ## 自测 | 检查 | 命令 | 结果 | | --- | --- | --- | | 研究章、口径、隔离、校正 golden、时钟 | `pytest tests/test_research_timing.py -q` | 8 通过 | | 星座大运生产者仍无次小运字段 | `pytest tests/test_rashi_dashas_native.py -q` | 通过 | | 对话域读取 | `pytest tests/test_full_data_domain_reader.py -q` | 通过 | | 卫生预算 | `pytest tests/test_python_hygiene_budget.py -q` | 通过 | | 真恒星框架 | `pytest tests/test_sidereal_nutation_frame.py -q` | 通过 | | 运行时不扫进 jhora | `pytest tests/test_runtime_jhora_import_scan.py -q` | 通过 | | API 增长合同 | `pytest tests/test_api_server_growth_contract.py -q` | 通过 | | 六章与研究章标题 | `pytest tests/test_full_data_parity_chapters.py -q` | 先有 1 个标题顺序失败;断言改为「六章之后才是研究章」后,该测试通过。同一次里其余测试已通过 | | 英文版 | `pytest tests/test_report_english_edition.py -q` | 通过 | | 前端 tsc / lint | 未跑 | 没有改前端 | | test:db | 未跑 | 没有改表 | | Python 全量、快速门 | 未跑 | 按分工留给验收 | 标题顺序那条断言:原值是「拿掉六章后只少这六章」;新值是「基准同时拿掉六章和研究章,完整报告在六章之后还有研究章」;原因是研究章也是后加的二级标题。 D81 出现位置那条是新断言,不是改旧数字:研究章之前的正文不得再出现 D81、D108、D144。 ## 修复单自测(Windows) | 检查 | 命令 | 结果 | | --- | --- | --- | | 研究章、对照标注、校正 golden | `pytest tests/test_research_timing.py tests/test_sidereal_nutation_frame.py tests/test_rashi_dashas_native.py tests/test_full_data_domain_reader.py tests/test_report_english_edition.py tests/test_python_hygiene_budget.py tests/test_api_server_growth_contract.py tests/test_runtime_jhora_import_scan.py tests/test_report_reader_main.py tests/test_repo_privacy_markers.py -q` | 163 通过,失败 0,约 1013 秒 | | 1970 年以前的日出 | `pytest tests/test_research_timing.py::test_solar_events_before_1970_stay_available_on_windows -q` | 通过。Windows 上不再用 `fromtimestamp`,见 BUG-1429 | | 200 张虚构盘英文 | `pytest tests/test_report_english_sweep.py::test_two_hundred_fictional_charts_have_clean_english -q` | 通过,约 1956 秒。修复前,早于 1970 年的盘会在 Windows 上中断整份报告(BUG-1429) | | 前端 tsc / lint | 未跑 | 没有改前端 | | test:db | 未跑 | 没有改表 | | Python 全量、快速门 | 未跑 | 留给验收 | 阅读页泄漏断言:原值是整篇出现 PyJHora 都算泄漏;新值是以「与 PyJHora 不一致:」或「Differs from PyJHora:」开头的行先拿掉,其余照旧;原因是修复单要求这两句留在标题下。英文研究章同理:原值是英文不得出现 PyJHora;新值是只允许出现在「Differs from PyJHora:」开头的行。