SCI v1.5
One file for the paper and the experiment behind it
Keep a paper and the experiment it describes in one portable record. The format is JSON, the schema is published, and every record carries its own checksum.
The 21 top-level fields
A record is one JSON object with these fields and no others. The schema sets
additionalProperties to false, so a record that carries an unknown
field is rejected rather than silently accepted.
| Field | What it carries | Required |
|---|---|---|
| sci_version | The version of the format this document is written in. | yes |
| schema | The absolute URI of the JSON Schema this document validates against. | optional |
| id | The .science file identifier, for example pmid:26981379. | yes |
| kind | What kind of record this is. Always science-record in v1. | yes |
| revision | The counter that changes when the body of the record changes. | yes |
| content_hash | SHA-256 over the canonical JSON of the record body. Reproducible, and checkable by any consumer. | yes |
| created_at | When the record was first published. | optional |
| updated_at | When the record was last changed. | optional |
| generator | The tool and converter that wrote the record, and the dialect it was read from. | optional |
| paper | The source: title, authors, journal, abstract and the claims the paper makes. | yes |
| experiment | The experiment behind the paper: objective, steps, materials, instruments, reagents and conditions. | yes |
| data | The data the work rests on: every file, table or repository route, with its checksum and access state, and the size of each comparison group. | yes |
| analysis | The analysis: named methods, the operations they need, and the published target a run would check. | yes |
| capability | The capabilities required to run the experiment. | yes |
| readiness | How ready the record is for execution, and the requirements still to resolve. | yes |
| review | What the readers made of the paper, and where that critique is published. | yes |
| execution | Whether the experiment has been run, and the evidence if it has. | yes |
| provenance | Where every part of the record came from: entities, activities and agents. | yes |
| lineage | The revision this record supersedes, its checksum, and the generation it belongs to. | optional |
| assays | Every assay the experiment ran, in the order it ran them. An experiment is a set of processes and each process is an assay: the measurement, the analysis, the validation, the normalisation. Every one of them is required, so there is no primary assay and no optional one. | optional |
| gaps | Missing information and unresolved questions. | yes |
The four layers
Each layer records its completion state and identifies the information still needed.
paper
What the paper says: its claims, its authors, its abstract.
state: absent, partial, complete or blocked
experiment
The work behind the paper: steps, materials, instruments, conditions.
state: absent, partial, complete or blocked
data
The data route: every asset with its checksum, format and access state.
state: absent, partial, complete or blocked
analysis
The analysis: named methods, the operations needed, the published target.
state: absent, partial, complete or blocked
What the record carries beyond the four layers
The schema at the format’s URI accepts 1.0, 1.1 and 1.2 records, so a client that reads the address it has always read sees all of them. A 1.0 record is unchanged and still valid.
data.group_sizes
The number of samples in each comparison group, as the repository metadata states it. A consumer holding the samples can check them against the paper’s design instead of running the paper’s method over a different set.
assays
Every assay the experiment ran, in the order it ran them. Each one names the definition it used, the operations it needs and whether the platform supports them. The catalogue that owns the definitions keeps them. Version 1.2 replaced the single binding of version 1.1 with this array, because an experiment is a set of processes and every one of them is required.
How a record changes
A published record is immutable. A corrected record is published as the next revision of the same record and names the revision it replaces, so a consumer can prove what it holds and can fetch what supersedes it. A rebuild that changes nothing leaves the published bytes, the checksum and the revision number exactly as they were.
The checksum rule
content_hash is a SHA-256 over the canonical JSON encoding of the
record body with the hash field itself removed: sorted keys, compact separators, UTF-8. The same
canonical content always hashes to the same value. A consumer can recompute it to check the
record’s content; a separate byte checksum checks the exact file received.
A number is written with the fewest digits that read back to the same value, in plain decimal between 0.0001 and 10^16 and in scientific notation otherwise, with an exponent of at least two digits. PHP and JavaScript write the same number differently, so a consumer that re-encodes a document follows the rule as the specification states it.
The engine’s own validator checks the schema, the hash, that every step cites an asset that exists, and that every method claims only operations the catalogue knows. A consumer is free to check the first and the second on its own.
Where to get one
| Endpoint | What it returns |
|---|---|
| GET /api/v1/sci | The format contract: the schema URI and the status of each input dialect. |
| GET /api/v1/sci/schema | The JSON Schema inside the published envelope. |
| GET /api/v1/sci/documents | Every published .science file, filterable and pageable. |
| GET /api/v1/sci/documents/{id} | One whole .science file. |
| GET /api/v1/sci/documents/{id}/versions | Every published version of that file, each with its own hash. |
| GET /api/v1/sci/versions/{content_hash} | One exact version, by the hash of its own body. |
| GET /api/v1/papers/{pmid}/sections | The section index for a paper: every section, its role and its size. |
The specification
The full text of the format, published as Markdown so it can be read, cited and versioned alongside the schema it describes.
Every field
250 keys, each with its own address. The schema says what is valid; this says what each key is for, so a .science file can be read, edited or proposed against.
sci_version enum required one of 1.0, 1.1, 1.2, 1.3, 1.4
schema any optional one of https://corpus.bntrg.co.uk/sci/1.0/sci.schema.json
id string required
kind any required one of science-record
revision integer required
content_hash string or null required
created_at string or null optional
updated_at string or null optional
generator object or null optional
paper object required
paper.state enum required one of absent, partial, complete, blocked
paper.title string or null required
paper.doi string or null required
paper.pmid string or null required
paper.journal string or null required
paper.year integer or null required
paper.abstract string or null required
paper.claims array required
paper.claims[].id string required
paper.claims[].statement string or null required
paper.claims[].kind enum required one of quantitative, qualitative, methodological
paper.claims[].state enum required one of absent, partial, complete, blocked
paper.claims[].target object or null required
paper.claims[].target.value number or null required
paper.claims[].target.unit string or null required
paper.claims[].target.tolerance number or null required
paper.claims[].target.source string or null required
paper.claims[].evidence array required
paper.claims[].evidence[].asset string or null required
paper.claims[].evidence[].locator string or null required
paper.claims[].evidence[].quote string or null required
paper.gaps array required
experiment object required
experiment.state enum required one of absent, partial, complete, blocked
experiment.objective string or null required
experiment.steps array required
experiment.steps[].id string required
experiment.steps[].order integer required
experiment.steps[].name string or null required
experiment.steps[].kind enum required one of physical, computational, data-preparation, analysis, other
experiment.steps[].state enum required one of absent, partial, complete, blocked
experiment.steps[].blocked_on string or null optional
experiment.steps[].description string or null optional
experiment.steps[].duration_hours number or null required
experiment.steps[].parameters object required
experiment.steps[].inputs array required
experiment.steps[].outputs array required
experiment.steps[].instruments array optional
experiment.steps[].reagents array optional
experiment.steps[].reagents[].name string or null required
experiment.steps[].reagents[].quantity number or null required
experiment.steps[].reagents[].unit string or null required
experiment.steps[].reagents[].catalogue string or null optional
experiment.materials array required
experiment.instruments array required
experiment.reagents array required
experiment.conditions object required
experiment.gaps array required
data object required
data.state enum required one of absent, partial, complete, blocked
data.group_sizes object or null optional
data.assets array required
data.assets[].id string required
data.assets[].role enum required one of manuscript, protocol, raw, processed, derived, code, supplementary, figure, table, reference
data.assets[].format string required
data.assets[].media_type string required
data.assets[].uri string or null required
data.assets[].sha256 string or null required
data.assets[].bytes integer or null required
data.assets[].access enum required one of open, restricted, embargoed, unknown
data.assets[].state enum required one of declared, resolved, verified, unavailable
data.assets[].reader string or null required
data.assets[].reader_status enum required one of available, converter_required, reader_required, unknown
data.assets[].identifier string or null optional
data.assets[].version string or null optional
data.assets[].note string or null optional
data.assets[].structure object or null required
data.assets[].table object or null optional
data.assets[].table.label string or null required
data.assets[].table.caption string or null required
data.assets[].table.rows array required
data.assets[].table.row_count integer required
data.assets[].table.column_count integer required
data.assets[].table.numeric_cells integer required
data.assets[].table.header_rows integer required
data.assets[].table.locator string required
data.gaps array required
analysis object required
analysis.state enum required one of absent, partial, complete, blocked
analysis.methods array required
analysis.methods[].id string required
analysis.methods[].family string or null required
analysis.methods[].specific string or null required
analysis.methods[].label string or null required
analysis.methods[].dsl_operations array required
analysis.methods[].missing_operations array required
analysis.methods[].expressible boolean or null required
analysis.methods[].parameters object required
analysis.methods[].data_shapes array required
analysis.methods[].evidence object required
analysis.methods[].evidence.score number or null required
analysis.methods[].evidence.band string or null required
analysis.methods[].evidence.quote string or null required
analysis.targets array required
analysis.targets[].id string required
analysis.targets[].claim_id string or null required
analysis.targets[].operation string or null required
analysis.targets[].expected_value number or null required
analysis.targets[].unit string or null required
analysis.targets[].tolerance number or null required
analysis.targets[].state enum required one of absent, partial, complete, blocked
analysis.targets[].note string or null optional
analysis.gaps array required
capability object required
capability.state enum required one of absent, partial, complete, blocked
capability.requirements array required
capability.requirements[].capability_id string required
capability.requirements[].label string or null required
capability.requirements[].assay_families array required
capability.requirements[].availability_state string or null required
capability.requirements[].tier_unlocked string or null required
capability.requirements[].candidate string or null optional
capability.gaps array required
readiness object required
readiness.state enum required one of absent, partial, complete, blocked
readiness.tier enum required one of R0, R1, R2, R3, R4, R5,
readiness.blocking_axis enum required one of method, capability, data, none,
readiness.blocked_on string or null required
readiness.axes object required
readiness.can_run object required
readiness.can_run.dsl_operations array required
readiness.can_run.assets array required
readiness.can_run.steps array required
readiness.must_build object required
readiness.must_build.dsl_operations array required
readiness.must_build.dsl_operations[].operation string required
readiness.must_build.dsl_operations[].unlocks_papers integer or null required
readiness.must_build.dsl_operations[].priority integer or null required
readiness.must_build.converters array required
readiness.must_build.readers array required
readiness.must_build.capabilities array required
readiness.must_build.data_gaps array required
readiness.gaps array required
review object required
review.state enum required one of absent, partial, complete, blocked
review.machine_critique object or null required
review.human_critique object or null required
review.stages array required
review.gaps array required
execution object required
execution.state enum required one of absent, partial, complete, blocked
execution.status string or null required
execution.mode string or null required
execution.runs array required
execution.gaps array required
provenance object required
provenance.entities array required
provenance.activities array required
provenance.agents array required
provenance.source_run_id string or null required
provenance.dsl_catalogue_fingerprint string or null optional
provenance.capability_table_fingerprint string or null optional
provenance.snapshot_id string or null optional
lineage object or null optional
lineage.parent_id string or null optional
lineage.parent_hash string or null optional
lineage.fork_of string or null optional
lineage.generation integer or null optional
assays array optional
assays[].id string required
assays[].role string or null optional
assays[].order_basis string or null optional
assays[].depends_on array or null optional
assays[].definition_id string optional
assays[].definition_version string optional
assays[].definition_digest string or null optional
assays[].required_operations array optional
assays[].support_state enum optional one of supported, partial, unsupported, unknown
assays[].source_hashes object optional
assays[].confidence number or null optional
assays[].evidence array optional
assays[].definition object or null optional
assays[].definition.definition_id string required
assays[].definition.definition_version string required
assays[].definition.definition_digest string or null optional
assays[].definition.required_operations array optional
assays[].definition.support_state enum optional one of supported, partial, unsupported, unknown
assays[].definition.input_contract object or null optional
assays[].definition.parameter_contract object or null optional
assays[].definition.output_contract object or null optional
assays[].definition.limitations array or null optional
assays[].definition.interpretation string or null optional
assays[].request object or null optional
assays[].request.assay_id string required
assays[].request.source_record_id string required
assays[].request.source_content_hash string required
assays[].request.operation string required
assays[].request.operation_version string or null optional
assays[].request.inputs array optional
assays[].request.parameters object or null optional
assays[].request.request_id string or null optional
assays[].request.provider string or null optional
assays[].result object or null optional
assays[].result.assay_id string required
assays[].result.operation string or null optional
assays[].result.provider string or null optional
assays[].result.execution_id string required
assays[].result.input_hash string or null optional
assays[].result.result_hash string or null optional
assays[].result.evidence_hash string or null optional
assays[].result.status string required
assays[].result.finding string or null optional
assays[].result.result object or null optional
assays[].operations array or null optional
assays[].operations[].operation string required
assays[].operations[].operation_version string or null optional
assays[].operations[].support_state enum optional one of supported, partial, unsupported, unknown
assays[].operations[].input_contract object or null optional
assays[].operations[].parameter_contract object or null optional
assays[].operations[].output_contract object or null optional
assays[].operations[].limitations array or null optional
assays[].operations[].interpretation string or null optional
gaps array required
generator.name free optional
The schema accepts any object here, so these keys are documented but not enforced.
generator.converter free optional
The schema accepts any object here, so these keys are documented but not enforced.
generator.source_package_schema free optional
The schema accepts any object here, so these keys are documented but not enforced.
provenance.entities[].id free optional
The schema accepts any object here, so these keys are documented but not enforced.
provenance.entities[].type free optional
The schema accepts any object here, so these keys are documented but not enforced.
provenance.entities[].label free optional
The schema accepts any object here, so these keys are documented but not enforced.
provenance.activities[].id free optional
The schema accepts any object here, so these keys are documented but not enforced.
provenance.activities[].type free optional
The schema accepts any object here, so these keys are documented but not enforced.
provenance.activities[].used free optional
The schema accepts any object here, so these keys are documented but not enforced.
provenance.activities[].agent free optional
The schema accepts any object here, so these keys are documented but not enforced.
provenance.agents[].id free optional
The schema accepts any object here, so these keys are documented but not enforced.
provenance.agents[].type free optional
The schema accepts any object here, so these keys are documented but not enforced.
provenance.agents[].label free optional
The schema accepts any object here, so these keys are documented but not enforced.
review.machine_critique.status free optional
The schema accepts any object here, so these keys are documented but not enforced.
review.machine_critique.providers free optional
The schema accepts any object here, so these keys are documented but not enforced.
review.machine_critique.target_providers free optional
The schema accepts any object here, so these keys are documented but not enforced.
review.machine_critique.agreement free optional
The schema accepts any object here, so these keys are documented but not enforced.
review.machine_critique.disagreements free optional
The schema accepts any object here, so these keys are documented but not enforced.
review.machine_critique.agreement_basis free optional
The schema accepts any object here, so these keys are documented but not enforced.
review.machine_critique.blinded free optional
The schema accepts any object here, so these keys are documented but not enforced.
review.human_critique.status free optional
The schema accepts any object here, so these keys are documented but not enforced.
review.human_critique.providers free optional
The schema accepts any object here, so these keys are documented but not enforced.
review.human_critique.disagreements free optional
The schema accepts any object here, so these keys are documented but not enforced.
readiness.axes.method free optional
The schema accepts any object here, so these keys are documented but not enforced.
readiness.axes.capability free optional
The schema accepts any object here, so these keys are documented but not enforced.
readiness.axes.data free optional
The schema accepts any object here, so these keys are documented but not enforced.