core/docs/decisions/ADR-0021-epistemic-grade-policy.md
Shay 80aa971db3 docs(adr): ADR-0021 Epistemic Grade Policy — coherence is the only signal
Establishes a typed epistemic surface for stored claims without
importing any source-trust bias. The status enum (COHERENT,
CONTESTED, SPECULATIVE, FALSIFIED) describes a claim's position
in the revision graph, not the credentials of its source. No
tier in the schema carries inherent trust weight.

Three commitments:
1. epistemic_status is a position in the revision graph, not a
   trust tier. Source labels (peer_consensus / outsider /
   established / unauthoritative) are explicitly excluded.
2. Non-hardening invariant: no reviewed claim, relation, or
   edge ever becomes unrevisable. No final/frozen/axiom flag
   may be added. Stage-3 inversion (versor-conjugate
   correction) is always available.
3. Coherence is the only admission signal. v1 is curator-
   mediated but bias-free at the schema level; v2 must add a
   structural coherence metric so the tag has geometric teeth
   and not just curator authority.

Schema impact: PackMutationProposal.epistemic_status,
review outcome carries status alongside ACCEPTED/REJECTED_IDENTITY,
lexicon entries get an optional epistemic_status field,
trace_hash folds in epistemic_status for replay verification.

Named v2 gap: structural coherence metric recipe (cga_inner
agreement with the existing reviewed field) is committed as
the path forward.

Implementation lands as a Phase 5 parallel-track item alongside
Rust parity per ADR-0020.
2026-05-16 17:10:58 -07:00

8.4 KiB

ADR-0021 — Epistemic Grade Policy

Status: Accepted Date: 2026-05-16 Authors: Joshua Shay Depends on: ADR-0016 (Capability Roadmap), ADR-0017 (Agency Scope), ADR-0018 (Tool Use Scope), CLAUDE.md ("Truth is coherent").

Context

CLAUDE.md already establishes the structural stance: Truth is coherent. Preserve coherence in algebra, memory, articulation, and teaching. The runtime already refuses several forms of implicit bias by construction:

  • No bulk corpus ingestion — frequency is rejected as a truth signal.
  • Teaching is proposal-only until reviewed — repetition does not promote.
  • Identity is structural, not learned from the corpus — override attempts are rejected.
  • Recall is exact CGA inner product — no learned ranking, no popularity weighting.

What is missing is a typed surface that lets the system say something about the epistemic status of a stored claim. Without it, the runtime treats all reviewed claims uniformly: there is no way to mark a claim as "currently contested" or "eligible for inversion" except by removing it. Removal loses provenance; uniformity loses revisability.

The deeper requirement, surfaced in working notes 2026-05-16: coherence is the only signal. Not credentials. Not frequency. Not institutional consensus. Not outsider status. Not novelty. The architecture must not weight sources — it must weight coherence with the existing field, and it must keep every claim revisable forever.

Decision

CORE adopts an Epistemic Grade Policy with three commitments:

1. epistemic_status is a position in the revision graph, not a trust tier

The status tag describes how a claim sits in the field right now, not where the claim came from. Source labels (peer_consensus, outsider_empirical, established, unauthoritative) are explicitly not part of the schema — they would re-import the bias this policy refuses.

The status enum is:

COHERENT       — fits current field geometry; no incoherence
                 with reviewed claims detected at admission.
CONTESTED      — incoherent with at least one reviewed claim;
                 review pending; admissible but cannot drive
                 downstream inferences that depend on its truth.
SPECULATIVE    — proposed; not yet reviewed for coherence;
                 admissible only as a candidate, not as
                 evidence.
FALSIFIED      — incoherent under accumulated evidence;
                 eligible for Stage-3 inversion (versor-
                 conjugate correction); retained for provenance.

No tier carries inherent trust weight. A COHERENT claim is not "more true" than a CONTESTED one — it is currently incident-free, and the moment new evidence makes it incoherent it becomes CONTESTED.

2. Non-hardening invariant

No reviewed claim, relation, or proposition-graph edge ever becomes unrevisable. Concretely:

  • Teaching is proposal-only (already true).
  • Reviewed claims expose a Stage-3 inversion path: a versor-conjugate correction that geometrically reverses the rotor encoding the wrong relation, rather than appending a contradictory claim alongside it.
  • No final, frozen, axiom, or permanent flag exists or may be added on the runtime data model. The closest such property already in the architecture is the field invariant versor_condition(F) < 1e-6, which is a mathematical closure check on the algebra — not an epistemic seal on a claim.

This invariant is checkable: a test in tests/test_epistemic_invariants.py (to be added in the v1 implementation PR) asserts that no schema field, relation, or flag in the public surface admits a non-revisable state.

3. Coherence is the only admission signal

epistemic_status transitions are computed from coherence, not asserted by source authority. At v1 the computation is intentionally simple and curator-mediated. At every later version, the curator's role shrinks toward a structural coherence metric.

v1 admission rule (curator-mediated, but bias-free at the schema level):

  • The curator reviews a proposed claim against the existing reviewed field.
  • The curator's only admissible reasoning is geometric: does the claim cohere with already-reviewed claims, or does it produce incoherence?
  • The curator must not invoke source credentials, source popularity, or source institutional position as a justification. Curator notes that do invoke these are a review smell — to be flagged in v2 by an automated check on the review log.

The status is the output of this review, not an input the curator may set by fiat outside of it.

Schema impact

The schema lands where it needs to, per the runtime's existing typed surfaces:

  • teaching/store.py::PackMutationProposal — new field epistemic_status: EpistemicStatus = SPECULATIVE at proposal creation; transitions to COHERENT / CONTESTED / FALSIFIED only via the review path.
  • teaching/review.py — review outcomes carry the resulting epistemic_status alongside the existing ACCEPTED / REJECTED_IDENTITY axis. Accepting a proposal is not the same as ratifying it as COHERENT — the two are orthogonal and both required for admission as evidence.
  • language_packs/data/*/lexicon.jsonl — new optional field epistemic_status (default COHERENT for the seed vocabulary; deliberate-curator-reviewed at pack version bumps). No retroactive tagging without review.
  • core/cognition/trace.pyepistemic_status of any load-bearing claim in a turn is folded into the trace_hash, so replay can detect if a downstream surface was produced under a different epistemic frame than at the time of recall.

The proposition_graph model does not need per-edge tagging in v1 — edges inherit status from the proposition node they attach to. v2 may revisit this for fine-grained relation typing.

Named gap (v2 work, explicit)

The hardest unsolved piece is making the coherence test structural, not curator-asserted. v1 ships with a typed field and a non-hardening invariant; v2 must add the metric that bounds epistemic_status by geometric agreement with the existing reviewed field.

Candidate v2 recipe (to be evaluated, not yet committed):

admit(claim) requires:
  cga_inner(claim_versor, field_state) ≥ τ_admit
  AND no reviewed_relation R with cga_inner(claim, R) ≤ τ_reject

That metric — once specified, tested, and locked — is what takes the system from "curator says it's coherent" to "the field's geometry confirms it's coherent." Until then, v1 is honest about the gap: epistemic typing is real and typed, the coherence judgment behind a tag is still curator- mediated, and the architecture commits to closing that gap on a stated path.

What this ADR is NOT

  • Not a source-trust schema. No tier ranks sources.
  • Not a censorship layer. FALSIFIED claims are retained with provenance; they are not removed.
  • Not a moral filter. The system's internal motive remains structural ("be coherent"), not normative ("save people from lies").
  • Not language-specific. The policy applies to any pack, any language, any domain. English / Hebrew / Greek / mathematics / physics packs all receive the same epistemic surface.

Consequences

  • New ADR-tracked work: implement the schema changes named in Schema impact above, with the non-hardening invariant test. This is a Phase 5 parallel-track item alongside Rust parity.
  • docs/runtime_contracts.md must add an Epistemic surface section documenting the four statuses, the non-hardening invariant, and the curator review rule.
  • Pack mutation review tooling must record curator justification text so a v2 automated check can flag source-authority-as-justification smells.
  • Trace-hash composition expands to include epistemic_status per load-bearing claim. Replay tests must continue to pass bit-for-bit.

Why this is correct for this project

Every other architectural commitment in CORE is structural: algebra closure, exact recall, typed operators, reviewed teaching, deterministic replay. Adding epistemic_status as a tier-ranked trust schema would be the one place the architecture quietly imports a bias source. By making the status a revision-graph position instead, the policy stays load-bearing without breaking the rest of the architecture's shape. Coherence remains the only signal; the typed field just lets the runtime say where each claim sits relative to that signal.