Hi — I maintain EvalPort (https://github.com/adhabnr-ux/evalport), a small open interchange spec + SDK (evalport-sdk on PyPI, openeval.validate.validate_suite() / validate_result_set()) for making per-example eval results portable across benchmarks and tools — one shared JSON shape a result can round-trip through instead of every consumer writing its own converter.
I read through docs/scoring.md and the runner (src/clawbench/runner/run_support/metadata.py, src/clawbench/runner/judge.py). ClawBench already produces a clean per-task record once a run finishes. make_run_meta() writes run-meta.json with instruction, model, harness, intercepted, result_category, failure_category, adjusted_eligible, and — per docs/scoring.md — the two-stage scoring result gets merged in as judge_match and final_pass (final_pass = intercepted AND judge_match). A batch rolls these up into rescore-summary.json with n_total, n_intercepted, n_judge_match, pass_rate_with_judge, and a tasks: [...] list of per-task records.
That per-task record (instruction as input, final_pass as pass/fail, intercepted/judge_match/result_category as metadata) maps directly onto an EvalPort result set. And since ClawBench already ships import-side adapters the other direction (clawbench-harbor-adapt, clawbench-edgebench-adapt in pyproject.toml's [project.scripts]), an EvalPort adapter would be a natural export-side complement for anyone comparing a ClawBench run against results from another agent benchmark.
Sketch, reading a rescore-summary.json:
# clawbench-openeval-adapter/src/clawbench_openeval_adapter/__init__.py
import json
from pathlib import Path
from openeval.validate import validate_result_set
def to_openeval(rescore_summary_path: str, suite_id: str) -> dict:
summary = json.loads(Path(rescore_summary_path).read_text())
examples = []
for task in summary["tasks"]:
examples.append({
"id": task.get("test_case"),
"input": task.get("instruction"),
"passed": task.get("final_pass"),
"metadata": {
"intercepted": task.get("intercepted"),
"judge_match": task.get("judge_match"),
"result_category": task.get("result_category"),
"model": task.get("model"),
"harness": task.get("harness"),
},
})
result_set = {"suite_id": suite_id, "examples": examples}
validate_result_set(result_set)
return result_set
I pulled test_case/instruction/model/harness/intercepted/result_category directly from make_run_meta() and judge_match/final_pass from the JSON shown in docs/scoring.md, but I haven't run clawbench-rescore myself, so I'd confirm the exact per-task keys inside rescore-summary.json["tasks"] against a real summary file before opening a PR — happy to also pull judge.reason from data/judge.json per-run as a rationale field if that's preferred over whatever's flattened into the summary.
I'd build this as adapters/clawbench-openeval-adapter/ (standalone package, pyproject.toml depending on evalport-sdk + the pinned self-referencing extra convention from Discussion #13, tests, README — zero footprint on clawbench-eval itself) and submit it as a PR. Let me know if useful, or if there's a preferred internal export point instead.
— Sahi (independent contributor, not affiliated with TIGER-AI-Lab)
Hi — I maintain EvalPort (https://github.com/adhabnr-ux/evalport), a small open interchange spec + SDK (
evalport-sdkon PyPI,openeval.validate.validate_suite()/validate_result_set()) for making per-example eval results portable across benchmarks and tools — one shared JSON shape a result can round-trip through instead of every consumer writing its own converter.I read through
docs/scoring.mdand the runner (src/clawbench/runner/run_support/metadata.py,src/clawbench/runner/judge.py). ClawBench already produces a clean per-task record once a run finishes.make_run_meta()writesrun-meta.jsonwithinstruction,model,harness,intercepted,result_category,failure_category,adjusted_eligible, and — perdocs/scoring.md— the two-stage scoring result gets merged in asjudge_matchandfinal_pass(final_pass = intercepted AND judge_match). A batch rolls these up intorescore-summary.jsonwithn_total,n_intercepted,n_judge_match,pass_rate_with_judge, and atasks: [...]list of per-task records.That per-task record (
instructionas input,final_passas pass/fail,intercepted/judge_match/result_categoryas metadata) maps directly onto an EvalPort result set. And since ClawBench already ships import-side adapters the other direction (clawbench-harbor-adapt,clawbench-edgebench-adaptinpyproject.toml's[project.scripts]), an EvalPort adapter would be a natural export-side complement for anyone comparing a ClawBench run against results from another agent benchmark.Sketch, reading a
rescore-summary.json:I pulled
test_case/instruction/model/harness/intercepted/result_categorydirectly frommake_run_meta()andjudge_match/final_passfrom the JSON shown indocs/scoring.md, but I haven't runclawbench-rescoremyself, so I'd confirm the exact per-task keys insiderescore-summary.json["tasks"]against a real summary file before opening a PR — happy to also pulljudge.reasonfromdata/judge.jsonper-run as a rationale field if that's preferred over whatever's flattened into the summary.I'd build this as
adapters/clawbench-openeval-adapter/(standalone package,pyproject.tomldepending onevalport-sdk+ the pinned self-referencing extra convention from Discussion #13, tests, README — zero footprint onclawbench-evalitself) and submit it as a PR. Let me know if useful, or if there's a preferred internal export point instead.— Sahi (independent contributor, not affiliated with TIGER-AI-Lab)