Artificial Wasteland artwaste.land

How a registered clinical trial primary outcome moved

7 of 7 conditions 10,099 rows · 1.5 MB · 5 files

10,099 trials sampled from ClinicalTrials.gov, one row each, describing whether the primary outcome the trial registered is still the primary outcome its record names, when it last changed, and what kind of change it was.

The files

FileRowsBytessha256
trials.csv 10,099 1,497,661 a13e56a61e88a48477d082fb3f6be9770499ab311e5a2cbcd6271ed60613bfbe
README.md n/a 3,974 d7a765459b4828514e7f4c3a037f09256e25fed6570dd14d4041ae293712942e
schema.json n/a 9,515 7ae6bfdbed2bc842482f48db8bd71924873013ca15e78d302f3824a0617c82f0
sources.json n/a 2,970 757c728a1eaea935f200421818a4829c06d1e9c039db7d1d7b0faa435e48889a
validate.mjs n/a 15,198 67aceadfaea1f0b4611fa24f550c1b648437f25fbf20f19bf864292700aa69a2

Take the folder and check it yourself: node validate.mjs in the downloaded directory re-runs every row against the schema and every file against the digest above, with no dependencies and no network. The dataset's own full account is README.md.

A row, field by field

Origin is the column that decides whether we may give a field away at all. built is ours; redistributed is a source's own content, and it may only ship where that source's licence permits it.

FieldTypeOriginWhat it is
nct_id string redistributed The registry identifier. Resolves at https://clinicaltrials.gov/study/<nct_id>.
study_status string redistributed Overall recruitment status as the registry records it, e.g. COMPLETED, TERMINATED, UNKNOWN.
funder_type string redistributed The registry's funder class: INDUSTRY, NIH, OTHER_GOV, NETWORK, OTHER, or empty.
phases string redistributed The registry's phase string, e.g. PHASE3 or PHASE2|PHASE3, or NA where phase does not apply.
primary_completion_date_recorded string redistributed The primary completion date exactly as the registry prints it, which may be YYYY, YYYY-MM or YYYY-MM-DD.
primary_completion_date_resolved string built The same date resolved to the LAST day it could denote. Ours, and deliberately the conservative direction: it pushes the date later, which makes a change count as post-completion less often.
first_posted string redistributed Date the record first appeared publicly, resolved by the same rule.
results_first_posted string redistributed Date results were first posted, or empty if never.
prospectively_registered boolean built True where first_posted is on or before primary_completion_date_resolved. A trial first posted after its own primary completion never pre-specified anything in public.
versions integer built Number of versions in the registry's archive for this record.
first_version_date string redistributed Date of version 0.
last_version_date string redistributed Date of the most recent version in the snapshot.
admin_only_versions integer built Versions whose changed modules are all routine: study status, contacts and locations, identification, references, documents, sponsor, oversight.
has_primary_outcome_field boolean built False where the history endpoint reports no primary-outcome version index at all, which happens for records that never registered one. Such rows are excluded from every rate.
primary_outcome_changed boolean or string built True where the primary outcomes differ from the ones first registered. Empty where has_primary_outcome_field is false.
primary_outcome_change_version integer or string redistributed The registry's own version index at which primary outcomes were last changed.
primary_outcome_change_date string redistributed The date of that version.
changed_after_primary_completion boolean or string built True where primary_outcome_change_date is strictly after primary_completion_date_resolved.
days_from_primary_completion integer or string built Signed days from primary completion to the outcome change. Negative means before.
change_version_carried_results boolean or string built True where the version that changed the primary outcome also carried the results section, so the pre-specification and the results were filed together.
outcomes_update_count integer or string redistributed The registry's own count of outcome updates for this record.
n_primary_outcomes_original integer or string built How many primary outcome measures the first registration named.
n_primary_outcomes_current integer or string built How many the record names now.
change_kind string built COUNT_CHANGED (a measure was added or dropped), MEASURE_CHANGED (same count, a named measure no longer appears), DETAIL_ONLY (every named measure survives verbatim, only description or time frame moved), UNDECIDABLE, or empty where the trial did not change. The rule is research/the-outcome-that-changed/classify.mjs.
worst_title_dice number or string built For MEASURE_CHANGED rows, the lowest token-set Dice similarity between an original measure title and its closest current one. 1 is identical, 0 is disjoint.
enrollment_change_version integer or string redistributed Version at which the enrolment figure was last changed, where it changed.
enrollment_changed_after_primary_completion boolean or string built The control field. Recording actual enrolment after a trial ends is normal and required, so this is what an innocent post-completion edit looks like.
in_headline_set boolean built True for the completed, prospectively registered trials the published headline rate is computed on.

Where it came from, and how we know we may pass it on

ClinicalTrials.gov, the registry and its archive of record versions

U.S. National Library of Medicine, National Institutes of Health · https://clinicaltrials.gov/

Licence
ClinicalTrials.gov Terms and Conditions
How we know
publisher statement
Accessed
2026-09-04
Covers
The identifier, the status, funder and phase labels, the record dates, and the registry's own version indices and update count.

Read at https://clinicaltrials.gov/about-site/terms-conditions on 2026-09-04. The terms contemplate third-party distribution and attach four conditions, introduced with "In any publication or distribution of these data, you should": attribute the source as ClinicalTrials.gov, update the data such that they are current at all times, clearly display the date the data were processed by ClinicalTrials.gov, and state any modifications made to the content of the data. A frozen research snapshot cannot satisfy the currency clause literally; the mitigation is that this dataset states its processing date, states that it is frozen, and carries the identifier that resolves to the always-current record. The terms also note the data "carry an international copyright outside the United States and its Territories or Possessions" and that some of it "may be subject to the copyright of third parties", which is why no record text is redistributed here. Fetching used only the /api/int/ path that clinicaltrials.gov/robots.txt explicitly allows, at its stated Crawl-delay of 1.

The version arithmetic, the date resolution and the change classification

Artificial Wasteland · https://artwaste.land/strata/added-dropped-or-just-reworded/

Licence
CC0 1.0 Universal
How we know
publisher statement
Accessed
2026-09-04
Covers
Every field marked x-origin: built.

Ours to give: this project places its own derived fields in the public domain.

Required attributionSource: ClinicalTrials.gov. Processed 2026-09-04. This is a frozen snapshot and is NOT maintained current; each row carries an nct_id that links to the live registry entry, which is. Modifications: the registry's fields were reduced to the flags, dates and counts described in schema.json, partial dates were resolved to the last day they could denote, and the change_kind classification is this project's. No record text was altered and none is redistributed here. The version arithmetic and the classification are by the Artificial Wasteland, CC0 1.0.

The seven conditions, and what was measured

  1. Bytes 1 data file(s), 1,497,661 bytes, largest 1.4 MiB
  2. Shape 10,099 rows checked, 0 violation(s)
  3. Count 10,099 rows across 1 file(s), all counts agree
  4. Fixity 5 file(s) verified by sha256
  5. Provenance 2 source(s), each with a licence from the table
  6. Origin 28 field(s): 15 built here, 13 redistributed under a licence that permits it
  7. Rebuild research/data-room/emit/outcome-change-history.mjs (byte-equality proved by: node research/data-room/publish.mjs --check)

← every dataset, and the three we could not publish