Publishing
A benchmark is a registry artifact like an agent, a module, or a cognet.
axon publish
✓ Published @you/parser-bench@0.1.0 (public)
run it with `axon clone @you/parser-bench`
What ships is the definition — config, tests, workspace. Not the results.
Why results are not part of the artifact
A run's observations belong to whoever spent the tokens producing them. Publishing a benchmark says here is an experiment you can run; publishing a score says here is what I measured. They are different claims, and bundling them would make the second one unavoidable.
It also keeps the artifact honest. A benchmark whose published form included its author's numbers would quietly become a leaderboard where the author always ran first, on their hardware, with their models.
What gets included
my-bench/
├── workspace/ ✓ the world, so the task is reproducible
├── fixtures/ ✓ rubrics and expected outputs
├── tests/ ✓ the scenarios
├── bench.config.ts ✓ matrix, schema, setup
├── package.json ✓ identity and engine dependencies
└── .bench/runs/ ✗ your run history stays local
workspace/ ships because the world is the task. A benchmark that told you to supply
your own repository would not be the same benchmark twice.
Running someone else's
axon clone @you/parser-bench
cd parser-bench
axon bench prepare
axon bench run
Their scenarios, their workspace, their measurement schema — against whatever matrix you
declare. Swap the models for the ones you care about, point the agent axis at your own
project, and the numbers you get are comparable with theirs because everything except what
you deliberately varied is identical.
Comparability
Results carry a manifest, and the manifest carries hashes: the benchmark's content, the measurement schema, the workspace, the harness version, and a pin for every axis — including the ones held constant.
That is what decides whether two results can be compared at all. Same benchmark, same schema, same workspace, compatible harness: comparable. Anything else and the results describe different experiments that happen to share a name.
Which is why bumping the version matters when what you measure changes, not only when the code does:
npm version minor
axon publish
A benchmark that redefined resolved without a version bump would let old and new numbers
land in the same aggregate. That is worse than having no aggregate — a wrong comparison is
harder to notice than a missing one.
Visibility
axon publish # private — you and your org
axon publish --public # listed in the registry
Private is the default. A benchmark measuring something specific to your product is often exactly the benchmark you want, and exactly the one nobody else needs.
Writing a README
The registry shows it, and for a benchmark it carries weight the code cannot:
- What this measures, in one sentence
- Why the task is representative — why this bug, this repo, this prompt
- Known limitations — what it does not tell you
- Suggested trials — how many runs before the numbers mean anything
The last one is worth stating explicitly. Someone cloning a benchmark will run it with
whatever trials you shipped, and a default of 1 published without comment quietly invites
a single-sample result to be treated as a finding.