diff --git a/references/oracle/authoritative_oss_jyotish_source_intake_2026_07_19.json b/references/oracle/authoritative_oss_jyotish_source_intake_2026_07_19.json new file mode 100644 index 00000000..a62bcd49 --- /dev/null +++ b/references/oracle/authoritative_oss_jyotish_source_intake_2026_07_19.json @@ -0,0 +1,95 @@ +{ + "created_at": "2026-07-19", + "next_actions": [ + "pin commit/hash for each source before adding as oracle artifact", + "prefer existing local mirrors before fetching new code", + "never copy AGPL/GPL into commercial runtime", + "store raw input/output/hash for every observation" + ], + "production_tuning_allowed": false, + "scope": "authoritative_oss_jyotish_source_intake", + "sources": [ + { + "commercial_action": "pin_commit_and_compare_fields", + "license": "MIT", + "name": "northtara/jyotishganit", + "truth_status": "observation_not_final_truth", + "url": "https://github.com/northtara/jyotishganit", + "use": "local_oracle_observation_for_birth_chart_divisional_panchanga_shadbala" + }, + { + "commercial_action": "hash KP tables/files before reuse", + "license": "check_repo_file_before_copy", + "name": "diliprk/VedicAstro", + "truth_status": "source_candidate_requires_hash", + "url": "https://github.com/diliprk/VedicAstro", + "use": "KP star/sub-lord/significator reference candidate" + }, + { + "commercial_action": "keep adapter probe metadata/raw only", + "license": "MIT", + "name": "VicharaVandana/jyotishyamitra", + "truth_status": "independent_observation_not_truth", + "url": "https://github.com/VicharaVandana/jyotishyamitra", + "use": "independent package probe for bala/ashtakavarga/divisional/dasha field surface" + }, + { + "commercial_action": "retain raw/hash and do not promote to shadbala truth", + "license": "Apache-2.0", + "name": "vedika-io/xalen-ephemeris", + "truth_status": "formula_isolation_oracle", + "url": "https://github.com/vedika-io/xalen-ephemeris", + "use": "formula isolation oracle for ephemeris/varga separation" + }, + { + "commercial_action": "do_not_vendor_or_runtime_depend", + "license": "AGPL-3.0", + "name": "naturalstupid/PyJHora", + "truth_status": "license_isolated_oracle", + "url": "https://github.com/naturalstupid/PyJHora", + "use": "black-box oracle/fixture only" + }, + { + "commercial_action": "hosted remains blocked without deployment identity", + "license": "check_repo_components", + "name": "VedAstro/VedAstro", + "truth_status": "hosted_identity_blocked", + "url": "https://github.com/VedAstro/VedAstro", + "use": "hosted observation and possible self-host candidate" + }, + { + "commercial_action": "feature_gap_reference_only_until file-level license and formula audit", + "license": "MIT per search result", + "name": "SV-stark/jyotish-flutter-library-fork", + "truth_status": "feature_benchmark_only", + "url": "https://github.com/SV-stark/jyotish-flutter-library-fork", + "use": "feature-surface benchmark for D1-D60/D249/Ashtakavarga/KP/Jaimini/Panchanga/Muhurta" + }, + { + "commercial_action": "do_not_copy_until_license_verified", + "license": "unknown_until_repo_license_verified", + "name": "pandaypr/VedicAstroEngineLite", + "truth_status": "feature_benchmark_only", + "url": "https://github.com/pandaypr/VedicAstroEngineLite", + "use": "feature-surface benchmark for Shodashavarga/Shadbala/Vimsopaka/Ishta-Kashta" + }, + { + "commercial_action": "do_not_copy_into_commercial_runtime", + "license": "GPL-2.0-or-later per search result", + "name": "kunjara/jyotish", + "truth_status": "license_restricted_reference_only", + "url": "https://github.com/kunjara/jyotish", + "use": "historical PHP calculation reference" + }, + { + "commercial_action": "product_surface_reference_only", + "license": "MIT per search result", + "name": "RoxyAPI/jyotish-vedic-astrology-app", + "truth_status": "feature_benchmark_only", + "url": "https://github.com/RoxyAPI/jyotish-vedic-astrology-app", + "use": "product/API feature benchmark for Panchang/Ashtakoot/Vimshottari/Dosha" + } + ], + "status": "source_intake_v1", + "truth_boundary": "Open-source projects can provide reusable code, field inventories, fixtures, or observation oracles; they do not become final truth unless version, license, input contract and worked-example parity are archived." +} diff --git a/references/oracle/evidence_packet_index_2026_07_19.json b/references/oracle/evidence_packet_index_2026_07_19.json index 40d72ef9..13f3fdc6 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": 45, + "packet_count": 46, "blocked_or_partial_count": 40, "human_review_required_count": 1 }, @@ -369,6 +369,14 @@ "claim_status": "partial", "consumer_policy": "research_to_commercial_contract_only", "claim_boundary": "40 generic-only Dn rows require source/formula/oracle closure or remain hidden generic fallback." + }, + { + "packet_id": "authoritative_oss_jyotish_source_intake", + "path": "references/oracle/authoritative_oss_jyotish_source_intake_2026_07_19.json", + "domain": "oss_source_reuse_governance", + "claim_status": "source_intake_only", + "consumer_policy": "pin_hash_license_gate_before_runtime_use", + "claim_boundary": "Open-source Jyotish projects may provide source candidates, probes, raw artifacts, and worked-example leads; they are not final truth until license, commit/hash, input contract, and field-level oracle gates close." } ] } diff --git a/tests/test_authoritative_oss_jyotish_source_intake.py b/tests/test_authoritative_oss_jyotish_source_intake.py new file mode 100644 index 00000000..c5273b65 --- /dev/null +++ b/tests/test_authoritative_oss_jyotish_source_intake.py @@ -0,0 +1,61 @@ +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +INTAKE = ROOT / "references/oracle/authoritative_oss_jyotish_source_intake_2026_07_19.json" +INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json" + + +def _load(path: Path): + return json.loads(path.read_text(encoding="utf-8")) + + +def test_oss_intake_keeps_source_candidates_out_of_production_truth(): + data = _load(INTAKE) + + assert data["scope"] == "authoritative_oss_jyotish_source_intake" + assert data["production_tuning_allowed"] is False + truth_boundary = data["truth_boundary"].lower() + assert "final truth" in truth_boundary + assert "do not become" in truth_boundary or "not final truth" in truth_boundary + + by_name = {source["name"]: source for source in data["sources"]} + for required in ( + "northtara/jyotishganit", + "VicharaVandana/jyotishyamitra", + "vedika-io/xalen-ephemeris", + "naturalstupid/PyJHora", + "VedAstro/VedAstro", + ): + assert required in by_name + + for source in data["sources"]: + truth_status = source["truth_status"].lower() + assert truth_status != "final_truth" + assert "ready_truth" not in truth_status + + +def test_copyleft_sources_are_not_vendorable_in_commercial_runtime(): + data = _load(INTAKE) + + restricted = [ + source + for source in data["sources"] + if source.get("license", "").startswith(("AGPL", "GPL")) + ] + assert restricted + for source in restricted: + action = source["commercial_action"].lower() + assert "do_not" in action or "isolated" in action or "separate" in action + + +def test_oss_intake_is_registered_in_evidence_packet_index(): + index = _load(INDEX) + + packets = {packet["packet_id"]: packet for packet in index["packets"]} + packet = packets["authoritative_oss_jyotish_source_intake"] + assert packet["path"] == INTAKE.relative_to(ROOT).as_posix() + assert packet["claim_status"] == "source_intake_only" + assert "not final truth" in packet["claim_boundary"].lower() + assert "pin" in packet["consumer_policy"]