The grammar
Six node types. One artifact anchor.
Every node is a record with fields: the shared set below, plus a few slots specific to its type. Some slots hold a value; some reference another node — and that is what weaves the records into a graph.
The nodes
| Node | What it is (from the schema) |
|---|---|
| Question | A scientific unknown, addressable by the systematic application of research methods. |
| Claim | An atomic, generalized assertion that (proposes to) answer a question. |
| Evidence | A specific empirical observation from one application of a method. |
| Study | The activity — an experiment or analysis — that produces evidence. |
| Protocol | The reusable method an activity follows. |
| Request | A unit of work the community can pick up — issue-tracker-shaped. |
| SourceDocument | A paper, book or preprint that reports evidence. |
| Entity (the artifact) | Not a node type — it is what an Evidence record’s observationBase field points to: the figure, blot or dataset an observation stands on. Held as a URL pointer, never a payload — MIRA hosts nothing. |
Every node also carries the same shared NodeSchema fields — creator, created, modified, description, has_container and the record’s own text. Claim and Evidence additionally include Argument, so they carry the supports / opposes slots.
The heart of the model
The four-layer Evidence chain — and where the objective/subjective boundary sits.
An Evidence record carries the fields that place it: observationStatement (which Claim it speaks to), observationBase (the artifact it rests on — a pointer), is_grounded_in (the Study that produced it) and sourceDocument (the paper that reported it). Reading those fields lets you ask which layer a problem lives in — is the claim contested, the evidence un-reproduced, or the figure itself unsound? — instead of collapsing all of it into “here’s the claim” or “cite the paper.”
The grammar, anchored on the artifact
The format, concretely
A record is a bundle of fields.
A node carries a @type array and a set of slots. Some slots hold a value; some hold a reference to another node. Only when a reference needs to carry who asserted it and how strongly is it reified as its own record — and that is where flavor, degree and confidence live, per agent. The anti-gaming property depends on it.
{ "@id": "mira:evd-photo51-helix",
"@type": ["sdata:44107", "mira:Evidence"],
"content": "An X-shaped diffraction pattern — a helix.", // a value
"creator": "mira:person-franklin", // a value
"observationBase": "https://.../photo-51.tif", // a pointer (URL)
"observationStatement": "mira:clm-double-helix", // a reference
"is_grounded_in": "mira:study-franklin-1952", // a reference
"sourceDocument": "mira:doc-franklin-1953" } // a reference
// the same observationStatement, reified — only to add attribution
{ "@type": "mira:RelationInstance",
"predicate": "observationStatement",
"source": "mira:evd-photo51-helix",
"destination": "mira:clm-double-helix",
"creator": "mira:person-franklin" } // who asserted it
Canonical grammar: github.com/MIRA-science/schema (mira.yaml, LinkML — every slot is declared there with its range). The wire format is JSON-LD via mira.jsonld; SHACL and Turtle are generated from the source. For the same walkthrough you can click, see the interactive DNA deck.
Linking, without a scoreboard
Three flavors of evidence→claim linkage, with a qualitative degree.
| Flavor | Degree |
|---|---|
| supports | not at all · weakly · moderately · strongly |
| informs | — (neutral / topical) |
| opposes | not at all · weakly · moderately · strongly |
Plus a qualitative confidence rating on the relation that others can weigh in on. Flavor, degree and confidence are per-agent attributed assertions on a reified relation — never aggregated. Ten agents rating one relation produce ten signed ratings, not an average. Nothing in the schema computes a value, so there is no value to game: an adversary can add their own rating, and it arrives labeled with their identity like everyone else’s.