Merge codex/goel-jaimini-strength-20261022 (#94) into staging
Independent Staging Quality Gate / validate (push) Successful in 15m44s
Independent Staging Quality Gate / publish (push) Successful in 4m27s

# Conflicts:
#	CHANGELOG.md
#	docs/tasks/README.md
This commit is contained in:
Jesse_Chen
2026-10-22 08:53:17 +08:00
13 changed files with 1234 additions and 6 deletions
@@ -0,0 +1,206 @@
上游 `5fb8379c` 原文;我方 Niryaana 选择器在 `scripts/rashi_dashas_native.py`;书稿未入库
# Goel Jaimini public calculation module
## Scope and entry points
`scripts/goel_jaimini_strength.py` publishes the existing frozen runtime's
position-only arithmetic, with input validation and explicit blocked points.
It contains no customer identity, birth record, report, private fixture, or
runtime dependency on a frozen directory. The historical frozen-engine
publication receipt remains true: its complete payload is not published.
Public functions:
- `calculate_goel_strength(planet_longitudes, node_occupancy_policy=...)`
- `build_goel_chart_evidence(planet_longitudes, ascendant_longitude)`
Both accept already calculated sidereal longitudes in degrees, in `[0, 360)`.
Supply exactly Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu and Ketu;
nodes must be opposite. The builder also requires a finite numeric Ascendant.
No ayanamsa, node mode, birth time or ephemeris is inferred. The caller owns
those upstream settings. Invalid inputs raise `ValueError`; equal seven-karaka
degrees block the calculation instead of inventing a ranking.
The native `jaimini --mode special` / `--mode all` commands and `full-reading`
now expose `goel_full_strength` and `goel_special_points`. The builder's
`strength` and `special_points` keys map to those two report keys. Existing
eight-karaka and other Jaimini profiles remain independent.
## Sources and page numbering
V. P. Goel, *Predicting through Jaimini Astrology*, Chapter 1, printed pp10–17
(PDF file pages14–21). Local source:
`V. P. Goel, Predicting through Jaimini Astrology`.
Transcription SHA256:
`0a8eb5e6de409d5d8ae6684be927b1273acdc5fa72a7f1c36c31de33907341a6`.
Line numbers below refer to that transcription, not printed line numbers.
| Calculation | Printed pages | PDF pages | Transcription locator |
|---|---|---|---|
| Dignity values and natural friendship | 10–11 | 14–15 | L461 onward |
| Seven-karaka rank; Kendriya, Kartari, Adhipati | 11–12 | 15–16 | L510–553 |
| Sign permanent and karaka components | 13 | 17 | L558–593 |
| Sthana, aspect roles, sign-lord strength | 14 | 18 | L598–632 |
| Worked planetary/sign totals | 15 | 19 | L636–697 |
| Brahma and Maheshwara; first Rudra rule | 16 | 20 | L701–727 |
| Rudra malefic-contact exception | 17 | 21 | L731–736 |
| Mercury/Jupiter as sign lord: double role credit | 103 | 107 | L4359–4389 |
The p103 clarification occurs in Goel's **short method** chapter. Only its
explicit double-role explanation is used to clarify the three-role reading
of p14. The short method's different weights are NOT mixed into this full
method. Numeric reproduction of p15 also checks this role convention.
Degree-specific Moolatrikona ranges reuse the existing named
`raman_manual_degree_mt_exaltation_first_v1` profile from
`scripts/trikona_raman.py`: B. V. Raman, *A Manual of Hindu Astrology*,
section29, printed p12. Goel provides the score categories; this auxiliary
profile supplies degree ranges. Exaltation is checked first. This is an
explicit method choice, not a claim that all Goel/Raman conventions coincide.
## Formula contract
Planet total is dignity + karaka + kendriya + kartari + adhipati.
- Dignity: exalted60, Moolatrikona45, own30, friend22.5, neutral15,
enemy7.5, debilitated3.75; natural friendship, not compound friendship.
- Seven classical planets ranked by degree within sign: 60,45,30,22.5,15,7.5,3.75.
Nodes never receive these karaka points.
- Kendra / Panaphara / Apoklima from AK: 60 / 30 / 15.
- Kartari: 60 when the planet is in an odd sign and both adjacent signs have
occupants; nodes count in this component under both occupancy policies.
- Adhipati: 60 for a qualifying odd-sign lord with a malefic conjunction or
Jaimini rasi aspect. All classical planets except Moon own an odd sign.
This implementation declares Sun/Mars/Saturn/Rahu/Ketu malefics and excludes
self-contact; phase-dependent Moon and conditioned Mercury are not added.
Sign total is permanent + occupying karaka points + Sthana + aspect roles
+ sign-lord total. Movable/fixed/dual permanent values are15/30/60.
Sthana is zero if empty, otherwise45+15*n. Jupiter, Mercury and sign lord are
three roles worth60 each; if one planet fulfills two roles it can earn120.
Conjunction and aspect qualify a role once, not twice. Aspects are Jaimini
sign aspects, not Parashari planetary aspects.
Special points:
- Brahma first checks AK's eighth lord occupying AK's eighth. Otherwise it
compares Lagna/seventh Goel totals and selects the strongest non-Saturn
6/8/12 lord from the stronger anchor. The Saturn exclusion belongs to the
fallback branch; it is not silently applied to the first override.
- Maheshwara is AK's eighth lord; if exalted, compare AK's twelfth lord.
Saturn is allowed.
- Rudra compares Lagna's second/eighth lords. The weaker candidate wins when
it alone has malefic contact; when both have contact the stronger wins.
The frozen convention treats conjunction and rasi aspect as contact;
the p17 exception itself says “aspect” and its discussion adds association.
Retain this declared convention when porting rather than hiding it.
- Equal final scores remain `blocked`; no silent degree or list-order tie-break.
## Node discrepancy and default
Printed p14 explicitly includes Rahu and Ketu in Sthana. The p15 worked
totals reproduce when they are excluded from **that component only**.
`include_nodes_text` is the default because it follows the explicit rule.
`exclude_nodes_worked_example` is the reproducibility alternative, retained
under `strength.worked_example_node_exclusion` by the builder.
This switch does NOT remove nodes from Kartari or malefic contacts and does
not give them karaka points. For the published example, excluding nodes gives
Virgo281.25 / Pisces363.75; including them gives296.25 /378.75. The other ten
sign totals and all seven planet totals agree between policies. This is an
observed text/table discrepancy, not proof of the author's intended erratum.
## Relation to 9f08b57b and 258e08e3
These are **different algorithms**:
| Field / producer | Comparison | Method / use |
|---|---|---|
| `lagna_seventh_strength` | First/seventh Goel numeric totals | Goel Brahma/Sthira-related explicit selector evidence |
| Historical `niryaana_shoola_strength` | Same first/seventh totals | Deprecated frozen-export alias only |
| `select_niryaana_shoola_start_sign` | Second/eighth | PVR Ayur ordered comparison: occupancy, all-planet rasi aspects, exalted-occupant presence |
`9f08b57b` implements the last row and `258e08e3` explicitly includes both
nodes in its occupancy/aspect counts. Those changes are already on main.
This publication does not replace them. The legacy alias now carries
`deprecated: true`, `comparison: lagna_vs_seventh`, and `not_for` metadata.
Use the canonical new key for Goel totals; use the existing PVR selector for
Niryaana. Sthira's existing explicit-input short selector is a separate
contract: do not label Goel full weights as the Chapter5 short weights, and
do not infer that publishing these points automatically executes Sthira Dasha.
## Portable synthetic example
```python
from scripts.goel_jaimini_strength import build_goel_chart_evidence
positions = dict(Sun=29., Moon=58., Mars=87., Mercury=116.,
Jupiter=145., Venus=174., Saturn=203., Rahu=245., Ketu=65.)
result = build_goel_chart_evidence(positions, 0.)
```
This is deliberately invented positional data, not a real birth chart.
| Planet | Dignity | Karaka | Kendriya | Kartari | Adhipati | Total |
|---|---:|---:|---:|---:|---:|---:|
| Sun | 60 | 60 | 60 | 0 | 0 | 180 |
| Moon | 60 | 45 | 30 | 0 | 0 | 135 |
| Mars | 7.5 | 30 | 15 | 60 | 60 | 172.5 |
| Mercury | 7.5 | 22.5 | 60 | 0 | 0 | 90 |
| Jupiter | 22.5 | 15 | 30 | 60 | 60 | 187.5 |
| Venus | 3.75 | 7.5 | 15 | 0 | 60 | 86.25 |
| Saturn | 60 | 3.75 | 60 | 0 | 0 | 123.75 |
AK=Sun. Lagna=367.5; seventh=225. Brahma=Jupiter; Maheshwara=Mars;
Rudra=Mars. Gemini Sthana=75 (alternative60); Sagittarius Sthana=60
(alternative0). The existing PVR Niryaana selector instead selects Taurus.
`tests/test_goel_jaimini_strength.py` contains these literal expectations,
the printed p15 totals without birth identity, branch checks, input rejection,
blocked points and native entry wiring. Run:
```bash
python3 -m pytest -q tests/test_goel_jaimini_strength.py tests/test_niryaana_shoola_dasha.py
```
Status: source-bounded wired, with one published numerical table replay and
synthetic arithmetic regression. No predictive-case validation, global
closure, PL9 parity or automatic change to a frozen customer pin is claimed.
Verification:166 tests passed across `test_goel_jaimini_strength`,
`test_niryaana_shoola_dasha`, `test_sthira_brahma_goel_short_method`,
`test_trikona_raman_native`, `test_jaimini`, `test_jaimini_source_identity`
and `test_bphs_validation_runtime`. This includes the real full-reading CLI
and its Goel output, as well as the existing PVR Niryaana behavior.
## Current-window exploration and publication boundary
Started from main258e08e3 in an isolated `codex/goel-publication` worktree;
the original workspace was on customer-export-r32-release with unrelated
dirty files, all preserved. Checked all six existing linked worktree paths,
branch/recent-commit status, tracked file inventory, producer/CLI/report/test
searches and the two whole-machine sweep records. WorkBuddy skill is a
symlink to the primary repository; its registry remains a separate authority.
The configured r32 runtime supplies the reviewed position-only Goel module;
its hash was235fc8f90718b6da45af0ee1edc2a7c195be92664ff55bbb7b8e0398b605b33d.
The archived 10-16 publication receipt confirms the full payload was excluded.
The separately inspected local 10-16 r2 engine has neither this named module
nor the two Goel output fields; therefore the archive date must not be used
as proof of that report's actual generating pin. This extraction is from
the inspected r32 source, not a claim that the omitted r2 payload contained it.
Repository APIs/renderers remain consumers of the native engine, not a second
implementation. No external engine code or book pages are republished here.
Pre-work check passed, including external adapter diagnostics and remote
visibility; direct `git ls-remote origin refs/heads/main` returned258e08e3.
The broader governance audit separately flags `main_worktree_dirty` and
`remote_head_unverified`; the former is real and preserved, and the latter
does not certify publication despite the successful direct visibility check.
Capability authority snapshot and governance audit were invoked;
the former's historical customer examples are not authority for this module.
The reused chains are Goel position arithmetic, Raman dignity helpers,
Jaimini rasi aspects, and the existing PVR Niryaana selector. Unclosed items
are lineage differences, equal-strength selections without a source rule and
independent predictive verification. This is code publication, not a chart
interpretation, personal report export, or MEVG predictive validation.
+6
View File
@@ -484,3 +484,9 @@ Prevention: 打分路径新增或改动输入模块时,先查它在不在两
`TASK-report-chart-blank-columns-20261003` T2 写的是「`_map_to_houses_values` 增字段」,`scripts/ashtakavarga.py` 在 `sealed_holdout_rerun.PRODUCTION_FILES` 里,只加字段、分数不变也让 `test_rectification_validation_integrity_gate` 4 条与 `test_sealed_holdout_contract_freshness` 3 条失败(ERR-110 同型)。改为在 `pl9_reader_export.py` 用引擎已有字段拆分,冻结文件零改动,门禁恢复全绿,无需重新冻结。
Prevention: 写任务书时(不只是执行时)就对照 `PRODUCTION_FILES` 与 dataset `frozen_scoring.files`;只为展示的字段优先在消费层(reader / mapper)从已有数据推出,不进冻结文件。关联 ERR-110、BUG-1200。
## ERR-116 | Goel 首/七强度不是 PVR Niryaana 的二/八,完整法也不是简法 | observed 2026-10-22
Goel《Predicting through Jaimini Astrology》第 1 章完整强度的 `lagna_seventh_strength` 比的是命宫和第七宫的 Goel 总分。弃用别名 `niryaana_shoola_strength` 是同一组首/七数字,带 `deprecated`、`replacement`、`not_for`。我方 Niryaana Shoola(#84)的 `select_niryaana_shoola_start_sign` 在 `scripts/rashi_dashas_native.py`,比的是第二宫和第八宫的 PVR Ayur 口径。两套不能互相接入。`scripts/goel_short_strength.py` 是第 5 章简法,给 Sthira / Niryaana 等用,也不是这一套完整法。
Prevention: 不要把 `lagna_seventh_strength` 或 `niryaana_shoola_strength` 接到 Niryaana 选择或大运计算。不要用 `goel_jaimini_strength` 替换 `goel_short_strength`。报告里印这一章交给 #91。关联 issue #94、#84。
@@ -0,0 +1,105 @@
# 进度:Goel Jaimini 强度(issue #94,2026-10-22)
执行分支 `codex/goel-jaimini-strength-20261022`。工作树 `.worktrees/goel-jaimini-strength-20261022`。未 push。Python 用 `G:\Ferti\Jyotisha\.worktrees\agent-loop\.venv\Scripts\python.exe`(本工作树没有 `.venv`)。`core.autocrlf=false`。上游只读仓 `G:\Ferti\yinduzhanxing-ref`,提交 `5fb8379c`。
## 做了什么
- T1:四个上游模块放到 `scripts/` 根目录。`ROOT_PY_BUDGET` 448 → 452,常量旁写了三栏。`scripts/*.py` 计数 452。
- T2:测试原样搬入,只把 Niryaana 选择器的 import 改到 `scripts.rashi_dashas_native`。`test_bphs_validation_runtime.py` 新增 `test_full_reading_exposes_goel_jaimini_strength`,用文件里已有的虚构 `BASE_BIRTH_ARGS`。
- T3:`_goel_jaimini_evidence` 接到 `cmd_jaimini`(`mode` 为 `all` 或 `special`)和 full-reading 写入 `modules.jaimini` 之前。
- T4:接线后的口径测试(两种交点政策、七星同度 blocked 且不出 AK / 排序、full-reading 喂给 Goel 的经度)。
- T5:三张固定虚构盘与 200 张固定种子虚构盘。没有让步缩盘:三张盘 full-reading 均值 5.212 秒,200 张 × 交点两种口径约 34.74 分钟,低于 40 分钟,mean 与 true 都跑了。
- T6:研究笔记、ERR-116、CHANGELOG。Skill 版本不 bump。
## 四个 blob
| 文件 | 上游 `5fb8379c` | 落地后 `git hash-object` |
| --- | --- | --- |
| `scripts/goel_jaimini_strength.py` | `2170f781740affbad7b8ff4e048b88d87f997bcc` | `d13b3f785a86a17970e450f111d60fc8d52108ac` |
| `scripts/trikona_raman.py` | `1fc9283396acba98b9113bde7af0e27a80841a30` | 相同 |
| `scripts/sthira_brahma_goel_short_method.py` | `6e010b54f5ba480db3e6d8d79e711a1cc2d59fbf` | 相同 |
| `scripts/trikona_dasha.py` | `e6c8a27cf5e23e5c686154406ba5183226d12d79` | 相同 |
`goel_jaimini_strength.py` 相对上游的 diff 只有 `SOURCE` 一行,LF。旧值是上游本地书稿路径,没有入库。新值是 `SOURCE = 'V. P. Goel, Predicting through Jaimini Astrology'`。
测试文件上游 blob `e29c47182c03c2277cff46e271a7f664c3349601`。相对上游先只改一行:
```
-from scripts.niryaana_shoola_dasha import select_niryaana_shoola_start_sign
+from scripts.rashi_dashas_native import select_niryaana_shoola_start_sign
```
T4 在这个文件末尾另加了三条接线测试,不再是单行 diff。
## 接线与上游的两处差异
1. 捕获 `(ImportError, KeyError, TypeError, ValueError)` 时 `logger.warning` 记下异常类和信息,`reason` 写成 `f'{exc.__class__.__name__}: {exc}'`。这几类失败在 helper 内返回 blocked,不会抛进 full-reading 外层的 `except Exception`,因此不会把整个 `modules.jaimini` 带掉。
2. `cmd_jaimini` 传给 Goel 的经度用 `pd.get('degree_raw', pd['degree'])`。模拟盘只有 `degree` 时回退,上游那条特殊点测试仍过。full-reading 本来的 `planet_lons` 已是 `degree_raw`,原样传给 Goel。上升点仍用原来的 `asc_deg`(`lon`)。
没有把 `lagna_seventh_strength` / `niryaana_shoola_strength` 接到 Niryaana 选择或大运。没有改冻结文件、报告渲染、API 主文件、数据库。
## T5 数据(全是虚构盘)
三张盘是 `tests/test_report_english_edition.py` 的 day / night / south。`PYTHONHASHSEED=0`。
单独计时的 full-reading:day 6.343 秒、night 4.692 秒、south 4.600 秒,均值 5.212 秒。三张都是 `executed`,Goel AK 与 `chara_karaka_7` 的 AK 都是同一颗星(Venus / Mercury / Jupiter)。四个新键都在。
改前引擎是接线提交的父本 `eb67962d7`。改前改后:
| 检查 | 结果 |
| --- | --- |
| 中文完整数据版 Markdown | 三张 SHA-256 相同(day `1de47056e69f…`,night `0415e1a20dfe…`,south `51eb80c838cf…`) |
| 英文完整数据版 Markdown | 三张 SHA-256 相同(day `3e6eaadae15e…`,night `a36abde746d5…`,south `adef6214ebbb…`) |
| full-reading 与 `cmd_jaimini` 的 jaimini,去掉四个新键 | SHA-256 相同 |
| 改后四个新键 | full-reading 与 `cmd_jaimini`(mode=all)都有,状态 `executed` |
| `build_domain_facts` 选出的对话卡 | 12 个域 × 3 张盘,规范化 JSON 相同 |
`read_full_data_domain` 的原始副本不是逐字节相同。它整份拷贝 `worksheets`,其中 `advanced_systems.jaimini` 多了四个新键;这是任务书已经写明的资料包 JSON 变大,正文不印。另外两边还有运行时噪声:审计耗时、缓存时间、PyJHora 年盘快照、一张盘的 Yogini `reference_date`。去掉四个新键和这些噪声字段后,day / night 还剩 PyJHora 年盘快照差异,south 只剩 `reference_date`。没有为了抹平这些差异去改渲染或对话卡。
200 张固定种子(`Random(20261022)`,年 1940–2015、日 1–28、纬度 −45~60、经度 −120~150、时区按经度取半小时、岁差在 lahiri / raman / kp 间)。mean 与 true 各 200 次,4 个进程,墙钟 556.6 秒。
| 项 | 数 |
| --- | --- |
| 次数 | 400 |
| `goel_full_strength.status == executed` | 400 |
| blocked | 0 |
| AK 与 `chara_karaka_7` 不一致 | 0 |
| 单次 full-reading | 均值 5.537 秒,最小 4.839,最大 7.848 |
| mean / true 均值 | 5.530 / 5.544 秒 |
三张盘改前改后的 full-reading 耗时互相重叠(改前均值 5.672 秒,同一次改后 6.069 秒,另一次改后计时 5.212 秒),没有拆出稳定的增量。
冻结身份交集(`PRODUCTION_FILES` + `RESEARCH_FILES` + `frozen_scoring.files` 对上 `origin/staging...HEAD`)输出是 `[]`。
## 测试
工作树内 `pytest -q`。Windows 默认 GBK 标准输出打不出 full-reading 里已有的 emoji(`U+1F4D0`、`U+1F534`),`test_bphs_validation_runtime.py` 两条因此在子进程退出码 1。下面的数字是 `PYTHONUTF8=1` 再跑的结果。屏蔽 PyJHora 用临时目录的 `sitecustomize.py` 放在 `PYTHONPATH` 最前(`import jhora` 变成 `ModuleNotFoundError`),没有卸载包。
两次都是 238 条收集、237 通过、1 跳过、0 失败。跳过的是 `test_consultation_contract_golden.py` 里未设置 `JYOTISH_LIVE_CONTRACT_GOLDEN=1` 的线上重抓。
| 文件 | 结果 |
| --- | --- |
| `tests/test_goel_jaimini_strength.py` | 22 通过 |
| `tests/test_bphs_validation_runtime.py` | 3 通过 |
| `tests/test_python_hygiene_budget.py` | 2 通过 |
| `tests/test_rashi_dashas_native.py` | 18 通过 |
| `tests/test_niryaana_shoola_dasha.py` | 3 通过 |
| `tests/test_jaimini.py` | 42 通过 |
| `tests/test_runtime_jhora_import_scan.py` | 4 通过 |
| `tests/test_api_server_growth_contract.py` | 9 通过 |
| `tests/test_consultation_contract_golden.py` | 2 通过,1 跳过 |
| `tests/test_sealed_holdout_contract_freshness.py` | 9 通过 |
| `tests/test_rectification_validation_integrity_gate.py` | 22 通过 |
| `tests/test_reported_offset_research.py` | 14 通过 |
| `tests/test_rectification_engine_memoization.py` | 25 通过 |
| `tests/test_repo_privacy_markers.py` | 62 通过(文档提交前再复跑一次) |
没有弱化既有断言。没有重冻,没有改冻结记录或 golden。
## 移交 #91
本单不印报告。交给 #91:
- 报告印「Goel Jaimini 强度与特殊点」章,中英标签齐全。`blocked` 的中文写「无法判定」、英文写「Not determinable」,并注明原因(七星度数相同 / 强度相同无唯一选择)。
- `jyotish_engine.py` 受限资料 `jaimini_special_points.reason` 里「Brahma/Maheshwara/Rudra still lack a same-profile structured producer」随印章一并改。
- 交点两种口径并列印出,标明默认遵循正文(`include_nodes_text`)。
+1 -1
View File
@@ -518,7 +518,7 @@
| `TASK-report-english-han-leak-20261021.md` | `PROGRESS-report-english-han-leak-20261021.md` | #89 个人报告英文版约 4 成整份丢弃:漏译汉字源头补英文孪生字段、修吃空格;200 张固定种子回归 + 快速门 smoke(复发自 BUG-1272);中文逐字节不变 | 待领取(最先做;#91/#92 在后) | `codex/report-english-han-leak-20261021` |
| `TASK-chart-dasha-yogini-20261021.md` | — | #88 星盘页大运右栏切换 Chara / Yogini,Yogini 补小运(按比例,内部核对,页面注明未经外部软件核对);Ashtottari 另立单(起运表与 PyJHora 8/12 宿不一致) | 待领取(等 #86、#87 合入) | `codex/chart-dasha-yogini-20261021` |
| `TASK-full-data-parity-1-20261021.md` | — | #91 完整数据版补齐(一):A 段渲染(中文附录改中文源、71 小节归 6 章、导出星座名)→ B 段引擎(Yogi 点、标准大运子运、Kalachakra 简化子运、年运三年全展开、36 个月星历、解释补长);不设大小上限 | 待领取(等 #89 合入;T3 与 #90 串行) | `codex/full-data-parity-1-20261021` |
| `TASK-goel-jaimini-strength-20261022.md` | — | #94 搬上游公开的 Goel Jaimini 强度与 Brahma / Maheshwara / Rudra(4 个上游原样文件,按 #81 决策 A 先例根目录预算 448→452;来源串改书目引用);只做计算、不改报告;冻结身份不变 | 待领取(可与 #89 并行;须在 #91 印章前合入) | `codex/goel-jaimini-strength-20261022` |
| `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` |
| `TASK-synastry-staging-fix-fix-20261022.md` | `PROGRESS-synastry-staging-fix-20261021.md` | **#85 第 1 次打回**(T7~T11 主体通过):新地址没登记进路由清单致快速门红;CHANGELOG 与 T11 矛盾;侧栏点亮测试是空断言 | 待领取 | `codex/synastry-staging-fix-20261021` |