Files
Jyotisha/scripts/external_oracle_sanity_closure.py
T
2026-07-08 17:03:04 +08:00

355 lines
14 KiB
Python

#!/usr/bin/env python3
"""Summarize VedAstro/PyJHora/jyotishganit sanity closure status.
This is an audit ledger, not a calculator. It cross-references existing
external evidence and reports which parts are closed, partial, or blocked
without importing PyJHora AGPL code or treating local consistency as truth.
"""
from __future__ import annotations
import argparse
import importlib.util
import json
import subprocess
import sys
from datetime import datetime, timezone
from pathlib import Path
from typing import Any
ROOT = Path(__file__).resolve().parents[1]
PYTHON = sys.executable
DEFAULT_DASHA_ORACLE_FILE = "references/oracle/dasha_shadbala_oracle_cases.json"
DEFAULT_TAJIKA_ORACLE_FILE = "references/oracle/tajika_annual_oracle_cases.json"
JYOTISHGANIT_ROOT = ROOT / "references" / "open_source_sources" / "jyotishganit"
def _run_json(command: list[str], *, timeout: int = 120) -> dict[str, Any]:
completed = subprocess.run(
command,
cwd=ROOT,
text=True,
capture_output=True,
timeout=timeout,
check=False,
)
if completed.returncode != 0:
return {
"status": "blocked",
"command": command,
"stderr": completed.stderr.strip(),
"stdout_excerpt": completed.stdout.strip()[:500],
}
try:
data = json.loads(completed.stdout)
except json.JSONDecodeError as exc:
return {
"status": "blocked",
"command": command,
"reason": f"invalid_json: {exc}",
"stdout_excerpt": completed.stdout.strip()[:500],
}
if isinstance(data, dict):
return data
return {"status": "blocked", "command": command, "reason": "json_root_not_object"}
def _load_json(path: Path) -> dict[str, Any]:
try:
data = json.loads(path.read_text(encoding="utf-8"))
except Exception as exc: # pragma: no cover - exact filesystem errors vary
return {"status": "blocked", "reason": f"{type(exc).__name__}: {exc}"}
return data if isinstance(data, dict) else {"status": "blocked", "reason": "json_root_not_object"}
def _relative(path: Path) -> str:
try:
return str(path.relative_to(ROOT))
except ValueError:
return str(path)
def _vedastro_ledger(oracle_file: str, *, live_official_full_snapshot: bool = False) -> dict[str, Any]:
boundary = _run_json([PYTHON, "scripts/oracle_boundary_audit.py", "--oracle-file", oracle_file])
longitude_cases = boundary.get("longitude_cases") if isinstance(boundary.get("longitude_cases"), list) else []
within_threshold = [
row for row in longitude_cases
if isinstance(row, dict) and row.get("within_threshold") is True
]
max_delta = max(
(float(row.get("max_abs_delta_arcsec", 0.0)) for row in longitude_cases if isinstance(row, dict)),
default=None,
)
boundary_status = "ok" if longitude_cases and len(within_threshold) == len(longitude_cases) else "blocked"
if live_official_full_snapshot:
snapshot = _run_json([
PYTHON,
"scripts/vedastro_service_adapter.py",
"--official-full-snapshot",
"--case",
"steve_jobs_public_aa",
])
else:
snapshot = {
"status": "not_run_default_non_blocking",
"source_metadata": {
"official_python_bundle": {
"status": "not_run_default_non_blocking",
},
},
"official_chart": {},
}
snapshot_status = str(snapshot.get("status") or "blocked")
source_metadata = snapshot.get("source_metadata") if isinstance(snapshot.get("source_metadata"), dict) else {}
official_bundle = source_metadata.get("official_python_bundle") if isinstance(source_metadata.get("official_python_bundle"), dict) else {}
official_chart = snapshot.get("official_chart") if isinstance(snapshot.get("official_chart"), dict) else {}
official_chart_available = bool(
isinstance(official_chart.get("planets"), dict)
and official_chart.get("planets")
and isinstance(official_chart.get("ascendant"), dict)
and official_chart.get("ascendant")
)
fine_status_ok = snapshot_status in {"ok", "partial"} and official_chart_available
if fine_status_ok and boundary_status == "ok":
status = "ok"
verdict = "official_precision_sanity_passed"
else:
status = "blocked"
verdict = (
"official_longitude_sanity_passed_but_full_snapshot_blocked"
if boundary_status == "ok"
else "official_precision_sanity_blocked"
)
return {
"name": "VedAstro",
"role": "official_precision_sanity",
"status": status,
"verdict": verdict,
"live_official_full_snapshot": live_official_full_snapshot,
"fine_calc_blocked": status != "ok",
"longitude_case_count": len(longitude_cases),
"longitude_cases_within_threshold": len(within_threshold),
"max_abs_delta_arcsec": max_delta,
"snapshot_status": snapshot_status,
"official_chart_available": official_chart_available,
"official_python_bundle_status": official_bundle.get("status"),
"evidence_paths": [
"references/oracle/dasha_shadbala_oracle_cases.json",
"scripts/oracle_boundary_audit.py",
"scripts/vedastro_service_adapter.py",
],
"blocked_reason": None if status == "ok" else (
"Official fine snapshot is not a stable ok chart, or only longitude sanity is currently closed."
),
}
def _pyjhora_ledger() -> dict[str, Any]:
manifest_path = ROOT / "references" / "oracle" / "artifacts" / "pyjhora_oracle_artifact_manifest.json"
manifest = _load_json(manifest_path)
artifact_count = int(manifest.get("artifact_count") or 0)
packet_count = int(manifest.get("packet_count") or 0)
fronts = manifest.get("fronts") if isinstance(manifest.get("fronts"), dict) else {}
status = "ok" if artifact_count >= 8 and packet_count >= 8 else "partial" if artifact_count else "blocked"
return {
"name": "PyJHora",
"role": "black_box_external_oracle",
"status": status,
"verdict": "black_box_artifact_ledger_available" if status != "blocked" else "black_box_artifact_ledger_missing",
"artifact_count": artifact_count,
"packet_count": packet_count,
"fronts": fronts,
"license_boundary": "black_box_artifacts_only_no_agpl_code_import",
"evidence_paths": [_relative(manifest_path)],
}
def _jyotishganit_ledger() -> dict[str, Any]:
package_init = JYOTISHGANIT_ROOT / "jyotishganit" / "__init__.py"
license_path = JYOTISHGANIT_ROOT / "LICENSE"
source_available = package_init.is_file()
license_text = ""
if license_path.is_file():
license_text = license_path.read_text(encoding="utf-8", errors="ignore")[:2000].lower()
license_name = "MIT" if "mit license" in license_text or "permission is hereby granted" in license_text else "unknown"
importable = False
import_error = None
if source_available:
spec = importlib.util.spec_from_file_location("jyotishganit", package_init)
importable = spec is not None
if not importable:
import_error = "cannot_build_import_spec"
benchmark_path = ROOT / "references" / "jyotishganit_benchmark.md"
status = "ok" if source_available and license_name == "MIT" and benchmark_path.is_file() else "partial" if source_available else "blocked"
return {
"name": "jyotishganit",
"role": "mit_reference_layer",
"status": status,
"verdict": "mit_reference_source_available" if status != "blocked" else "mit_reference_source_missing",
"license": license_name,
"source_available": source_available,
"import_spec_available": importable,
"import_error": import_error,
"benchmark_available": benchmark_path.is_file(),
"evidence_paths": [
_relative(JYOTISHGANIT_ROOT),
_relative(benchmark_path),
],
"boundary": "MIT reference layer and local comparison asset; not a complete second runtime oracle for every request.",
}
def _oracle_master(dasha_oracle_file: str, tajika_oracle_file: str) -> dict[str, Any]:
return _run_json([
PYTHON,
"scripts/oracle_closure_master_dashboard.py",
"--dasha-oracle-file",
dasha_oracle_file,
"--tajika-oracle-file",
tajika_oracle_file,
"--format",
"json",
])
def build_report(
dasha_oracle_file: str,
tajika_oracle_file: str,
*,
live_official_full_snapshot: bool = False,
) -> dict[str, Any]:
vedastro = _vedastro_ledger(
dasha_oracle_file,
live_official_full_snapshot=live_official_full_snapshot,
)
pyjhora = _pyjhora_ledger()
jyotishganit = _jyotishganit_ledger()
master = _oracle_master(dasha_oracle_file, tajika_oracle_file)
ledgers = {
"vedastro": vedastro,
"pyjhora": pyjhora,
"jyotishganit": jyotishganit,
}
blocked = [key for key, value in ledgers.items() if value.get("status") == "blocked"]
partial = [key for key, value in ledgers.items() if value.get("status") == "partial"]
ok = [key for key, value in ledgers.items() if value.get("status") == "ok"]
can_claim_fully_closed = not blocked and not partial and master.get("summary", {}).get("can_claim_global_oracle_closure") is True
return {
"scope": "external_official_sanity_oracle_closure",
"schema_version": 1,
"generated_at": datetime.now(timezone.utc).isoformat(),
"summary": {
"required_oracles": ["VedAstro", "PyJHora", "jyotishganit"],
"ok_count": len(ok),
"partial_count": len(partial),
"blocked_count": len(blocked),
"ok_oracles": ok,
"partial_oracles": partial,
"blocked_oracles": blocked,
"external_verified_tasks": master.get("summary", {}).get("external_verified_tasks"),
"total_tasks": master.get("summary", {}).get("total_tasks"),
"open_tasks": master.get("summary", {}).get("open_tasks"),
"live_official_full_snapshot": live_official_full_snapshot,
},
"oracle_ledger": ledgers,
"master_oracle_dashboard": {
"summary": master.get("summary", {}),
"fronts": master.get("fronts", {}),
},
"honesty_boundary": {
"can_claim_fully_closed": can_claim_fully_closed,
"can_claim_high_rigor_with_blocks": bool(pyjhora.get("status") in {"ok", "partial"} and jyotishganit.get("status") in {"ok", "partial"}),
"blocked_reason": (
None if can_claim_fully_closed else
"At least one official precision/oracle layer is partial or blocked; report must expose blocked rows instead of claiming full closure."
),
"license_boundary": "PyJHora is black-box evidence only; jyotishganit MIT assets may be referenced/reused within existing project policy.",
},
"next_actions": [
"Run --live-official-full-snapshot when foreground VedAstro budget/network credentials are available, then promote VedAstro only if the full official chart is stable.",
"Keep PyJHora as artifact-backed oracle evidence; do not import AGPL implementation code.",
"If a report needs full closure language, require all oracle ledger rows to be ok and the master oracle dashboard open_tasks to be 0.",
],
}
def render_markdown(report: dict[str, Any]) -> str:
summary = report["summary"]
lines = [
"# External Official Sanity / Oracle Closure",
"",
f"Generated: `{report['generated_at']}`",
"",
"## Summary",
"",
f"- ok_count: `{summary['ok_count']}`",
f"- partial_count: `{summary['partial_count']}`",
f"- blocked_count: `{summary['blocked_count']}`",
f"- total_tasks: `{summary.get('total_tasks')}`",
f"- external_verified_tasks: `{summary.get('external_verified_tasks')}`",
f"- open_tasks: `{summary.get('open_tasks')}`",
"",
"## Oracle Ledger",
"",
"| oracle | status | role | verdict |",
"|---|---|---|---|",
]
for key, row in report["oracle_ledger"].items():
lines.append(f"| `{key}` | `{row.get('status')}` | `{row.get('role')}` | `{row.get('verdict')}` |")
lines.extend([
"",
"## Honesty Boundary",
"",
f"- can_claim_fully_closed: `{str(report['honesty_boundary']['can_claim_fully_closed']).lower()}`",
f"- can_claim_high_rigor_with_blocks: `{str(report['honesty_boundary']['can_claim_high_rigor_with_blocks']).lower()}`",
f"- blocked_reason: {report['honesty_boundary']['blocked_reason']}",
"",
"## Next Actions",
"",
])
lines.extend(f"- {item}" for item in report["next_actions"])
lines.append("")
return "\n".join(lines)
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Audit VedAstro/PyJHora/jyotishganit sanity closure")
parser.add_argument("--dasha-oracle-file", default=DEFAULT_DASHA_ORACLE_FILE)
parser.add_argument("--tajika-oracle-file", default=DEFAULT_TAJIKA_ORACLE_FILE)
parser.add_argument(
"--live-official-full-snapshot",
action="store_true",
help="Run the heavy VedAstro official full snapshot probe; default stays non-blocking for CI.",
)
parser.add_argument("--format", choices=["json", "markdown"], default="json")
parser.add_argument("--output")
return parser.parse_args(argv)
def main(argv: list[str] | None = None) -> int:
args = parse_args(argv)
report = build_report(
args.dasha_oracle_file,
args.tajika_oracle_file,
live_official_full_snapshot=args.live_official_full_snapshot,
)
text = json.dumps(report, ensure_ascii=False, indent=2) if args.format == "json" else render_markdown(report)
if args.output:
output = Path(args.output)
output.parent.mkdir(parents=True, exist_ok=True)
output.write_text(text, encoding="utf-8")
print(text)
return 0
if __name__ == "__main__":
raise SystemExit(main())