Files
yao-meta-skill/scripts/review_studio_data.py
T
YAO 31ce04c655 Split meta skill CLI and review gates
Merge the beta-ready Yao Meta Skill architecture, report, evidence gate, and release-boundary updates.\n\nRelease boundary: beta/public testing is allowed; formal world-class, fully reviewed, or superiority claims remain blocked until the pending evidence gates are accepted.
2026-06-17 18:43:02 +08:00

388 lines
19 KiB
Python

#!/usr/bin/env python3
"""Data loading and insight card helpers for Review Studio."""
import json
from pathlib import Path
from typing import Any
from skill_ir_paths import find_skill_ir_path as find_skill_ir_path_for_name
try:
import yaml
except ImportError: # pragma: no cover
yaml = None
SCRIPT_INTERFACE = "internal-module"
SCRIPT_INTERFACE_REASON = "Imported by render_review_studio.py to load Review Studio source reports and metric cards."
ROOT = Path(__file__).resolve().parent.parent
def load_json(path: Path) -> dict[str, Any]:
if not path.exists():
return {}
try:
payload = json.loads(path.read_text(encoding="utf-8"))
except json.JSONDecodeError:
return {}
return payload if isinstance(payload, dict) else {}
def latest_json_report(directory: Path) -> dict[str, Any]:
if not directory.exists():
return {}
candidates = sorted(path for path in directory.glob("*.json") if path.is_file())
if not candidates:
return {}
payload = load_json(candidates[-1])
if payload:
try:
payload.setdefault("source_path", str(candidates[-1].resolve().relative_to(directory.parent.parent.parent.resolve())))
except ValueError:
payload.setdefault("source_path", str(candidates[-1]))
return payload
def latest_report_path(skill_dir: Path, directory: Path, suffix: str) -> str:
if not directory.exists():
return ""
candidates = sorted(path for path in directory.glob(f"*{suffix}") if path.is_file())
if not candidates:
return ""
try:
return str(candidates[-1].resolve().relative_to(skill_dir.resolve()))
except ValueError:
return str(candidates[-1])
def load_yaml(path: Path) -> dict[str, Any]:
if not path.exists() or yaml is None:
return {}
payload = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
return payload if isinstance(payload, dict) else {}
def parse_frontmatter(path: Path) -> dict[str, Any]:
if not path.exists():
return {}
lines = path.read_text(encoding="utf-8", errors="replace").splitlines()
if not lines or lines[0].strip() != "---":
return {}
try:
end_index = lines[1:].index("---") + 1
except ValueError:
return {}
text = "\n".join(lines[1:end_index])
if yaml is not None:
payload = yaml.safe_load(text) or {}
return payload if isinstance(payload, dict) else {}
data = {}
for line in text.splitlines():
if ":" in line:
key, value = line.split(":", 1)
data[key.strip()] = value.strip().strip('"')
return data
def find_skill_ir_path(skill_dir: Path) -> str:
frontmatter = parse_frontmatter(skill_dir / "SKILL.md")
name = str(frontmatter.get("name") or skill_dir.name)
return find_skill_ir_path_for_name(skill_dir, name)
def evidence_paths(skill_dir: Path) -> dict[str, str]:
rels = {
"skill_overview": "reports/skill-overview.html",
"review_viewer": "reports/review-viewer.html",
"output_eval": "reports/output_quality_scorecard.md",
"output_execution": "reports/output_execution_runs.md",
"output_blind_review": "reports/output_blind_review_pack.md",
"output_review_kit": "reports/output_review_kit.md",
"output_review_kit_html": "reports/output_review_kit.html",
"output_review_decisions": "reports/output_review_decisions.json",
"output_review_adjudication": "reports/output_review_adjudication.md",
"benchmark_reproducibility": "reports/benchmark_reproducibility.md",
"skill_os2_coverage": "reports/skill_os2_coverage.md",
"runtime_conformance": "reports/conformance_matrix.md",
"trust_report": "reports/security_trust_report.md",
"python_compatibility": "reports/python_compatibility.md",
"architecture_maintainability": "reports/architecture_maintainability.md",
"permission_policy": "security/permission_policy.md",
"runtime_permissions": "reports/runtime_permission_probes.md",
"skill_atlas": "reports/skill_atlas.html",
"compiled_targets": "reports/compiled_targets.md",
"adoption_drift": "reports/adoption_drift_report.md",
"review_waivers": "reports/review_waivers.md",
"review_annotations": "reports/review_annotations.md",
"adaptation_proposals": "reports/adaptation_proposals.md",
"adaptation_approval_ledger": "reports/adaptation_approval_ledger.json",
"adaptation_regression": "reports/adaptation_regression_report.md",
"world_class_evidence_plan": "reports/world_class_evidence_plan.md",
"world_class_evidence_ledger": "reports/world_class_evidence_ledger.md",
"world_class_evidence_intake": "reports/world_class_evidence_intake.md",
"world_class_evidence_preflight": "reports/world_class_evidence_preflight.md",
"world_class_evidence_preflight_html": "reports/world_class_evidence_preflight.html",
"world_class_submission_review": "reports/world_class_submission_review.md",
"world_class_operator_runbook": "reports/world_class_operator_runbook.md",
"world_class_operator_runbook_html": "reports/world_class_operator_runbook.html",
"world_class_claim_guard": "reports/world_class_claim_guard.md",
"registry_audit": "reports/registry_audit.md",
"package_verification": "reports/package_verification.md",
"install_simulation": "reports/install_simulation.md",
"upgrade_check": "reports/upgrade_check.md",
"migration": "docs/migration-v2.md",
}
skill_ir_path = find_skill_ir_path(skill_dir)
if skill_ir_path:
rels["skill_ir"] = skill_ir_path
daily_md = latest_report_path(skill_dir, skill_dir / "reports" / "skillops" / "daily", ".md")
weekly_md = latest_report_path(skill_dir, skill_dir / "reports" / "skillops" / "weekly", ".md")
if daily_md:
rels["daily_skillops"] = daily_md
if weekly_md:
rels["weekly_curator"] = weekly_md
return {key: rel for key, rel in rels.items() if (skill_dir / rel).exists() or (ROOT / rel).exists()}
def load_review_data(skill_dir: Path) -> dict[str, dict[str, Any]]:
reports = skill_dir / "reports"
return {
"overview": load_json(reports / "skill-overview.json"),
"intent_confidence": load_json(reports / "intent-confidence.json"),
"intent_dialogue": load_json(reports / "intent-dialogue.json"),
"route_scorecard": load_json(reports / "route_scorecard.json"),
"output_quality": load_json(reports / "output_quality_scorecard.json"),
"output_execution": load_json(reports / "output_execution_runs.json"),
"output_blind_review": load_json(reports / "output_blind_review_pack.json"),
"output_review_kit": load_json(reports / "output_review_kit.json"),
"output_review_adjudication": load_json(reports / "output_review_adjudication.json"),
"benchmark_reproducibility": load_json(reports / "benchmark_reproducibility.json"),
"skill_os2_coverage": load_json(reports / "skill_os2_coverage.json"),
"compiled_targets": load_json(reports / "compiled_targets.json"),
"conformance": load_json(reports / "conformance_matrix.json"),
"runtime_permissions": load_json(reports / "runtime_permission_probes.json"),
"trust": load_json(reports / "security_trust_report.json"),
"python_compatibility": load_json(reports / "python_compatibility.json"),
"architecture_maintainability": load_json(reports / "architecture_maintainability.json"),
"context_budget": load_json(reports / "context_budget.json"),
"promotion": load_json(reports / "promotion_decisions.json"),
"atlas": load_json(reports / "skill_atlas.json"),
"adoption_drift": load_json(reports / "adoption_drift_report.json"),
"daily_skillops": latest_json_report(reports / "skillops" / "daily"),
"weekly_curator": latest_json_report(reports / "skillops" / "weekly"),
"review_waivers": load_json(reports / "review_waivers.json"),
"review_annotations": load_json(reports / "review_annotations.json"),
"adaptation_proposals": load_json(reports / "adaptation_proposals.json"),
"adaptation_approval_ledger": load_json(reports / "adaptation_approval_ledger.json"),
"adaptation_regression": load_json(reports / "adaptation_regression_report.json"),
"world_class_evidence_ledger": load_json(reports / "world_class_evidence_ledger.json"),
"world_class_evidence_intake": load_json(reports / "world_class_evidence_intake.json"),
"world_class_evidence_preflight": load_json(reports / "world_class_evidence_preflight.json"),
"world_class_submission_review": load_json(reports / "world_class_submission_review.json"),
"world_class_operator_runbook": load_json(reports / "world_class_operator_runbook.json"),
"world_class_claim_guard": load_json(reports / "world_class_claim_guard.json"),
"registry": load_json(reports / "registry_audit.json"),
"package_verification": load_json(reports / "package_verification.json"),
"install_simulation": load_json(reports / "install_simulation.json"),
"upgrade_check": load_json(reports / "upgrade_check.json"),
"manifest": load_json(skill_dir / "manifest.json"),
"frontmatter": parse_frontmatter(skill_dir / "SKILL.md"),
"interface": load_yaml(skill_dir / "agents" / "interface.yaml"),
}
def insight_cards(data: dict[str, dict[str, Any]]) -> list[dict[str, str]]:
overview = data["overview"]
output = data["output_quality"].get("summary", {})
output_execution = data["output_execution"].get("summary", {})
output_blind = data["output_blind_review"].get("summary", {})
output_review_kit = data["output_review_kit"].get("summary", {})
output_review = data["output_review_adjudication"].get("summary", {})
benchmark = data["benchmark_reproducibility"].get("summary", {})
blueprint = data["skill_os2_coverage"].get("summary", {})
extension_partial = int(blueprint.get("extension_partial_count", 0) or 0)
extension_planned = int(blueprint.get("extension_planned_count", 0) or 0)
compiled = data["compiled_targets"].get("summary", {})
conformance = data["conformance"].get("summary", {})
runtime_permissions = data["runtime_permissions"].get("summary", {})
trust = data["trust"].get("summary", {})
python_compat = data["python_compatibility"].get("summary", {})
architecture = data["architecture_maintainability"].get("summary", {})
atlas = data["atlas"].get("summary", {})
adoption = data["adoption_drift"].get("summary", {})
daily_skillops = data["daily_skillops"].get("summary", {})
weekly_curator = data["weekly_curator"].get("summary", {})
waivers = data["review_waivers"].get("summary", {})
annotations = data["review_annotations"].get("summary", {})
intake = data["world_class_evidence_intake"].get("summary", {})
claim_guard = data["world_class_claim_guard"].get("summary", {})
registry = data["registry"].get("package", {})
package_verification = data["package_verification"].get("summary", {})
install_simulation = data["install_simulation"].get("summary", {})
upgrade = data["upgrade_check"].get("summary", {})
cards = [
{
"label": "Skill IR",
"value": str(overview.get("skill_ir", {}).get("schema_version", "missing")),
"detail": f"{overview.get('skill_ir', {}).get('target_count', 0)} targets in platform-neutral contract",
},
{
"label": "Compiler",
"value": f"{compiled.get('pass_count', 0)}/{compiled.get('target_count', 0)}",
"detail": "target contracts compiled from Skill IR",
},
{
"label": "Output Delta",
"value": str(output.get("delta", "n/a")),
"detail": f"{output.get('case_count', 0)} cases; {output.get('file_backed_case_count', 0)} file-backed",
},
{
"label": "Exec Runs",
"value": str(output_execution.get("variant_run_count", 0)),
"detail": (
f"command {output_execution.get('command_executed_count', 0)}; "
f"model {output_execution.get('model_executed_count', 0)}; "
f"recorded {output_execution.get('recorded_fixture_count', 0)}"
),
},
{
"label": "Blind A/B",
"value": str(output_blind.get("pair_count", 0)),
"detail": "review pairs hide baseline vs with-skill labels",
},
{
"label": "Review Kit",
"value": f"{output_review_kit.get('ready_for_adjudication_count', 0)}/{output_review_kit.get('case_count', 0)}",
"detail": f"pending {output_review_kit.get('pending_decision_count', 0)}; answer key hidden",
},
{
"label": "Review A/B",
"value": f"{output_review.get('judgment_count', 0)}/{output_review.get('pair_count', 0)}",
"detail": f"adjudication decisions; pending {output_review.get('pending_count', 0)}",
},
{
"label": "Public Claim",
"value": "ready" if benchmark.get("public_claim_ready") is True else "blocked",
"detail": f"{benchmark.get('public_claim_blocker_count', 0)} blockers; local reproducible {str(benchmark.get('reproducibility_ready', False)).lower()}",
},
{
"label": "Blueprint",
"value": f"{blueprint.get('pass_count', 0)}/{blueprint.get('item_count', 0)}",
"detail": (
f"2.0 coverage; extensions partial {extension_partial}, "
f"planned {extension_planned}; evidence pending {blueprint.get('world_class_evidence_pending_count', 0)}"
),
},
{
"label": "Runtime",
"value": f"{conformance.get('pass_count', 0)}/{conformance.get('target_count', 0)}",
"detail": "target conformance pass rate",
},
{
"label": "Perm Probe",
"value": f"{runtime_permissions.get('metadata_fallback_count', 0)}/{runtime_permissions.get('target_count', 0)}",
"detail": (
f"{runtime_permissions.get('native_enforcement_count', 0)} native; "
f"{runtime_permissions.get('installer_enforcement_pass_count', 0)} installer-enforced"
),
},
{
"label": "Trust",
"value": str(trust.get("secret_findings", 0)),
"detail": f"{trust.get('script_count', 0)} scripts scanned; secrets found",
},
{
"label": "Py Compat",
"value": str(python_compat.get("issue_count", 0)),
"detail": f"{python_compat.get('file_count', 0)} files scanned for Python {python_compat.get('target_python', '3.11')}",
},
{
"label": "Arch Debt",
"value": str(architecture.get("hotspot_count", 0)),
"detail": (
f"{architecture.get('largest_file_lines', 0)} largest lines; "
f"{architecture.get('watchlist_count', 0)} watchlist; "
f"{architecture.get('early_watchlist_count', 0)} early; "
f"{architecture.get('command_handler_count', 0)} CLI handlers; "
f"{architecture.get('entrypoint_command_handler_count', 0)} in entrypoint"
),
},
{
"label": "Atlas",
"value": str(atlas.get("route_collision_count", 0)),
"detail": f"{atlas.get('skill_count', 0)} scanned skills; route collisions",
},
{
"label": "Drift",
"value": str(adoption.get("risk_band", "n/a")),
"detail": f"{adoption.get('event_count', 0)} metadata events; {adoption.get('missed_trigger_count', 0)} missed triggers",
},
{
"label": "Daily Ops",
"value": str(daily_skillops.get("proposal_count", 0)),
"detail": (
f"{daily_skillops.get('decision', 'missing')}; "
f"approval {daily_skillops.get('approval_count', 0)}; "
f"release lock {str(daily_skillops.get('release_lock_ready', False)).lower()}"
),
},
{
"label": "Weekly Queue",
"value": str(weekly_curator.get("unique_opportunity_count", 0)),
"detail": (
f"{weekly_curator.get('decision', 'missing')}; "
f"ready {weekly_curator.get('ready_for_approval_review_count', 0)}; "
f"top score {weekly_curator.get('top_score', 0)}"
),
},
{
"label": "Waivers",
"value": str(waivers.get("active_count", 0)),
"detail": f"{waivers.get('covered_gate_count', 0)} gates covered; human risk decisions",
},
{
"label": "Intake",
"value": f"{intake.get('template_pass_count', 0)}/{intake.get('template_count', 0)}",
"detail": (
f"{intake.get('valid_submission_count', 0)} valid submissions; "
f"{intake.get('invalid_submission_count', 0)} invalid"
),
},
{
"label": "Claim Guard",
"value": str(claim_guard.get("violation_count", 0)),
"detail": f"{claim_guard.get('claim_surface_count', 0)} public surfaces scanned",
},
{
"label": "Notes",
"value": f"{annotations.get('open_count', 0)}/{annotations.get('annotation_count', 0)}",
"detail": f"{annotations.get('open_blocker_count', 0)} open blocker annotations",
},
{
"label": "Registry",
"value": str(registry.get("version", "n/a")),
"detail": f"{len(registry.get('targets', []))} targets; {registry.get('license', 'no license')} license",
},
{
"label": "Archive",
"value": "pass" if data["package_verification"].get("ok") else "n/a",
"detail": f"{package_verification.get('archive_entry_count', 0)} zip entries; package verification",
},
{
"label": "Install",
"value": "pass" if data["install_simulation"].get("ok") else "n/a",
"detail": (
f"{install_simulation.get('adapter_count', 0)} adapters; "
f"{install_simulation.get('installer_permission_enforced_count', 0)} permissions enforced; "
f"{install_simulation.get('installer_permission_failure_count', 0)} permission failures"
),
},
{
"label": "Upgrade",
"value": str(upgrade.get("recommended_bump", "n/a")),
"detail": f"declared {upgrade.get('declared_bump', 'n/a')}; {upgrade.get('breaking_change_count', 0)} breaking changes",
},
]
return cards