docs/minimal-ontology.md
The minimal ontology
Final reduction. Fact itself attacked, then State and Occurrence attacked together rather than separately.
⚠️ Extended by dimension-algebra.md. The exclusivity law below is subsequently eliminated — it is entailed by truth being a function, not an extra law — which closes the open question this document ends on. Dimension reduces further, to a value space plus a persistence behaviour.
Outcome: Fact reduces to one canonical form parameterized by mode — the four
families are eliminated. And State and Occurrence do not survive as primitives:
they derive from a persistence law, which is promoted in their place.
Part 1 — attacking Fact
Minimal structure, by attempted removal
Each component removed in turn; truth either survives or it does not.
| Component | Removable? | Why |
|---|---|---|
| evidence | yes — from the truth | a truth is true whether or not anyone observed it |
| subjects | no | every observational truth is about something; arity ≥ 1 |
| dimension | no | a truth predicates something of its subject |
| value | no | may be degenerate (unit-valued) but not absent |
| ordering | no | needed to distinguish one truth from another of the same content |
The first row is the important one. Fact conflates a truth with the record of
a truth. Evidence and recordedAt are not properties of what is true; they are
properties of our having come to know it. Two structures, not one:
truth = (subjects, dimension, ordinal) → value
record = truth + evidence + recordedAt
This is not a new concept — it is the layer evidence already occupies, made
structural. It also explains why measurement was a category error in
truth-kinds.md: the family named after an observation method
was a record-level name applied at the truth level.
The dimension/value cut is not arbitrary — and getting it wrong is the bug
An apparent reduction: dimension and value are one thing, a predication, cut at
an arbitrary point. condition: degraded on X can be encoded two ways:
- A — dimension =
degraded, value =true - B — dimension =
health, value =degraded
If the cut were arbitrary, identity would be arbitrary, since dimension is in identity and value is not. It is not arbitrary, and the two encodings are not equivalent:
- Under A,
degradedandhealthyare different dimensions, so they have different identities and coexist. Recovery is unrepresentable. - Under B, they share an identity and form one episode with a changing value. Recovery is representable.
Law: mutually exclusive predicates are values of one dimension, never dimensions of their own.
The discriminator is exclusivity, and it is a fact about reality, not a modelling preference. This law unifies two defects previously recorded as separate:
conditionIdentity(condition, subject)puts the condition in identity — encoding A. This is why condition episodes merge.placement:${subject}@${at}puts the place in identity. A place is a mutually exclusive predicate — a thing is in one place — so this is the same error, and it is why one package appeared in two places at once.
Two families, one law violated, one defect. They were filed as different bugs.
One canonical form
| Family | subjects | dimension | value | mode |
|---|---|---|---|---|
condition |
(X) | the exclusivity class | the condition | state |
measure |
(X) | the metric | number + unit | state |
placement |
(X) | location | the place | state |
exchange |
(from, to) | what moved | quantity | occurrence |
All four instantiate (subjects, dimension, ordinal) → value. The families
encode arity, value type, and mode — all of which are data, not kinds.
The four fact families are eliminated. They are a fixed enumeration of parameter combinations, mistaken for a taxonomy.
And the reduction makes a falsifiable prediction: the enumeration is
incomplete. If mode and arity are independent parameters, a 1-ary occurrence
must be possible. It is — a heartbeat. The current families cannot express
it: exchange is the only occurrence family, and moved, from and to are
all required (fact.ts:54, no optionals). A heartbeat has no from and no to.
The prediction was made from the reduction and confirmed against the type. The gap is a consequence of enumerating combinations instead of parameterising them.
Part 2 — do State and Occurrence derive from a persistence law?
The law
Every truth has a persistence extent: how long one identity remains one truth.
Both distinguishing laws derive from it, rather than standing alongside it:
| Extent | Absent evidence means | Separation |
|---|---|---|
| until-change | unchanged — it persisted | on a differing value |
| zero | did not happen | always |
Persistence is upstream of both. If a truth persists until superseded, then absence of observation must mean unchanged, and two equal adjacent observations must be one truth. If its extent is zero, absence means absence, and every observation is its own truth. Neither law is independent; both are consequences.
This also corrects the ordering asserted in truth-reduction.md, which had the epistemic generating the ontological. The clean chain runs the other way:
persistence extent → absent-evidence semantics → interpolability
(reality) (what may be inferred) (the test)
Interpolability was already demoted to a test. Absent-evidence semantics is now demoted to an inference rule. Persistence is the reality-level fact, and it is the only one of the three that is not about observers.
Is the parameter binary by necessity or by accident?
If intermediate extents exist, persistence is a continuum and the two kinds are two arbitrary points on it. Candidates with a bounded extent not set by change:
| Case | Reduces? |
|---|---|
| a visa valid 90 days | yes |
| a DNS record with a TTL | yes |
| a quote valid 24 hours | yes |
| a session token expiry | yes |
Each looks like a third mode — the truth lapses without anyone observing a change. But the expiry is itself a truth: "this visa expires at T" is a state. So each case is two states plus a computation, and the lapse is derived, not a new extent.
Extent is therefore measured by what ends the truth, and there are exactly two answers: nothing but a differing truth (until-change), or immediately (zero). A scheduled ending is a differing truth with a known arrival time.
The binary is forced by the structure, not observed to be binary.
Verdict
State and Occurrence do not survive as primitives. They are the two values of the persistence parameter, and every law that distinguished them is a consequence of it.
The gain is not compression — one law with a binary parameter carries the same information as two kinds. The gain is explanatory:
- Two kinds could only assert that no third kind was found, after failing to find one.
- The persistence law explains why no third can exist: the parameter is binary by construction, because "what ends this truth" admits exactly two answers.
That converts an inductive result into a structural one, which is the strongest outcome available and the reason to promote the law rather than the kinds.
The ontology that survives
truth = (subjects, dimension, ordinal) → value
record = truth + evidence + recordedAt
persistence extent ∈ { until-change, zero }
determines: identity's ordinal, separation, absent-evidence semantics
dimension = an exclusivity class; mutually exclusive predicates share one
One law. One structure. Two layers.
| Concept | Standing |
|---|---|
| persistence law | promoted — provisional primitive |
| State, Occurrence | its two values; the right names, not primitives |
| truth / record split | promoted — evidence is not part of a truth |
| exclusivity law | promoted — derived, and it explains two live defects |
Fact's four families |
eliminated — an enumeration of parameter combinations |
| constraint, relation, measurement, capability | eliminated previously; unchanged |
| interpolability | a test |
| absent-evidence semantics | an inference rule |
What is still not established
- Provisional, not proved. Everything here rests on sustained failure to reduce. The binary-by-structure argument is the one genuinely structural claim, and it depends on the reduction of bounded-extent cases holding for every such case, not the four checked.
capabilityremains the soft joint, untouched across three rounds. It is now the oldest unexamined assumption in the taxonomy.- The exclusivity law needs a source. It says mutually exclusive predicates share a dimension, but nothing here says how exclusivity is known. It is a fact about the domain that some observer must supply, and no mechanism exists.
Nothing implemented.