Contributing Benchmark Results¶
Thank you for contributing to the BenchBox community results dataset! Community-submitted results help everyone compare platforms on real workloads and grow the benchmark coverage.
Prerequisites¶
Install BenchBox - follow the Getting Started guide
Run a benchmark - you need a complete benchmark result to submit
Step-by-Step Submission Flow¶
1. Run a benchmark¶
Run a complete benchmark suite (not a cherry-picked subset of queries):
Install the platform extra first in your project environment (for example,
uv add benchbox --extra duckdb).
uv run -- benchbox run --platform duckdb --benchmark tpch --scale 0.01
The result JSON is written to benchmark_runs/results/.
Optional companion files may be written next to the result JSON. Add
--capture-plans on supported platforms to create <result>.plans.json.
The --tuning flag accepts notuning (default), tuned, auto, or a
path to a YAML config; use tuned, auto, or a YAML path only for
intentionally tuned submissions, which create <result>.tuning.json
when tuning clauses are applied. benchbox submit packages either
companion automatically when it sits next to the result JSON, so missing
companion files do not make a default submission incomplete.
2. Package the submission¶
Use uv run -- benchbox submit to create a submission package:
# Package the most recent result
uv run -- benchbox submit --last --output ./submission
# Show exact result paths if you need to choose a specific run
# (--paths writes one path per line to stdout, safe to pipe to xargs)
uv run -- benchbox results --paths --limit 25
# Or specify a result file directly
uv run -- benchbox submit benchmark_runs/results/tpch_sf001_duckdb_20260401_120000.json --output ./submission
# Preview what would be packaged (no files written)
uv run -- benchbox submit --last --dry-run
This creates a submission/ directory containing:
File |
Description |
|---|---|
|
The canonical schema-v2 result bundle |
|
Optional query execution plans from |
|
Optional tuning details from an intentionally tuned run |
|
Metadata: hash, benchmark, platform, contributor |
|
PR instructions (for reference) |
The manifest’s submitted_by field defaults to your git config user.name.
If that is empty (e.g. a fresh sandbox or CI runner), benchbox submit warns
and writes the field as "". Override with --submitted-by "Your Name" if
you prefer not to set git config or want a different attribution.
3. Fork and open a PR¶
Fork the BenchBox repository on GitHub (or use your existing fork)
Copy the contents of
submission/bundle/intoresults-data/bundles/in your forkCopy
submission/<result>.manifest.jsonalongside the bundle files (the per-bundle manifest filename inherits the bundle stem so two contributors submitting the same week cannot collide)Regenerate the inventory before you commit:
uv run -- python scripts/generate_corpus_inventory.py --write
Commit and open a pull request against the
published-resultsbranch ofjoeharris76/BenchBox(the public repository)
Use this PR title format:
results: <benchmark> <platform> sf<scale>
Example: results: tpch DuckDB sf1.0
4. CI validation¶
When your PR is opened, the Validate Submission workflow runs automatically. It checks:
Schema compliance - the bundle is valid schema-v2 JSON with all required fields
Hash verification - the SHA-256 hash in the manifest matches the bundle contents
Sanity checks - no all-zero timings, no negative durations, valid platform/benchmark names
Metadata extraction - a summary comment is posted on the PR showing what the submission adds
If validation fails, the PR comment will explain what to fix. The workflow also
checks that results-data/corpus-inventory.json matches the submitted bundles.
If that check fails, rerun:
uv run -- python scripts/generate_corpus_inventory.py --write
5. Review and merge¶
A maintainer reviews the submission for quality and environment consistency. Once approved and merged into published-results, the bundle enters the public corpus. The results explorer is designed to build and deploy from main (not from published-results directly) via the docs CI workflow, so once that deploy path is live, a merged submission would appear on the site at the next release rather than immediately. Pre-launch caveat: release-cut currently strips results-explorer/ and results-data/ out of every release branch, so the main-deployed site is not live yet — see docs/operations/results-phase-2-runbook.md for the current state. Until that changes, treat benchbox.dev/results/ as a develop-built preview rather than a guarantee that your merged submission will appear there.
What Makes a Good Submission¶
Complete benchmark suite - run the full query set, not a cherry-picked subset
Stable environment - run on a dedicated machine or instance, not a shared laptop under load
Default configuration - unless you’re specifically benchmarking a tuned configuration, use defaults
Reproducible - include enough environment metadata that someone else could replicate the run
Honest results - don’t hand-optimize queries or cherry-pick favorable runs
Trust Labels¶
Results in the explorer carry trust labels:
Label |
Meaning |
|---|---|
Maintainer Run |
Generated by BenchBox CI or project maintainers |
Community Submission |
Contributed via PR from an arms-length community member |
Vendor Supplied |
Produced by the platform vendor itself; applied by maintainers, never self-asserted |
CI |
Generated by automated CI pipelines |
Local |
Local/development runs |
Community submissions are labeled “Community” in the explorer to distinguish
them from maintainer-curated results. Vendor Supplied results appear in
ranked tables (unlike community submissions) but always carry the distinct
vendor badge, because the platform vendor has a direct interest in the outcome.
You cannot self-apply the vendor label through a community PR. The label is
derived from a bundle living under results-data/bundles/vendor/, and the
submission CI (validate-submission.yml) rejects any pull request from a
non-maintainer that adds files under that path. Community submissions belong in
results-data/bundles/ (not vendor/); maintainers place and review vendor
results.
Funding Disclosure¶
Independent of who produced a result, you may disclose how the run was funded. This is optional and orthogonal to the trust label (a community run can be on a free trial; a vendor result can be employer-funded).
Funding value |
Meaning |
|---|---|
|
Paid for by your employer |
|
Paid for out of pocket |
|
Free trial or promotional credits |
|
The platform vendor paid for or sponsored the run |
|
Research or institutional grant |
|
Not disclosed (the default) |
Quality Expectations¶
Submissions that don’t meet these criteria may be asked for revisions:
Full query coverage - all queries in the benchmark must be included
No synthetic data - results must come from actual benchmark execution
Reasonable timings - query durations should be plausible for the platform and scale factor
Valid metadata - benchmark ID, platform name, and scale factor must match known values
Schema v2 format - BenchBox currently writes top-level
version"2.1". Public submission validation accepts numeric2.xversions for forward-compatible schema-v2 bundles, but rejects missing or malformed values. To check your bundle:uv run -- python -c "import json; print(json.load(open('bundle.json'))['version'])"
Running Validation Locally¶
You can validate your bundle before opening a PR. Run validation through
uv run -- python so it uses the same environment as BenchBox.
# Validate a specific bundle
uv run -- python scripts/validate_submission.py path/to/result.json
# Validate all bundles in a directory
uv run -- python scripts/validate_submission.py results-data/bundles/
# Verify the inventory is current before you open the PR
uv run -- python scripts/generate_corpus_inventory.py --check
If you use pre-commit locally, install the hooks once so inventory drift is checked automatically:
pre-commit install
If this clone installed hooks before BenchBox added its pre-push timing-policy
stage, re-run pre-commit install once so the pre-push hook is installed too.
Questions?¶
Open an issue or start a discussion.
Maintainers: see Phase 2 Results Operations Runbook.