docs(tasks): Goel Jaimini strength port brief (agent loop, issue #94)

Four upstream files from 5fb8379c (the issue missed trikona_dasha.py),
root budget 448 -> 452 per the #81 decision A precedent, wiring into the
jaimini and full-reading outputs only. The source string becomes a plain
book citation; frozen rectification identity must not move.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LutgzyJqNhPpZy1nFsJtN3
This commit is contained in:
Jesse_Chen
2026-10-22 00:32:53 +08:00
co-authored by Claude Opus 5.5
parent f90020efda
commit a9bf16816b
2 changed files with 202 additions and 0 deletions
+1
View File
@@ -517,3 +517,4 @@
| `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` |
@@ -0,0 +1,201 @@
# 任务书:搬上游公开的 Goel Jaimini 强度与 Brahma / Maheshwara / Rudra 计算(agent 循环 issue #94,2026-10-22)
## 基线
- 写作基线:`origin/staging` = `f90020efd`。开工以当时的 `origin/staging` 为准。
- 分支:`codex/goel-jaimini-strength-20261022`;工作树:`.worktrees/goel-jaimini-strength-20261022`。执行方 **Grok(Windows + Docker)**,只推这个分支。
- 顺序:**可与 #89(英文漏译)并行**,#89 只改渲染文件,不碰本单的文件。**必须在 #91 B 段印「Goel Jaimini Strength」这一章之前合入**。#91 的 T4(`yogi_sphuta`)改的是 `scripts/jyotish_engine.py` 里 full-reading 的同一段 jaimini 组装代码,与本单 T3 相邻;后开工的一方先 `git merge origin/staging`,不 rebase。
- 上游:`https://github.com/732642856/yinduzhanxing.git` `main` 上的提交 `5fb8379c`(2026-10-21,作者应我方请求公开)。只读,放在仓库外。
- 关联:#84 / BUG-1393、BUG-1283(Niryaana Shoola,PVR Ayur 口径);#81 决策 A(上游原样文件放根目录,预算按文件数调高);BUG-1275(真恒星口径);ERR-110、ERR-115(冻结身份);#91 `TASK-full-data-parity-1-20261021`(D7 当时定为「不做」,因为源码未公开;本单公开后由 #91 或其后续单印这一章)。
## 1. 现状实证(Claude,Linux,只读)
### 1.1 上游 `5fb8379c` 改了什么
共 6 个文件,+522 / −1:
| 文件 | 变化 | 行数 | blob 哈希(上游 `5fb8379c`) |
| --- | --- | --- | --- |
| `scripts/goel_jaimini_strength.py` | 新增 | 137 | `2170f781740affbad7b8ff4e048b88d87f997bcc` |
| `tests/test_goel_jaimini_strength.py` | 新增 | 134 | `e29c47182c03c2277cff46e271a7f664c3349601` |
| `docs/research/goel_public_calculation_module_2026_10_21.md` | 新增 | 204 | `c0bef9d9ad5f708093589ce852db20f9e2613995` |
| `scripts/jyotish_engine.py` | +26 / −1 | — | 新增 `_goel_jaimini_evidence`;`cmd_jaimini` 在 `mode in ('all','special')` 时并入;`_cmd_full_reading` 在 `report['modules']['jaimini'] = jaimini_result` 前并入;另改 `render_pl9_markdown` 里 p89 一行说明文字 |
| `tests/test_bphs_validation_runtime.py` | +5 | — | 在 `test_full_reading_exposes_lagna_vargottamamsa_receipt` 末尾加 Goel 四条断言 |
| `docs/research/pre_work_error_ledger.md` | +16 | — | 上游自己的台账条目(Goel 首/七强度 ≠ PVR Niryaana) |
新模块依赖的上游文件(**这次提交之前就在上游,我方都没有**):
| 文件 | 行数 | blob 哈希(上游 `5fb8379c`) | 为什么需要 |
| --- | --- | --- | --- |
| `scripts/trikona_raman.py` | 233 | `1fc9283396acba98b9113bde7af0e27a80841a30` | Goel 取 `CLASSICAL`、`DIGNITY_PROFILE`、`_dignity`、`_validate_positions` |
| `scripts/sthira_brahma_goel_short_method.py` | 112 | `6e010b54f5ba480db3e6d8d79e711a1cc2d59fbf` | Goel 取 `SIGNS`、`SIGN_LORDS`(按整数索引的表) |
| `scripts/trikona_dasha.py` | 166 | `e6c8a27cf5e23e5c686154406ba5183226d12d79` | **issue 没列,但必需**:`trikona_raman.py` 模块顶层 `from scripts.trikona_dasha import RAMAN_AD_PROFILE, RAMAN_SOURCE, build_trikona_raman_antardasa_report`,不搬就导入失败 |
依赖我方已有的两个文件,逐项核对与上游相同,**不用改**:
| 我方文件 | 用到的符号 | 结论 |
| --- | --- | --- |
| `scripts/narayana_dasha.py` | `_rasi_aspects`、`SIGNS`、`SIGN_LORDS`、`_NARAYANA_DIGNITY` | 四个定义与上游逐字相同(整文件不同,不影响) |
| `scripts/jaimini.py` | `FRIENDSHIP` | 逐字相同 |
### 1.2 口径与安全检查
| 检查 | 结果 |
| --- | --- |
| 位置框架 | 四个上游文件都**不算位置**:没有 `swe`、`FLG_MOSEPH`、`FLG_TRUEPOS`、视位置。只接受调用方给的恒星黄道经度(`[0,360)`,九星齐全,罗睺计都必须对冲,误差 1e-7)。位置由我方引擎提供即为真恒星口径 |
| PyJHora | 四个文件都不导入 `jhora`;`trikona_dasha.py` 只有一句字符串提到 PyJHora,`test_runtime_jhora_import_scan` 不把字符串算导入 |
| 隐私 | 测试只有虚构位置(`SYNTHETIC`)和 Goel 书第 15 页公开例题(只有度数,无出生资料);文档无个案资料。**不搬**上游台账条目里关于客户导出 pin 的段落 |
| 静默吞错 | 四个文件没有宽泛 `except`;`_goel_jaimini_evidence` 捕获的是具名异常元组,不计入 `SILENT_EXCEPT_BUDGET` |
| 来源字符串 | `goel_jaimini_strength.SOURCE` 是上游本地书稿路径(含 `Z-Library` 字样),我方仓库没有这份书稿。**这一行是唯一允许的改动**(Claude 10-22 定):公开仓库不出现盗版书库字样与他人本地路径,改成书名与作者的纯引用:`SOURCE = 'V. P. Goel, Predicting through Jaimini Astrology'`;**不得**搬入书稿 |
| 已有同名概念 | 我方 `scripts/goel_short_strength.py` 是 Goel **第 5 章简法**(供 `rashi_dashas_native` 的 Sthira / Niryaana 等用),与本单的**第 1 章完整法**不是一套,互不替换 |
### 1.3 试跑(Claude,临时目录,未改仓库)
把四个上游文件放进临时包,`narayana_dasha.py` / `jaimini.py` / `rashi_dashas_native.py` / `goel_short_strength.py` 用我方 `f90020efd` 的版本:
- `tests/test_goel_jaimini_strength.py` 中**不涉及引擎**的 16 条全过(含第 15 页例题逐值、虚构盘五分量、交点两种口径、度数相同 → blocked、非法输入)。
- 涉及引擎的 3 条需要本单接线后才能跑。其中 `test_legacy_lagna_seventh_alias_does_not_replace_pvr_second_eighth` 从 `scripts.niryaana_shoola_dasha` 导入 `select_niryaana_shoola_start_sign`;**我方这个函数在 `scripts/rashi_dashas_native.py`**(#84)。用我方函数跑虚构盘:选中 Taurus(`selected_sign_idx == 1`),`profile == 'pvr_niryaana_shoola_ayur_rasi_strength_v1'`,与上游断言一致。
- Linux 验收机未装 swisseph,没跑真实排盘;真实盘上的结果由 T5 验证。
### 1.4 我方接线点(按符号定位)
| 位置 | 现状 |
| --- | --- |
| `scripts/jyotish_engine.py::cmd_jaimini` | 除上游新增那一行外与上游逐字相同。`planet_lons` 取 `pd['degree']`(**四舍五入到 4 位小数**) |
| `scripts/jyotish_engine.py::cmd_full_reading`(Step 6: Jaimini 系统) | `planet_lons` 取 `degree_raw`(未舍入),`asc_deg` 取上升 `lon`;jaimini 组装末尾 `report['modules']['jaimini'] = jaimini_result`,整段包在 `try … except Exception` 里,任何未捕获异常会让**整个** jaimini 模块丢失 |
| API | `/api/jaimini`(`_compute_jaimini`,mode=all)走 `cmd_jaimini`;咨询与报告走 full-reading。**不需要改 `scripts/jyotish_api_server.py`** |
| 报告 | `pl9_reader_export.py` 按键名取 jaimini 子项,不会自动印新键;`build_pl9_style_export_packet` 会把整个 `modules.jaimini` 放进资料包 JSON(体积略增,不出正文)。`jyotish_engine.py` 里受限资料 `jaimini_special_points.reason` 仍写「Brahma/Maheshwara/Rudra still lack a same-profile structured producer」——本单不改(属报告文字,交 #91) |
| 关键路径快照 | `tests/golden/consultation_contract_keypaths_v1.json` 只记两层(`modules.jaimini` 为止),新键在第三层,**不变** |
| 键名冲突 | 我方没有任何代码读 `niryaana_shoola_strength`、`lagna_seventh_strength`、`goel_full_strength`、`goel_special_points`;我方 Niryaana 读的是 `dasha_families['niryaana_shoola']` 等精确键 |
### 1.5 冻结身份(ERR-110 / ERR-115)
冻结身份按**文件字节哈希**核对三份清单:`scripts/research/sealed_holdout_rerun.py` 的 `PRODUCTION_FILES`(11 个,校正与 `functional_benefics.py`)、`RESEARCH_FILES`(7 个),以及 `references/real_case_calibration/minute_rectification_holdout_v3.json` 的 `frozen_scoring.files`(12 个,**含 `jaimini.py`、`narayana_dasha.py`**)。
- 本单新增的四个文件、`jyotish_engine.py`、两个测试文件都**不在**清单里。
- 本单只**导入** `jaimini.py`、`narayana_dasha.py`,不改它们。
- 校正打分不调用 full-reading,也不读 `modules.jaimini`。
结论:按设计冻结身份**不会变**。若执行中发现必须改清单里的文件,或下面第 9 节的检查命令非空 / 四个身份测试转红,按红线 4 停下回报。
### 1.6 根目录文件预算
`scripts/*.py` 现为 **448** = `tests/test_python_hygiene_budget.py` 的 `ROOT_PY_BUDGET`,已满。先例:**#81 决策 A(产品 2026-10-18)**——「**上游原样文件**可以放在 `scripts/` 根目录(与上游同路径,方便以后同步),预算为这几个文件相应调高;我们自己写的文件仍不许增加」,当时 446 → 448,常量旁写了三栏。#91 把 `yogi_sphuta` 等放子包,是因为那些模块要改位置口径,不算原样文件;本单四个文件**一字不改**,正好落在 #81 A 的范围内。
## 2. 背景
Goel《Predicting through Jaimini Astrology》第 1 章(印刷页 10–17)的完整强度:行星五分量(尊贵、Karaka 名次分、从 AK 起的 Kendra 分、Kartari、Adhipati),星座五分量(固定分、所含 Karaka 分、Sthana、木星 / 水星 / 宫主三角色相位、宫主强度),再据此选 Brahma、Maheshwara、Rudra。上游交付版的「Goel Jaimini Strength and Special-Point Evidence」一章(约 4.8 万字符)就印这些数,我方此前因源码未公开没法做(#91 D7)。
## 3. 决策记录(产品负责人,issue #94,2026-10-21)
| # | 决定 |
| --- | --- |
| D1 | 搬 `goel_jaimini_strength.py` 及其依赖 `trikona_raman.py`、`sthira_brahma_goel_short_method.py`;`narayana_dasha._rasi_aspects` 两边已相同,不动。按 blob 哈希锁定上游版本,写进进度记录。(Claude 核实:`trikona_raman.py` 还硬依赖 `trikona_dasha.py`,一并按原样搬,见 1.1) |
| D2 | 按上游 `jyotish_engine.py` 的改动,把 `goel_full_strength`、`goel_special_points` 接进我方 jaimini 与 full-reading 输出 |
| D3 | 搬上游测试 `tests/test_goel_jaimini_strength.py`(书中公开数值表 + 虚构盘),必须全过;`test_bphs_validation_runtime.py` 的相应改动一并对照 |
| D4 | 口径照上游文档:交点默认计入 Sthana(遵循正文,`include_nodes_text`);排除交点的示例表口径也保留(`worked_example_node_exclusion`);七个 Karaka 度数相同时为「无法判定」(`status: blocked`),**不得自造排序** |
| D5 | 上游新增的 `lagna_seventh_strength` 与我方 #84 的 Niryaana Shoola(PVR Ayur)不是同一套:只搬字段本身,**不改**我方 Niryaana Shoola 的算法 |
| D6 | 校正打分不读这两个新字段;封存回放、偏移扫描前后逐项相同。若只是因为 full-reading 多了字段导致冻结身份变化,**停下来报告,不得自行重冻** |
| D7 | 位置一律用我方引擎口径(真恒星位置) |
| D8 | 本单只做计算,不改报告渲染;报告里印这一章由 #91 负责 |
| D9 | 可与 #89 并行;必须在 #91 印这一章之前合入 |
| D10 | 根目录预算:按 **#81 决策 A** 先例,四个上游原样文件放 `scripts/` 根目录,`ROOT_PY_BUDGET` 只为这四个文件调高(448 → 452)。这是对先例的适用,不是新决定;若产品另有意见,按第 8 节让步改放子包 |
## 4. 硬红线
1. **上游四个文件一字不改**(唯一例外:`goel_jaimini_strength.py` 的 `SOURCE` 一行改为书目引用,见 1.2):其余三个文件落地后 `git hash-object` 必须等于 1.1 表里的 blob 哈希;`goel_jaimini_strength.py` 与上游 blob 的 `diff` 只能有 `SOURCE` 这一行(Windows 注意 `core.autocrlf=false`,LF 换行)。需要的适配一律写在调用方(`jyotish_engine.py`)或测试里。
2. **不改我方 Niryaana Shoola 与简法强度**:`scripts/rashi_dashas_native.py`、`scripts/niryaana_shoola_dasha.py`、`scripts/goel_short_strength.py` 零改动;`tests/test_rashi_dashas_native.py`、`tests/test_niryaana_shoola_dasha.py` 不改断言且全绿。新增代码不得把 `lagna_seventh_strength` 或 `niryaana_shoola_strength` 接到任何 Niryaana 选择或大运计算上。
3. **不改冻结清单里的文件**:`jaimini.py`、`narayana_dasha.py`、`ashtakavarga.py` 等 `frozen_scoring.files` 与 `PRODUCTION_FILES`、`RESEARCH_FILES` 中的任何文件零改动;校正代码(`scripts/rectification/**`、`minute_rectification_*`、`active_rectification_*`)不得读新字段。
4. **冻结身份变化即停**:第 9 节检查命令输出非空,或 `test_sealed_holdout_contract_freshness`、`test_rectification_validation_integrity_gate`、`test_reported_offset_research`、`test_rectification_engine_memoization` 任一条转红——停下,推分支,PROGRESS 写清哪个文件、哪条测试,**不得重新冻结、不得改冻结记录或 golden**。
5. **口径**:Goel 输入的经度一律取我方 `compute_chart_data` 的结果(Swiss Ephemeris + 真岁差,BUG-1275 之后),full-reading 用 `degree_raw`;不引入任何新的位置计算。
6. **PyJHora**:运行时不得导入 `jhora`(`tests/test_runtime_jhora_import_scan.py`)。
7. **增长冻结**:不改 `scripts/jyotish_api_server.py`;`tests/test_api_server_growth_contract.py` 不放宽。
8. **静默吞错**:`SILENT_EXCEPT_BUDGET = 1` 不变(只给 `classical_astrology.py`)。Goel 失败必须 `logger.warning` 记具体异常类与信息,返回的 `reason` 带同样信息;不得让 Goel 失败把整个 `modules.jaimini` 带掉。
9. **不改报告渲染**(D8):`pl9_*`、`scripts/report_render/**`、`professional_report_reference.py`、前端一概不动。3 张固定虚构盘的中英完整数据版 Markdown 改前改后逐字节相同(见 T5)。
10. **对话不受影响**:`read_full_data_domain` 经卡片选择后的对话卡,对 3 张固定虚构盘逐字节不变。
11. 不动数据库与迁移;不改 `.gitea/`;不推 `main`。
12. **隐私**:只用虚构盘与书中公开例题;不搬上游书稿、客户导出文件、上游台账里的客户 pin 段落。PROGRESS 实测段只写「虚构盘」。
## 5. 任务分解
| # | 内容 | 验收标准 |
| --- | --- | --- |
| T1 | **原样搬四个模块**到 `scripts/` 根目录(`goel_jaimini_strength.py`、`trikona_raman.py`、`sthira_brahma_goel_short_method.py`、`trikona_dasha.py`),用 `git -C <上游> show 5fb8379c:<路径> > <路径>` 取,不经编辑器。`tests/test_python_hygiene_budget.py`:`ROOT_PY_BUDGET` 448 → 452,常量旁写三栏——原值 448 / 新值 452 / 原因「产品 2026-10-18 #81 决策 A 先例,issue #94:上游原样文件 goel_jaimini_strength、trikona_raman、sthira_brahma_goel_short_method、trikona_dasha 按上游路径放根目录;本地新写的文件仍不得增加」。合并时若根目录计数已因别的单变化,按合并后实数重算,**只为这四个文件加名额** | 三个文件 `git hash-object` 与 1.1 表逐一相等,`goel_jaimini_strength.py` 与上游的 diff 只有 `SOURCE` 一行(贴进 PROGRESS);仓库内 `grep -rn "Z-Library" scripts tests docs` 无命中;`ls scripts/*.py \| wc -l` = 新预算;`test_python_hygiene_budget` 全绿(静默处理仍只有 `classical_astrology.py:12558`) |
| T2 | **搬测试**:`tests/test_goel_jaimini_strength.py` 按原样取,**只改一行**:`from scripts.niryaana_shoola_dasha import select_niryaana_shoola_start_sign` → `from scripts.rashi_dashas_native import select_niryaana_shoola_start_sign`(我方 #84 的位置);PROGRESS 记上游 blob 与这一行改动。**对照** `test_bphs_validation_runtime.py`:我方这个文件没有上游的 `test_full_reading_exposes_lagna_vargottamamsa_receipt`,新增一条测试 `test_full_reading_exposes_goel_jaimini_strength`,用文件里已有的 `BASE_BIRTH_ARGS`(虚构盘)与 `_run_engine("full-reading", …)`,断言上游那四条:`goel_full_strength.status == 'executed'`、`rashi_strengths` 12 行、`goel_special_points` 键集合为 Brahma / Maheshwara / Rudra、`niryaana_shoola_strength.deprecated is True` | `tests/test_goel_jaimini_strength.py` 全部 19 条通过(含 3 条引擎接线条);新增 full-reading 测试通过;屏蔽 PyJHora 再跑一次同样通过 |
| T3 | **接线**(`scripts/jyotish_engine.py`):照上游加 `_goel_jaimini_evidence(planet_longitudes, ascendant_longitude)`,返回 `goel_full_strength`、`goel_special_points`,以及有就带上的 `lagna_seventh_strength` 与弃用别名 `niryaana_shoola_strength`(上游模块原样产出,带 `deprecated: true`、`replacement`、`not_for` 标注,保留以便与上游测试一致)。与上游的两处差异,写进 PROGRESS:(a) 捕获异常时 `logger.warning` 记异常类与信息(红线 8),`reason` 写成 `f'{exc.__class__.__name__}: {exc}'`;(b) `cmd_jaimini` 传给 Goel 的经度用 `pd.get('degree_raw', pd['degree'])`——我方 `degree` 舍入到 4 位小数,罗睺计都对冲检查容差 1e-7,用舍入值可能误判为不对冲而整组 blocked(上游测试的模拟盘只有 `degree`,回退后仍过)。`cmd_jaimini` 在 `mode in ('all','special')` 时并入;full-reading 在 `report['modules']['jaimini'] = jaimini_result` 之前并入,**不得**放在会被外层 `except Exception` 吞掉整个模块的位置之外再抛异常 | `cmd_jaimini` 与 full-reading 对 3 张固定虚构盘都输出四个新键;`modules.jaimini` 原有各键逐值不变(改前改后 JSON 去掉四个新键后逐字节相同);`git diff` 只动 `jyotish_engine.py` 的这三处 |
| T4 | **口径与「无法判定」**:确认 D4 的三件事在接线后的输出里成立:默认 `node_occupancy_policy == 'include_nodes_text'`;`goel_full_strength.worked_example_node_exclusion` 存在且 `node_occupancy_policy == 'exclude_nodes_worked_example'`;七星度数相同时 `status == 'blocked'`、三个特殊点全部 `blocked`,不出 AK、不出排序。另加一条测试:full-reading 里喂给 Goel 的经度与 `modules.chart.planets.*.degree_raw` 差 ≤ 1e-6° | 测试覆盖三件事与经度一致;不新增任何排序兜底 |
| T5 | **实盘回归与不变性**:(1) 200 张固定种子随机虚构盘(可复用 #89 的生成器,未合入则自写固定种子)跑 full-reading 的 jaimini 段:`goel_full_strength.status` 全部 `executed`(若有 `blocked`,逐张列原因,只允许七星度数相同一种);`goel_full_strength.atmakaraka` 与我方 `chara_karaka_7` 的 AK 一致(不一致逐张列出并停下回报,不改任何一方);mean / true 交点各跑一遍。(2) 3 张固定虚构盘:中英完整数据版 Markdown 改前改后逐字节相同;对话卡(`read_full_data_domain`)逐字节相同。(3) 冻结身份检查(第 9 节命令)输出为空 | 三项结果写进 PROGRESS(盘数、blocked 数、AK 一致率、耗时增量);任一不满足按红线停下 |
| T6 | **文档**:上游 `docs/research/goel_public_calculation_module_2026_10_21.md` 原样放到同路径(docs 不占根目录名额;文中唯一一处书稿本地路径同样改成书目引用,`grep -n "Z-Library"` 无命中),开头加一行我方说明:「上游 `5fb8379c` 原文;我方 Niryaana 选择器在 `scripts/rashi_dashas_native.py`;书稿未入库」。`docs/research/pre_work_error_ledger.md` 加一条我方台账(新 ERR 号):Goel 首/七强度 ≠ PVR Niryaana 二/八,弃用别名不得接入 Niryaana;Goel 完整法 ≠ `goel_short_strength` 简法。`CHANGELOG.md` 一行(引擎新增 Goel 强度与三个特殊点,报告暂不显示;Skill 版本不 bump)。PROGRESS 记:四个 blob、测试改动的那一行、接线与上游的两处差异、T5 数据、交给 #91 的事项(见下) | 文档齐;`.venv/bin/python -m pytest tests/test_repo_privacy_markers.py -q` 通过 |
交给 #91(写进 PROGRESS「移交」段,本单不做):
- 报告印「Goel Jaimini 强度与特殊点」章,中英标签齐全;`blocked` 的中文写「无法判定」、英文写「Not determinable」,并注明原因(七星度数相同 / 强度相同无唯一选择)。
- `jyotish_engine.py` 受限资料 `jaimini_special_points.reason` 里「Brahma/Maheshwara/Rudra still lack a same-profile structured producer」随印章一并改。
- 交点两种口径并列印出,标明默认遵循正文。
## 6. 验收分工
| 检查 | Grok 自跑 | Claude 验收 |
| --- | --- | --- |
| 改到与新增的 Python 测试文件:`test_goel_jaimini_strength`、`test_bphs_validation_runtime`、`test_python_hygiene_budget`、`test_rashi_dashas_native`、`test_niryaana_shoola_dasha`、`test_jaimini`、`test_runtime_jhora_import_scan`、`test_api_server_growth_contract`、`test_consultation_contract_golden`、四个冻结身份测试(红线 4)、`test_repo_privacy_markers` | 必跑(工作树 `.venv`),屏蔽 PyJHora 再跑一次 | 复验 |
| T5 的 200 盘与 3 盘逐字节比对 | 必跑,结果写 PROGRESS | 抽 3 盘复跑 |
| Python 快速门 `run_quality_gate.py --profile quick` | 不跑 | 以 Claude 为准 |
| **Python 全量 pytest 与开工基线逐条比对**(引擎输出有新增键) | 不跑 | 以 Claude 为准;屏蔽 PyJHora 模拟生产 |
| 前端 | 不动,不要求 | — |
| `test:db` | 不动数据库,不要求 | — |
## 7. 提交顺序(一个分支)
T1 → T2 → T3 → T4 → T5 → T6,一条任务一个提交。T1、T2 的提交里不得夹带对上游文件的任何格式化。
## 8. 让步顺序
不让步:红线全部;T1 的 blob 一致;T2 上游测试全过;T3 两个输出入口;冻结身份不变。
时间不够时依次让出:T5 的 true 交点那一遍 → T5 的 200 盘缩到 50 盘(写明)→ T6 的上游文档原样副本(台账与 CHANGELOG 不让)。
若产品不同意按 #81 A 调预算:四个文件改放 `scripts/goel_jaimini/`(子包,含 `__init__.py`),把模块内 `from scripts.trikona_raman` / `scripts.sthira_brahma_goel_short_method` / `scripts.trikona_dasha` 三处导入改成子包路径,测试里的 `scripts.goel_jaimini_strength` 跟着改;PROGRESS 记上游 blob + 本地导入改动的 diff,此后上游同步需人工比对。默认不走这条。
## 9. 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/goel-jaimini-strength-20261022 .worktrees/goel-jaimini-strength-20261022 origin/staging
cd .worktrees/goel-jaimini-strength-20261022
git config core.autocrlf false
# 上游参照放仓库外,只读
git clone --filter=blob:none https://github.com/732642856/yinduzhanxing.git ../yinduzhanxing-ref # 已有则 git -C ../yinduzhanxing-ref fetch origin
git -C ../yinduzhanxing-ref show --stat 5fb8379c
for f in scripts/goel_jaimini_strength.py scripts/trikona_raman.py scripts/sthira_brahma_goel_short_method.py scripts/trikona_dasha.py tests/test_goel_jaimini_strength.py docs/research/goel_public_calculation_module_2026_10_21.md; do
echo "$f $(git -C ../yinduzhanxing-ref rev-parse 5fb8379c:$f)"; done
ls scripts/*.py | wc -l # 期望 448(= ROOT_PY_BUDGET)
grep -n "ROOT_PY_BUDGET\|SILENT_EXCEPT_BUDGET" tests/test_python_hygiene_budget.py
grep -n "^def cmd_jaimini\|report\['modules'\]\['jaimini'\] = jaimini_result" scripts/jyotish_engine.py
grep -n "^def select_niryaana_shoola_start_sign" scripts/rashi_dashas_native.py
grep -oE "^## BUG-[0-9]+" docs/BUG_HISTORY.md | sort -u | sort -t- -k2 -n | tail -1
grep -oE "^## ERR-[0-9]+" docs/research/pre_work_error_ledger.md | sort -u | sort -t- -k2 -n | tail -1
```
冻结身份检查(T5 与交回前各跑一次,输出必须是 `[]`):
```bash
git diff --name-only origin/staging...HEAD > /tmp/goel_changed.txt
.venv/bin/python - <<'EOF'
import json, re
src = open("scripts/research/sealed_holdout_rerun.py", encoding="utf-8").read()
listed = set(re.findall(r'"(scripts/[^"]+\.py)"', src)) # PRODUCTION_FILES + RESEARCH_FILES
ds = json.load(open("references/real_case_calibration/minute_rectification_holdout_v3.json", encoding="utf-8"))
listed |= set(ds["frozen_scoring"]["files"])
changed = {l.strip() for l in open("/tmp/goel_changed.txt") if l.strip()}
print(sorted(listed & changed))
EOF
.venv/bin/python -m pytest -q tests/test_sealed_holdout_contract_freshness.py tests/test_rectification_validation_integrity_gate.py tests/test_reported_offset_research.py tests/test_rectification_engine_memoization.py
```
非空或转红 → 红线 4:停下、推分支、PROGRESS 写明,不重冻。
## 10. BUG 编号
本单是上游功能移植,预计**不新增** BUG 记录。若执行中确认了缺陷(例如 `cmd_jaimini` 舍入经度致对冲检查误判、Goel 失败带掉整个 jaimini 模块),按 `docs/BUG_HISTORY.md` 全文 `sort -u` 后的最大号 **+1** 起编(写作时最大号 BUG-1403;#88~#93 可能先占号,以开工时为准)。台账新 ERR 号同样开工时取最大号 +1。