diff --git a/docs/research/panchanga_local_jyotishganit_comparison_2026_07_21.md b/docs/research/panchanga_local_jyotishganit_comparison_2026_07_21.md new file mode 100644 index 00000000..65b4f1c7 --- /dev/null +++ b/docs/research/panchanga_local_jyotishganit_comparison_2026_07_21.md @@ -0,0 +1,29 @@ +# Panchanga local ↔ jyotishganit comparison — TEMCQ-061 + +Date: 2026-07-21 + +This packet closes the first local comparison step for the Panchanga schema ticket without writing a new Panchanga algorithm. + +## Result + +- Local method: `scripts/muhurta.py::calc_panchanga` +- Case: Steve Jobs +- Compared fields: `vaara`, `tithi`, `nakshatra`, `yoga`, `karana` +- Result: 4 exact matches + 1 naming alias +- Truth upgrade: 0 + +## Field comparison + +| Field | Local | jyotishganit | Status | +|---|---|---|---| +| vaara | Thursday | Thursday | within_tolerance | +| tithi | Shukla Tritiya | Shukla Tritiya | within_tolerance | +| nakshatra | Uttara Bhadrapada | Uttara Bhadrapada | within_tolerance | +| yoga | Shubha | Shubha | within_tolerance | +| karana | Garija | Gara | alias_match | + +`Gara` and `Garija` are recorded as a naming alias, not a formula mismatch. + +## Boundary + +This is still `research_observation_only`. It does not upgrade Panchanga to global truth because VedAstro and PyJHora/JHora five-field normalized packets are not pinned for this same comparison, and sunrise-relative semantics still need multi-case closure. diff --git a/docs/research/panchanga_temcq_061_schema_packet_2026_07_21.md b/docs/research/panchanga_temcq_061_schema_packet_2026_07_21.md new file mode 100644 index 00000000..9d30054c --- /dev/null +++ b/docs/research/panchanga_temcq_061_schema_packet_2026_07_21.md @@ -0,0 +1,26 @@ +# Panchanga TEMCQ-061 schema packet — 2026-07-21 + +## Result + +- Status: `schema_mapping_required` +- Normalized fields ready: `0` +- Truth upgrades: `0` + +## Observed jyotishganit raw + +- Vaara: Thursday +- Tithi: Shukla Tritiya +- Nakshatra: Uttara Bhadrapada +- Yoga: Shubha +- Karana: Gara + +## Blockers + +- Local archived high-rigor raw lacks a normalized Panchanga field. +- PyJHora/JHora normalized Panchanga raw is not archived. +- VedAstro shared Panchanga endpoint/method is not pinned. +- Naming and calculation conventions must be fixed before field comparison. + +## Boundary + +This is schema mapping only. It does not prove Panchanga parity or production timing readiness. diff --git a/docs/research/three_engine_jyotishganit_bridge_applied_2026_07_21.md b/docs/research/three_engine_jyotishganit_bridge_applied_2026_07_21.md new file mode 100644 index 00000000..624f261d --- /dev/null +++ b/docs/research/three_engine_jyotishganit_bridge_applied_2026_07_21.md @@ -0,0 +1,27 @@ +# Three-engine jyotishganit bridge applied — 2026-07-21 + +## Status + +- Claim status: `observation_only` +- Truth upgrades: `0` +- Source selected hash: `4709b8ade84efdea4d0a67c15f3e32cea516a5aa2e8abe3885578feda20cb3f4` + +## Applied rows + +- Existing TEMCQ tickets mapped: `18` +- No existing ticket: `1` + +Mapped groups: + +- D2/D4/D9/D10 sign rows → existing `endpoint_or_varga_semantics` tickets. +- BAV/SAV rows → existing `ashtakavarga_table_or_contributor_variant` tickets. +- Panchanga → no old mismatch ticket; create a separate closure row before comparison. + +## Boundary + +This packet only proves that jyotishganit selected raw can be routed into the +existing closure queue. It does not prove formula truth, timing readiness, or +commercial production tuning. + +Shadbala remains an explicit gap because the current jyotishganit probe does not +expose `shadbala` or `strengths` in selected raw. diff --git a/references/oracle/evidence_packet_index_2026_07_19.json b/references/oracle/evidence_packet_index_2026_07_19.json index e46ebf8f..41011109 100644 --- a/references/oracle/evidence_packet_index_2026_07_19.json +++ b/references/oracle/evidence_packet_index_2026_07_19.json @@ -5,8 +5,8 @@ "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": 118, - "blocked_or_partial_count": 51, + "packet_count": 120, + "blocked_or_partial_count": 52, "human_review_required_count": 3 }, "packets": [ @@ -953,6 +953,22 @@ "claim_status": "partial", "consumer_policy": "research_observation_only", "claim_boundary": "Classifies BAV/SAV rows into partial consensus or multi-engine variant; public worked table and method metadata still required." + }, + { + "packet_id": "panchanga_temcq_061_schema_packet_2026_07_21", + "path": "references/oracle/panchanga_temcq_061_schema_packet_2026_07_21.json", + "domain": "three_engine_parity", + "claim_status": "open_queue", + "consumer_policy": "research_observation_only", + "claim_boundary": "Creates TEMCQ-061 Panchanga schema mapping queue from jyotishganit raw; local/PyJHora/VedAstro normalized fields remain missing or unpinned." + }, + { + "packet_id": "panchanga_local_jyotishganit_comparison_2026_07_21", + "path": "references/oracle/panchanga_local_jyotishganit_comparison_2026_07_21.json", + "domain": "three_engine_parity", + "claim_status": "partial", + "consumer_policy": "research_observation_only", + "claim_boundary": "Compares local calc_panchanga against jyotishganit for five Panchanga labels; one Karana alias remains naming-only and no global truth upgrade is made." } ] } diff --git a/references/oracle/panchanga_local_jyotishganit_comparison_2026_07_21.json b/references/oracle/panchanga_local_jyotishganit_comparison_2026_07_21.json new file mode 100644 index 00000000..c6c1e5df --- /dev/null +++ b/references/oracle/panchanga_local_jyotishganit_comparison_2026_07_21.json @@ -0,0 +1,88 @@ +{ + "scope": "panchanga_local_jyotishganit_comparison", + "ticket_id": "TEMCQ-061", + "created_at": "2026-07-21", + "claim_status": "partial", + "truth_matrix_allowed": false, + "production_tuning_allowed": false, + "algorithm_reuse_policy": "reuse_existing_local_muhurta_calc_panchanga_no_new_algorithm", + "source_local_method": "scripts/muhurta.py::calc_panchanga", + "source_local_input": { + "case": "Steve Jobs", + "source_artifact": "references/oracle/artifacts/local_steve_jobs_high_rigor_raw.json", + "sun_lon_reconstructed_from_sign_degree": 312.5175, + "moon_lon_reconstructed_from_sign_degree": 344.5165, + "weekday_convention": "0=Sun ... 6=Sat", + "weekday_used": 4, + "hour_from_sunrise_used": 6.0 + }, + "local_normalized_raw": { + "vaara": "Thursday", + "tithi": "Shukla Tritiya", + "nakshatra": "Uttara Bhadrapada", + "yoga": "Shubha", + "karana": "Garija" + }, + "jyotishganit_observed_raw": { + "@type": "Panchanga", + "karana": "Gara", + "nakshatra": "Uttara Bhadrapada", + "tithi": "Shukla Tritiya", + "vaara": "Thursday", + "yoga": "Shubha" + }, + "field_comparison": [ + { + "field": "vaara", + "local_value": "Thursday", + "jyotishganit_value": "Thursday", + "status": "within_tolerance", + "reason": "same weekday name" + }, + { + "field": "tithi", + "local_value": "Shukla Tritiya", + "jyotishganit_value": "Shukla Tritiya", + "status": "within_tolerance", + "reason": "same paksha+tithi label" + }, + { + "field": "nakshatra", + "local_value": "Uttara Bhadrapada", + "jyotishganit_value": "Uttara Bhadrapada", + "status": "within_tolerance", + "reason": "same nakshatra label" + }, + { + "field": "yoga", + "local_value": "Shubha", + "jyotishganit_value": "Shubha", + "status": "within_tolerance", + "reason": "same yoga label" + }, + { + "field": "karana", + "local_value": "Garija", + "jyotishganit_value": "Gara", + "status": "alias_match", + "alias_rule": "Gara == Garija", + "reason": "naming alias only; not treated as formula mismatch" + } + ], + "summary": { + "fields_total": 5, + "within_tolerance": 4, + "alias_match": 1, + "formula_mismatch": 0, + "unit_mismatch": 0, + "truth_upgrades": 0 + }, + "still_blocked": [ + "VedAstro shared Panchanga endpoint/version not pinned", + "PyJHora/JHora Panchanga normalized packet not archived for this five-field comparison", + "single-case agreement cannot establish global Panchanga oracle truth", + "sunrise-relative semantics and local civil-time convention still require explicit multi-case contract" + ], + "supersedes_schema_gap": "references/oracle/panchanga_temcq_061_schema_packet_2026_07_21.json", + "boundary": "local_jyotishganit_panchanga_field_observation_not_global_truth" +} diff --git a/references/oracle/panchanga_temcq_061_schema_packet_2026_07_21.json b/references/oracle/panchanga_temcq_061_schema_packet_2026_07_21.json new file mode 100644 index 00000000..1a34dc7e --- /dev/null +++ b/references/oracle/panchanga_temcq_061_schema_packet_2026_07_21.json @@ -0,0 +1,53 @@ +{ + "scope": "panchanga_temcq_061_schema_packet", + "created_at": "2026-07-21", + "ticket_id": "TEMCQ-061", + "claim_status": "open_queue", + "production_tuning_allowed": false, + "truth_matrix_allowed": false, + "source_ticket_placeholder": "references/oracle/three_engine_field_status_batch_2026_07_21.json", + "source_jyotishganit_probe": "references/oracle/jyotishganit_field_probe_steve_jobs_2026_07_19.json", + "closure_status": "schema_mapping_required", + "summary": { + "normalized_fields_ready": 0, + "truth_upgrades": 0, + "observed_jyotishganit_field_count": 6 + }, + "jyotishganit_observed_raw": { + "@type": "Panchanga", + "karana": "Gara", + "nakshatra": "Uttara Bhadrapada", + "tithi": "Shukla Tritiya", + "vaara": "Thursday", + "yoga": "Shubha" + }, + "engine_field_status": { + "local": "archived_panchanga_field_missing", + "jyotishganit": "raw_available_not_normalized", + "VedAstro": "shared_panchanga_endpoint_not_pinned", + "PyJHora_JHora": "not_archived_as_normalized_panchanga" + }, + "required_schema_fields": [ + "vaara", + "tithi", + "nakshatra", + "yoga", + "karana" + ], + "required_contract": [ + "weekday convention", + "tithi naming and paksha convention", + "nakshatra spelling/diacritic alias table", + "yoga calculation convention", + "karana naming convention", + "sunrise-relative vs birth-moment rule" + ], + "next_actions": [ + "archive local normalized Panchanga for the same public case", + "locate or generate legal PyJHora/JHora normalized Panchanga raw", + "pin VedAstro Panchanga endpoint or mark not available", + "then compare exact named fields after alias normalization" + ], + "boundary": "panchanga_schema_mapping_only_no_numeric_truth", + "human_report": "docs/research/panchanga_temcq_061_schema_packet_2026_07_21.md" +} diff --git a/tests/test_panchanga_local_jyotishganit_comparison_packet.py b/tests/test_panchanga_local_jyotishganit_comparison_packet.py new file mode 100644 index 00000000..6b3f3d3b --- /dev/null +++ b/tests/test_panchanga_local_jyotishganit_comparison_packet.py @@ -0,0 +1,66 @@ +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +PACKET = ROOT / "references/oracle/panchanga_local_jyotishganit_comparison_2026_07_21.json" +INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json" + + +def test_panchanga_local_jyotishganit_packet_scope_and_boundary(): + data = json.loads(PACKET.read_text(encoding="utf-8")) + assert data["scope"] == "panchanga_local_jyotishganit_comparison" + assert data["ticket_id"] == "TEMCQ-061" + assert data["claim_status"] == "partial" + assert data["truth_matrix_allowed"] is False + assert data["production_tuning_allowed"] is False + assert data["algorithm_reuse_policy"] == "reuse_existing_local_muhurta_calc_panchanga_no_new_algorithm" + assert data["boundary"] == "local_jyotishganit_panchanga_field_observation_not_global_truth" + + +def test_panchanga_local_values_reuse_existing_muhurta_engine(): + data = json.loads(PACKET.read_text(encoding="utf-8")) + assert data["source_local_method"] == "scripts/muhurta.py::calc_panchanga" + assert data["local_normalized_raw"] == { + "vaara": "Thursday", + "tithi": "Shukla Tritiya", + "nakshatra": "Uttara Bhadrapada", + "yoga": "Shubha", + "karana": "Garija", + } + assert data["jyotishganit_observed_raw"] == { + "@type": "Panchanga", + "karana": "Gara", + "nakshatra": "Uttara Bhadrapada", + "tithi": "Shukla Tritiya", + "vaara": "Thursday", + "yoga": "Shubha", + } + + +def test_panchanga_field_comparison_distinguishes_alias_from_truth(): + data = json.loads(PACKET.read_text(encoding="utf-8")) + rows = {row["field"]: row for row in data["field_comparison"]} + assert set(rows) == {"vaara", "tithi", "nakshatra", "yoga", "karana"} + assert [row["status"] for row in rows.values()].count("within_tolerance") == 4 + assert rows["karana"]["status"] == "alias_match" + assert rows["karana"]["alias_rule"] == "Gara == Garija" + assert data["summary"] == { + "fields_total": 5, + "within_tolerance": 4, + "alias_match": 1, + "formula_mismatch": 0, + "unit_mismatch": 0, + "truth_upgrades": 0, + } + + +def test_panchanga_local_comparison_registered_in_evidence_index(): + index = json.loads(INDEX.read_text(encoding="utf-8")) + entry = next( + row for row in index["packets"] + if row["packet_id"] == "panchanga_local_jyotishganit_comparison_2026_07_21" + ) + assert entry["domain"] == "three_engine_parity" + assert entry["claim_status"] == "partial" + assert entry["consumer_policy"] == "research_observation_only" diff --git a/tests/test_panchanga_temcq_061_schema_packet.py b/tests/test_panchanga_temcq_061_schema_packet.py new file mode 100644 index 00000000..bf59fa59 --- /dev/null +++ b/tests/test_panchanga_temcq_061_schema_packet.py @@ -0,0 +1,61 @@ +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +PACKET = ROOT / "references/oracle/panchanga_temcq_061_schema_packet_2026_07_21.json" +INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json" + + +def test_panchanga_temcq_061_records_not_comparable_status(): + data = json.loads(PACKET.read_text(encoding="utf-8")) + + assert data["scope"] == "panchanga_temcq_061_schema_packet" + assert data["ticket_id"] == "TEMCQ-061" + assert data["claim_status"] == "open_queue" + assert data["truth_matrix_allowed"] is False + assert data["closure_status"] == "schema_mapping_required" + assert data["summary"]["normalized_fields_ready"] == 0 + assert data["summary"]["truth_upgrades"] == 0 + + +def test_panchanga_temcq_061_preserves_jyotishganit_raw_fields(): + data = json.loads(PACKET.read_text(encoding="utf-8")) + + assert data["jyotishganit_observed_raw"] == { + "@type": "Panchanga", + "karana": "Gara", + "nakshatra": "Uttara Bhadrapada", + "tithi": "Shukla Tritiya", + "vaara": "Thursday", + "yoga": "Shubha", + } + assert data["engine_field_status"]["local"] == "archived_panchanga_field_missing" + assert data["engine_field_status"]["VedAstro"] == "shared_panchanga_endpoint_not_pinned" + assert data["engine_field_status"]["PyJHora_JHora"] == "not_archived_as_normalized_panchanga" + + +def test_panchanga_temcq_061_requires_exact_schema_before_comparison(): + data = json.loads(PACKET.read_text(encoding="utf-8")) + + assert data["required_schema_fields"] == ["vaara", "tithi", "nakshatra", "yoga", "karana"] + assert data["required_contract"] == [ + "weekday convention", + "tithi naming and paksha convention", + "nakshatra spelling/diacritic alias table", + "yoga calculation convention", + "karana naming convention", + "sunrise-relative vs birth-moment rule" + ] + assert data["boundary"] == "panchanga_schema_mapping_only_no_numeric_truth" + + +def test_panchanga_temcq_061_is_registered(): + index = json.loads(INDEX.read_text(encoding="utf-8")) + entry = next( + row for row in index["packets"] + if row["packet_id"] == "panchanga_temcq_061_schema_packet_2026_07_21" + ) + + assert entry["domain"] == "three_engine_parity" + assert entry["claim_status"] == "open_queue"