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
Community submissions must include a manifest, execute at least one query, and
report summary.validation=passed with no failed measurement evidence.
Truthful partial results are accepted only from the trusted maintainer mirror
path and remain excluded from rankings.
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
complete Phase 2 archive. It does not automatically enter develop or the
curated static Explorer snapshot.
Maintainer-run refreshes are monthly via .github/workflows/seed-corpus.yml
(see docs/operations/corpus-refresh.md). That
path is not a substitute for community benchbox submit PRs.
The Results Explorer is not built directly from published-results; the documented docs.yml workflow builds on the curated release path and deploys only after a protected push to release. The Explorer is a curated preview, not a broad leaderboard claim. See docs/operations/results-phase-2-runbook.md for the publication path and launch evidence.
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.2". 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.