diff --git a/references/oracle/compatibility_skill_readiness_dashboard_2026_07_20.json b/references/oracle/compatibility_skill_readiness_dashboard_2026_07_20.json new file mode 100644 index 00000000..3d6f085c --- /dev/null +++ b/references/oracle/compatibility_skill_readiness_dashboard_2026_07_20.json @@ -0,0 +1,159 @@ +{ + "scope": "compatibility_skill_readiness_dashboard", + "created_at": "2026-07-20", + "status": "dashboard_v1", + "claim_status": "partial", + "production_tuning_allowed": false, + "truth_matrix_allowed": false, + "summary": { + "layer_count": 9, + "runtime_available_count": 5, + "blocked_or_registry_only_count": 4, + "oracle_ready_count": 0 + }, + "skill_use_policy": { + "allowed": "Expose basic compatibility factors and relationship context with explicit low/partial evidence boundaries.", + "forbidden": "Do not present any layer as deterministic marriage success, divorce prediction, exact relationship timing, or complete synastry truth." + }, + "layers": [ + { + "layer_id": "ashtakoota_guna_milan", + "name": "Ashtakoota / Guna Milan", + "runtime_status": "available", + "runtime_path": "scripts/ashtakoot.py", + "runtime_path_exists": true, + "skill_status": "callable_basic", + "api_ui_status": "surface_audit_needed", + "external_oracle_status": "partial", + "commercial_sync_status": "basic_safe_with_boundary", + "evidence_paths": [ + "scripts/ashtakoot.py", + "references/oracle/ashtakoot_oracle_cases.json", + "scripts/synastry.py" + ], + "claim_boundary": "36-point compatibility can be exposed as one factor only; not deterministic marriage outcome." + }, + { + "layer_id": "mangal_dosha", + "name": "Mangal / Kuja Dosha matching", + "runtime_status": "available", + "runtime_path": "scripts/ashtakoot.py", + "runtime_path_exists": true, + "skill_status": "callable_basic", + "api_ui_status": "surface_audit_needed", + "external_oracle_status": "partial", + "commercial_sync_status": "basic_safe_with_boundary", + "evidence_paths": [ + "scripts/ashtakoot.py" + ], + "claim_boundary": "Use as risk flag and cancellation check; never as standalone rejection verdict." + }, + { + "layer_id": "d9_navamsa_relationship", + "name": "D9 Navamsa relationship layer", + "runtime_status": "available", + "runtime_path": "scripts/relationship_analysis.py", + "runtime_path_exists": true, + "skill_status": "callable_context", + "api_ui_status": "surface_audit_needed", + "external_oracle_status": "partial", + "commercial_sync_status": "safe_as_context", + "evidence_paths": [ + "scripts/relationship_analysis.py", + "references/navamsa-marriage-deep-analysis.md" + ], + "claim_boundary": "D9 can support relationship analysis; timing/outcome claims still require Dasha, transits, and external calibration." + }, + { + "layer_id": "darakaraka", + "name": "Darakaraka spouse significator", + "runtime_status": "available", + "runtime_path": "scripts/darakaraka_reader.py", + "runtime_path_exists": true, + "skill_status": "callable_context", + "api_ui_status": "surface_audit_needed", + "external_oracle_status": "source_reference_only", + "commercial_sync_status": "safe_as_context", + "evidence_paths": [ + "scripts/darakaraka_reader.py", + "references/darakaraka-complete-guide.md" + ], + "claim_boundary": "May describe spouse/relationship themes; not a compatibility score or event proof." + }, + { + "layer_id": "upapada_lagna", + "name": "Upapada Lagna marriage image", + "runtime_status": "available_as_chart_field", + "runtime_path": "jyotish-app/analysis-deep.js", + "runtime_path_exists": true, + "skill_status": "callable_context", + "api_ui_status": "surface_audit_needed", + "external_oracle_status": "source_reference_only", + "commercial_sync_status": "safe_as_context", + "evidence_paths": [ + "jyotish-app/analysis-deep.js", + "references/data-bridge-mapping.md", + "references/jaimini-complete-system.md" + ], + "claim_boundary": "UL is a relationship image layer; must not replace full chart, D9, Dasha, or event evidence." + }, + { + "layer_id": "relationship_combinations", + "name": "Relationship rule-family combinations", + "runtime_status": "registry_only", + "runtime_path": null, + "runtime_path_exists": false, + "skill_status": "contract_only", + "api_ui_status": "no_runtime_surface", + "external_oracle_status": "missing", + "commercial_sync_status": "research_only", + "evidence_paths": [ + "references/oracle/relationship_combinations_rule_family_registry_2026_07_19.json" + ], + "claim_boundary": "Indexed rule families still need source packets, deduplication, tests, and claim gates before runtime use." + }, + { + "layer_id": "relationship_ashtakavarga_overlay", + "name": "Relationship Ashtakavarga overlay", + "runtime_status": "missing_runtime", + "runtime_path": null, + "runtime_path_exists": false, + "skill_status": "not_invoked", + "api_ui_status": "no_runtime_surface", + "external_oracle_status": "missing", + "commercial_sync_status": "blocked_until_oracle", + "evidence_paths": [ + "references/oracle/ashtakavarga_advanced_usage_gap_registry_2026_07_19.json" + ], + "claim_boundary": "Do not expose relationship AV overlay until rules, examples, and field-level oracle packets exist." + }, + { + "layer_id": "planet_lagna_kuta", + "name": "Planet/Lagna Kuta variants", + "runtime_status": "registry_only", + "runtime_path": null, + "runtime_path_exists": false, + "skill_status": "not_invoked", + "api_ui_status": "no_runtime_surface", + "external_oracle_status": "missing", + "commercial_sync_status": "blocked_until_oracle", + "evidence_paths": [ + "references/oracle/compatibility_full_system_gap_registry_2026_07_19.json" + ], + "claim_boundary": "Do not claim full top-tier compatibility until Planet/Lagna Kuta variants and worked examples are validated." + }, + { + "layer_id": "western_composite_davidson_boundary", + "name": "Western composite / Davidson boundary", + "runtime_status": "out_of_scope", + "runtime_path": null, + "runtime_path_exists": false, + "skill_status": "not_invoked", + "api_ui_status": "no_vedic_surface", + "external_oracle_status": "not_applicable_vedic_core", + "commercial_sync_status": "out_of_scope_for_vedic_core", + "evidence_paths": [], + "claim_boundary": "Keep out of Vedic commercial runtime unless explicitly scoped as cross-system research." + } + ] +} diff --git a/references/oracle/evidence_packet_index_2026_07_19.json b/references/oracle/evidence_packet_index_2026_07_19.json index df1b31dd..4754f6ad 100644 --- a/references/oracle/evidence_packet_index_2026_07_19.json +++ b/references/oracle/evidence_packet_index_2026_07_19.json @@ -633,14 +633,22 @@ "claim_status": "open_queue", "consumer_policy": "research_to_commercial_contract_only", "claim_boundary": "Progress dashboard for five blocked-but-code-progressable domains; does not unblock production-ready claims." + }, + { + "packet_id": "compatibility_skill_readiness_dashboard", + "path": "references/oracle/compatibility_skill_readiness_dashboard_2026_07_20.json", + "domain": "compatibility", + "claim_status": "partial", + "consumer_policy": "research_to_commercial_contract_only", + "claim_boundary": "Basic compatibility layers are callable with boundaries; full synastry, relationship AV overlays, Planet/Lagna Kuta, and deterministic relationship timing remain blocked until oracle packets close." } ], "production_tuning_allowed": false, "scope": "evidence_packet_index", "status": "active_index_v1", "summary": { - "packet_count": 79, - "blocked_or_partial_count": 52, + "packet_count": 80, + "blocked_or_partial_count": 53, "human_review_required_count": 2 } } diff --git a/scripts/compatibility_skill_readiness_dashboard.py b/scripts/compatibility_skill_readiness_dashboard.py new file mode 100644 index 00000000..cac519ec --- /dev/null +++ b/scripts/compatibility_skill_readiness_dashboard.py @@ -0,0 +1,188 @@ +#!/usr/bin/env python3 +"""Build a bounded compatibility/synastry skill readiness dashboard. + +This is governance glue, not a truth engine. It records which relationship +layers are callable, which are registry-only, and which must stay blocked. +""" + +from __future__ import annotations + +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +OUT = ROOT / "references" / "oracle" / "compatibility_skill_readiness_dashboard_2026_07_20.json" + + +def exists(path: str) -> bool: + return (ROOT / path).exists() + + +def layer( + layer_id: str, + name: str, + runtime_path: str | None, + runtime_status: str, + skill_status: str, + api_ui_status: str, + external_oracle_status: str, + commercial_sync_status: str, + claim_boundary: str, + evidence: list[str] | None = None, +) -> dict: + paths = list(evidence or []) + if runtime_path: + paths.insert(0, runtime_path) + return { + "layer_id": layer_id, + "name": name, + "runtime_status": runtime_status, + "runtime_path": runtime_path, + "runtime_path_exists": exists(runtime_path) if runtime_path else False, + "skill_status": skill_status, + "api_ui_status": api_ui_status, + "external_oracle_status": external_oracle_status, + "commercial_sync_status": commercial_sync_status, + "evidence_paths": paths, + "claim_boundary": claim_boundary, + } + + +def build() -> dict: + layers = [ + layer( + "ashtakoota_guna_milan", + "Ashtakoota / Guna Milan", + "scripts/ashtakoot.py", + "available", + "callable_basic", + "surface_audit_needed", + "partial", + "basic_safe_with_boundary", + "36-point compatibility can be exposed as one factor only; not deterministic marriage outcome.", + ["references/oracle/ashtakoot_oracle_cases.json", "scripts/synastry.py"], + ), + layer( + "mangal_dosha", + "Mangal / Kuja Dosha matching", + "scripts/ashtakoot.py", + "available", + "callable_basic", + "surface_audit_needed", + "partial", + "basic_safe_with_boundary", + "Use as risk flag and cancellation check; never as standalone rejection verdict.", + ), + layer( + "d9_navamsa_relationship", + "D9 Navamsa relationship layer", + "scripts/relationship_analysis.py", + "available", + "callable_context", + "surface_audit_needed", + "partial", + "safe_as_context", + "D9 can support relationship analysis; timing/outcome claims still require Dasha, transits, and external calibration.", + ["references/navamsa-marriage-deep-analysis.md"], + ), + layer( + "darakaraka", + "Darakaraka spouse significator", + "scripts/darakaraka_reader.py", + "available", + "callable_context", + "surface_audit_needed", + "source_reference_only", + "safe_as_context", + "May describe spouse/relationship themes; not a compatibility score or event proof.", + ["references/darakaraka-complete-guide.md"], + ), + layer( + "upapada_lagna", + "Upapada Lagna marriage image", + "jyotish-app/analysis-deep.js", + "available_as_chart_field", + "callable_context", + "surface_audit_needed", + "source_reference_only", + "safe_as_context", + "UL is a relationship image layer; must not replace full chart, D9, Dasha, or event evidence.", + ["references/data-bridge-mapping.md", "references/jaimini-complete-system.md"], + ), + layer( + "relationship_combinations", + "Relationship rule-family combinations", + None, + "registry_only", + "contract_only", + "no_runtime_surface", + "missing", + "research_only", + "Indexed rule families still need source packets, deduplication, tests, and claim gates before runtime use.", + ["references/oracle/relationship_combinations_rule_family_registry_2026_07_19.json"], + ), + layer( + "relationship_ashtakavarga_overlay", + "Relationship Ashtakavarga overlay", + None, + "missing_runtime", + "not_invoked", + "no_runtime_surface", + "missing", + "blocked_until_oracle", + "Do not expose relationship AV overlay until rules, examples, and field-level oracle packets exist.", + ["references/oracle/ashtakavarga_advanced_usage_gap_registry_2026_07_19.json"], + ), + layer( + "planet_lagna_kuta", + "Planet/Lagna Kuta variants", + None, + "registry_only", + "not_invoked", + "no_runtime_surface", + "missing", + "blocked_until_oracle", + "Do not claim full top-tier compatibility until Planet/Lagna Kuta variants and worked examples are validated.", + ["references/oracle/compatibility_full_system_gap_registry_2026_07_19.json"], + ), + layer( + "western_composite_davidson_boundary", + "Western composite / Davidson boundary", + None, + "out_of_scope", + "not_invoked", + "no_vedic_surface", + "not_applicable_vedic_core", + "out_of_scope_for_vedic_core", + "Keep out of Vedic commercial runtime unless explicitly scoped as cross-system research.", + ), + ] + return { + "scope": "compatibility_skill_readiness_dashboard", + "created_at": "2026-07-20", + "status": "dashboard_v1", + "claim_status": "partial", + "production_tuning_allowed": False, + "truth_matrix_allowed": False, + "summary": { + "layer_count": len(layers), + "runtime_available_count": sum(1 for x in layers if x["runtime_status"] in {"available", "available_as_chart_field"}), + "blocked_or_registry_only_count": sum(1 for x in layers if x["commercial_sync_status"] in {"research_only", "blocked_until_oracle", "out_of_scope_for_vedic_core"}), + "oracle_ready_count": 0, + }, + "skill_use_policy": { + "allowed": "Expose basic compatibility factors and relationship context with explicit low/partial evidence boundaries.", + "forbidden": "Do not present any layer as deterministic marriage success, divorce prediction, exact relationship timing, or complete synastry truth.", + }, + "layers": layers, + } + + +def main() -> None: + OUT.write_text(json.dumps(build(), ensure_ascii=False, indent=2) + "\n") + print(OUT) + + +if __name__ == "__main__": + main() diff --git a/tests/test_compatibility_skill_readiness_dashboard.py b/tests/test_compatibility_skill_readiness_dashboard.py new file mode 100644 index 00000000..24ee2865 --- /dev/null +++ b/tests/test_compatibility_skill_readiness_dashboard.py @@ -0,0 +1,55 @@ +import json +import subprocess +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +ARTIFACT = ROOT / "references" / "oracle" / "compatibility_skill_readiness_dashboard_2026_07_20.json" +INDEX = ROOT / "references" / "oracle" / "evidence_packet_index_2026_07_19.json" + + +def test_compatibility_skill_dashboard_generator_creates_bounded_layers(): + subprocess.run( + ["python3", "scripts/compatibility_skill_readiness_dashboard.py"], + cwd=ROOT, + check=True, + ) + + data = json.loads(ARTIFACT.read_text()) + assert data["scope"] == "compatibility_skill_readiness_dashboard" + assert data["claim_status"] == "partial" + assert data["production_tuning_allowed"] is False + assert data["truth_matrix_allowed"] is False + + layers = {layer["layer_id"]: layer for layer in data["layers"]} + for layer_id in [ + "ashtakoota_guna_milan", + "mangal_dosha", + "d9_navamsa_relationship", + "darakaraka", + "upapada_lagna", + "relationship_combinations", + "relationship_ashtakavarga_overlay", + "planet_lagna_kuta", + "western_composite_davidson_boundary", + ]: + assert layer_id in layers + + assert layers["ashtakoota_guna_milan"]["runtime_status"] == "available" + assert layers["ashtakoota_guna_milan"]["external_oracle_status"] == "partial" + assert layers["relationship_ashtakavarga_overlay"]["runtime_status"] in { + "missing_runtime", + "registry_only", + } + assert layers["western_composite_davidson_boundary"]["commercial_sync_status"] == "out_of_scope_for_vedic_core" + assert all("claim_boundary" in layer and layer["claim_boundary"] for layer in data["layers"]) + + +def test_compatibility_dashboard_is_indexed_as_partial_contract_only_packet(): + index = json.loads(INDEX.read_text()) + packets = {packet["packet_id"]: packet for packet in index["packets"]} + packet = packets["compatibility_skill_readiness_dashboard"] + assert packet["path"] == "references/oracle/compatibility_skill_readiness_dashboard_2026_07_20.json" + assert packet["domain"] == "compatibility" + assert packet["claim_status"] == "partial" + assert packet["consumer_policy"] == "research_to_commercial_contract_only"