sync: import panchanga closure packets

This commit is contained in:
732642856
2026-07-21 14:00:40 +08:00
parent a9d756691a
commit c60b3af7c3
8 changed files with 368 additions and 2 deletions
@@ -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.
@@ -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.
@@ -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.
@@ -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."
}
]
}
@@ -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"
}
@@ -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"
}
@@ -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"
@@ -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"