Skip to content

EvalPort adapter for ClawBench's run-meta.json / rescore-summary.json results #322

Description

@adhabnr-ux

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestquestionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions