"""
]
for r in results:
outcome = r.get("outcome", {})
traj = r.get("trajectory_efficiency", {})
o_icon, o_cls = verdict_icon(outcome.get("passed"))
t_icon, t_cls = verdict_icon(traj.get("passed"))
is_skipped = r.get("status") == "skipped"
human = r.get("requires_human", False)
human_badge = "
human" if human else ""
env_text = html.escape(r.get("environment", ""))
state_text = html.escape(r.get("authsome_state", ""))
prompt_text = html.escape(r["prompt"])
name_text = html.escape(r.get("name", r["prompt"]))
agent_text = html.escape(r.get("agent", "claude"))
if is_skipped:
body_rows = (
"
"
"skipped"
""
"Rate limit hit — switch model and retry"
"
"
)
else:
o_evidence = html.escape(outcome.get("evidence", ""))
t_evidence = html.escape(traj.get("evidence", ""))
body_rows = f"""
outcome
{o_evidence}
trajectory
{t_evidence}
"""
parts.append(f"""
prompt
{prompt_text}
environment
{env_text}
authsome state at start
{state_text}
{body_rows}
""")
parts.append("""
""")
return "".join(parts)
def main() -> None:
parser = argparse.ArgumentParser(description="Generate HTML report from grading.json")
parser.add_argument("grading_json", help="Path to grading.json")
parser.add_argument(
"-o",
"--output",
default=None,
help="Output HTML path (default: report.html next to grading.json)",
)
args = parser.parse_args()
grading_path = Path(args.grading_json)
data = json.loads(grading_path.read_text())
html_out = Path(args.output) if args.output else grading_path.parent / "report.html"
html_out.write_text(generate_html(data))
print(f"Report written to {html_out}")
subprocess.run(["open", str(html_out)], check=False)
if __name__ == "__main__":
main()