Datasheet
Following Datasheets for Datasets (Gebru et al., 2018), the standard disclosure format for machine-learning datasets. Why the data exists, what is in it, how it was collected, what it is for, and where its limits lie.
Every figure in this document is generated from oracles.jsonl by
make_datasheet.py, so it cannot drift away from the data it describes. Snapshot
taken 2026-08-19: 896 records from 352 projects.
Claims that a reader cannot check against the corpus or against the public commits it cites have been left out of this document, including figures for mining throughput and cost. Those describe our pipeline rather than this dataset, and the pipeline is not published.
A held-out portion exists and is not published. Projects are assigned to the public release or to a held-out set, and a project's records are all on one side, so nothing here can be used to reconstruct what is withheld. This is stated plainly because a public evaluation set is contaminated the moment it is public, and a reader should know that a disjoint uncontaminated set exists rather than discovering it later. Everything released here stays released and is never withdrawn.
Motivation
Why was it created? Evaluating a coding agent requires knowing the right answer in a form a machine can check without a human in the loop. Goldset supplies that: real defects, the fixes their authors wrote, and the tests that tell the two apart.
Who created it? Goldset (goldset.dev). Mined from public repositories. No
defect, fix or test in this corpus was authored by us.
Composition
What is an instance? A record holds the broken code, the fixed code, and a machine-runnable test that fails against the first and passes against the second.
There are 896 records drawn from 352 projects, all Python, with fixes committed between 2010-06-13 and 2026-08-17.
| field | meaning |
|---|---|
id, fingerprint |
stable identity; the fingerprint deduplicates across re-runs and vendored copies |
repo, repo_url, license, license_file |
the source project and the licence it was read under |
commit, parent, commit_url |
the fix and the state it was broken in, permanently linkable |
committed_at, parent_at |
dates of both, for filtering against a training cutoff |
subject |
the author's own commit message, unedited |
module, unit, units_changed |
the importable path, the unit under test, and every unit the commit touched |
granularity, spec_source |
whether the record is one function or one file, and where its specification came from |
spec |
the documented behaviour of the code under test |
source_before, source_after |
the code before and after the fix |
test_file, fail_to_pass |
the test file and the exact pytest node ids that flip |
validated_at, validator |
audit trail |
unit is empty on file-level records, where no single function was isolated.
Two granularities. 355 records isolate one changed function together
with its docstring as the specification. The remaining 541 keep the whole
changed file and use the commit message as the specification instead. The
granularity field says which, so consumers who want only the tighter kind can
filter. Defects spanning multiple source files are discovered but not extracted, so
the corpus is biased toward localised, unit-testable defects.
Sampling. Not a random sample of bugs. It is the subset of real fixes that shipped a regression test in the same commit, touched a single source file, and could be reduced either to one documented unit or to one whole file whose test still flips. Use it as an evaluation set, not as an estimate of how defects are distributed in production software.
Concentration. The largest single project contributes 3% of the
corpus and the ten largest contribute 20% between them, so no small group
of projects dominates. An earlier version of this datasheet described the yield as
following a power law, which these figures do not support. Per-project counts are
published in ATTRIBUTION.md so the distribution can be checked directly.
Licence distribution.
| licence | records | share |
|---|---|---|
| MIT | 629 | 70.2% |
| Apache-2.0 | 117 | 13.1% |
| BSD-3-Clause | 81 | 9.0% |
| BSD-2-Clause | 64 | 7.1% |
| PSF-2.0 | 4 | 0.4% |
| ISC | 1 | 0.1% |
Confidential or offensive content? Public source code from permissively licensed projects only. No commit metadata about authors is stored: no record carries a commit author name, email or login.
Source code itself is reproduced byte for byte, and 74 records contain an email address that the project's own authors wrote into their source, usually a maintainer contact in a module header. Those addresses are already public in the repositories cited and are not extracted, indexed or collected by us, but they are present in the text, and an earlier version of this datasheet implied otherwise. If you maintain a project here and want an address removed, write to andy@goldset.dev or open an issue.
Collection
Collection is entirely by program. No language model is involved at any stage, and no human judges whether a change is a fix.
- Read a project's commit history for changes that touched source and test files in the same commit, excluding documentation, style, refactor and revert commits.
- Check the licence before cloning in full, so projects outside the allow-list never enter the pipeline.
- Materialise the parent tree and the fix tree, then overlay the fix commit's test files onto the parent tree, so the same test runs against both states.
- Run the tests the fix commit added against both trees. Keep the candidate only if they fail on the parent and pass on the fix.
- Isolate the single changed function with its docstring where the fix allows it, and otherwise keep the whole changed file with the commit message as the specification.
Step 4 is the whole warrant. Validity is decided by execution rather than by us.
What step 4 checks, precisely. Only the tests the fix commit added are run, not the project's whole suite. A record therefore asserts that those tests fail on the parent and pass on the fix. It does not assert that the fix is globally correct, and a commit that repaired one thing while breaking another would not be caught. The benefit is that an unrelated failing test elsewhere in the file does not disqualify a genuine defect.
Independent re-verification. verify.py re-clones each project from scratch,
checks out both commits, re-applies the fix commit's tests and runs them again. It
reads only the published record and the project it cites, and re-derives the
result from the upstream repository.
Old projects are run under an interpreter that can import them, so a record from 2016 is not judged by whether it works on a current Python. The interpreter used is reported alongside the verdict. A record that cannot be run on a given machine is reported as skipped, never as a failure.
python3 verify.py --sample 20
Run it yourself. A SKIP means the test could not be executed on your machine, most
often because a project dependency is missing, and says nothing about the record. A
FAIL means a published record did not hold up and is worth an issue.
Preprocessing
Doctests are removed from every spec, including the expected output beneath each example, so a model cannot read the answer out of the documentation. An earlier version stripped only the prompt lines and left the expected output stranded, which was corrected and the affected records rewritten. Source is otherwise byte-identical to upstream. Nothing is paraphrased, reformatted or model-generated.
Uses
Intended. Evaluating code understanding and defect repair in models and agents, measuring the contribution of harness and scaffolding rather than the model alone, and research on automated program repair.
Out of scope. This is an evaluation corpus. It is not a training set, and it is not a representative sample of production defects.
What passing does not mean. A model that makes the recorded test pass has made the recorded test pass. It has not been shown to have fixed the program correctly.
Contamination. Every record comes from a public repository and may already appear
in a model's pre-training data. Every record carries committed_at for the fix and
parent_at for the broken state, so the corpus can be cut at any training cutoff.
Report the date window you evaluated on.
| window | records | share |
|---|---|---|
| Committed in 2026 | 228 | 25% |
| Committed in 2025 or later | 296 | 33% |
| Committed in 2024 or later | 359 | 40% |
| Committed before 2024 | 537 | 60% |
Because mining is continuous rather than a single snapshot, the portion of the corpus that postdates any given cutoff grows over time instead of decaying.
Distribution and licensing
Two layers, deliberately separated.
Source excerpts remain under the licence of the project they came from. Every
record names its licence and the file that licence was read from, and links the exact
upstream commit. Attribution for every project is in ATTRIBUTION.md, regenerated
whenever the corpus changes, and the full text of each project's licence as it stood
at the commit cited is included under licenses/, since MIT, BSD and Apache-2.0
condition redistribution on the notice travelling with the code rather than on a link
to it. A project whose licence text could not be retrieved has its records withheld.
The added layer, meaning the validation results, the schema, the fingerprints and the selection and arrangement of records, is released under CC BY 4.0.
Only licences on an explicit allow-list are shipped. Anything ambiguous is withheld rather than guessed at.
If you maintain a project here and want it removed, write to andy@goldset.dev or open an issue, and it will be dropped, no questions asked. The address is given as well as the issue tracker so the request works even if you would rather not do it in public.
Maintenance
Mined continuously. The corpus is append-only and deduplicated by fingerprint. Records are not silently edited: a correction is a new record, except where a defect in our own extraction required rewriting a field, which is recorded below.
Errata. Defects found in the corpus itself are published rather than quietly fixed.
- Specs derived from docstrings originally retained the expected output of doctests after the prompt lines were stripped. For functions defined by their examples this disclosed part of the answer. Corrected 2026-08-18, and 84 affected records were rewritten in place.
ATTRIBUTION.mdcredited only 197 of the then 386 projects for a period, because it was regenerated on the mining host rather than where the corpus was assembled. Corrected, and it is now rewritten on every change to the corpus.- A fix that changes only an error message, while both versions raise the same exception type, cannot always be distinguished by a single test expression.
- "No known defect" means the project's own tests passed at that commit. It is not a proof of correctness.