diff --git a/references/oracle/d1_d60_source_use_readiness_2026_07_19.json b/references/oracle/d1_d60_source_use_readiness_2026_07_19.json new file mode 100644 index 00000000..28303d03 --- /dev/null +++ b/references/oracle/d1_d60_source_use_readiness_2026_07_19.json @@ -0,0 +1,41 @@ +{ + "boundary": "D1-D60 public/OSS sources can only improve names and use notes here. Generic-only divisions stay hidden from final claims until source, formula variant, and numeric oracle gates close.", + "claim_status": "partial", + "created_at": "2026-07-19", + "production_tuning_allowed": false, + "scope": "d1_d60_source_use_readiness", + "source_hash": "586215412fa87afed77fdc5844ce64d32ef0c39599722890e634b7732342da8e", + "source_queue": "references/oracle/d1_d60_public_source_candidate_queue_2026_07_19.json", + "source_registry": "references/oracle/d1_d60_varga_mapping_registry_2026_07_19.json", + "sources": [ + { + "allowed_update": "names_and_use_notes_only", + "blocked_update": "numeric_formula_or_truth_without_variant_review", + "candidate_use": "D1-D60 names/use cross-check", + "readiness": "source_text_candidate_not_numeric_oracle", + "url": "https://www.barbarapijan.com/bpa/Varga/varga.html" + }, + { + "allowed_update": "names_and_use_notes_only", + "blocked_update": "numeric_formula_or_truth_without_variant_review", + "candidate_use": "common varga names/use", + "readiness": "source_text_candidate_not_numeric_oracle", + "url": "https://www.astrosage.com/astrology/divisional-charts.asp" + }, + { + "allowed_update": "names_and_use_notes_only", + "blocked_update": "numeric_formula_or_truth_without_variant_review", + "candidate_use": "permissive OSS varga implementation cross-check", + "readiness": "implementation_observation_only", + "url": "https://github.com/northtara/jyotishganit" + } + ], + "status": "source_use_readiness_ready", + "summary": { + "allowed_scope": "names_and_use_notes_only", + "candidate_source_count": 3, + "generic_only_count": 0, + "numeric_oracle_ready_count": 0 + }, + "truth_matrix_allowed": false +} diff --git a/references/oracle/d1_d60_varga_mapping_registry_2026_07_19.json b/references/oracle/d1_d60_varga_mapping_registry_2026_07_19.json new file mode 100644 index 00000000..57d670e8 --- /dev/null +++ b/references/oracle/d1_d60_varga_mapping_registry_2026_07_19.json @@ -0,0 +1,1099 @@ +{ + "boundary": "D1-D60 rows are enumerated. Generic fallback rows are not formal traditional varga completion and must not be advertised as verified D1-D60 support.", + "claim_status": "partial", + "created_at": "2026-07-19", + "production_tuning_allowed": false, + "rows": [ + { + "api_entry": true, + "claim_boundary": "Commonly used varga with local/API coverage; still requires oracle parity for high-rigor claims.", + "claim_status": "ready_or_partial_core", + "division": "D1", + "external_oracle_status": "partial_or_smoke", + "formal_name": "Rashi", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "natal_chart_core", + "local_computable": true, + "number": 1, + "skill_invoked": true, + "special_formula_present": false, + "traditional_use": "本命盘/身体/整体命运", + "traditional_use_present": true, + "ui_entry": true + }, + { + "api_entry": true, + "claim_boundary": "Commonly used varga with local/API coverage; still requires oracle parity for high-rigor claims.", + "claim_status": "ready_or_partial_core", + "division": "D2", + "external_oracle_status": "partial_or_smoke", + "formal_name": "Hora", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 2, + "skill_invoked": true, + "special_formula_present": true, + "traditional_use": "财富/资源", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity.", + "claim_status": "partial_formal_not_core", + "division": "D3", + "external_oracle_status": "missing", + "formal_name": "Drekkana", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 3, + "skill_invoked": false, + "special_formula_present": true, + "traditional_use": "兄弟姐妹/勇气", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Commonly used varga with local/API coverage; still requires oracle parity for high-rigor claims.", + "claim_status": "ready_or_partial_core", + "division": "D4", + "external_oracle_status": "partial_or_smoke", + "formal_name": "Chaturthamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 4, + "skill_invoked": true, + "special_formula_present": true, + "traditional_use": "房产/基础/运气", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity.", + "claim_status": "partial_formal_not_core", + "division": "D5", + "external_oracle_status": "missing", + "formal_name": "Panchamsa", + "formal_name_present": true, + "jyotishganit_external_observation": false, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 5, + "skill_invoked": false, + "special_formula_present": true, + "traditional_use": "权力/名声", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity.", + "claim_status": "partial_formal_not_core", + "division": "D6", + "external_oracle_status": "missing", + "formal_name": "Shashthamsa", + "formal_name_present": true, + "jyotishganit_external_observation": false, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 6, + "skill_invoked": false, + "special_formula_present": true, + "traditional_use": "疾病/敌人", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity.", + "claim_status": "partial_formal_not_core", + "division": "D7", + "external_oracle_status": "missing", + "formal_name": "Saptamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 7, + "skill_invoked": false, + "special_formula_present": true, + "traditional_use": "子女/创造", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity.", + "claim_status": "partial_formal_not_core", + "division": "D8", + "external_oracle_status": "missing", + "formal_name": "Ashtamsa", + "formal_name_present": true, + "jyotishganit_external_observation": false, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 8, + "skill_invoked": false, + "special_formula_present": true, + "traditional_use": "突发/寿元风险", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Commonly used varga with local/API coverage; still requires oracle parity for high-rigor claims.", + "claim_status": "ready_or_partial_core", + "division": "D9", + "external_oracle_status": "partial_or_smoke", + "formal_name": "Navamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 9, + "skill_invoked": true, + "special_formula_present": true, + "traditional_use": "婚姻/法/内在成熟", + "traditional_use_present": true, + "ui_entry": true + }, + { + "api_entry": true, + "claim_boundary": "Commonly used varga with local/API coverage; still requires oracle parity for high-rigor claims.", + "claim_status": "ready_or_partial_core", + "division": "D10", + "external_oracle_status": "partial_or_smoke", + "formal_name": "Dasamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 10, + "skill_invoked": true, + "special_formula_present": true, + "traditional_use": "事业/行动/地位", + "traditional_use_present": true, + "ui_entry": true + }, + { + "api_entry": true, + "claim_boundary": "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity.", + "claim_status": "partial_formal_not_core", + "division": "D11", + "external_oracle_status": "missing", + "formal_name": "Rudramsa", + "formal_name_present": true, + "jyotishganit_external_observation": false, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 11, + "skill_invoked": true, + "special_formula_present": true, + "traditional_use": "破坏/转化", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity.", + "claim_status": "partial_formal_not_core", + "division": "D12", + "external_oracle_status": "missing", + "formal_name": "Dwadasamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 12, + "skill_invoked": false, + "special_formula_present": true, + "traditional_use": "父母/祖系", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D13", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 13, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D14", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 14, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D15", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 15, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity.", + "claim_status": "partial_formal_not_core", + "division": "D16", + "external_oracle_status": "missing", + "formal_name": "Shodasamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 16, + "skill_invoked": false, + "special_formula_present": true, + "traditional_use": "车辆/舒适/享受", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D17", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 17, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D18", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 18, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D19", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 19, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity.", + "claim_status": "partial_formal_not_core", + "division": "D20", + "external_oracle_status": "missing", + "formal_name": "Vimsamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 20, + "skill_invoked": false, + "special_formula_present": true, + "traditional_use": "灵性修行", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D21", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 21, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D22", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 22, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D23", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 23, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Commonly used varga with local/API coverage; still requires oracle parity for high-rigor claims.", + "claim_status": "ready_or_partial_core", + "division": "D24", + "external_oracle_status": "missing", + "formal_name": "Chaturvimsamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 24, + "skill_invoked": true, + "special_formula_present": true, + "traditional_use": "教育/学习", + "traditional_use_present": true, + "ui_entry": true + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D25", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 25, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D26", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 26, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity.", + "claim_status": "partial_formal_not_core", + "division": "D27", + "external_oracle_status": "missing", + "formal_name": "Bhamsa/Saptavimsamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 27, + "skill_invoked": false, + "special_formula_present": true, + "traditional_use": "力量/弱点", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D28", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 28, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D29", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 29, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Commonly used varga with local/API coverage; still requires oracle parity for high-rigor claims.", + "claim_status": "ready_or_partial_core", + "division": "D30", + "external_oracle_status": "partial_or_smoke", + "formal_name": "Trimsamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 30, + "skill_invoked": true, + "special_formula_present": true, + "traditional_use": "不幸/困难/过失", + "traditional_use_present": true, + "ui_entry": true + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D31", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 31, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D32", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 32, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D33", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 33, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D34", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 34, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D35", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 35, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D36", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 36, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D37", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 37, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D38", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 38, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D39", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 39, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity.", + "claim_status": "partial_formal_not_core", + "division": "D40", + "external_oracle_status": "missing", + "formal_name": "Khavedamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 40, + "skill_invoked": false, + "special_formula_present": true, + "traditional_use": "吉凶效果/母系", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D41", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 41, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D42", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 42, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D43", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 43, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D44", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 44, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity.", + "claim_status": "partial_formal_not_core", + "division": "D45", + "external_oracle_status": "missing", + "formal_name": "Akshavedamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 45, + "skill_invoked": false, + "special_formula_present": true, + "traditional_use": "总体品格/父系", + "traditional_use_present": true, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D46", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 46, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D47", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 47, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D48", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 48, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D49", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 49, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D50", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 50, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D51", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 51, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D52", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 52, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D53", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 53, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D54", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 54, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D55", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 55, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D56", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 56, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D57", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 57, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D58", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 58, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": false, + "claim_boundary": "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga.", + "claim_status": "low_rigor_generic_only", + "division": "D59", + "external_oracle_status": "missing", + "formal_name": null, + "formal_name_present": false, + "jyotishganit_external_observation": false, + "local_basis": "generic_fallback_only_unvalidated", + "local_computable": true, + "number": 59, + "skill_invoked": false, + "special_formula_present": false, + "traditional_use": null, + "traditional_use_present": false, + "ui_entry": false + }, + { + "api_entry": true, + "claim_boundary": "Commonly used varga with local/API coverage; still requires oracle parity for high-rigor claims.", + "claim_status": "ready_or_partial_core", + "division": "D60", + "external_oracle_status": "partial_or_smoke", + "formal_name": "Shashtiamsa", + "formal_name_present": true, + "jyotishganit_external_observation": true, + "local_basis": "formal_branch_or_explicit_enum", + "local_computable": true, + "number": 60, + "skill_invoked": true, + "special_formula_present": true, + "traditional_use": "业力/深层因果", + "traditional_use_present": true, + "ui_entry": true + } + ], + "scope": "d1_d60_varga_mapping_registry", + "status": "complete_registry", + "summary": { + "formal_name_count": 20, + "generic_only_count": 40, + "oracle_partial_or_smoke_count": 7, + "skill_invoked_count": 9, + "total_rows": 60, + "ui_entry_count": 6 + }, + "truth_matrix_allowed": false +} diff --git a/references/oracle/evidence_packet_index_2026_07_19.json b/references/oracle/evidence_packet_index_2026_07_19.json index 260d123b..f25851fd 100644 --- a/references/oracle/evidence_packet_index_2026_07_19.json +++ b/references/oracle/evidence_packet_index_2026_07_19.json @@ -5,7 +5,7 @@ "production_tuning_allowed": false, "boundary": "Index of current governance packets only. Raw oracle artifacts remain in references/oracle/artifacts and are not all duplicated here.", "summary": { - "packet_count": 65, + "packet_count": 66, "blocked_or_partial_count": 40, "human_review_required_count": 1 }, @@ -529,6 +529,14 @@ "claim_status": "partial", "consumer_policy": "research_to_commercial_contract_only", "claim_boundary": "Classifies Muhurta factors as supporting-context only; no scored verdict readiness until formulas, weights, public examples, and replay hashes close." + }, + { + "packet_id": "d1_d60_source_use_readiness", + "path": "references/oracle/d1_d60_source_use_readiness_2026_07_19.json", + "domain": "varga_mapping", + "claim_status": "partial", + "consumer_policy": "research_to_commercial_contract_only", + "claim_boundary": "Classifies D1-D60 sources for names/use notes only; generic-only Dn remains hidden until formula/source/oracle gates close." } ] } diff --git a/scripts/d1_d60_source_use_readiness.py b/scripts/d1_d60_source_use_readiness.py new file mode 100644 index 00000000..c31b2844 --- /dev/null +++ b/scripts/d1_d60_source_use_readiness.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +"""Classify D1-D60 source candidates for name/use readiness.""" +from __future__ import annotations + +import hashlib +import json +from pathlib import Path +from typing import Any + + +ROOT = Path(__file__).resolve().parents[1] +QUEUE = ROOT / "references/oracle/d1_d60_public_source_candidate_queue_2026_07_19.json" +REGISTRY = ROOT / "references/oracle/d1_d60_varga_mapping_registry_2026_07_19.json" + + +def stable_json(data: Any) -> str: + return json.dumps(data, ensure_ascii=False, sort_keys=True, separators=(",", ":"), default=str) + + +def source_readiness(source: dict[str, Any]) -> str: + if source["oracle_status"] == "observation_only": + return "implementation_observation_only" + return "source_text_candidate_not_numeric_oracle" + + +def build() -> dict[str, Any]: + queue = json.loads(QUEUE.read_text(encoding="utf-8")) + registry = json.loads(REGISTRY.read_text(encoding="utf-8")) + sources = [ + { + "url": source["url"], + "candidate_use": source["candidate_use"], + "readiness": source_readiness(source), + "allowed_update": "names_and_use_notes_only", + "blocked_update": "numeric_formula_or_truth_without_variant_review", + } + for source in queue["candidate_sources"] + ] + generic_only = [ + row + for row in registry.get("rows", []) + if row.get("status") == "generic_only" + ] + summary = { + "candidate_source_count": len(sources), + "generic_only_count": len(generic_only), + "numeric_oracle_ready_count": 0, + "allowed_scope": "names_and_use_notes_only", + } + return { + "scope": "d1_d60_source_use_readiness", + "created_at": "2026-07-19", + "status": "source_use_readiness_ready", + "claim_status": "partial", + "production_tuning_allowed": False, + "truth_matrix_allowed": False, + "source_queue": str(QUEUE.relative_to(ROOT)), + "source_registry": str(REGISTRY.relative_to(ROOT)), + "summary": summary, + "source_hash": hashlib.sha256(stable_json(sources).encode("utf-8")).hexdigest(), + "sources": sources, + "boundary": ( + "D1-D60 public/OSS sources can only improve names and use notes here. " + "Generic-only divisions stay hidden from final claims until source, " + "formula variant, and numeric oracle gates close." + ), + } + + +def main() -> int: + print(json.dumps(build(), ensure_ascii=False, indent=2, sort_keys=True)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/d1_d60_varga_mapping_registry.py b/scripts/d1_d60_varga_mapping_registry.py new file mode 100644 index 00000000..4a3672d9 --- /dev/null +++ b/scripts/d1_d60_varga_mapping_registry.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +"""Generate D1-D60 varga mapping coverage registry.""" +from __future__ import annotations + +import json + +FORMAL = { + 1: ("Rashi", "本命盘/身体/整体命运", False), + 2: ("Hora", "财富/资源", True), + 3: ("Drekkana", "兄弟姐妹/勇气", True), + 4: ("Chaturthamsa", "房产/基础/运气", True), + 5: ("Panchamsa", "权力/名声", True), + 6: ("Shashthamsa", "疾病/敌人", True), + 7: ("Saptamsa", "子女/创造", True), + 8: ("Ashtamsa", "突发/寿元风险", True), + 9: ("Navamsa", "婚姻/法/内在成熟", True), + 10: ("Dasamsa", "事业/行动/地位", True), + 11: ("Rudramsa", "破坏/转化", True), + 12: ("Dwadasamsa", "父母/祖系", True), + 16: ("Shodasamsa", "车辆/舒适/享受", True), + 20: ("Vimsamsa", "灵性修行", True), + 24: ("Chaturvimsamsa", "教育/学习", True), + 27: ("Bhamsa/Saptavimsamsa", "力量/弱点", True), + 30: ("Trimsamsa", "不幸/困难/过失", True), + 40: ("Khavedamsa", "吉凶效果/母系", True), + 45: ("Akshavedamsa", "总体品格/父系", True), + 60: ("Shashtiamsa", "业力/深层因果", True), +} + +JYOTISHGANIT = {1, 2, 3, 4, 7, 9, 10, 12, 16, 20, 24, 27, 30, 40, 45, 60} +SKILL_USED = {1, 2, 4, 9, 10, 11, 24, 30, 60} +API_USED = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 20, 24, 27, 30, 40, 45, 60} +UI_USED = {1, 9, 10, 24, 30, 60} +ORACLE_PARTIAL = {1, 2, 4, 9, 10, 30, 60} +CORE = {1, 2, 4, 9, 10, 24, 30, 60} + + +def row(n: int) -> dict: + formal = n in FORMAL + name, use, special = FORMAL.get(n, (None, None, False)) + if formal: + local_basis = "formal_branch_or_explicit_enum" + else: + local_basis = "generic_fallback_only_unvalidated" + if n == 1: + local_basis = "natal_chart_core" + claim = ( + "ready_or_partial_core" + if n in CORE + else "partial_formal_not_core" + if formal + else "low_rigor_generic_only" + ) + boundary = ( + "Commonly used varga with local/API coverage; still requires oracle parity for high-rigor claims." + if n in CORE + else "Formal named varga exists locally but is not consistently invoked by skill/UI and lacks complete oracle parity." + if formal + else "Only generic Dn fallback can compute a sign; no formal name/use/special formula/oracle is registered, so do not present as completed traditional varga." + ) + return { + "division": f"D{n}", + "number": n, + "local_computable": True, + "local_basis": local_basis, + "formal_name_present": formal, + "formal_name": name, + "traditional_use_present": use is not None, + "traditional_use": use, + "special_formula_present": special, + "skill_invoked": n in SKILL_USED, + "api_entry": n in API_USED, + "ui_entry": n in UI_USED, + "jyotishganit_external_observation": n in JYOTISHGANIT, + "external_oracle_status": "partial_or_smoke" if n in ORACLE_PARTIAL else "missing", + "claim_status": claim, + "claim_boundary": boundary, + } + + +def build() -> dict: + rows = [row(n) for n in range(1, 61)] + return { + "scope": "d1_d60_varga_mapping_registry", + "created_at": "2026-07-19", + "status": "complete_registry", + "claim_status": "partial", + "production_tuning_allowed": False, + "truth_matrix_allowed": False, + "summary": { + "total_rows": 60, + "formal_name_count": sum(1 for r in rows if r["formal_name_present"]), + "generic_only_count": sum(1 for r in rows if r["claim_status"] == "low_rigor_generic_only"), + "skill_invoked_count": sum(1 for r in rows if r["skill_invoked"]), + "ui_entry_count": sum(1 for r in rows if r["ui_entry"]), + "oracle_partial_or_smoke_count": sum(1 for r in rows if r["external_oracle_status"] != "missing"), + }, + "boundary": "D1-D60 rows are enumerated. Generic fallback rows are not formal traditional varga completion and must not be advertised as verified D1-D60 support.", + "rows": rows, + } + + +def main() -> int: + print(json.dumps(build(), ensure_ascii=False, indent=2, sort_keys=True)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_d1_d60_source_use_readiness.py b/tests/test_d1_d60_source_use_readiness.py new file mode 100644 index 00000000..731f6fa7 --- /dev/null +++ b/tests/test_d1_d60_source_use_readiness.py @@ -0,0 +1,39 @@ +import json +import subprocess +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +ARTIFACT = ROOT / "references/oracle/d1_d60_source_use_readiness_2026_07_19.json" +INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json" + + +def test_d1_d60_source_readiness_script_keeps_scope_narrow(): + data = json.loads( + subprocess.check_output( + ["python3", "scripts/d1_d60_source_use_readiness.py"], + cwd=ROOT, + text=True, + ) + ) + assert data["scope"] == "d1_d60_source_use_readiness" + assert data["claim_status"] == "partial" + assert data["truth_matrix_allowed"] is False + assert data["summary"]["candidate_source_count"] >= 3 + assert data["summary"]["numeric_oracle_ready_count"] == 0 + + +def test_d1_d60_source_readiness_allows_only_names_and_use_notes(): + data = json.loads(ARTIFACT.read_text(encoding="utf-8")) + assert data["summary"]["allowed_scope"] == "names_and_use_notes_only" + assert all(row["allowed_update"] == "names_and_use_notes_only" for row in data["sources"]) + assert all("numeric_formula" in row["blocked_update"] for row in data["sources"]) + assert "Generic-only divisions stay hidden" in data["boundary"] + + +def test_evidence_index_registers_d1_d60_source_readiness(): + packets = { + row["packet_id"]: row + for row in json.loads(INDEX.read_text(encoding="utf-8"))["packets"] + } + assert packets["d1_d60_source_use_readiness"]["claim_status"] == "partial" diff --git a/tests/test_d1_d60_varga_mapping_registry.py b/tests/test_d1_d60_varga_mapping_registry.py new file mode 100644 index 00000000..63e39bf7 --- /dev/null +++ b/tests/test_d1_d60_varga_mapping_registry.py @@ -0,0 +1,52 @@ +import json +import subprocess +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +REGISTRY = ROOT / "references/oracle/d1_d60_varga_mapping_registry_2026_07_19.json" +INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json" + + +def test_generator_outputs_all_d1_to_d60_rows(): + data = json.loads( + subprocess.check_output(["python3", "scripts/d1_d60_varga_mapping_registry.py"], cwd=ROOT, text=True) + ) + assert data["scope"] == "d1_d60_varga_mapping_registry" + assert data["summary"]["total_rows"] == 60 + assert [row["number"] for row in data["rows"]] == list(range(1, 61)) + assert data["production_tuning_allowed"] is False + assert data["truth_matrix_allowed"] is False + + +def test_registry_marks_formal_vs_generic_rows(): + data = json.loads(REGISTRY.read_text(encoding="utf-8")) + rows = {row["number"]: row for row in data["rows"]} + assert rows[1]["formal_name"] == "Rashi" + assert rows[9]["formal_name"] == "Navamsa" + assert rows[10]["skill_invoked"] is True + assert rows[60]["formal_name"] == "Shashtiamsa" + assert rows[13]["formal_name_present"] is False + assert rows[13]["local_basis"] == "generic_fallback_only_unvalidated" + assert rows[13]["claim_status"] == "low_rigor_generic_only" + assert "must not be advertised" in data["boundary"] + + +def test_registry_tracks_api_ui_skill_oracle_boundaries(): + data = json.loads(REGISTRY.read_text(encoding="utf-8")) + rows = {row["number"]: row for row in data["rows"]} + assert rows[24]["api_entry"] is True + assert rows[24]["ui_entry"] is True + assert rows[27]["api_entry"] is True + assert rows[27]["ui_entry"] is False + assert rows[27]["external_oracle_status"] == "missing" + assert data["summary"]["formal_name_count"] == 20 + assert data["summary"]["generic_only_count"] == 40 + + +def test_evidence_index_registers_d1_d60_registry(): + index = json.loads(INDEX.read_text(encoding="utf-8")) + packets = {row["packet_id"]: row for row in index["packets"]} + packet = packets["d1_d60_varga_mapping_registry"] + assert packet["path"] == "references/oracle/d1_d60_varga_mapping_registry_2026_07_19.json" + assert packet["claim_status"] == "partial"