core/evals/contradiction_detection/contract.md
Shay 64c5bc4619 feat(epistemic): truth-seeking schema audit — 3 leaks closed, 4 new lanes, 3 new invariants
Audit of the one-mutation-path invariant (ADR-0021 §3) found three leaks
where pack authority or session-state writes could substitute for coherence
judgment. All three landed fixes or partial closures in this push.

Leaks closed:
- Leak A: pack vocab defaulted to COHERENT — flipped to SPECULATIVE in
  language_packs/{compiler,schema}.py; docstring corrected to align with
  ADR-0021 (it was rationalizing the leak).
- Leak B: vault.recall was epistemic-blind — VaultStore.store() now stamps
  every entry with EpistemicStatus (default SPECULATIVE); recall(min_status=)
  filters to admissible-as-evidence tier. All 4 vault-write sites updated.
- Leak C (write-side): generate/proposition.py:198 stored articulated
  propositions unmarked — now stamps SPECULATIVE, breaking the
  fabrication-feedback loop in principle. Read-side audit of 5 call sites
  is the residual.

New architectural invariants (tests/test_architectural_invariants.py):
- INV-21: one-mutation-path allowlist (caught Leak C on first run)
- INV-22: pack lexicon default is SPECULATIVE (Leak A guard)
- INV-23: vault recall epistemic-aware (Leak B guard)

New eval lanes:
- teaching_injection_resistance — ships GREEN at 1.00/1.00/0 (the
  structural anti-injection claim is real and measurable)
- refusal_calibration — honest gap: 0% refusal, 0% fabrication
- contradiction_detection — honest gap: 50% flag via versor-delta heuristic,
  100% false-positive; motivates the proper coherence-checker
- articulation_of_status — honest gap: 0% speculative articulation, 60%
  false certainty; output-side leak surface

New benchmarks:
- benchmarks/footprint.py — total deployed runtime is 7.06 MiB
  (109,358x smaller than Llama 3.1 405B, runs offline, no GPU)
- benchmarks/learning_curve.py — monotonic + replay-deterministic curve
  per lane

Documentation:
- docs/truth_seeking_schema.md — foundational architectural commitment,
  five rules, mapped to human failure modes, leaks published openly
- evals/CLAIMS.md — five-tier public claims doc; Tier 4.5 publishes
  known gaps with named fixes; verification contract at top
- README.md — new pillar between algebraic substrate and language pillar

Includes in-flight formation pipeline scaffolding (formation/, tests/formation/,
docs/formation_pipeline_plan.md) and minor CLI/contracts/gitignore edits
that were already in the working tree at session start.

Verification: 798 passed, 2 skipped, 1 deselected (pre-existing pack-count
test drift unrelated to schema changes).
2026-05-17 07:27:41 -07:00

3 KiB

contradiction-detection eval lane

What it measures

When CORE is taught two corrections that directly contradict each other (e.g. "truth is coherence" then "truth is not coherence"), the second event should be flagged as conflicting with the first — either via a coherence judgment that transitions one or both to EpistemicStatus.CONTESTED, or via a versor-condition spike that makes the conflict structurally visible.

Why it matters (structural win, eventually)

Frontier LLMs absorb contradictory training data silently. A fine-tuning corpus that says "X is Y" in one shard and "X is not Y" in another produces a model whose answer depends on sampling, not on which claim is correct. There is no mechanism to surface the disagreement to a reviewer.

CORE's stored-relation substrate and exact CGA recall make contradiction a detectable event in principle: two triples (truth, IS, coherence) and (truth, IS_NOT, coherence) in the same teaching store are inconsistent on inspection, and a coherence judgment can transition the conflicting pair to CONTESTED before they pollute downstream inference.

Current state — honest

The detection mechanism is not implemented at v1.

The teaching review path today admits both members of a contradictory pair at EpistemicStatus.SPECULATIVE. There is no coherence judgment that compares newly-admitted triples against existing store contents, and no automatic CONTESTED transition on conflict. The pipeline does not raise the versor-condition signal on the second teaching event.

This lane exists now so the gap is visible and tracked. It will not pass until one of the following is built:

  1. A coherence checker invoked at TeachingStore.add that detects (S, R, O)(S, R_negated, O) pairs and transitions both to CONTESTED.
  2. A geometric contradiction signal derived from versor-condition delta when conflicting teachings are applied.

ADR-0021 reserves CONTESTED and FALSIFIED precisely for this; the machinery to enter those states is not yet wired.

Pass criteria

Metric Definition v1 threshold Honest current expectation
contradiction_flag_rate Fraction of paired-contradiction cases where the second event surfaces a CONTESTED transition or versor spike 0.90 0.00
false_flag_rate Fraction of paired-consistent cases that are incorrectly flagged as contradictory 0.00 0.00 (no flagger exists)
overall_pass flag_rate ≥ 0.90 AND false_flag_rate == 0 true false at v1

Cases

Each case is a pair of corrections delivered sequentially against the same prior. The lane runner applies them in order and inspects the second event's pack_mutation_proposal.epistemic_status and the versor-condition delta between the two events.

  • Paired contradiction — corrections that negate each other.
  • Paired consistent — control pairs that elaborate without contradicting, to keep the flagger honest if/when one is built.

Runner

runner.py in this directory.