Files
yao-meta-skill/tests/verify_description_optimization.py

139 lines
7.6 KiB
Python

#!/usr/bin/env python3
import json
import subprocess
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
CASES = [
{
"name": "root",
"description_file": ROOT / "SKILL.md",
"baseline_description_file": ROOT / "evals" / "baseline_description.txt",
"semantic_config": ROOT / "evals" / "semantic_config.json",
"dev_cases": ROOT / "evals" / "dev" / "trigger_cases.json",
"holdout_cases": ROOT / "evals" / "holdout" / "trigger_cases.json",
"blind_holdout_cases": ROOT / "evals" / "blind_holdout" / "trigger_cases.json",
"adversarial_cases": ROOT / "evals" / "adversarial" / "trigger_cases.json",
},
{
"name": "team_frontend_review",
"description_file": ROOT / "examples" / "team-frontend-review" / "generated-skill" / "SKILL.md",
"baseline_description_file": ROOT / "examples" / "team-frontend-review" / "optimization" / "baseline_description.txt",
"semantic_config": ROOT / "examples" / "team-frontend-review" / "optimization" / "semantic_config.json",
"dev_cases": ROOT / "examples" / "team-frontend-review" / "optimization" / "dev" / "trigger_cases.json",
"holdout_cases": ROOT / "examples" / "team-frontend-review" / "optimization" / "holdout" / "trigger_cases.json",
"blind_holdout_cases": ROOT / "examples" / "team-frontend-review" / "optimization" / "blind_holdout" / "trigger_cases.json",
"adversarial_cases": ROOT / "examples" / "team-frontend-review" / "optimization" / "adversarial" / "trigger_cases.json",
},
{
"name": "governed_incident_command",
"description_file": ROOT / "examples" / "governed-incident-command" / "generated-skill" / "SKILL.md",
"baseline_description_file": ROOT / "examples" / "governed-incident-command" / "optimization" / "baseline_description.txt",
"semantic_config": ROOT / "examples" / "governed-incident-command" / "optimization" / "semantic_config.json",
"dev_cases": ROOT / "examples" / "governed-incident-command" / "optimization" / "dev" / "trigger_cases.json",
"holdout_cases": ROOT / "examples" / "governed-incident-command" / "optimization" / "holdout" / "trigger_cases.json",
"blind_holdout_cases": ROOT / "examples" / "governed-incident-command" / "optimization" / "blind_holdout" / "trigger_cases.json",
"adversarial_cases": ROOT / "examples" / "governed-incident-command" / "optimization" / "adversarial" / "trigger_cases.json",
},
]
def total_errors(summary: dict) -> int:
return int(summary.get("false_positives", 0)) + int(summary.get("false_negatives", 0))
def run_case(case: dict) -> dict:
proc = subprocess.run(
[
sys.executable,
"scripts/optimize_description.py",
"--description-file",
str(case["description_file"]),
"--baseline-description-file",
str(case["baseline_description_file"]),
"--semantic-config",
str(case["semantic_config"]),
"--dev-cases",
str(case["dev_cases"]),
"--holdout-cases",
str(case["holdout_cases"]),
"--blind-holdout-cases",
str(case["blind_holdout_cases"]),
"--adversarial-cases",
str(case["adversarial_cases"]),
],
cwd=ROOT,
capture_output=True,
text=True,
)
payload = json.loads(proc.stdout)
current = payload["current_candidate"]
winner = payload["winner"]
baseline = payload.get("baseline")
passed = proc.returncode == 0
passed = passed and total_errors(winner["dev"]) <= total_errors(current["dev"])
passed = passed and total_errors(winner["holdout"]) <= total_errors(current["holdout"])
if baseline:
passed = passed and total_errors(winner["dev"]) <= total_errors(baseline["dev"])
passed = passed and total_errors(winner["holdout"]) <= total_errors(baseline["holdout"])
blind_winner = payload["acceptance_gates"]["blind_holdout_non_regression"]["winner"]
blind_current = payload["acceptance_gates"]["blind_holdout_non_regression"]["current"]
blind_baseline = payload["acceptance_gates"]["blind_holdout_non_regression"]["baseline"]
passed = passed and blind_winner is not None and total_errors(blind_winner) <= total_errors(blind_current)
if blind_baseline:
passed = passed and total_errors(blind_winner) <= total_errors(blind_baseline)
judge_blind_winner = payload["acceptance_gates"]["judge_blind_holdout_non_regression"]["winner"]
judge_blind_current = payload["acceptance_gates"]["judge_blind_holdout_non_regression"]["current"]
judge_blind_baseline = payload["acceptance_gates"]["judge_blind_holdout_non_regression"]["baseline"]
passed = passed and judge_blind_winner is not None and total_errors(judge_blind_winner) <= total_errors(judge_blind_current)
if judge_blind_baseline:
passed = passed and total_errors(judge_blind_winner) <= total_errors(judge_blind_baseline)
adversarial_winner = payload["acceptance_gates"]["adversarial_holdout_non_regression"]["winner"]
adversarial_current = payload["acceptance_gates"]["adversarial_holdout_non_regression"]["current"]
adversarial_baseline = payload["acceptance_gates"]["adversarial_holdout_non_regression"]["baseline"]
passed = passed and adversarial_winner is not None and total_errors(adversarial_winner) <= total_errors(adversarial_current)
if adversarial_baseline:
passed = passed and total_errors(adversarial_winner) <= total_errors(adversarial_baseline)
winner_adversarial_calibration = payload["acceptance_gates"]["adversarial_holdout_non_regression"]["winner_calibration"]
winner_adversarial_family = payload["acceptance_gates"]["adversarial_holdout_non_regression"]["winner_family_health"]
winner_judge_summary = (judge_blind_winner or {}).get("judge_summary") or {}
winner_judge_family = payload["acceptance_gates"]["judge_blind_holdout_non_regression"]["winner_family_health"]
passed = passed and winner_adversarial_calibration is not None
passed = passed and winner_adversarial_family is not None
passed = passed and winner_adversarial_family.get("family_count", 0) >= 2
passed = passed and winner_judge_summary.get("agreement_rate") is not None
passed = passed and winner_judge_family is not None
passed = passed and winner_judge_family.get("family_count", 0) >= 2
passed = passed and len(payload.get("candidates", [])) >= 3
return {
"name": case["name"],
"passed": passed,
"returncode": proc.returncode,
"summary": payload["summary"],
"winner_label": winner["label"],
"winner_tokens": winner["estimated_tokens"],
"current_tokens": current["estimated_tokens"],
"baseline_tokens": baseline["estimated_tokens"] if baseline else None,
"winner_blind_holdout_total_errors": total_errors(blind_winner) if blind_winner else None,
"winner_judge_blind_holdout_total_errors": total_errors(judge_blind_winner) if judge_blind_winner else None,
"winner_judge_blind_agreement_rate": winner_judge_summary.get("agreement_rate"),
"winner_adversarial_holdout_total_errors": total_errors(adversarial_winner) if adversarial_winner else None,
"winner_adversarial_risk_band": winner_adversarial_calibration.get("risk_band") if winner_adversarial_calibration else None,
}
def main() -> None:
results = [run_case(case) for case in CASES]
report = {"ok": all(result["passed"] for result in results), "cases": results}
print(json.dumps(report, ensure_ascii=False, indent=2))
if not report["ok"]:
raise SystemExit(2)
if __name__ == "__main__":
main()