docs/truth-reduction.md
Reducing the taxonomy
Every surviving kind attacked until reduction fails. Supersedes the three-kind result in truth-kinds.md.
⚠️ The conditional on state is retracted by occurrence-falsification.md. Deriving state from a complete occurrence history is a computation result; it does not bear on whether state is a distinct ontological kind. The eliminations below stand.
Outcome: constraint is eliminated. Interpolability is eliminated as a primitive. Two kinds survive — state and occurrence — and their survival is conditional on partial observation.
Attack 1 — constraint reduces to state
The reduction
"Inventory must not exceed 100" is not a truth about inventory. It is a truth about a policy, and the policy is a subject:
measure(subject = policy/inventory-cap, dimension = limit) = 100
Interpolable — the policy holds between observations. Therefore a state.
Testing it against the discriminators that earned constraint its class
Violability — the discriminator I called sharp. Under the reduction, a
violation is: policy.limit = 100 and inventory.level = 120. Two states, both
true, no contradiction anywhere. The "violation" is a comparison between two
states — derived, computed by a projection. And relation was already
eliminated as a truth kind in truth-kinds.md.
So violability is not a property of a truth. It is a property of a comparison over truths, and it belongs to projection, not ontology. The discriminator does not survive.
Evidence — my claim was falsified by this repository. I wrote that evidence
is meaningless for constraints because they are stipulated rather than observed.
constitution.ts refutes it directly:
{ id: "recency-horizon-days", value: 30,
where: "substrate/telemetry", ← observer
basis: "stated window for commit recency decay", ← citation
assumed: false }
where and basis are an observer and a citation under other names. A policy
document is observable; I conflated "not observed in the physical world" with
"not observed at all." Constraints carry evidence like anything else.
Amendment — the third separation rule collapses. I claimed constraints separate on amendment rather than on change. But a limit moving from 100 to 120 is a change of value on the policy subject — episode separation, the state rule exactly. There was never a third rule; there was the first rule wearing a different name.
The residue, dissected
What made constraints feel distinct was two flags, and neither belongs to the constraint:
enforced— measured: it is never read anywhere. Declared incore/fact.ts:50, plumbed throughingest.ts:170, referenced only in prose. The flag distinguishing a real constraint from an aspiration has no consumer. And semantically it is not about the limit at all: this repo's own entry says "enforced by the dispatcher; a real constraint" — enforcement is a property of the dispatcher, a state about the enforcer. The flag is on the wrong subject.assumed— documented as "True when no evidence supports the value." That is a statement about evidence quality, not about the constraint. It belongs to the evidence layer.
Strip both — enforced to the enforcer, assumed to evidence — and what remains
is a value on a subject. A state.
Constraint is eliminated. It was a state on a policy subject, plus a misplaced capability flag, plus an evidence-quality flag.
One dependency recorded honestly: relocating enforced routes through
capability, which truth-kinds.md classified as state but
marked least settled. The reduction inherits that uncertainty. It does not depend
on it — the other two arguments stand alone — but it is not free of it.
Attack 2 — interpolability reduces to absent-evidence semantics
Interpolability asks: does the truth hold in an unobserved gap? Underneath it is a more primitive question:
What does the absence of an observation mean for this truth?
| Kind | Absence of observation means |
|---|---|
| state | unchanged — it persisted; absence is ignorance |
| occurrence | did not happen — absence is absence |
This is more primitive on three counts. It is epistemic and generates the ontological property rather than the reverse. It produces the identical partition, so nothing is lost. And it is the same distinction already load-bearing in this system — the missing-versus-zero rule, where absence of a fact means nobody measured and a fact of value 0 means someone measured and found none. That rule was derived independently, for provenance, and turns out to be this one.
Formally, a state carries a frame assumption — absent evidence of change, it stays. An occurrence carries none.
Interpolability does not survive as a primitive. It survives as a consequence of absent-evidence semantics. It remains a usable test; it is not foundational.
Attack 3 — are state and occurrence one kind with a flag?
If the only difference is what absence means, that is a binary parameter, and
one kind with a persists flag would carry identical information.
The criterion: two things are one kind if they share their laws. State and occurrence share none of them —
| state | occurrence | |
|---|---|---|
| absent evidence | unchanged | did not happen |
| separation | on change of value | always |
| identity's third term | episode ordinal | occurrence ordinal |
| the question it answers | what is it now? | did it happen in this window? |
A shared container type is not a shared kind. The flag does not unify them; it names the fork and then every law reads it. Not a reduction — a relabeling.
Attack 4 — state reduces to occurrence (event sourcing)
The strongest remaining attack, and a real technique: a state is the accumulation of change-occurrences. Temperature is the initial value plus every change since. Under it, only occurrences exist.
It requires two things this system does not have:
- A known initial state. Connectors report what they find, not what was.
- Complete observation of every change. This system is built on partial
observation from independent connectors, and it has a
Gaptype precisely to record that observation failed.
Under incomplete change-observation the derived state is wrong and nothing can detect that it is wrong — the accumulation is silently short. An observed state is directly evidenced; a reconstructed one inherits every gap.
Worse, it fabricates. A thermometer observes a level, not a change. Reducing that reading to occurrences means inventing the change events that produced it — information no observer reported, which is the defect this whole audit exists to find.
But the reduction is valid in a closed system. With complete change-capture and a known origin, event sourcing genuinely eliminates state. That is not a quibble; it means:
The size of the taxonomy is a function of observational completeness. Under complete observation: one kind. Under partial observation: two.
This system is open by construction, so state survives — conditionally, and the condition is stated rather than assumed away.
Attack 5 — occurrence reduces to state
Already falsified twice, on independent grounds, and both stand:
- Colliding deltas — simultaneous
a→bandc→bof 5 produce the same net levels as one transfer of 10. Occurrences carry information levels cannot hold. - Heartbeat — an occurrence that changes no state at all. There is no delta to reduce to.
The first shows the reduction is lossy; the second shows it is undefined.
Where the taxonomy stands
| Kind | Verdict | Reduces to |
|---|---|---|
| state | survives — conditionally | occurrence, only under complete observation |
| occurrence | survives | nothing — lossy and undefined in both directions |
| constraint | eliminated | state on a policy subject |
| relation | eliminated | state over a tuple |
| measurement | eliminated | category error — the evidence layer |
| capability | eliminated | state (least settled) |
| Criterion | Verdict |
|---|---|
| interpolability | eliminated as primitive — a consequence of absent-evidence semantics |
| absent-evidence semantics | survives — and is the missing-versus-zero rule, arrived at twice |
Two kinds. One criterion. Both survived direct attack; four candidates did not.
What this does not establish
The reductions that succeeded are constructive — each exhibits the target encoding. The two survivals are failures to reduce, which is weaker: no argument here shows a future reduction impossible.
capability is the soft joint. It was eliminated into state on one unusual
property, and enforced was relocated through it. If capability turns out to be
irreducible, constraint's elimination needs re-examination — though not
reversal, since the violability and amendment arguments are independent of it.
Nothing implemented.