Written in response to a fair external critique: “without a formal algebra of how interpretations interact — composition, conflict, resolution, precedence — the proposal stays at the level of a design pattern, not a model.” This is the attempt to answer it. It is a specification, not a mechanized or proven theory (see Honest limits).
The whole point of FCIR is that adjudication is deferred and optional. An algebra makes that precise: it says exactly which operators a representation must provide, and which law makes it FCIR rather than something adjacent.
S — an immutable set of addressable elements. A is its
address space (ids, offsets, node paths, coordinates). S is never written.V — what an interpretation can assert about an address
(a label, a value, a mask, a relation, a fact).I = (id, src, t, π) — a first-class entity with identity
id, provenance src, time t, and a partial map π : A ⇀ V (defined
only on the addresses it speaks about).𝓘(S) — the interpretations currently co-registered
to S. This set is the stored state.Coexistence ⊕ (the primary operator) — 𝓘 ⊕ I = 𝓘 ∪ {I}.
Non-destructive union. Adding an interpretation never alters or removes
another. This is the operator most systems lack in non-destructive form.
Restriction I|_{A'} — I narrowed to addresses A' ⊆ A.
Conflict Δ (a query, not a mutation) — for two interpretations,
Δ(I₁, I₂) = { a ∈ dom π₁ ∩ dom π₂ : π₁(a) ≠ π₂(a) };
over a set, Δ(𝓘) = ⋃_{i<j} Δ(Iᵢ, Iⱼ). Detects disagreement without
resolving it.
Projection / lens σ (read-only view) — σ_φ(𝓘) reads S through the
interpretations selected by filter φ (one id, one src, a time window).
σ returns a view; it does not change 𝓘.
Adjudication α_p (read-time, optional, policy-parameterized) — at an
address a, α_p(𝓘, a) maps the multiset of claims { π_i(a) } to a single
value or the explicit symbol ⊥ (“undecided”). Policies p:
majority, priority(<) (a precedence order over sources), latest,
trust(w), unanimous (returns ⊥ iff there is conflict). α_p is a
function over the stored set; it never mutates 𝓘.
Precedence / override ▷ (derived view, non-commutative) — I₁ ▷ I₂ is
the reading in which I₁ wins where the two overlap. It is sugar for
α_{priority(I₁ < I₂)}; both interpretations remain in 𝓘.
Composition / stacking ∘ — an interpretation may take another
interpretation as its substrate (a review of annotator A’s labels; a meta
layer). I_meta : dom(I_A) ⇀ V. This yields a finite stack; it is the least
developed operator (see limits).
Provenance prov(I) = (src, t) — carried by every interpretation,
preserved by ⊕, σ, α, ▷.
S.⊕ is a commutative, associative monoid with identity ∅ (the empty
interpretation), and idempotent on identical id (set semantics).σ, α, ▷, Δ are read-only: the stored set is
invariant under them. view(𝓘) ⇒ 𝓘 unchanged.Δ(𝓘 ⊕ I) ⊇ Δ(𝓘) — adding interpretations can
only add conflicts, never silently erase them.α_p is definable as a pure function of
(𝓘, a, p). The stored set does not depend on p; changing the policy
changes only the view. This is the heart.A representation
Ris FCIR iff its coexistence⊕is non-destructive (L3) and its adjudicationαis separable (L5) — i.e.⊕andαare independent operators.
Equivalently: you can add a contradicting interpretation and still read every prior one unchanged, and you can change how you resolve conflicts without rewriting anything.
This turns the earlier prose test (“can two readings of the same element both remain until a reader chooses to adjudicate?”) into an algebraic property, and it explains the prior-art verdicts as facts about coupling:
| system | ⊕ and α |
FCIR? |
|---|---|---|
| RDF named graphs + PROV | decoupled: ⊕ = add a graph; α = query-time choice |
yes |
| Standoff annotation | decoupled: ⊕ = add a layer; α = optional gold/consensus pass |
yes |
| Git / branches | coupled: a branch defers α, but the model drives toward merge (= α at integration time); unmerged = divergent copies |
no |
| CRDTs | coupled: α is baked into ⊕ (deterministic auto-convergence) |
no |
| Event sourcing | single truth: projections are σ over one history; no rival α |
no |
| Bitemporal / Datomic | coupled to time: α = temporal order; supersession, not co-equal rivals |
partial |
So FCIR is not “we invented coexistence.” It is: the property is exactly the
decoupling of ⊕ from α, and that decoupling already exists in named graphs
and standoff annotation — but is absent from the systems people reach for by
default (Git, CRDTs, event sourcing, bitemporal stores).
⊕, Δ, α_p; verify
L3 (views don’t mutate) and L5 (policy is a read-time parameter).∘) is under-specified — interpretation-of-interpretation
needs a typing discipline to avoid paradox; only the finite-stack case is
sketched.bhanno implements a
fragment: ⊕, Δ, and α_majority / α_unanimous. The other prototypes use
even less of it.In short: this answers “is there a model, or just a pattern?” with “here is a model, written as a specification” — while being explicit that a specification is not yet a proven theory, and that the property it formalizes is, in two domains, already implemented.