The grammar
The node and edge types this site models instruments with, published as a stated grammar rather than left to be inferred from the data. Publishing it is what makes ten instruments interoperable instead of ten shapes that happen to share a repository.
Node types
| Type | What it is |
|---|---|
Provision | An article, paragraph or point, carrying its source reference. The unit everything else attaches to |
Definition | A term the instrument defines for its own purposes. Usually an article of its own, and usually the most-referenced node in the graph |
Requirement | Something that must be the case |
Obligation | Something a named actor must do |
Prohibition | Something that must not be done. Kept separate from Obligation because a prohibition and a negated obligation behave differently under exemption |
Control | A measure that satisfies a requirement. Proposed and never instantiated — see the honesty note below |
Actor | The roles the instrument itself defines — provider, deployer, importer, notified body. Not organisations; the instrument's own vocabulary |
Amendment | Added later, and first-class. A change to an instrument is a node in its own right, not a property of the thing it changes — which is what makes amendment history queryable |
FrameworkReference | The bridge node of the ontologies-of-ontologies model. Specified, never built. Crosswalks → |
Control is a proposed node type with no instances anywhere in the corpus — which is also why controls was rejected as a name for this site. FrameworkReference is the crosswalk bridge, and there are zero crosswalks. A grammar is cheap to write; the honest part is marking which of it is load-bearing today.Edge types
Structural and instrument-specific:
defines / defined_in · applies_to · triggers · exempts · references · satisfied_by · in_scope_when
Amendment:
amends · substitutes · inserts · deletes · repealed_by · effective_from · references
The established set — exhaust it first
This is a governance decision with an outsized effect. The wider project already has an edge vocabulary, used across risk graphs and twins, and the rule is that a legal instrument reaches for it before inventing anything.
Where an established edge already fits, it should be used instead. A requirement that reduces a risk isprotected_by; a control whose value depends on an assumption isconditional_on; a provision that creates exposure isgives_rise_to; the connection from any node to a twin and onward to reality isconnected_to.
The established set, in full:
connected_to · observed_on · backed_by · measured_by · grants · reaches · enables · exposes · gives_rise_to · protected_by · conditional_on · defeated_by · owned_by · accepted_by · underwritten_by
A new edge type requires an argument for why no established one fits.
That rule is the whole governance model, and it is deliberately annoying. An ontology that accepts new edge types on request becomes a hundred near-synonyms in a year, and at that point nothing composes: a query written against one instrument silently misses half of another. The cost of the rule is friction on the person adding an instrument. The benefit is that the compounding argument is mechanically true rather than aspirational.
Identity
Every node carries two identities and a human alias. The two-hash scheme is the reason:
| Field | Example | Stable across amendment? |
|---|---|---|
| Positional hash — the node id | pos 3f9c1a… | Yes. This is what a citation and a crosswalk attach to |
| Content hash | sha 8e21b4… | No — and that is the point. It moving is the amendment signal |
| Human alias | art-026-para-05 | Yes, unless the instrument renumbers — in which case the alias moves and the positional hash does not |
Address by positional hash, never by array index or display label. Labels are translations; array positions are an accident of how a file was parsed. This is rule 2 of the tool contract, and the reason it is a rule rather than advice is that both failure modes are silent.
The grammar as data
Agents are half the audience for this page, so the grammar is also served as JSON, with a contract version a tool can refuse politely on:
/agents/grammar.json — node types, edge types, the established set, the identity fields, and contract_version. The machine surface →