teleo-infrastructure/scripts/run_leo_m3taversal_oos_handler_suite.py
2026-07-13 12:37:08 +02:00

139 lines
5.8 KiB
Python
Executable file

#!/usr/bin/env python3
"""Run and score the read-only m3taversal out-of-sample suite on the live VPS handler."""
from __future__ import annotations
import argparse
import json
import uuid
from datetime import datetime, timezone
from pathlib import Path
from typing import Any
import run_leo_direct_claim_handler_suite as handler
import working_leo_m3taversal_oos_benchmark as benchmark
ROOT = Path(__file__).resolve().parents[1]
REPORT_DIR = ROOT / "docs" / "reports" / "leo-working-state-20260709"
RESULTS_JSON = REPORT_DIR / "telegram-handler-m3taversal-oos-suite-current.json"
SCORE_JSON = REPORT_DIR / "telegram-handler-m3taversal-oos-suite-score-current.json"
SCORE_MARKDOWN = REPORT_DIR / "telegram-handler-m3taversal-oos-suite-score-current.md"
def write_score_markdown(path: Path, report: dict[str, Any]) -> None:
score = report["score"]
lines = [
"# Working Leo m3taversal Out-of-Sample Score",
"",
f"Generated UTC: `{report['generated_at_utc']}`",
f"Pass: `{score['pass']}`",
f"Prompts: `{score['passes']}/{score['expected_prompt_count']}`",
f"DB counts changed: `{report['db_counts_changed']}`",
f"Service unchanged: `{report['service_unchanged']}`",
f"Temporary profile removed: `{report['temp_profile_removed']}`",
f"Database context injections: `{report['database_context_injection_count']}`",
f"Database context all OK: `{report['database_context_all_ok']}`",
f"Posted to Telegram: `{report['posted_to_telegram']}`",
"",
"## Prompt Scores",
"",
]
for item in score["scores"]:
lines.append(f"- `{item['prompt_id']}` / `{item['dimension']}`: `pass={item['pass']}`")
lines.extend(
[
"",
"## Claim Ceiling",
"",
"A pass proves broad out-of-sample and same-session-memory behavior through the live VPS GatewayRunner "
"using a temporary profile, with no Telegram post and no DB count change. It does not prove human-visible "
"Telegram delivery, production DB apply, or GCP parity.",
"",
]
)
path.write_text("\n".join(lines), encoding="utf-8")
def build_score_report(report: dict[str, Any], *, memory_token: str) -> dict[str, Any]:
score = benchmark.score_results(report.get("results") or [], memory_token=memory_token)
service_unchanged = bool((report.get("service_before_after") or {}).get("unchanged_from_preexisting_live_readback"))
return {
"generated_at_utc": datetime.now(timezone.utc).isoformat(),
"mode": "working_leo_m3taversal_out_of_sample_live_vps_handler_score",
"source_results_json": str(RESULTS_JSON),
"memory_token": memory_token,
"score": score,
"db_counts_changed": report.get("db_counts_changed"),
"service_unchanged": service_unchanged,
"temp_profile_removed": report.get("temp_profile_removed"),
"database_context_injection_count": report.get("database_context_injection_count"),
"database_context_all_ok": report.get("database_context_all_ok"),
"posted_to_telegram": report.get("posted_to_telegram"),
"production_db_apply_ran": False,
}
def score_report_passes(report: dict[str, Any], score_report: dict[str, Any]) -> bool:
return bool(
report.get("remote_returncode") == 0
and report.get("pass_runtime") is True
and report.get("db_counts_changed") is False
and score_report["service_unchanged"]
and report.get("temp_profile_removed") is True
and report.get("database_context_all_ok") is True
and int(report.get("database_context_injection_count") or 0) >= len(report.get("results") or [])
and report.get("posted_to_telegram") is False
and score_report["score"]["pass"]
)
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"--score-existing",
action="store_true",
help="Rescore the retained live transcript without making another remote model call.",
)
args = parser.parse_args()
if args.score_existing:
report = json.loads(RESULTS_JSON.read_text(encoding="utf-8"))
previous_score = json.loads(SCORE_JSON.read_text(encoding="utf-8"))
memory_token = str(previous_score["memory_token"])
else:
memory_token = "demo-ledger-" + uuid.uuid4().hex[:8]
prompts = [
{"id": prompt["id"], "dimension": prompt["dimension"], "message": prompt["message"]}
for prompt in benchmark.prompt_catalog(memory_token)
]
remote = handler.run_remote(
prompts=prompts,
suite_mode="live_vps_gatewayrunner_temp_profile_m3taversal_out_of_sample_suite",
report_prefix="leo-m3taversal-oos-handler-report",
prompt_note="Broad out-of-sample m3taversal prompts plus randomized memory and participant-identity checks.",
)
report = handler.write_output(remote, output_json=RESULTS_JSON)
score_report = build_score_report(report, memory_token=memory_token)
SCORE_JSON.write_text(json.dumps(score_report, indent=2, sort_keys=True) + "\n", encoding="utf-8")
write_score_markdown(SCORE_MARKDOWN, score_report)
safe_pass = score_report_passes(report, score_report)
print(
json.dumps(
{
"results_json": str(RESULTS_JSON),
"score_json": str(SCORE_JSON),
"score_markdown": str(SCORE_MARKDOWN),
"pass": safe_pass,
"prompts": f"{score_report['score']['passes']}/{score_report['score']['expected_prompt_count']}",
"rescored_existing": args.score_existing,
},
indent=2,
sort_keys=True,
)
)
return 0 if safe_pass else 1
if __name__ == "__main__":
raise SystemExit(main())