from __future__ import annotations import argparse import json from pathlib import Path HTML_TEMPLATE = """ LedgerShield v2 Before/After

LedgerShield v2 Before / After

{cards}
""" def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Render a simple before/after metric card page") parser.add_argument("--before", required=True) parser.add_argument("--after", required=True) parser.add_argument("--output", required=True) return parser.parse_args() def load(path: str) -> dict: return json.loads(Path(path).read_text(encoding="utf-8")) def metric_card(label: str, before: float, after: float) -> str: return ( '
' f'
{label}
' f'
{before:.3f} → {after:.3f}
' "
" ) def main() -> None: args = parse_args() before = load(args.before) after = load(args.after) metrics = [ ( "Control-Satisfied Resolution", float(before["public_benchmark"]["control_satisfied_resolution_rate"]), float(after["public_benchmark"]["control_satisfied_resolution_rate"]), ), ( "Institutional Utility", float(before["public_benchmark"]["institutional_utility_stats"]["mean"]), float(after["public_benchmark"]["institutional_utility_stats"]["mean"]), ), ( "Unsafe Release Rate", float(before["public_benchmark"]["unsafe_release_rate"]), float(after["public_benchmark"]["unsafe_release_rate"]), ), ( "Holdout Mean", float(before["holdout_challenge"]["score_stats"]["mean"]), float(after["holdout_challenge"]["score_stats"]["mean"]), ), ] html = HTML_TEMPLATE.format(cards="\n".join(metric_card(label, b, a) for label, b, a in metrics)) Path(args.output).write_text(html, encoding="utf-8") if __name__ == "__main__": main()