standards.sgit.ai / method / grammar

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

TypeWhat it is
ProvisionAn article, paragraph or point, carrying its source reference. The unit everything else attaches to
DefinitionA term the instrument defines for its own purposes. Usually an article of its own, and usually the most-referenced node in the graph
RequirementSomething that must be the case
ObligationSomething a named actor must do
ProhibitionSomething that must not be done. Kept separate from Obligation because a prohibition and a negated obligation behave differently under exemption
ControlA measure that satisfies a requirement. Proposed and never instantiated — see the honesty note below
ActorThe roles the instrument itself defines — provider, deployer, importer, notified body. Not organisations; the instrument's own vocabulary
AmendmentAdded 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
FrameworkReferenceThe bridge node of the ontologies-of-ontologies model. Specified, never built. Crosswalks →
Two of these have never been instantiated, and the pages that use them say so. 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 is protected_by; a control whose value depends on an assumption is conditional_on; a provision that creates exposure is gives_rise_to; the connection from any node to a twin and onward to reality is connected_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:

FieldExampleStable across amendment?
Positional hash — the node idpos 3f9c1a…Yes. This is what a citation and a crosswalk attach to
Content hashsha 8e21b4…No — and that is the point. It moving is the amendment signal
Human aliasart-026-para-05Yes, 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 →