Files
m2pack-secure/scripts/validate_runtime_gate.py
server 1f1b48f4db
Some checks failed
ci / headless-e2e (push) Has been cancelled
Add audio runtime validation and CI workflow
2026-04-14 18:39:57 +02:00

103 lines
3.1 KiB
Python
Executable File

#!/usr/bin/env python3
from __future__ import annotations
import argparse
import json
import subprocess
import sys
from pathlib import Path
from known_issues import default_known_issues_path
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Run the scenario validators with the shared runtime known-issues baseline."
)
parser.add_argument(
"--runtime-root",
type=Path,
required=True,
help="Client runtime root containing assets/.",
)
parser.add_argument(
"--known-issues",
type=Path,
default=None,
help="Optional known issues baseline JSON. Defaults to repo known_issues/runtime_known_issues.json.",
)
parser.add_argument(
"--strict-known-issues",
action="store_true",
help="Fail when the known-issues baseline contains stale entries not observed anymore.",
)
parser.add_argument(
"--json",
action="store_true",
help="Emit JSON output.",
)
return parser.parse_args()
def run_validator(script_path: Path, runtime_root: Path, known_issues: Path, strict_known_issues: bool) -> dict:
cmd = [
sys.executable,
str(script_path),
"--runtime-root",
str(runtime_root),
"--known-issues",
str(known_issues),
"--json",
]
if strict_known_issues:
cmd.append("--strict-known-issues")
completed = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if completed.returncode not in (0, 1):
raise RuntimeError(
f"{script_path.name} failed unexpectedly with rc={completed.returncode}: {completed.stderr or completed.stdout}"
)
return json.loads(completed.stdout)
def main() -> int:
args = parse_args()
runtime_root = args.runtime_root.resolve()
known_issues = (args.known_issues.resolve() if args.known_issues else default_known_issues_path(__file__))
script_dir = Path(__file__).resolve().parent
validators = {
"world": script_dir / "validate_runtime_scenarios.py",
"actor": script_dir / "validate_actor_scenarios.py",
"effect": script_dir / "validate_effect_scenarios.py",
"audio": script_dir / "validate_audio_scenarios.py",
}
results = {
name: run_validator(script_path, runtime_root, known_issues, args.strict_known_issues)
for name, script_path in validators.items()
}
ok = all(result["ok"] for result in results.values())
summary = {
"ok": ok,
"runtime_root": str(runtime_root),
"known_issues_path": str(known_issues),
"validators": results,
}
if args.json:
print(json.dumps(summary, indent=2))
else:
print(f"ok={ok}")
for name, result in results.items():
print(
f"{name}: ok={result['ok']} unexpected={len(result.get('unexpected_issue_ids', []))} "
f"known={len(result.get('known_issue_ids', []))} stale={len(result.get('stale_known_issue_ids', []))}"
)
return 0 if ok else 1
if __name__ == "__main__":
sys.exit(main())