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.
This commit is contained in:
parent
4a3e89b730
commit
80aa971db3
1 changed files with 213 additions and 0 deletions
213
docs/decisions/ADR-0021-epistemic-grade-policy.md
Normal file
213
docs/decisions/ADR-0021-epistemic-grade-policy.md
Normal file
|
|
@ -0,0 +1,213 @@
|
|||
# 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:
|
||||
|
||||
```text
|
||||
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.py` — `epistemic_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):
|
||||
|
||||
```text
|
||||
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.
|
||||
Loading…
Reference in a new issue