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()