241 lines
9.2 KiB
Python
241 lines
9.2 KiB
Python
#!/usr/bin/env python3
|
|
"""Generate a unified dashboard for Jyotish external-oracle closure fronts."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
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
|
|
|
|
|
|
def _run_json(command: list[str]) -> dict[str, Any]:
|
|
completed = subprocess.run(
|
|
command,
|
|
cwd=ROOT,
|
|
text=True,
|
|
capture_output=True,
|
|
timeout=90,
|
|
check=False,
|
|
)
|
|
if completed.returncode != 0:
|
|
raise RuntimeError(completed.stderr.strip() or completed.stdout.strip())
|
|
return json.loads(completed.stdout)
|
|
|
|
|
|
def _front_from_status(name: str, status: dict[str, Any], task_key: str, verified_key: str, claim_key: str) -> dict[str, Any]:
|
|
summary = status["summary"]
|
|
first = status["first_priority"]
|
|
task_count = int(summary[task_key])
|
|
verified = int(summary[verified_key])
|
|
if first is None:
|
|
return {
|
|
"front": name,
|
|
"task_count": task_count,
|
|
"external_verified_tasks": verified,
|
|
"open_tasks": task_count - verified,
|
|
"can_claim_closure": bool(summary[claim_key]),
|
|
"production_tuning_allowed": bool(summary.get("production_tuning_allowed", False)),
|
|
"first_priority": None,
|
|
}
|
|
missing_fields = first.get("missing_fields", [])
|
|
return {
|
|
"front": name,
|
|
"task_count": task_count,
|
|
"external_verified_tasks": verified,
|
|
"open_tasks": task_count - verified,
|
|
"can_claim_closure": bool(summary[claim_key]),
|
|
"production_tuning_allowed": bool(summary.get("production_tuning_allowed", False)),
|
|
"first_priority": {
|
|
"case_id": first["case_id"],
|
|
"capture_id": first["capture_id"],
|
|
"packet_path": first["packet_path"],
|
|
"missing_field_count": len(missing_fields),
|
|
"missing_fields": missing_fields,
|
|
"missing_groups": first.get("missing_groups", {}),
|
|
"prefilled_fields": first.get("prefilled_fields", {}),
|
|
"manual_fill_plan": first.get("manual_fill_plan", {}),
|
|
"apply_command": first.get("apply_command", ""),
|
|
"validate_command": first.get("validate_command", ""),
|
|
},
|
|
}
|
|
|
|
|
|
def build_dashboard(dasha_oracle_file: str, tajika_oracle_file: str) -> dict[str, Any]:
|
|
dasha_status = _run_json([
|
|
PYTHON,
|
|
"scripts/dasha_oracle_closure_status.py",
|
|
"--oracle-file",
|
|
dasha_oracle_file,
|
|
"--format",
|
|
"json",
|
|
])
|
|
shadbala_status = _run_json([
|
|
PYTHON,
|
|
"scripts/shadbala_oracle_closure_status.py",
|
|
"--oracle-file",
|
|
dasha_oracle_file,
|
|
"--format",
|
|
"json",
|
|
])
|
|
tajika_status = _run_json([
|
|
PYTHON,
|
|
"scripts/tajika_annual_closure_status.py",
|
|
"--oracle-file",
|
|
tajika_oracle_file,
|
|
"--format",
|
|
"json",
|
|
])
|
|
|
|
fronts = {
|
|
"dasha": _front_from_status(
|
|
"dasha",
|
|
dasha_status,
|
|
"dasha_task_count",
|
|
"external_verified_dasha_tasks",
|
|
"can_claim_dasha_oracle_closure",
|
|
),
|
|
"shadbala": _front_from_status(
|
|
"shadbala",
|
|
shadbala_status,
|
|
"shadbala_task_count",
|
|
"external_verified_shadbala_tasks",
|
|
"can_claim_shadbala_absolute_closure",
|
|
),
|
|
"tajika_sahams": _front_from_status(
|
|
"tajika_sahams",
|
|
tajika_status,
|
|
"annual_task_count",
|
|
"external_verified_annual_tasks",
|
|
"can_claim_tajika_sahams_closure",
|
|
),
|
|
}
|
|
total_tasks = sum(front["task_count"] for front in fronts.values())
|
|
verified_tasks = sum(front["external_verified_tasks"] for front in fronts.values())
|
|
current_target_set_closed = total_tasks > 0 and verified_tasks == total_tasks
|
|
next_action_order = sorted(
|
|
[
|
|
{
|
|
"front": front["front"],
|
|
"case_id": front["first_priority"]["case_id"],
|
|
"capture_id": front["first_priority"]["capture_id"],
|
|
"missing_field_count": front["first_priority"]["missing_field_count"],
|
|
"manual_entry_count": int(front["first_priority"].get("manual_fill_plan", {}).get("manual_entry_count", front["first_priority"]["missing_field_count"])),
|
|
"apply_command": front["first_priority"]["apply_command"],
|
|
}
|
|
for front in fronts.values()
|
|
if not front["can_claim_closure"] and front["first_priority"] is not None
|
|
],
|
|
key=lambda item: item["missing_field_count"],
|
|
)
|
|
return {
|
|
"scope": "jyotish_external_oracle_closure_master_dashboard",
|
|
"schema_version": 1,
|
|
"generated_at": datetime.now(timezone.utc).isoformat(),
|
|
"summary": {
|
|
"total_tasks": total_tasks,
|
|
"external_verified_tasks": verified_tasks,
|
|
"open_tasks": total_tasks - verified_tasks,
|
|
"can_claim_current_target_set_closure": current_target_set_closed,
|
|
"can_claim_global_oracle_closure": False,
|
|
"production_tuning_allowed": False,
|
|
},
|
|
"fronts": fronts,
|
|
"next_action_order": next_action_order,
|
|
"boundary": (
|
|
"This dashboard merges current target-set external evidence readiness only. A closed target set does not "
|
|
"claim global oracle closure, does not claim prediction accuracy, does not tune production constants, "
|
|
"and does not treat local engine output as oracle evidence."
|
|
),
|
|
}
|
|
|
|
|
|
def render_markdown(report: dict[str, Any]) -> str:
|
|
summary = report["summary"]
|
|
lines = [
|
|
"# Jyotish External Oracle Closure Master Dashboard",
|
|
"",
|
|
f"Generated: `{report['generated_at']}`",
|
|
"",
|
|
"## Summary",
|
|
"",
|
|
f"- total_tasks: `{summary['total_tasks']}`",
|
|
f"- external_verified_tasks: `{summary['external_verified_tasks']}`",
|
|
f"- open_tasks: `{summary['open_tasks']}`",
|
|
f"- can_claim_current_target_set_closure: `{str(summary['can_claim_current_target_set_closure']).lower()}`",
|
|
f"- can_claim_global_oracle_closure: `{str(summary['can_claim_global_oracle_closure']).lower()}`",
|
|
f"- production_tuning_allowed: `{str(summary['production_tuning_allowed']).lower()}`",
|
|
"",
|
|
"## Fronts",
|
|
"",
|
|
"| front | tasks | verified | first priority | missing fields | manual entries | metadata missing | target missing |",
|
|
"|---|---:|---:|---|---:|---:|---:|---:|",
|
|
]
|
|
for key in ["dasha", "tajika_sahams", "shadbala"]:
|
|
front = report["fronts"][key]
|
|
first = front["first_priority"]
|
|
if first is None:
|
|
lines.append(
|
|
f"| `{key}` | {front['task_count']} | {front['external_verified_tasks']} | `complete` | "
|
|
"0 | 0 | 0 | 0 |"
|
|
)
|
|
continue
|
|
missing_groups = first.get("missing_groups", {})
|
|
manual_fill_plan = first.get("manual_fill_plan", {})
|
|
lines.append(
|
|
f"| `{key}` | {front['task_count']} | {front['external_verified_tasks']} | `{first['case_id']}` | "
|
|
f"{first['missing_field_count']} | {manual_fill_plan.get('manual_entry_count', first['missing_field_count'])} | "
|
|
f"{missing_groups.get('metadata', {}).get('count', 0)} | {missing_groups.get('target', {}).get('count', 0)} |"
|
|
)
|
|
lines.extend(["", "## Next Action Order", ""])
|
|
for item in report["next_action_order"]:
|
|
lines.extend(
|
|
[
|
|
f"### {item['front']}",
|
|
"",
|
|
f"- case_id: `{item['case_id']}`",
|
|
f"- capture_id: `{item['capture_id']}`",
|
|
f"- missing_field_count: `{item['missing_field_count']}`",
|
|
f"- manual_entry_count: `{item['manual_entry_count']}`",
|
|
"",
|
|
"```bash",
|
|
item["apply_command"],
|
|
"```",
|
|
"",
|
|
]
|
|
)
|
|
lines.extend(["## Boundary", "", report["boundary"], ""])
|
|
return "\n".join(lines)
|
|
|
|
|
|
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
|
parser = argparse.ArgumentParser(description="Generate unified external-oracle closure dashboard")
|
|
parser.add_argument("--dasha-oracle-file", default="references/oracle/dasha_shadbala_oracle_cases.json")
|
|
parser.add_argument("--tajika-oracle-file", default="references/oracle/tajika_annual_oracle_cases.json")
|
|
parser.add_argument("--format", choices=["json", "markdown"], default="json")
|
|
parser.add_argument("--output", help="Optional output path")
|
|
return parser.parse_args(argv)
|
|
|
|
|
|
def main(argv: list[str] | None = None) -> int:
|
|
args = parse_args(argv)
|
|
report = build_dashboard(args.dasha_oracle_file, args.tajika_oracle_file)
|
|
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())
|