feat: sync compatibility skill readiness dashboard

This commit is contained in:
732642856
2026-07-20 02:41:20 +08:00
parent 6c1c421582
commit d048e6a652
4 changed files with 412 additions and 2 deletions
@@ -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."
}
]
}
@@ -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
}
}
@@ -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()
@@ -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"