diff --git a/SKILL.md b/SKILL.md index 1a86122f..c4dbc745 100644 --- a/SKILL.md +++ b/SKILL.md @@ -145,6 +145,7 @@ description: 印度占星(Jyotish)专业解盘与推运系统。核心能力 - Dasha-only 外部证据当前目标集已闭环:`dasha_external_oracle_evidence_validation.valid_dasha_packets: 3/3`;Steve Jobs / Lahiri、REDACTED_YEAR Lahiri 模板与 1800 Delhi historical epoch 的 Vimshottari 起始边界来自 PyJHora 4.8.7 隔离黑盒 stdout artifact。 - 全局 Dasha/Shadbala Calibration Status 仍未完成:`external_oracle_evidence_validation.valid_packets: 4`,`ready_for_calibration: 4`;Shadbala 外部绝对值当前目标集已通过 4/4,Raman 扩展样本与非 Dasha 靶点尚未封顶。 +- Tajika/Sahams 年运外部样本已开始闭环:`tajika_sahams_annual_benchmark_dashboard.ready_for_calibration: 1/5`;Steve Jobs 1984 Varshaphala/Lahiri 的 solar return、Varsha Lagna、Muntha、Year Lord、Mudda Dasha 首主、三项 Sahams 与 Tajika Yogas 已由 PyJHora 4.8.7 隔离黑盒 artifact 验证,下一优先级为 Einstein 1905。仍不得声称 Tajika/Sahams 年运体系已全局封顶。 - D1/D9/SAV 高可信;Dasha 精细日期可引用已验证 Dasha-only 样本的局部进度,但不得把全部大运边界、Shadbala 绝对值或全局精度说成已完成外部校准。 - `production_tuning_allowed: false` 前,禁止为了贴合单份 PDF、单个 JHora 截图或本仓库本地输出而改生产常数。 - 对普通用户的建议话术:基础落座、D9、SAV 可作为稳定证据;当前 Dasha-only 目标集已完成外部黑盒验证,但多 Dasha 家族、Antardasha/Pratyantar 细边界仍需扩展;Shadbala 当前目标集已有四个外部六分量样本,绝对值断语可引用 4/4 闭合进度;但跨软件差异、Raman 扩展样本与公开书例仍需更多证据后再提升到全局置信。 @@ -270,7 +271,7 @@ python3 scripts/validate_interpretation_templates.py --format markdown 5. **Prashna 分支工作流** - 问事类型分支、裁决链、时机判断仍需更稳定的传统链路 6. **Varshaphala / Tajika / Sahams 年运裁决深度** - - 年盘骨架已在,但事件裁决与权重层仍需继续成熟 + - 年盘骨架已在,第一条 Steve Jobs 1984 外部年运样本已闭环;但整体仍只有 `1/5`,事件裁决、权重层、Einstein 1905 等后续样本仍需继续成熟 7. **Kalachakra / Narayana 等替代 Dasha 的成熟度边界** - 已有覆盖,但部分子层、边界口径、外部黑盒对照仍需继续收紧 8. **高阶解释层整合** diff --git a/docs/research/oracle_closure_master_dashboard_latest.md b/docs/research/oracle_closure_master_dashboard_latest.md index da73923d..05260bb7 100644 --- a/docs/research/oracle_closure_master_dashboard_latest.md +++ b/docs/research/oracle_closure_master_dashboard_latest.md @@ -1,12 +1,12 @@ # Jyotish External Oracle Closure Master Dashboard -Generated: `2026-06-26T18:30:41.843216+00:00` +Generated: `2026-06-26T19:05:03.531931+00:00` ## Summary - total_tasks: `12` -- external_verified_tasks: `7` -- open_tasks: `5` +- external_verified_tasks: `8` +- open_tasks: `4` - can_claim_global_oracle_closure: `false` - production_tuning_allowed: `false` @@ -15,20 +15,20 @@ Generated: `2026-06-26T18:30:41.843216+00:00` | front | tasks | verified | first priority | missing fields | manual entries | metadata missing | target missing | |---|---:|---:|---|---:|---:|---:|---:| | `dasha` | 3 | 3 | `complete` | 0 | 0 | 0 | 0 | -| `tajika_sahams` | 5 | 0 | `template_steve_jobs_varshaphala_1984_lahiri` | 15 | 15 | 5 | 10 | +| `tajika_sahams` | 5 | 1 | `template_einstein_varshaphala_1905_lahiri` | 15 | 15 | 5 | 10 | | `shadbala` | 4 | 4 | `template_redacted_place_shadbala_raman` | 55 | 55 | 5 | 50 | ## Next Action Order ### tajika_sahams -- case_id: `template_steve_jobs_varshaphala_1984_lahiri` -- capture_id: `external_template_steve_jobs_varshaphala_1984_lahiri` +- case_id: `template_einstein_varshaphala_1905_lahiri` +- capture_id: `external_template_einstein_varshaphala_1905_lahiri` - missing_field_count: `15` - manual_entry_count: `15` ```bash -python3 scripts/tajika_annual_oracle_queue.py --oracle-file references/oracle/tajika_annual_oracle_cases.json --apply-packet references/oracle/artifacts/pending_packets/external_template_steve_jobs_varshaphala_1984_lahiri.json --format json +python3 scripts/tajika_annual_oracle_queue.py --oracle-file references/oracle/tajika_annual_oracle_cases.json --apply-packet references/oracle/artifacts/pending_packets/external_template_einstein_varshaphala_1905_lahiri.json --format json ``` ## Boundary diff --git a/docs/research/skill_gap_truth_audit_latest.md b/docs/research/skill_gap_truth_audit_latest.md index 25e7f7b5..a8c9fed4 100644 --- a/docs/research/skill_gap_truth_audit_latest.md +++ b/docs/research/skill_gap_truth_audit_latest.md @@ -1,6 +1,6 @@ # Jyotish Skill Gap Truth Audit -Generated: `2026-06-26T18:30:42.500897+00:00` +Generated: `2026-06-26T19:05:04.292300+00:00` ## Public Claim Boundary @@ -19,8 +19,8 @@ Generated: `2026-06-26T18:30:42.500897+00:00` ## External Oracle Closure - total_tasks: `12` -- external_verified_tasks: `7` -- open_tasks: `5` +- external_verified_tasks: `8` +- open_tasks: `4` - can_claim_global_oracle_closure: `false` ## Remaining Hard Fronts @@ -51,7 +51,7 @@ Generated: `2026-06-26T18:30:42.500897+00:00` - id: `tajika_sahams_annual_closure` - priority: `P0` - status: `active_gap` -- current_truth: Varshaphala, Muntha, Year Lord, Mudda Dasha and Sahams have local structure, but annual judgment depth and external sample closure remain incomplete. +- current_truth: Varshaphala, Muntha, Year Lord, Mudda Dasha and Sahams have local structure, and the first annual external packet is now accepted at 1/5 for Steve Jobs 1984 Lahiri via PyJHora 4.8.7 black-box artifact; annual judgment depth, Einstein 1905 and the remaining external sample set are still incomplete. ### Article-level interpretation template industrialization diff --git a/docs/research/tajika_annual_benchmark_dashboard_latest.md b/docs/research/tajika_annual_benchmark_dashboard_latest.md new file mode 100644 index 00000000..cc0e2225 --- /dev/null +++ b/docs/research/tajika_annual_benchmark_dashboard_latest.md @@ -0,0 +1,26 @@ +# Tajika/Sahams Annual Benchmark Dashboard + +Generated: `2026-06-26T19:05:02.797254+00:00` + +## Annual Oracle Readiness + +- total_tasks: `5` +- ready_for_collection: `4` +- ready_for_calibration: `1` +- production_tuning_allowed: `false` + +## Annual Closure Claim + +- can_claim_tajika_sahams_closure: `false` +- reason: Do not claim annual-chart closure until every template row is promoted to external_verified with human-reviewable artifacts. + +## Remaining Gap + +Solar return exact time, Varsha Lagna, Muntha, Year Lord, Mudda Dasha first lord, Sahams and Tajika Yogas still need external JHora/PyJHora/book-example evidence before the Jyotish skill can claim Tajika/Sahams annual closure. + +## Next Actions + +- Fill the next annual evidence packet from JHora or PyJHora: template_einstein_varshaphala_1905_lahiri. +- Add solar return datetime and Varsha Lagna tolerance checks after the first external row exists. +- Add Saham-specific tolerance checks for Punya, Rajya and Vivah Saham. +- Expand the annual benchmark with at least one printed Varshaphala example. diff --git a/docs/research/tajika_annual_closure_status_latest.md b/docs/research/tajika_annual_closure_status_latest.md new file mode 100644 index 00000000..6366be53 --- /dev/null +++ b/docs/research/tajika_annual_closure_status_latest.md @@ -0,0 +1,81 @@ +# Tajika/Sahams Annual Closure Status + +- annual_task_count: `5` +- external_verified_annual_tasks: `1` +- can_claim_tajika_sahams_closure: `false` +- production_tuning_allowed: `false` + +## First Priority Packet + +- case_id: `template_einstein_varshaphala_1905_lahiri` +- capture_id: `external_template_einstein_varshaphala_1905_lahiri` +- packet_path: `references/oracle/artifacts/pending_packets/external_template_einstein_varshaphala_1905_lahiri.json` +- required_target_fields: `target.solar_return_datetime, target.varsha_lagna_deg, target.muntha_sign, target.year_lord, target.mudda_dasha_first_lord, target.sahams.punya_saham, target.sahams.rajya_saham, target.sahams.vivah_saham, target.tajika_yogas, target.source_artifact` + +## Missing Summary + +- metadata: `5` +- target: `10` + +## Prefilled Fields + +- status: `draft` +- promotion_status_after_fill: `external_verified` + +- metadata: + + - ayanamsa: `lahiri` + - node_mode: `mean` + - timezone: `0.883333` + - annual_system: `varshaphala` + - target_year: `1905` + +- settings: + + - ayanamsa: `lahiri` + - node_mode: `mean` + - annual_system: `varshaphala` + - target_year: `1905` + +## Manual Fill Plan + +- status_value: `external_verified` +- manual_entry_count: `15` + +## Missing Fields + +- `metadata.tool_name` +- `metadata.tool_version_or_url` +- `metadata.capture_date` +- `metadata.operator_note` +- `metadata.source_artifact` +- `target.solar_return_datetime` +- `target.varsha_lagna_deg` +- `target.muntha_sign` +- `target.year_lord` +- `target.mudda_dasha_first_lord` +- `target.sahams.punya_saham` +- `target.sahams.rajya_saham` +- `target.sahams.vivah_saham` +- `target.tajika_yogas` +- `target.source_artifact` +## Commands + +```bash +python3 scripts/tajika_annual_oracle_queue.py --oracle-file references/oracle/tajika_annual_oracle_cases.json --apply-packet references/oracle/artifacts/pending_packets/external_template_einstein_varshaphala_1905_lahiri.json --format json +``` + +```bash +python3 scripts/tajika_annual_oracle_queue.py --oracle-file references/oracle/tajika_annual_oracle_cases.json --format json && python3 scripts/tajika_annual_benchmark_dashboard.py --oracle-file references/oracle/tajika_annual_oracle_cases.json --format json +``` + +## Next Actions + +- Fill solar return datetime, Varsha Lagna, Muntha, Year Lord, first Mudda Dasha lord, three Sahams and Tajika Yogas from an external annual source. +- Document timezone/DST and solar-return convention before promoting the row. +- Set the row to external_verified only after target.source_artifact and metadata.source_artifact point to reviewable evidence. +- Regenerate the annual queue and benchmark dashboard. + +## Boundary + +This board isolates Tajika/Sahams annual closure. Local scripts/varshaphala.py output is not an external oracle and must not be used as production tuning evidence. diff --git a/references/navatara-kantaka-shani-guide.md b/references/navatara-kantaka-shani-guide.md index fea26424..ec999b19 100644 --- a/references/navatara-kantaka-shani-guide.md +++ b/references/navatara-kantaka-shani-guide.md @@ -99,12 +99,13 @@ ## 四、缓解因素 -| 因素 | 缓解效果 | -|------|---------| -| 土星入庙/旺相(本命或Transit) | 大幅减轻 → "刺痛"变"磨练" | -| Lagna主星强(Shadbala高) | 中度减轻 | -| 土星与Jupiter形成相位 | 吉星保护 | -| Ashtakavarga该宫SAV分高(>30) | 该领域抗压力强 | +| 因素 | 缓解效果 | 实战表现 | +|------|---------|---------| +| **本命形成强 Yoga(如 Sasa Yoga)且 Dasha 支持** | 显著调制负面效应 | "刺痛"更可能转化为训练、责任、竞争、考试、赛事或职场压力;是否获得奖项/地位必须再看10宫、11宫、D10、Dasha、AV与现实领域证据。 | +| 土星入庙/旺相(本命或Transit但非贵格) | 大幅减轻 | "刺痛"变"磨练",最终有收获 | +| Lagna主星强(Shadbala高) | 中度减轻 | 能扛住压力 | +| 土星与Jupiter形成相位 | 吉星保护 | 遇到困难有贵人兜底 | +| Ashtakavarga该宫SAV分高(>30) | 该领域抗压力强 | 外部动荡但核心盘面不崩 | ## 五、实战案例:示例案例命盘 diff --git a/references/oracle/artifacts/pending_packets/external_template_steve_jobs_varshaphala_1984_lahiri_pyjhora_20260627.json b/references/oracle/artifacts/pending_packets/external_template_steve_jobs_varshaphala_1984_lahiri_pyjhora_20260627.json new file mode 100644 index 00000000..f4e46ee1 --- /dev/null +++ b/references/oracle/artifacts/pending_packets/external_template_steve_jobs_varshaphala_1984_lahiri_pyjhora_20260627.json @@ -0,0 +1,139 @@ +{ + "capture_id": "external_template_steve_jobs_varshaphala_1984_lahiri", + "status": "external_verified", + "case_id": "template_steve_jobs_varshaphala_1984_lahiri", + "birth": { + "year": 1955, + "month": 2, + "day": 24, + "hour": 19, + "minute": 15, + "second": 0, + "lat": 37.7749, + "lon": -122.4194, + "tz": -8 + }, + "settings": { + "ayanamsa": "lahiri", + "node_mode": "true", + "annual_system": "varshaphala", + "target_year": 1984 + }, + "required_metadata_fields": [ + "tool_name", + "tool_version_or_url", + "capture_date", + "source_artifact", + "ayanamsa", + "node_mode", + "timezone", + "annual_system", + "target_year", + "operator_note" + ], + "metadata": { + "tool_name": "PyJHora", + "tool_version_or_url": "PyJHora 4.8.7 isolated /tmp black-box run", + "capture_date": "2026-06-27", + "source_artifact": "references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt", + "ayanamsa": "lahiri", + "node_mode": "PyJHora default", + "timezone": "UTC-08:00", + "annual_system": "Varshaphala/Tajika", + "target_year": 1984, + "operator_note": "Black-box annual output from isolated /tmp virtualenv. PyJHora AGPL code was not copied into this repository; only generated output is stored as external evidence. Year Lord direct call raised KeyError when Rahu appeared in candidates; packet records the filtered classical-planet workaround per PyJHora docstring boundary." + }, + "target_placeholders": { + "target.solar_return_datetime": "1984-02-25T05:41:37-08:00", + "target.varsha_lagna_deg": 287.4007, + "target.muntha_sign": "Cancer", + "target.year_lord": "Mars", + "target.mudda_dasha_first_lord": "Sun", + "target.sahams.punya_saham": 249.1148, + "target.sahams.rajya_saham": 207.6343, + "target.sahams.vivah_saham": 8.8762, + "target.tajika_yogas": { + "eesarpha": [ + [ + 0, + 5 + ], + [ + 1, + 3 + ], + [ + 2, + 6 + ], + [ + 4, + 5 + ] + ], + "gairi_kamboola": null, + "ithasala": [ + [ + 0, + 1, + 1 + ], + [ + 0, + 4, + 2 + ], + [ + 1, + 4, + 3 + ] + ], + "kamboola": [ + true, + [ + [ + 1, + 4 + ] + ], + [ + [ + 0, + 4 + ], + [ + 1, + 4 + ], + [ + 0, + 1 + ], + [ + 0, + 4 + ] + ] + ], + "khallasara": null, + "manahoo": [ + [ + 0, + 4, + 10 + ] + ], + "nakta": [], + "yamaya": [] + }, + "target.source_artifact": "references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt" + }, + "integrity_checks": { + "must_not_come_from_local_engine": true, + "requires_external_artifact": true, + "requires_status_external_verified_before_calibration": true, + "requires_solar_return_convention": true + }, + "promotion_status_after_fill": "external_verified" +} diff --git a/references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt b/references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt new file mode 100644 index 00000000..28d7cf5d --- /dev/null +++ b/references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt @@ -0,0 +1,30 @@ +panchanga /Users/wuyongnaren added to system path ['', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python311.zip', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/lib-dynload', '/private/tmp/jyotish_pyjhora_blackbox/lib/python3.11/site-packages', '/Users/wuyongnaren'] +/Users added to system path ['', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python311.zip', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/lib-dynload', '/private/tmp/jyotish_pyjhora_blackbox/lib/python3.11/site-packages', '/Users/wuyongnaren', '/Users'] +house_planet_dict ['', '7', '', '', '', '', '2/6', '8', '1/4', 'L/5', '0/3', ''] +house_planet_dict ['', '7', '', '', '', '', '2/6', '8', '1/4', 'L/5', '0/3', ''] +house_planet_dict ['', '7', '', '', '', '', '2/6', '8', '1/4', 'L/5', '0/3', ''] +_get_nakta_triples iy_list [(0, [(1, 4)])] +_get_nakta_triples iylist1 [(4, [(0, 1)])] +_get_nakta_triples iy_list [(0, [(1, 4)]), (4, [(0, 1)])] +house_planet_dict ['', '7', '', '', '', '', '2/6', '8', '1/4', 'L/5', '0/3', ''] +ithasala_yoga_planet_pairs [(0, 1, 1), (0, 4, 2), (1, 4, 3)] +_get_nakta_triples iy_list [(0, [(1, 4)])] +_get_nakta_triples iylist1 [(4, [(0, 1)])] +_get_nakta_triples iy_list [(0, [(1, 4)]), (4, [(0, 1)])] +_yamaya_triples [(0, [(1, 4)]), (4, [(0, 1)])] +checking triples 0 12.51819523474876 1 4.232244722579111 4 4 12.51819523474876 +checking triples 4 13.495962116843629 0 12.51819523474876 1 1 13.495962116843629 +yamaya planet triples [] +house_planet_dict ['', '7', '', '', '', '', '2/6', '8', '1/4', 'L/5', '0/3', ''] +PYJHORA_BLACKBOX_VERSION 4.8.7 +CASE_ID template_steve_jobs_varshaphala_1984_lahiri +DOB (1955, 2, 24) +TOB (19, 15, 0) +PLACE Place(Place='San Francisco, CA Steve Jobs Varshaphala 1984 template', latitude=37.7749, longitude=-122.4194, timezone=-8.0, elevation=0.0) +AYANAMSA LAHIRI +NODE_MODE PyJHora default +TARGET_YEAR 1984 +YEARS_FROM_DOB_USED 30 +NATAL_JD 2435163.3020833335 +ANNUAL_CHART_RAW [['L', (9, 17.400729761262824)], [0, (10, 12.51819523474876)], [1, (8, 4.232244722579111)], [2, (6, 26.729647475518334)], [3, (10, 2.592766661293183)], [4, (8, 13.495962116843629)], [5, (9, 14.22730692496367)], [6, (6, 22.75179249306666)], [7, (1, 18.443240534378823)], [8, (7, 18.443240534378816)]] +TAJIKA_ANNUAL_VALUES_JSON {"mudda_dasha_first_lord": "Sun", "mudda_first_raw": [[0, 0], [1985, 2, 9, 7.255877505987883], 0.91], "muntha_sign": "Cancer", "muntha_sign_index": 3, "sahams": {"punya_saham": 249.1148, "rajya_saham": 207.6343, "vivah_saham": 8.8762}, "solar_return_datetime": "1984-02-25T05:41:37-08:00", "solar_return_raw": [[1984, 2, 25], "05:41:37"], "tajika_yogas": {"eesarpha": [[0, 5], [1, 3], [2, 6], [4, 5]], "gairi_kamboola": null, "ithasala": [[0, 1, 1], [0, 4, 2], [1, 4, 3]], "kamboola": [true, [[1, 4]], [[0, 4], [1, 4], [0, 1], [0, 4]]], "khallasara": null, "manahoo": [[0, 4, 10]], "nakta": [], "yamaya": []}, "varsha_lagna_deg": 287.4007, "year_lord": "Mars", "year_lord_boundary": {"candidate_policy": "PyJHora docstring says Rahu/Ketu do not form lord of the year; filtered candidates to classical planets 0..6 after direct call raised KeyError.", "direct": {"error": "KeyError: 7", "ok": false, "value": null}, "filtered_candidates": [0, 2, 5], "jd_at_years": 2446120.9930033335, "night_time_birth": false, "raw_candidates": [7, 0, 2, 5]}, "year_lord_raw": 2} diff --git a/references/oracle/tajika_annual_oracle_cases.json b/references/oracle/tajika_annual_oracle_cases.json index 01533193..d9b95f3a 100644 --- a/references/oracle/tajika_annual_oracle_cases.json +++ b/references/oracle/tajika_annual_oracle_cases.json @@ -9,7 +9,7 @@ "template_cases": [ { "id": "template_steve_jobs_varshaphala_1984_lahiri", - "status": "template_only", + "status": "external_verified", "source": "JHora Varshaphala screenshot / PyJHora black-box annual output / printed example", "privacy": "public_figure_template", "birth": { @@ -30,20 +30,110 @@ "target_year": 1984 }, "target": { - "solar_return_datetime": null, - "varsha_lagna_deg": null, - "muntha_sign": null, - "year_lord": null, - "mudda_dasha_first_lord": null, + "solar_return_datetime": "1984-02-25T05:41:37-08:00", + "varsha_lagna_deg": 287.4007, + "muntha_sign": "Cancer", + "year_lord": "Mars", + "mudda_dasha_first_lord": "Sun", "sahams": { - "punya_saham": null, - "rajya_saham": null, - "vivah_saham": null + "punya_saham": 249.1148, + "rajya_saham": 207.6343, + "vivah_saham": 8.8762 }, - "tajika_yogas": null, - "source_artifact": null + "tajika_yogas": { + "eesarpha": [ + [ + 0, + 5 + ], + [ + 1, + 3 + ], + [ + 2, + 6 + ], + [ + 4, + 5 + ] + ], + "gairi_kamboola": null, + "ithasala": [ + [ + 0, + 1, + 1 + ], + [ + 0, + 4, + 2 + ], + [ + 1, + 4, + 3 + ] + ], + "kamboola": [ + true, + [ + [ + 1, + 4 + ] + ], + [ + [ + 0, + 4 + ], + [ + 1, + 4 + ], + [ + 0, + 1 + ], + [ + 0, + 4 + ] + ] + ], + "khallasara": null, + "manahoo": [ + [ + 0, + 4, + 10 + ] + ], + "nakta": [], + "yamaya": [] + }, + "source_artifact": "references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt" }, - "verification_note": "Fill only from external annual-chart output. Local scripts/varshaphala.py output is not valid evidence." + "verification_note": "Fill only from external annual-chart output. Local scripts/varshaphala.py output is not valid evidence.", + "evidence_packet": { + "capture_id": "external_template_steve_jobs_varshaphala_1984_lahiri", + "status": "external_verified", + "metadata": { + "tool_name": "PyJHora", + "tool_version_or_url": "PyJHora 4.8.7 isolated /tmp black-box run", + "capture_date": "2026-06-27", + "source_artifact": "references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt", + "ayanamsa": "lahiri", + "node_mode": "PyJHora default", + "timezone": "UTC-08:00", + "annual_system": "Varshaphala/Tajika", + "target_year": 1984, + "operator_note": "Black-box annual output from isolated /tmp virtualenv. PyJHora AGPL code was not copied into this repository; only generated output is stored as external evidence. Year Lord direct call raised KeyError when Rahu appeared in candidates; packet records the filtered classical-planet workaround per PyJHora docstring boundary." + } + } }, { "id": "template_einstein_varshaphala_1905_lahiri", diff --git a/references/skill_gap_truth_registry.json b/references/skill_gap_truth_registry.json index b3b0c43a..d02a88e8 100644 --- a/references/skill_gap_truth_registry.json +++ b/references/skill_gap_truth_registry.json @@ -55,7 +55,7 @@ "title": "Tajika / Sahams annual closure", "priority": "P0", "status": "active_gap", - "current_truth": "Varshaphala, Muntha, Year Lord, Mudda Dasha and Sahams have local structure, but annual judgment depth and external sample closure remain incomplete.", + "current_truth": "Varshaphala, Muntha, Year Lord, Mudda Dasha and Sahams have local structure, and the first annual external packet is now accepted at 1/5 for Steve Jobs 1984 Lahiri via PyJHora 4.8.7 black-box artifact; annual judgment depth, Einstein 1905 and the remaining external sample set are still incomplete.", "completion_standard": [ "External annual packets include solar return time, Varsha Lagna, Muntha, Year Lord, Mudda Dasha, key Sahams and Tajika Yogas.", "Annual interpretation templates distinguish calculation evidence from judgment confidence.", @@ -67,9 +67,9 @@ "Local Varshaphala output alone is external oracle evidence" ], "next_actions": [ - "Use scripts/tajika_annual_closure_status.py to fill the first annual packet.", - "Freeze the annual judgment template around Muntha, Year Lord, Mudda Dasha and Sahams.", - "Add public benchmark rows only after external annual evidence exists." + "Use scripts/tajika_annual_closure_status.py to fill the next annual packet: template_einstein_varshaphala_1905_lahiri.", + "Freeze the annual judgment template around Muntha, Year Lord, Mudda Dasha and Sahams without treating one annual sample as predictive closure.", + "Add public benchmark rows only after external annual evidence exists and scripts/tajika_annual_benchmark_dashboard.py reports readiness." ] }, "article_template_industrialization": { diff --git a/references/transit-comprehensive-guide.md b/references/transit-comprehensive-guide.md index d2421943..2f13292e 100644 --- a/references/transit-comprehensive-guide.md +++ b/references/transit-comprehensive-guide.md @@ -39,6 +39,18 @@ | 土星 | ~2.5年 | 人生阶段/业力 | 季度-年度 | | Rahu/Ketu | ~1.5年 | 深层欲望/灵性 | 半年-年度 | +### 1.3 Natal Promise First Protocol(本命承诺优先协议)⚠️ + +**核心规则**:在判定任何凶星(特别是土星、火星、Rahu/Ketu)过境带来的压力、延迟或风险前,**必须首先核验本命盘是否承诺该主题、该星在原盘中的功能性角色、尊贵度、Yoga、Shadbala/Ashtakavarga 支撑,以及当前 Dasha 是否允许兑现**。 + +| 本命与时运状态 | 流年过境(Gochara)修正法则 | 实战表现 | +|-------------|----------------------------|---------| +| **本命承诺强 + Yoga 成立 + Dasha 支持**(如 Mahapurusha Yoga、强 Parivartana、强宫主) | 过境凶星更常表现为高压激活、责任加重、竞争升级或结构化突破;不可直接套用灾难断语。 | 例如 Sasa Yoga 成立且相关 Dasha/事业宫位被激活时,Kantaka/Ashtama 类压力可能转为训练、赛事、考试、职场竞争或责任上升。仍需看 Dasha、宫位主题、AV 分数与实际事件背景。 | +| **入旺 / 极旺**(Exalted / Moolatrikona)但缺少明确事件承诺 | 负面效应通常减轻,压力更像必须完成的磨练;不能自动推断为大奖、升迁或胜利。 | 压力存在,但若 Dasha 与目标宫位配合,结果更容易有建设性。 | +| **落陷 / 受克 / 功能性凶且 Dasha 同步**(Debilitated / Afflicted) | 负面条文可信度上升,但仍应避免单因素绝对化;需与健康、事业、家庭等主题宫位和分盘交叉。 | 更可能出现压抑、延迟、失败、病痛或成本增加,但具体事件类型必须由本命承诺和 Dasha 指定。 | + +> **⚠️ 误区提醒**:禁止脱离本命承诺、Dasha 与分盘,直接套用“某凶星过某宫就必然发生某类坏事”的静态流年断语。更严谨的说法是:本命盘决定事件可发生的范围,Dasha 决定主题是否进入兑现期,Transit 主要负责触发、调制压力形态和缩小时间窗口。 + --- ## 二、Double Transit 理论(双过境理论) diff --git a/scripts/tajika_annual_benchmark_dashboard.py b/scripts/tajika_annual_benchmark_dashboard.py index 6d453a78..cb99f64e 100644 --- a/scripts/tajika_annual_benchmark_dashboard.py +++ b/scripts/tajika_annual_benchmark_dashboard.py @@ -33,6 +33,8 @@ def _run_json(command: list[str]) -> dict[str, Any]: def build_dashboard(oracle_file: str) -> dict[str, Any]: queue = _run_json([PYTHON, "scripts/tajika_annual_oracle_queue.py", "--oracle-file", oracle_file, "--format", "json"]) summary = queue["summary"] + next_task = next((task for task in queue["tasks"] if not task["ready_for_calibration"]), None) + next_case = next_task["case_id"] if next_task else None can_claim_closure = bool(summary["production_tuning_allowed"] and summary["ready_for_calibration"] == summary["total_tasks"]) remaining_gap = ( "Solar return exact time, Varsha Lagna, Muntha, Year Lord, Mudda Dasha first lord, " @@ -58,8 +60,13 @@ def build_dashboard(oracle_file: str) -> dict[str, Any]: ), }, "remaining_gap": remaining_gap, + "first_priority": next_task, "next_actions": [ - "Fill one Steve Jobs annual evidence packet from JHora or PyJHora.", + ( + f"Fill the next annual evidence packet from JHora or PyJHora: {next_case}." + if next_case + else "All annual evidence packets are filled; review tolerance checks before any production tuning." + ), "Add solar return datetime and Varsha Lagna tolerance checks after the first external row exists.", "Add Saham-specific tolerance checks for Punya, Rajya and Vivah Saham.", "Expand the annual benchmark with at least one printed Varshaphala example.", diff --git a/scripts/tajika_annual_closure_status.py b/scripts/tajika_annual_closure_status.py index ed63ad4b..0af11815 100644 --- a/scripts/tajika_annual_closure_status.py +++ b/scripts/tajika_annual_closure_status.py @@ -131,7 +131,9 @@ def _validate_command(oracle_file: str) -> str: def build_status(oracle_file: str) -> dict[str, Any]: queue = _run_json([PYTHON, "scripts/tajika_annual_oracle_queue.py", "--oracle-file", oracle_file, "--format", "json"]) annual_tasks = queue.get("tasks", []) - priority = next((task for task in annual_tasks if task.get("case_id") == FIRST_PRIORITY_CASE_ID), None) + priority = next((task for task in annual_tasks if not task.get("ready_for_calibration")), None) + if priority is None: + priority = next((task for task in annual_tasks if task.get("case_id") == FIRST_PRIORITY_CASE_ID), None) if priority is None and annual_tasks: priority = annual_tasks[0] if priority is None: @@ -141,7 +143,11 @@ def build_status(oracle_file: str) -> dict[str, Any]: capture_id = queue_packet["capture_id"] packet_path = f"references/oracle/artifacts/pending_packets/{capture_id}.json" template_path = FIRST_PRIORITY_TEMPLATE_PATH if priority["case_id"] == FIRST_PRIORITY_CASE_ID else packet_path - packet = json.loads((ROOT / template_path).read_text(encoding="utf-8")) + template_file = ROOT / template_path + if template_file.exists(): + packet = json.loads(template_file.read_text(encoding="utf-8")) + else: + packet = queue_packet missing_fields = _metadata_missing(packet) + _target_missing(packet) missing_groups = _group_missing_fields(missing_fields) external_verified = [ diff --git a/scripts/tajika_annual_oracle_queue.py b/scripts/tajika_annual_oracle_queue.py index d176daba..68844537 100644 --- a/scripts/tajika_annual_oracle_queue.py +++ b/scripts/tajika_annual_oracle_queue.py @@ -69,6 +69,8 @@ def _write_json(path: str, value: dict[str, Any]) -> None: def _target_fields(value: Any, prefix: str = "target") -> list[str]: + if prefix == "target.tajika_yogas": + return [prefix] if prefix == "target" and isinstance(value, dict): fields: list[str] = [] for key, child in value.items(): @@ -93,6 +95,10 @@ def _target_value(target: dict[str, Any], field: str) -> Any: def _missing_target_fields(value: Any, prefix: str = "target") -> list[str]: missing: list[str] = [] + if prefix == "target.tajika_yogas": + if value is None or value == "" or value == {}: + return [prefix] + return [] if isinstance(value, dict): for key, child in value.items(): missing.extend(_missing_target_fields(child, f"{prefix}.{key}")) @@ -117,9 +123,13 @@ def _evidence_packet(case: dict[str, Any], target_fields: list[str]) -> dict[str "target_year": settings.get("target_year", ""), "operator_note": "", } + existing = case.get("evidence_packet", {}) + existing_metadata = existing.get("metadata", {}) if isinstance(existing, dict) else {} + if isinstance(existing_metadata, dict): + metadata.update(existing_metadata) return { - "capture_id": f"external_{case_id}", - "status": "draft", + "capture_id": existing.get("capture_id") or f"external_{case_id}" if isinstance(existing, dict) else f"external_{case_id}", + "status": existing.get("status", "draft") if isinstance(existing, dict) else "draft", "case_id": case_id, "birth": case.get("birth", {}), "settings": settings, diff --git a/tests/test_oracle_closure_master_dashboard.py b/tests/test_oracle_closure_master_dashboard.py index 8acb23ee..6167ccf1 100644 --- a/tests/test_oracle_closure_master_dashboard.py +++ b/tests/test_oracle_closure_master_dashboard.py @@ -39,8 +39,8 @@ def test_oracle_closure_master_dashboard_aggregates_all_hard_fronts() -> None: assert report["scope"] == "jyotish_external_oracle_closure_master_dashboard" assert report["schema_version"] == 1 assert report["summary"]["total_tasks"] == 12 - assert report["summary"]["external_verified_tasks"] == 7 - assert report["summary"]["open_tasks"] == 5 + assert report["summary"]["external_verified_tasks"] == 8 + assert report["summary"]["open_tasks"] == 4 assert report["summary"]["can_claim_global_oracle_closure"] is False assert report["fronts"]["dasha"]["task_count"] == 3 assert report["fronts"]["shadbala"]["task_count"] == 4 @@ -49,7 +49,9 @@ def test_oracle_closure_master_dashboard_aggregates_all_hard_fronts() -> None: assert report["fronts"]["dasha"]["first_priority"] is None assert report["fronts"]["shadbala"]["external_verified_tasks"] == 4 assert report["fronts"]["shadbala"]["first_priority"]["case_id"] == "template_redacted_place_shadbala_raman" - assert report["fronts"]["tajika_sahams"]["first_priority"]["case_id"] == "template_steve_jobs_varshaphala_1984_lahiri" + assert report["fronts"]["tajika_sahams"]["external_verified_tasks"] == 1 + assert report["fronts"]["tajika_sahams"]["open_tasks"] == 4 + assert report["fronts"]["tajika_sahams"]["first_priority"]["case_id"] == "template_einstein_varshaphala_1905_lahiri" assert report["fronts"]["tajika_sahams"]["first_priority"]["missing_groups"]["target"]["count"] == 10 assert report["fronts"]["shadbala"]["first_priority"]["manual_fill_plan"]["manual_entry_count"] == 55 assert report["next_action_order"][0]["front"] == "tajika_sahams" @@ -68,6 +70,6 @@ def test_oracle_closure_master_dashboard_markdown_can_be_written(tmp_path: Path) assert "can_claim_global_oracle_closure: `false`" in markdown assert "`dasha` | 3 | 3 | `complete`" in markdown assert "template_redacted_place_shadbala_raman" in markdown - assert "template_steve_jobs_varshaphala_1984_lahiri" in markdown + assert "template_einstein_varshaphala_1905_lahiri" in markdown assert "manual entries" in markdown assert "metadata missing" in markdown diff --git a/tests/test_skill_gap_truth_audit.py b/tests/test_skill_gap_truth_audit.py index 33ad37f7..0acac8a4 100644 --- a/tests/test_skill_gap_truth_audit.py +++ b/tests/test_skill_gap_truth_audit.py @@ -92,3 +92,24 @@ def test_skill_gap_truth_audit_markdown_is_human_readable() -> None: assert "can_claim_global_first: `false`" in markdown assert "Dasha external oracle" in markdown assert "Past Corrections" in markdown + + +def test_transit_reference_blocks_single_factor_override_claims() -> None: + transit = (ROOT / "references" / "transit-comprehensive-guide.md").read_text(encoding="utf-8") + kantaka = (ROOT / "references" / "navatara-kantaka-shani-guide.md").read_text(encoding="utf-8") + combined = transit + "\n" + kantaka + + assert "Natal Promise First Protocol" in transit + assert "本命盘决定事件可发生的范围" in transit + assert "Dasha 决定主题是否进入兑现期" in transit + assert "Transit 主要负责触发" in transit + assert "是否获得奖项/地位必须再看10宫、11宫、D10、Dasha、AV与现实领域证据" in kantaka + + forbidden_overclaims = [ + "一票否决", + "完全反转", + "免疫纯粹灾难", + "土星过4宫必主", + ] + for phrase in forbidden_overclaims: + assert phrase not in combined diff --git a/tests/test_tajika_annual_benchmark_dashboard.py b/tests/test_tajika_annual_benchmark_dashboard.py index 429b87c2..b32e118b 100644 --- a/tests/test_tajika_annual_benchmark_dashboard.py +++ b/tests/test_tajika_annual_benchmark_dashboard.py @@ -38,7 +38,7 @@ def test_tajika_annual_dashboard_outputs_stable_json_summary() -> None: assert report["scope"] == "tajika_sahams_annual_benchmark_dashboard" assert report["schema_version"] == 1 assert report["summary"]["total_tasks"] == 5 - assert report["summary"]["ready_for_calibration"] == 0 + assert report["summary"]["ready_for_calibration"] == 1 assert report["summary"]["production_tuning_allowed"] is False assert report["annual_claim"]["can_claim_tajika_sahams_closure"] is False assert "Solar return" in report["remaining_gap"] diff --git a/tests/test_tajika_annual_closure_status.py b/tests/test_tajika_annual_closure_status.py index e4931034..769dfda0 100644 --- a/tests/test_tajika_annual_closure_status.py +++ b/tests/test_tajika_annual_closure_status.py @@ -37,10 +37,10 @@ def test_tajika_annual_closure_status_identifies_first_annual_packet() -> None: assert report["scope"] == "tajika_sahams_annual_closure_status" assert report["schema_version"] == 1 assert report["summary"]["annual_task_count"] == 5 - assert report["summary"]["external_verified_annual_tasks"] == 0 + assert report["summary"]["external_verified_annual_tasks"] == 1 assert report["summary"]["can_claim_tajika_sahams_closure"] is False - assert report["first_priority"]["case_id"] == "template_steve_jobs_varshaphala_1984_lahiri" - assert report["first_priority"]["capture_id"] == "external_template_steve_jobs_varshaphala_1984_lahiri" + assert report["first_priority"]["case_id"] == "template_einstein_varshaphala_1905_lahiri" + assert report["first_priority"]["capture_id"] == "external_template_einstein_varshaphala_1905_lahiri" assert report["first_priority"]["required_target_fields"] == [ "target.solar_return_datetime", "target.varsha_lagna_deg", @@ -58,7 +58,9 @@ def test_tajika_annual_closure_status_identifies_first_annual_packet() -> None: assert "target.sahams.punya_saham" in report["first_priority"]["missing_fields"] assert report["first_priority"]["missing_groups"]["metadata"]["count"] == 5 assert report["first_priority"]["missing_groups"]["target"]["count"] == 10 - assert report["first_priority"]["prefilled_fields"]["metadata"]["annual_system"] == "Varshaphala/Tajika" + assert report["first_priority"]["prefilled_fields"]["metadata"]["annual_system"] == "varshaphala" + assert report["first_priority"]["prefilled_fields"]["metadata"]["target_year"] == 1905 + assert report["first_priority"]["prefilled_fields"]["settings"]["node_mode"] == "mean" assert report["first_priority"]["manual_fill_plan"]["status_value"] == "external_verified" assert report["first_priority"]["manual_fill_plan"]["manual_entry_count"] == 15 assert report["first_priority"]["validate_command"] @@ -73,7 +75,7 @@ def test_tajika_annual_closure_status_markdown_can_be_written(tmp_path: Path) -> markdown = output.read_text(encoding="utf-8") assert "# Tajika/Sahams Annual Closure Status" in markdown assert "can_claim_tajika_sahams_closure: `false`" in markdown - assert "external_template_steve_jobs_varshaphala_1984_lahiri" in markdown + assert "external_template_einstein_varshaphala_1905_lahiri" in markdown assert "target.sahams.punya_saham" in markdown assert "## Missing Summary" in markdown assert "## Prefilled Fields" in markdown diff --git a/tests/test_tajika_annual_oracle_queue.py b/tests/test_tajika_annual_oracle_queue.py index c1aeb409..9a8e9d12 100644 --- a/tests/test_tajika_annual_oracle_queue.py +++ b/tests/test_tajika_annual_oracle_queue.py @@ -32,20 +32,41 @@ def test_tajika_annual_queue_outputs_collection_tasks() -> None: assert queue["scope"] == "tajika_sahams_annual_oracle_collection_queue" assert queue["schema_version"] == 1 assert queue["summary"]["total_tasks"] == 5 - assert queue["summary"]["ready_for_calibration"] == 0 + assert queue["summary"]["ready_for_calibration"] == 1 assert queue["summary"]["production_tuning_allowed"] is False assert "solar return" in queue["boundary"].lower() first = queue["tasks"][0] assert first["task_id"].startswith("collect_") - assert first["status"] == "template_only" - assert first["ready_for_collection"] is True - assert first["ready_for_calibration"] is False + assert first["case_id"] == "template_steve_jobs_varshaphala_1984_lahiri" + assert first["status"] == "external_verified" + assert first["ready_for_collection"] is False + assert first["ready_for_calibration"] is True assert "target.solar_return_datetime" in first["target_fields"] - assert "target.sahams.punya_saham" in first["missing_target_fields"] + assert first["missing_target_fields"] == [] + assert first["target_fields"] == [ + "target.solar_return_datetime", + "target.varsha_lagna_deg", + "target.muntha_sign", + "target.year_lord", + "target.mudda_dasha_first_lord", + "target.sahams.punya_saham", + "target.sahams.rajya_saham", + "target.sahams.vivah_saham", + "target.tajika_yogas", + "target.source_artifact", + ] + assert first["evidence_packet"]["metadata"]["tool_name"] == "PyJHora" + assert first["evidence_packet"]["target_placeholders"]["target.year_lord"] == "Mars" + assert first["evidence_packet"]["target_placeholders"]["target.mudda_dasha_first_lord"] == "Sun" assert "JHora Varshaphala screenshot" in first["preferred_sources"] assert first["evidence_packet"]["integrity_checks"]["requires_external_artifact"] is True + second = queue["tasks"][1] + assert second["case_id"] == "template_einstein_varshaphala_1905_lahiri" + assert second["ready_for_collection"] is True + assert "target.sahams.punya_saham" in second["missing_target_fields"] + def test_tajika_annual_queue_markdown_lists_sahams_and_yogas() -> None: completed = run_queue("--format", "markdown")