Relations and chains are two levels of structure:
relation = a local semantic edge, stated by an author
chain = a declared longitudinal interpretation of those edges, derived by LuriaRelations are local semantic edges
A field such as:
source:
- LIT-042becomes meaningfully stronger when the scheme declares:
references:
source:
scheme: LIT
many: trueThe declaration allows Luria to check that the value:
- is present when required,
- has the shape of a code,
- belongs to the intended scheme,
- resolves to a document.
A relation can also declare whether it is required, its cardinality, a converse, and an invariant. The keys and their defaults are in Configuration; Model and add relations walks through them, including the one that surprises people — a declared reference is required unless it says otherwise.
The difference between:
mentionsand:
supports
implements
extends
corrects
supersedes
motivatesis knowledge. Preserve it when it matters.
Converse relations
If extends and extended_by are declared as converses, the reverse edge is not a guess. It is the same relation read from the other endpoint (ADR-084).
references:
extends: {scheme: RFC, many: true, converse: extended_by, required: false}
extended_by: {scheme: RFC, many: true, converse: extends, required: false}
compared_against: {scheme: RFC, many: true, converse: compared_against, required: false}A symmetric relation such as compared_against names itself as its converse.
Because the two fields are one relation, the converse belongs to the scheme whose codes the field holds — for a relation that crosses schemes, the target scheme (ADR-097). And because either side can be derived from the other, a document holding only one side is a mechanical gap, not a judgement call: the lint reports it and luria link --fix fills it. The rules a pair must satisfy are in Model and add relations.
Relation invariants
A reference can assert that both endpoints share a declared field value.
For example:
extends:
scheme: RFC
invariant: tagsmeans the relation claims some shared subject vocabulary.
Relation invariants can cross schemes if both ends declare the invariant field (ADR-106).
An edge whose two ends share no value of the field is reported as unbound-relations: either a true value is missing from one end, or the edge is wrong.
A relation is held twice: as data and as prose
Frontmatter says that a relation holds: extends: [RFC-007]. Only the
body can say what it amounts to, which part of RFC-007 this one carries
on and what it changes. Both are the record’s, and Luria keeps them from
drifting apart in both directions:
- Up, from prose to frontmatter. A relation stated where it is
justified, with a
ref::directive or the[[extends::RFC-007]]shorthand, belongs in the frontmatter too. A stated relation the frontmatter lacks isunrecorded-relations, andluria link --fixwrites it, because the statement already says exactly what to write. - Down, from frontmatter to prose. A reference declared
explain:asks that the body account for every code the field holds. A code the body never explains isunexplained-relations, and nothing writes the explanation for you, because it is prose only a person can write.
What counts as an explanation is deliberately weak: a citation of the code
in the body, outside a reference entry (ADR-123). A bibliography line,
Kingma et al. (2014), LIT-001 — ARXIV-1412.6980., names the work and says
nothing about it, so it does not count. That holds wherever the line sits,
because entries are recognised by their shape rather than by a heading. The
check can tell whether the body mentions the code. It cannot tell whether
the sentence says anything, and a sentence written to clear the finding
passes it and defeats it.
So treat an unexplained relation as a question about the relation, not only about the prose. When reading the cited work turns up nothing to write (the source never makes the claim, the comparison was never run, the origin is older), the relation is what is wrong. Correct it rather than writing a sentence for it. The how-to has the syntax and the two strengths.
Chains are longitudinal interpretations
A chain walks one or more same-scheme relations transitively.
chains:
lineage:
scheme: RFC
relation:
- extends
- corrects
sibling: compared_against
output: docs/lineage.md
title: RFC lineageThe spine relations advance the line.
The sibling relation associates a rival or peer without pretending it is the next step.
Why multiple spine relations matter
Suppose:
A extends B
C corrects ABoth relations continue one line, but they carry different signs:
extends— builds on,corrects— exists because something earlier was wrong.
Flattening both into parent would discard meaning.
The chain does not erase that meaning, because it never owns it: the relations are unioned into one spine before the walk, so the chain page shows the order of the line, not which relation joined each step. The sign of each step stays in the fields of the documents it joins, where a reader of either document finds it.
Facets
A chain can carry declared fields as facets:
facet_by:
- status
- consensusThe line then becomes both structural and interpretive.
A Active converged
B Active contested
C Proposed emergingVocabularies therefore do more than classify records; they can provide the axes through which a lineage is read.
Chain invariants
A chain can assert an invariant across its line:
invariant: tagsThis is a stronger claim than a relation invariant (ADR-106). A relation invariant is about each edge; a chain invariant is about the whole line — every member of a connected line holding one value in common. A line that shares nothing is reported as unbound-lines, a weaker signal than unbound-relations, since each step may share something with its neighbour while nothing runs the whole length. Read the line whole before acting on it.
Declaring invariant on a chain also shapes its page: the lines are grouped under each value they share, and the lines that share none get a section of their own (ADR-113).
A failure does not automatically mean “bad edge.”
It may indicate:
- an incorrect relation,
- incorrect metadata,
- an invariant too strong for the intended line,
- or an ontology that lacks the concept binding the lineage.
This is one of the places where a finding can be evidence about the ontology itself, not only about the documents.
Chains are projections
The source truth remains the local relations.
source edges
↓
chain derivation
↓
generated sequenceDo not hand-maintain the lineage in parallel. DP-3 applies directly: derive the projection from the authoritative source.
Authors state the edges. Luria derives the line.