Read
0-AI-MANIFEST.a2mlfirst. Its(core-idea …)block is the canonical statement of what this repository is for, and it is marked do-not-paraphrase. This file describes how the work is arranged; it does not restate the idea.
Invariant Path is a claim-path debugger, not a truth engine. It has two faces:
-
The governance front-end for a three-layer claim checker. This is where the layer architecture is decided and recorded. Most of the intellectual work lives here.
-
A working extractor and classifier. A Rust CLI that finds claim transitions in repository artifacts and records what each one preserves and loses. This is what currently ships.
The second is not an implementation of the first. Keeping that distinction visible is the point of this document.
A claim is checked by three layers, each answering a question the others
cannot. nextgen-language-evangeliser names this repository as the
governance front-end for that architecture: rulings are recorded here
as ADRs, and each equivalence claim is anchored to its code locations
plus a witness, human-in-the-loop and editable.
Checkable on form alone, with no judgement of evidence quality. Three sub-layers:
-
Well-formedness — is this a claim at all?
-
Continuity / through-line — does the argument connect end to end?
-
Temporality — “the diode” — a forward-only ordering constraint: evidence must precede conclusion, no backward edges, applied per claim-type.
The diode was sited in Layer 1 deliberately, so that anything downstream inherits strand orientations from a clean form-only rule rather than from Layer 2’s purpose-indexed judgements.
What is settled, and what is not. The diode is correct but narrower than it looks: it rejects only label-honest backward edges. Three open problems are recorded in ADR-0001:
-
Its clock must be epistemic (when evidence was committed) rather than ontic (when events happened), or retrodiction — history, forensics — falsely fails to type-check.
-
Epistemic time across multiple sources is therefore a partial order, not a scalar clock, so verdicts must be proved invariant across admissible interleavings of causally incomparable commits.
-
Because the diode applies per claim-type, differently-clocked charts glue together, and a composite path can run forward in every chart while its endpoints reach backwards globally. ADR-0001 calls this composition-forgery; it is a holonomy phenomenon — every chart flat, the twist in the gluing.
Purpose-indexed, per strand: does individuated, context-bound evidence survive the leap to this conclusion for this use?
This is the layer with a real implementation, and it lives in
trope-checker and hermeneia, not here:
-
a six-coordinate
Grade— fourFatefields plusBondandMerge(Trope/Grade.idr); -
nine
p-*effects intrope-particularity-workbench/vocabulary/, of which three are deceptive and absorbing under composition; -
a
Floor— a use-model expressed as a partial demand vector (Checker/Ir.idr); -
a verdict
Sufficient | Insufficientthat carries a witness edge on failure (Checker/Check.idr); -
p-sufficiency, defined as
floor(U) ⊑ acc(v)— the declared floor lies below the accumulated grade in a componentwise retention order.
Grades compose associatively along transformation paths, with the fidelity coordinate accumulating tropically.
Resource discipline: affine, with a guarded contraction rule. At most once — weakening is free, contraction is not — but contraction is permitted when a resemblance warrant licenses it. That is not plain affine logic, and the distinction is load-bearing; see the doubling attack below.
Ruled 2026-08-05 in docs/decisions/0001-the-sortal-layer.adoc, after
a five-count case against the layer was built deliberately and three of
the five counts broke under adversarial review.
The layer adjudicates identity of an argument across presentations, and issues one of two things:
-
an equivalence certificate — a sequence of moves, every intermediate of which still passes Layers 1 and 2, transforming one presentation into the other;
-
an obstruction certificate — an invariant separating them under the same quotient.
Detection and equivalence-certification are dual, so “it is only an equivalence proof” is the job stated correctly, not a demotion.
The name is from the same literature trope came from: a sortal
supplies a criterion of identity and a principle of counting for its
instances. Both halves do work — the criterion decides “same
argument”, the count decides whether two corroborating lines are two
witnesses or one witness echoed.
Present one derivation twice, paraphrased, under distinct labels. Every node is label-honest, so the diode is silent. Every chain terminates in genuinely attested exogenous anchors, so attestation and well-foundedness both pass. Each copy individually passes Layer 2.
The doubled web and an honestly-redundant two-witness web have identical pass/fail profiles on every subdiagram — yet corroboration weight is two versus one.
This is not an illegal contraction. It is a contraction that was mandatory and never taken, and the affine resource algebra is structurally blind to it: nothing illegal happened, two distinct labels really were spent once each. Whether they were the same token is a fact about identity, which is not a resource property.
Hence the dependency arrow that the original design was missing:
Layer 1 (type) ──orientations──▶ Layer 3 (sortal) ──identities──▶ Layer 2 (trope)
Overlapping presentations must be recognised as the same argument before resource accounting runs, or Layer 2 double-counts. Layer 3 is upstream of Layer 2’s soundness, not decoration downstream of it.
Nothing in this repository implements these layers. ADR-0001 is a decision record about an architecture, and says so. A survey of existing formal work (recorded in the ADR) found:
-
Layer 1 — no substrate anywhere in the estate. No syntax of claims, no ordering on evidence events. Must be built from scratch.
-
Layer 2 — real support from
tropical-types(the retention order derived from one line of idempotence, axiom-free, behind a genuine CI gate) andecho-types(path-independence of degradation holds precisely if the retention order is propositional, with a countermodel). -
Layer 3 — roughly a quarter, obstruction side only.
echo-typessupplies the fibreEcho f y = Σ A (λ x → f x ≡ y)— “which distinct presentations collapsed to the same argument” — and “identified members count once”. There is nothing on the equivalence side: no move relation, no quotient, no normal form, anywhere.
Two candidate substrates were investigated and refuted with evidence: QuandleDB (a homonym — topological invariants are blind to labels, so a quandle fingerprint cannot see the doubling attack and would return false positives) and absolute-zero’s CNO (machine-checked refutation against its own Coq).
What actually compiles and runs today: a pipeline from artifact text to a reviewable record.
artifact text
│
▼
extractor candidate claim transitions, anchored by trigger phrase
│ and byte span
▼
classifier invariant type; losses/preserved; break condition;
│ a Classification
▼
annotations JSONL, upsert-on-write, visibility + status
│
▼
CLI scan / accept / dismiss / clarify / add / update / overlay
Two commitments explain most of the code.
Heuristics are deliberately strict. The extractor triggers on explicit
transition markers and accepts false negatives to avoid annotation noise
(DESIGN.md, 2026-04-10). A noisy suggester costs more trust than it
saves.
The path is retained, never discarded. A bare Classification
cannot recover the claim-path that produced it, so
ClassificationOutcome carries losses and preserved alongside
the verdict — the echo-types fibre discipline applied to a
classifier. See docs/ECHO-TYPES.md.
In crates/invariant-path-core/src/model.rs:
-
ClaimCandidate— source span, target text, matched trigger, path description. -
InvariantType— what is meant to be preserved:CausalRelationship,StatisticalRelationship,LogicalImplication,Mechanism,RiskProbability,NormativeBridge,ResourceBudget,Provenance. -
Classification—ValidPath,Overextended,Conflation,Incomplete,Abstain. -
ClassificationOutcome— the verdict pluslosses,preserved, break condition. The retained echo. -
Annotation— the persisted record, withVisibilityandStatus.
The classifier is pure and offline: term lists in classifier.rs, no
model, no network, no external state.
A profile is a lens onto a corpus that lives elsewhere. It names a
target by path and vendors nothing. pmpl.md is the reference
implementation.
The rule exists because a profile carrying a copy of its target drifts from the real thing and then grounds a claim about a stale fixture while reporting success — this tool’s own failure mode, turned inward. Profiles are named for their target, not for one claim about it.
Six exist: echidna, faces, hypatia, panll, pmpl,
standards-docs.
faces is the one worked example that is fully grounded end to end:
it checks that AffineScript’s several surface syntaxes all lower to one
canonical form, by compiling each to typed-wasm and comparing sha256
hashes. It is a good demonstration of the whole idea in miniature — and
it is an example, not the subject of this repository. It also violates
the profile rule twice (it vendors its corpus, and it is named for a
claim rather than a target), which is issue #54. Details in
profiles/faces.md; its Agda companion is proofs/SameCube.agda.
| Path | What lives there |
|---|---|
|
ADRs — the layer rulings. Start at ADR-0001. |
|
The library: |
|
The binary. Single |
|
The contract between this tool and anything reading its store. |
|
One markdown file per target corpus. Vendors nothing. |
|
The |
|
|
|
|
|
|
The Cargo workspace is exactly the two crates in members; nothing
under src/ is compiled.
-
Not a truth engine. It never decides whether a claim is true.
-
Not an implementation of the three layers. Those are decided, not built.
-
Not a prover.
proofs/grounds one claim in one worked example. -
Not networked. No service, no telemetry, no model calls.
-
Not a general NLP pipeline. The classifier is term lists and pattern matches, chosen so a reader can audit every decision it makes.