标出研究章和 PyJHora 的已知差别(#92)。

10 张虚构盘逐体系对照。不一致的方法在标题下写明差在哪一类。本命 Tithi 顺行一致,逆行没有公开函数。Windows 上 1970 年以前的日出不再用 fromtimestamp。

自测:合同与研究章测试通过;200 张英文扫描约 1956 秒通过。未跑全量 pytest、快速门和前端。

Co-Authored-By: Grok (agent loop)
This commit is contained in:
jesse-ux
2026-10-23 22:29:52 +08:00
co-authored by Grok (agent loop)
parent e586886196
commit a757af6b4e
10 changed files with 1196 additions and 35 deletions
@@ -63,9 +63,26 @@
## 让步和偏离
- **T5**:这台机器能导入 PyJHora。对照文件是 `docs/tasks/research-timing-pyjhora-20261023.json`,状态 `not_compared`,没有逐张盘逐层比对。报告因此不写「与 PyJHora 不一致」。这低于任务书「至少 5 张」的让步线,没有拿猜测去填标注。
- 没有让出 Karana 的 360 太阴月年,也没有让出 Tithi 的时间余额。
- 英文不写 PyJHora 这个名字,避免整份英文被卫生门丢掉。中文只有在对照 JSON 真有差异时才写那个名字;这一轮 JSON 没有差异列表。
- **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 的中文是:「次小运按简化模型,从现有主运按比例分出。主运和子运与原来的表相同。」
@@ -89,3 +106,16 @@
标题顺序那条断言:原值是「拿掉六章后只少这六章」;新值是「基准同时拿掉六章和研究章,完整报告在六章之后还有研究章」;原因是研究章也是后加的二级标题。
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:」开头的行。
+2 -2
View File
@@ -523,8 +523,8 @@
| `TASK-report-english-han-leak-20261021.md` | `PROGRESS-report-english-han-leak-20261021.md` | #89 个人报告英文版约 4 成整份丢弃:漏译汉字源头补英文孪生字段、修吃空格;200 张固定种子回归 + 快速门 smoke(复发自 BUG-1272);中文逐字节不变 | 已合入 staging | `codex/report-english-han-leak-20261021` |
| `TASK-chart-dasha-yogini-20261021.md` | — | #88 星盘页大运右栏切换 Chara / Yogini,Yogini 补小运(按比例,内部核对,页面注明未经外部软件核对);Ashtottari 另立单(起运表与 PyJHora 8/12 宿不一致) | 已合入 staging | `codex/chart-dasha-yogini-20261021` |
| `TASK-full-data-parity-1-20261021.md` | `PROGRESS-full-data-parity-1-b-20261023.md` | #91 完整数据版补齐(一):K1–K3 已做;K4 把年运新字段放到原键之后,Yogini 缺完整年数时不再整段失败(BUG-1425、BUG-1426) | 已合入 staging | `codex/full-data-parity-1-20261021` |
| `TASK-full-data-parity-2-20261021.md` | `PROGRESS-full-data-parity-2-20261021.md` | #92 完整数据版补齐(二):研究型推运附录、四种星座大运次小运、Kalachakra 第三层、D81 / D108 / D144 只留在研究口径章节 | 执行中 | `codex/full-data-parity-2-20261021` |
| `TASK-full-data-parity-2-fix-20261023.md` | `PROGRESS-full-data-parity-2-20261021.md` | **#92 第 1 次打回**:其余全过(Linux 生成约 18 秒、英文汉字 0);T5 PyJHora 离线对照一张没做(下限 5 张),报告无法标出不一致的体系 | 执行中 | `codex/full-data-parity-2-20261021` |
| `TASK-full-data-parity-2-20261021.md` | `PROGRESS-full-data-parity-2-20261021.md` | #92 完整数据版补齐(二):研究型推运附录、四种星座大运次小运、Kalachakra 第三层、D81 / D108 / D144 只留在研究口径章节 | 待验收 | `codex/full-data-parity-2-20261021` |
| `TASK-full-data-parity-2-fix-20261023.md` | `PROGRESS-full-data-parity-2-20261021.md` | **#92 第 1 次打回**:其余全过(Linux 生成约 18 秒、英文汉字 0);T5 已用 10 张虚构盘做完离线对照,不一致的体系在标题下写明差在哪一类 | 待验收 | `codex/full-data-parity-2-20261021` |
| `TASK-goel-jaimini-strength-20261022.md` | `PROGRESS-goel-jaimini-strength-20261022.md` | #94 搬上游公开的 Goel Jaimini 强度与 Brahma / Maheshwara / Rudra(4 个上游原样文件,按 #81 决策 A 先例根目录预算 448→452;来源串改书目引用);只做计算、不改报告;冻结身份不变 | 已合入 staging | `codex/goel-jaimini-strength-20261022` |
| `TASK-chart-subject-table-fix-20261022.md` | `PROGRESS-chart-subject-table-fix-20261022.md` | **#86 第 1 次打回**:报告所有表被强制单行(打印跑出纸面);保存他人复制了档案页代码且已分叉;点编辑框内边距会丢修改 | 已合入 staging | `codex/chart-subject-table-20261021` |
| `TASK-full-data-parity-3-20261022.md` | — | #93 完整数据版补齐(三):「独立年度方法参考」正式环境调 PyJHora(子进程隔离;装上后其余输出逐字节不变,7 个换路径开关钉死);输入默认用本地时间与正确年份(D6 待产品确认) | 待领取(等 #91 合入) | `codex/full-data-parity-3-20261022` |
@@ -1,6 +1,206 @@
{
"status": "not_compared",
"charts": 0,
"reason": "PyJHora imported, but this pass does not guess a mismatch without a completed comparison",
"mismatches": []
"status": "compared",
"charts": 10,
"chart_indexes": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"pyjhora_version": "4.8.7",
"return_rule": "A return moment within 1 minute is listed in within_tolerance and is not a mismatch. The two sides use different ayanamsa implementations and ephemeris files.",
"omitted_from_labels": [
"Sudasa confirmed start has no written full major start on our side, so it is not compared.",
"Niryaana Shoola child periods stay omitted by the 2026-10-23 decision.",
"Annual Tithi, Yoga, and Nakshatra headings are outside this pass."
],
"within_tolerance": [
{
"system": "tithi-natal-forward",
"chart": 0,
"minutes": 0.002
},
{
"system": "tithi-natal-forward",
"chart": 1,
"minutes": 0.001
},
{
"system": "tithi-natal-forward",
"chart": 2,
"minutes": 0.001
},
{
"system": "tithi-natal-forward",
"chart": 3,
"minutes": 0.003
},
{
"system": "tithi-natal-forward",
"chart": 4,
"minutes": 0.0
},
{
"system": "tithi-natal-forward",
"chart": 5,
"minutes": 0.002
},
{
"system": "tithi-natal-forward",
"chart": 6,
"minutes": 0.001
},
{
"system": "tithi-natal-forward",
"chart": 7,
"minutes": 0.002
},
{
"system": "tithi-natal-forward",
"chart": 8,
"minutes": 0.002
},
{
"system": "tithi-natal-forward",
"chart": 9,
"minutes": 0.003
}
],
"systems": {
"tithi-natal-forward": {
"status": "一致",
"heading_en": "Natal Tithi Ashtottari forward",
"heading_zh": "本命 Tithi Ashtottari 顺行",
"match": "exact"
},
"tithi-natal-reverse": {
"status": "无此方法",
"heading_en": "Natal Tithi Ashtottari reverse",
"heading_zh": "本命 Tithi Ashtottari 逆行",
"match": "exact"
},
"yoga-natal": {
"status": "不一致",
"heading_en": "Natal Yoga Vimshottari",
"heading_zh": "本命 Yoga Vimshottari",
"match": "exact",
"category": "子运划分",
"category_en": "sub-period division",
"example": "chart 2 third level under Mercury does not line up"
},
"buddhi-gati": {
"status": "不一致",
"heading_en": "Buddhi Gati",
"heading_zh": "Buddhi Gati",
"match": "exact",
"category": "起点",
"category_en": "start",
"example": "chart 0 period 1 native Sun vs PyJHora Mercury"
},
"kaala": {
"status": "不一致",
"heading_en": "Kaala",
"heading_zh": "Kaala",
"match": "exact",
"category": "年数",
"category_en": "year count",
"example": "chart 0 year count differs at the first compared period of Sun"
},
"sudasa-birth": {
"status": "不一致",
"heading_en": "Sudasa birth cycle",
"heading_zh": "Sudasa 出生周期",
"match": "exact",
"category": "年数",
"category_en": "year count",
"example": "chart 0 year count differs at the first compared period of Scorpio"
},
"varnada": {
"status": "不一致",
"heading_en": "Varnada",
"heading_zh": "Varnada",
"match": "prefix",
"category": "起点",
"category_en": "start",
"example": "chart 0 period 1 native Aries vs PyJHora Capricorn"
},
"karana-julene": {
"status": "不一致",
"heading_en": "Julene lords",
"heading_zh": "Julene 主星",
"match": "prefix",
"category": "年数",
"category_en": "year count",
"example": "chart 0 year count differs at the first compared period of Mars"
},
"karana-pvr": {
"status": "不一致",
"heading_en": "PVR quadrant lords",
"heading_zh": "PVR 象限主星",
"match": "prefix",
"category": "年数",
"category_en": "year count",
"example": "chart 0 year count differs at the first compared period of Mars"
},
"karana-pvr-tithi-year": {
"status": "不一致",
"heading_en": "PVR 360 tithi year",
"heading_zh": "PVR 360 太阴月年",
"match": "prefix",
"category": "年数",
"category_en": "year count",
"example": "chart 0 year count differs at the first compared period of Mars"
},
"sthira": {
"status": "不一致",
"heading_en": "Sthira",
"heading_zh": "Sthira",
"match": "exact",
"category": "起点",
"category_en": "start",
"example": "chart 1 period 1 native Capricorn vs PyJHora Cancer"
},
"drig": {
"status": "不一致",
"heading_en": "Drig",
"heading_zh": "Drig",
"match": "exact",
"category": "起点",
"category_en": "start",
"example": "chart 1 period 10 native Leo vs PyJHora Aquarius"
},
"shoola": {
"status": "不一致",
"heading_en": "Shoola",
"heading_zh": "Shoola",
"match": "exact",
"category": "起点",
"category_en": "start",
"example": "chart 1 period 1 native Sagittarius vs PyJHora Gemini"
},
"navamsha": {
"status": "不一致",
"heading_en": "Navamsha",
"heading_zh": "Navamsha",
"match": "exact",
"category": "起点",
"category_en": "start",
"example": "chart 0 period 1 native Capricorn vs PyJHora Aquarius"
},
"kalachakra": {
"status": "不一致",
"heading_en": "Kalachakra",
"heading_zh": "Kalachakra",
"match": "exact",
"category": "起点",
"category_en": "start",
"example": "chart 0 period 1 native Taurus vs PyJHora Gemini"
}
}
}