Current version v0.2.5 — open for comment
Negative-Results Record: the schema
The current version is v0.2.5: a JSON Schema with controlled vocabularies and a validator, published at github.com/portolansoft/nrr and tested by encoding nine published studies end to end, five in biology and four in chemistry. It is open for comment and not a released specification. The v0.1 discussion sketch is kept in full below, because it is the text that was circulated and because nothing in it has been renamed. Send comments to [email protected].
Current version: v0.2.5, machine-readable
Version 0.2 turned this sketch into a JSON Schema with controlled vocabularies and a validator. Five rounds later, at v0.2.4, it had been tested by encoding nine published studies end to end, producing 49 records and 217 findings with zero validation errors. Nothing below has ever been renamed or removed. Twenty-nine things were added, and the count per study fell from twelve to eight to five to two across the biology studies, then 1, 0, 1 and 0 across four chemistry papers from the American Chemical Society. Version 0.2.5 (21 October 2026) added fourteen vocabulary terms and nothing structural, forced not by a study but by machine-proposed experiments on SAGE and NEJM papers that could not label a clinical trial, a cohort, a placebo or an active comparator; the changelog records them as forced by proposals rather than deposits. The fifth study was run as a pre-registered convergence test, with the pass criterion fixed before encoding and the study chosen to maximise the chance of failure; it passed with two changes, both single vocabulary terms, and the chemistry round added only two more. The four things that matter most:
- Three levels, not one. A path (a project) contains attempts (one experiment, one agent run, one analysis), and an attempt carries one or more findings, each with its own question, target, outcome class, controls and evidence. One real experiment answered six questions with four different outcome classes.
- Controls carry a kind, and the informativeness rule is code. A negative counts as evidence of absence only if a designated or internal positive control passed, the negative control was clean, and a sensitivity or power statement exists. Otherwise validation forces an
inconclusive-*class. A new class,inconclusive-no-positive-control, separates “absent” from “failed”. - Controls do not have to be reagents, and a refutation is judged differently. A control kind can be a task rather than a substance: a
known-positive-taskthe pipeline should manage, or anadversarial-labelit should not be able to predict. Andrefutedis exempt from the control requirement, because an affirmative refutation is judged on the refuting analysis, not on the controls of the run it overturns. Both came from a study whose only controls were computational. - Every stage names its performer. Which model synthesised, which judged, which wrote the judge’s prompt, which agent analysed the data, and which humans ran the bench.
The schema files, the change log with the reason for every change, and all nine converters live at github.com/portolansoft/nrr, with the published records at github.com/portolansoft/nrr-records. The pilot and what it taught us is written up on the Pilot page. The materials profile below has now met one real paper, a failed zeolite synthesis: three of its failure modes fired for the first time and one entity type, material, had to be added; the rest of the profile has still not been exercised, and no materials study with a deposited dataset has been encoded. The v0.1 text that follows is kept as the discussion draft it was sent out as.
Overview
The core record is domain-agnostic. Domain profiles supply the identifiers, vocabularies, and evidence rules for a field. Two profiles are drafted: materials and biology.
One record equals one attempt on one path. A record is distilled, not raw: raw trajectories, logs, and instrument files may be attached, but the record is legible and useful without them.
The serialization is an RO-Crate 1.2 profile whose activity structure follows W3C PROV. Records are signed, immutable, and versioned: a correction produces a new version that points at the one it supersedes. Records are private by default, with an embargo the depositor sets, and become citable on release. Version and retraction status of everything a record cites is re-checked at read time, not frozen at write time.
Field names below are working names. Type is given as the JSON-LD range. Cardinality: 1 required, 0..1 optional, 0..n repeatable.
Core record (sections A to H)
These eight sections apply to every record, in every field. A profile may require more; it may not contradict what is here.
A. Identity and provenance
Who or what produced this record, with what software, and under whose authority.
| Field | Type | Card. | Notes |
|---|---|---|---|
| @id | URI | 1 | Persistent identifier for the record. DataCite DOI on release; content address before release. |
| version | Text | 1 | Monotonic. A correction is a new version, never an edit in place. |
| dateCreated | DateTime | 1 | UTC, ISO 8601. |
| agent | prov:SoftwareAgent | 1..n | Model or system name, version, and provider. Aligns with OpenTelemetry gen_ai attributes. |
| operator | Person / Organization | 1 | The accountable depositor. ORCID and ROR where available. |
| softwareStack | SoftwareApplication | 0..n | Name, version, and commit for each component that produced the result. |
| runIdentifier | Text | 0..1 | W3C Trace Context trace_id of the originating run, if one exists. |
| license | URI | 1 | Terms under which the released record may be reused. |
B. Question
What the attempt was trying to establish, stated well enough that another agent can decide whether this record is about its question.
| Field | Type | Card. | Notes |
|---|---|---|---|
| question | Text | 1 | One sentence, in the domain’s own terms. |
| target | URI | 0..n | The object of the attempt: a composition, structure, compound, claim, or theorem. Identifier, not prose, where one exists. |
| hypothesis | Text | 0..1 | The proposition under test, if the attempt had one. |
| successCriteria | Text | 1 | What would have counted as a positive result. Required: without it, “negative” has no meaning. |
| pathType | Enum | 1 | literature, computation, experiment, mixed. |
C. Path
What was actually done, in the stages that apply. Every stage is a PROV activity with start and end times.
C1. Literature stage (follows PRISMA-S)
| Field | Type | Card. | Notes |
|---|---|---|---|
| sourcesSearched | Text / URI | 1..n | Each database or index, with platform and coverage dates. PRISMA-S items 1–4. |
| query | Text | 1..n | Full query string as run, per source. Verbatim, not paraphrased. |
| searchDate | DateTime | 1..n | Date each search was executed. |
| limits | Text | 0..n | Filters, language and date restrictions. PRISMA-S item 9. |
| supplementaryMethods | Text | 0..n | Citation chasing, contact with authors, preprint servers. PRISMA-S items 10–12. |
| recordsFound | Integer | 1 | Before deduplication. |
| deduplication | Text | 0..1 | Method and resulting count. PRISMA-S item 16. |
C2. Computation stage
| Field | Type | Card. | Notes |
|---|---|---|---|
| method | Text / URI | 1 | Level of theory, model, or algorithm. |
| code | SoftwareApplication | 1..n | Name, version, commit, and build environment. |
| inputs | URI | 1..n | Structures and datasets by identifier: OPTIMADE, Materials Project, ICSD, PubChem. |
| parameters | Object | 1 | Cutoffs, k-points, functionals, seeds, tolerances. |
| convergence | Object | 0..1 | Criteria and whether they were met. |
| resources | Object | 0..1 | Core-hours, GPU-hours, wall time. |
C3. Experiment stage
| Field | Type | Card. | Notes |
|---|---|---|---|
| protocol | URI / Text | 1 | Reference to a protocol record where one exists. |
| instrument | Text | 0..n | Platform, make, model; autonomous or human-run. |
| precursors | URI / Text | 0..n | Materials with supplier, lot, and purity where relevant. |
| conditions | Object | 1 | Temperature, atmosphere, duration, ramp rates, stoichiometry. |
| characterization | Object | 0..n | Technique, instrument, and result summary; raw files attachable. |
| replicates | Integer | 0..1 | Number of attempts under these conditions. |
| conditionsCommitment | Object | 0..1 | Hash-commitment option for withheld conditions: alg, digest over the canonicalized condition set plus a salt, and revealBy. Lets a depositor register a dead end now and disclose the exact conditions later without allowing a rewrite. |
D. Screened items
One row per candidate considered and set aside: papers, structures, compounds, or prior results. This is the part a later agent queries first.
| Field | Type | Card. | Notes |
|---|---|---|---|
| identifier | URI | 1 | DOI, arXiv id, OPTIMADE, Materials Project, ICSD, PubChem. |
| decision | Enum | 1 | included, excluded, deferred. |
| reason | Enum | 1 | From the exclusion-reason vocabulary below. Free text is an error, not a fallback. |
| evidence | Text / URI | 0..n | The quotation, figure, value, or record that supports the decision. |
| statusAtCheck.version | Enum | 1 | NISO RP-8-2008: AO, SMUR, AM, P, VoR, CVoR, EVoR. |
| statusAtCheck.integrity | Enum | 1 | NISO RP-45-2024 (CREC): none, correction, expression-of-concern, retraction, removal. |
| statusAtCheck.assertedBy | Text / URI | 1 | Who said so: crossref-relation, retraction-watch, publisher, manual. |
| statusAtCheck.checkedAt | DateTime | 1 | When. The registry re-checks on every read and flags drift. |
E. Outcome
| Field | Type | Card. | Notes |
|---|---|---|---|
| outcomeClass | Enum | 1 | negative-not-novel, negative-not-achievable, negative-not-reproducible, refuted, inconclusive, abandoned. |
| failureMode | Enum | 0..n | From the domain vocabularies below. |
| evidence | Text / URI | 1..n | What establishes the outcome: measurement, diffraction pattern, energy above hull, prior publication. |
| nearestPriorResult | URI | 0..n | The closest existing result found. Required when outcomeClass is negative-not-novel. |
| confidence | Enum / Number | 1 | How strongly the evidence supports the outcome, with the basis stated. |
F. Reuse guidance
The fields that make a dead end actionable instead of merely discouraging.
| Field | Type | Card. | Notes |
|---|---|---|---|
| applicabilityConditions | Text / Object | 1 | The envelope within which this dead end holds. A negative result outside its envelope is not a negative result. |
| invalidators | Text | 0..n | What would overturn this record. Stated by the depositor, in advance. |
| untriedBranches | Text | 0..n | Paths visible from here that were not taken, and why. |
| cost | Object | 1 | What the attempt consumed: wetLabRuns, agentSeconds, gpuHours, instrumentHours, usd. The unit of value the registry reports back is cost avoided. |
G. Relations
| Field | Type | Card. | Notes |
|---|---|---|---|
| isNewVersionOf | URI | 0..1 | DataCite relation type. The record this one supersedes. |
| isDerivedFrom | URI | 0..n | Records or datasets this attempt built on. |
| references | URI | 0..n | Literature cited, each carrying its own statusAtCheck. |
| isSupplementTo | URI | 0..n | A publication or preprint this record supports. |
| refutes / confirms | URI | 0..n | Claims or records this attempt bears on. Directional and signed. |
| reusedBy | URI | 0..n | Populated by the registry when a later record cites this one as avoided cost. |
H. Integrity
| Field | Type | Card. | Notes |
|---|---|---|---|
| contentAddress | Text | 1 | Multihash over the canonicalized crate. The record’s identity before it has a DOI. |
| signature | Object | 1 | Nanopublication-style detached signature: algorithm, public key, signed digest. |
| signer | URI | 1 | Key holder, bound to the operator in section A. |
| timestamp | Object | 0..1 | Third-party attestation of existence at a time. |
| visibility | Enum | 1 | private, embargoed, public. Default private. |
| embargoUntil | Date | 0..1 | Set by the depositor. Release is automatic; extension is an explicit act with a reason. |
Materials profile
The materials and chemistry profile. Records link to Materials Project, OPTIMADE, and ICSD identifiers, not only to papers, so that a novelty claim is checked against structured data rather than prose.
Starter vocabularies
Controlled and deliberately small. Additions go through the same review as the schema; a term nobody uses is removed.
Exclusion reasons (section D)
- out-of-scope
- duplicate
- superseded-by-newer-version
- retracted
- expression-of-concern
- corrected-materially
- preprint-not-peer-reviewed
- insufficient-detail-to-reproduce
- wrong-composition
- wrong-conditions
- no-full-text-available
- language-not-supported
- evidence-not-verifiable
Failure modes, materials and chemistry (section E)
- known-disordered-variant
- phase-separation
- decomposition-at-temperature
- precursor-impurity
- no-crystalline-product
- moisture-or-air-sensitive
- yield-below-threshold
- characterization-inconclusive
- irreproducible-across-replicates
Failure modes, computation (section E)
- unconverged
- unstable-above-hull
- imaginary-phonon-modes
- functional-inadequate
- cell-or-supercell-too-small
- basis-set-insufficient
- numerical-instability
- resource-exhausted
- input-structure-invalid
Example record (abridged)
Illustrative only. Identifiers are placeholders.
{
"@context": ["https://w3id.org/ro/crate/1.2/context", {"prov": "http://www.w3.org/ns/prov#"}],
"@graph": [
{"@id": "ro-crate-metadata.json", "@type": "CreativeWork",
"conformsTo": {"@id": "https://portolansoft.com/profile/nrr/0.1"}, "about": {"@id": "./"}},
{"@id": "./", "@type": "Dataset", "name": "NRR: Li3MnCoO5 solid-state synthesis attempt",
"datePublished": "2026-11-03", "visibility": "embargoed", "embargoUntil": "2027-11-03",
"hasPart": [{"@id": "#attempt"}, {"@id": "#lit-search"}]},
{"@id": "#lit-search", "@type": "SearchAction", "query": "(Li3MnCoO5 OR \"Li-Mn-Co oxide\") AND synthesis",
"startTime": "2026-11-02T14:10:00Z", "result": [{"@id": "#cand-1"}]},
{"@id": "#cand-1", "@type": "ScholarlyArticle", "identifier": "doi:10.1000/example",
"decision": "excluded", "reason": "superseded-by-newer-version",
"statusAtCheck": {"version": "AM", "integrity": "none", "assertedBy": "crossref-relation",
"checkedAt": "2026-11-02T14:11:30Z"}},
{"@id": "#attempt", "@type": "CreateAction", "actionStatus": "FailedActionStatus",
"object": {"@id": "optimade:mp/mp-000000"},
"outcomeClass": "negative-not-novel", "failureMode": "known-disordered-variant",
"nearestPriorResult": {"@id": "icsd:000000"},
"applicabilityConditions": "solid-state route, 800-950 C, air",
"invalidators": "a refinement showing cation ordering at these conditions",
"cost": {"wetLabRuns": 3, "agentSeconds": 5400}}
]
}
Biology profile
A failed synthesis is a fact about a compound. A biological negative result is a claim that an effect was looked for and not found, and it is only informative if the assay could have detected the effect. The biology profile therefore adds three things the core record does not require: controls and sensitivity; persistent identity for reagents, strains, and cell lines; and evidence-synthesis screening decisions as first-class records. Four attempt types are recognized: wet-lab, computational, evidence-synthesis, hypothesis-generation.
Identifiers
| Class | Identifier systems |
|---|---|
| Organism and strain | NCBI Taxonomy id; stock-center strain ids (Chlamydomonas Resource Center CC-####, Bloomington, CGC, ZIRC, JAX/MGI); mutant-library ids such as CLiP for Chlamydomonas. |
| Gene and protein | Ensembl, NCBI Gene, HGNC, UniProt; model-organism ids (Phytozome, FlyBase, WormBase, ZFIN, SGD, TAIR). |
| Reagents | RRID (AB_ antibodies, CVCL_ cell lines via Cellosaurus, SCR_ software), Addgene ids, lot numbers. |
| Compounds | ChEMBL, PubChem, DrugBank. |
| Targets, diseases, phenotypes | Open Targets; MONDO, DOID, HPO; GO; Cell Ontology; Uberon. |
| Assays and methods | OBI terms; EDAM; protocols.io DOI. |
| Data | GEO, SRA, ENA, PRIDE, PDB, EMDB, BioImage Archive, IDR, Zenodo. |
| Trials and reviews | ClinicalTrials.gov; PROSPERO; OSF and AsPredicted; Registered Report stage. |
Version and integrity status, extended
Beyond the core version terms, the biology profile adds preprint-v{n}; reviewed-preprint, with eLife assessment terms carried as structured fields (significance: landmark, fundamental, important, valuable, useful; strength of evidence: exceptional, compelling, convincing, solid, incomplete, inadequate); registered-report-stage1 and registered-report-stage2; trial-registered and trial-results-posted. Integrity adds post-publication-comment, with a PubPeer pointer carried as a signal, never a verdict. Every status carries assertedBy and checkedAt.
Outcome classes
- negative-no-phenotype
- negative-no-effect
- negative-no-association
- negative-not-replicated
- negative-not-novel
- negative-contradicted-by-vor
- inconclusive-controls-failed
- inconclusive-underpowered
- inconclusive-reagent-failed
- partial
- positive
Informativeness rule. A negative is informative only if the positive control passed, the negative control was clean, and a power analysis or detection limit is stated. Otherwise the record is uninformative and must use an inconclusive outcome class. This is the absence-of-evidence versus evidence-of-absence distinction, made machine-checkable.
Failure modes, wet-lab
- no-phenotype-single-allele
- lethal-or-sick-mutant
- off-target
- strain-background-effect
- reagent-nonspecific
- cell-line-misidentified
- contamination
- construct-failed
- transformation-failed
- no-expression
- dose-no-response
- batch-effect
- assay-out-of-range
- toxicity
- not-replicated-second-model
Failure modes, computational
- no-differential-signal
- not-significant-after-correction
- confounded
- model-did-not-generalize
- low-confidence-structure
- benchmark-contamination
Failure modes, evidence synthesis
- wrong-population
- wrong-intervention
- wrong-comparator
- wrong-outcome
- wrong-study-design
- duplicate-publication
- insufficient-data
- not-retrievable
- retracted
- preprint-superseded
- claim-not-supported-by-cited-source
Evidence block for experimental negatives
| Field | Contents |
|---|---|
| controls.positive | Reagent or genotype, expected result, observed result, pass or fail. |
| controls.negative | Reagent or genotype, expected result, observed result, pass or fail. |
| sensitivity | Detection limit, or the minimum resolvable effect. |
| power | Power-analysis reference, or none. |
| replicates | Biological, technical, independent labs. |
| statistics | Test, effect size, confidence interval, n. |
| blinding, randomization | Whether used, and how. |
| preregistration | Registration identifier, or none. |
| reportingGuideline | ARRIVE 2.0, CONSORT, MIAME, MINSEQE, or none. |
Applicability conditions
For a biological record the envelope is: organism and strain; genotype and allele; cell type and passage; developmental stage; sex; growth conditions; assay and readout; reagent lot; time point; dose range.
Governance rules specific to biology
- No human-subject data in records, only accessions. Human-derived records are embargoed by default, and outcomes are aggregate-only.
- Compliance identifiers (IACUC, IRB) are committed by hash and revealed only to authorized readers.
- A restricted visibility tier for select-agent or dual-use work, never public regardless of embargo.
- Reagent lot identifiers are public by default, because they are the most diagnostic field in the record.
Example: a Chlamydomonas ciliary-assembly negative
Placeholder identifiers.
{
"@type": "CreateAction", "actionStatus": "FailedActionStatus",
"attemptType": "wet-lab",
"question": "Does loss of Cre00.g000000 shorten flagella or delay regeneration after deflagellation?",
"organism": {"taxon": "NCBITaxon:3055", "strain": "CC-4533", "mutant": "LMJ.RY0402.000000"},
"gene": {"id": "Cre00.g000000", "source": "Phytozome"},
"assay": {"obi": "OBI:0000000", "protocol": "doi:10.17504/protocols.io.example",
"readout": "flagellar length, DIC microscopy, 60 min post-deflagellation"},
"controls": {"positive": {"genotype": "shf1", "expected": "short flagella", "observed": "short flagella", "pass": true},
"negative": {"genotype": "CC-4533 parental", "observed": "wild-type length", "pass": true}},
"sensitivity": "resolves 1.0 um difference in mean length at n=100 cells",
"power": "80% for d=0.4 at n=100 per genotype",
"replicates": {"biological": 3, "technical": 2},
"statistics": {"test": "Welch t-test", "effect": "0.2 um", "ci95": [-0.3, 0.7], "n": 300},
"outcomeClass": "negative-no-phenotype", "informativeness": "informative",
"failureMode": "no-phenotype-single-allele",
"applicabilityConditions": "TAP medium, 22 C, continuous light, single CLiP allele, steady-state and regeneration",
"invalidators": "a second independent allele; complementation; a different readout such as IFT particle velocity",
"untriedBranches": ["second allele", "double mutant with known IFT component", "proteomics of isolated flagella"],
"screened": [{"identifier": "doi:10.1101/2026.00.00.000000v2", "decision": "included",
"statusAtCheck": {"version": "reviewed-preprint", "eLifeStrength": "solid",
"assertedBy": "eLife", "checkedAt": "2026-09-13T17:00:00Z"}}],
"cost": {"wetLabDays": 6, "agentSeconds": 3200},
"visibility": "embargoed", "embargoUntil": "2027-03-13"
}
Example: an evidence-synthesis exclusion
{
"@type": "SearchAction", "attemptType": "evidence-synthesis",
"question": "Systematic review: efficacy of intervention X in population Y (PROSPERO CRD0000000)",
"sources": [{"name": "PubMed", "query": "(X[tiab]) AND (Y[MeSH]) AND randomized", "date": "2026-09-10", "retrieved": 412}],
"screened": [{"identifier": "doi:10.1000/example", "decision": "excluded", "reason": "retracted",
"statusAtCheck": {"version": "VoR", "integrity": "retracted", "assertedBy": "retraction-watch",
"checkedAt": "2026-09-10T09:12:00Z"}}],
"outcomeClass": "partial", "prismaCounts": {"identified": 412, "screened": 380, "excluded": 351, "included": 29}
}
Open questions for biologists
- Is the informativeness rule the right minimum, or too strict for exploratory work?
- Should a single-allele no-phenotype ever be informative, or always
partialuntil a second allele or complementation? - Which reagent fields must be public for the record to be useful, and which will labs refuse to share?
- Should each screening decision be its own record, or a review one record with many screened items?
- What would make a lab deposit these at all?
Mapping to standards
Nothing here is a new standard. Each part of the record is carried by something that already exists.
| Part of the record | Standard | How it is used |
|---|---|---|
| Whole record, packaging | RO-Crate 1.2 (JSON-LD, schema.org) | A profile with conformsTo pointing at the NRR profile URI. |
| Activities and agents (A, C) | W3C PROV | Each stage is an activity with agents, entities, and times. |
| Literature stage (C1) | PRISMA-S | Reporting fields mapped one-to-one, so a literature path is auditable. |
| Version status (D) | NISO RP-8-2008 | Controlled version terms: AO, SMUR, AM, P, VoR, CVoR, EVoR. |
| Integrity status (D) | NISO RP-45-2024 (CREC); Crossref / Retraction Watch | Retraction, correction, and concern states, with assertion source and check time. |
| Identifiers and relations (B, D, G) | DataCite; DOI, arXiv, Materials Project, OPTIMADE, ICSD, PubChem | Relation types taken from DataCite; domain objects referenced by native identifier. |
| Agent runs (A) | OpenTelemetry gen_ai; W3C Trace Context | Model, provider, and trace identifiers carried through from the run. |
| Signing and addressing (H) | Nanopublication practice; multihash | Detached signature over a canonicalized crate; content address as pre-DOI identity. |
| Reagents and cell lines (biology) | RRID; Cellosaurus | Antibodies, cell lines, and software identified by resource identifier, with lot numbers. |
| Reagent reporting (biology) | STAR Methods Key Resources Table | Field set for the reagent block, so a record maps onto what labs already compile. |
| JSON-LD typing (biology) | Bioschemas profiles: Gene, Protein, Taxon, LabProtocol, Sample | Types for biological entities inside the RO-Crate graph. |
| Assays, methods, statistics | OBI; EDAM; STATO | Controlled terms for the assay, the computational method, and the statistical test. |
| Experiment reporting | ARRIVE 2.0; CONSORT; MIAME; MINSEQE | Named in the evidence block, so a reader knows which guideline the attempt followed. |
| Review registration | PROSPERO | Evidence-synthesis records carry their registration identifier. |
| Preregistration | OSF Registries; AsPredicted | Preregistration identifier, or an explicit none. |
| Preprint and review status | Europe PMC preprint links; Sciety; eLife assessment vocabulary | Reviewed-preprint status and assessment terms carried as structured fields. |
Open questions
These are the decisions the draft does not make. Comments on any of them are the most useful thing a reader can send.
- Granularity. Is one record one attempt, one campaign, or one decision point? Too fine and the registry is a log; too coarse and the applicability conditions stop being true.
- Identity and keys. What identifies “the same path” across depositors, so that two labs failing the same way can be recognized as such?
- Default embargo. What is the right default hold period, and should it differ for computation and wet-lab records?
- Redaction. How are withheld conditions handled beyond hash commitment, and what is the minimum a redacted record must still disclose to be admissible?
- Minimum record. What is the smallest set of required fields that is still worth depositing, given that capture must stay automatic?
- Where the profile lives. Which body should hold the profile and its vocabularies long term, and under what governance? The draft assumes an operator independent of publishers and content platforms; whether that is a nonprofit, a consortium, or a national facility is open.
Comment on this draft
The sketch above is the v0.1 discussion draft and is kept for reference. The current version is v0.2.5, machine-readable and open for comment. Corrections, objections, and field-level suggestions to [email protected].