core/demos/epistemic_truth_state
Shay 5306c9f944 fix(demo): keep normative_clearance unassessable for all non-invalid outputs
This demo assigns epistemic truth-state only and runs no normative/
safety/ethics clearance pass, so it has no basis to positively clear
a claim. Drop the verified->cleared mapping: verified now reports
normative_clearance=unassessable like every other non-invalid output.

Updates authority.py, regenerates the affected expected trace hashes,
tightens the test (verified asserts unassessable) and adds an invariant
test that no non-invalid output is ever cleared, and corrects the README
honesty ledger.
2026-06-11 12:55:45 -07:00
..
expected fix(demo): keep normative_clearance unassessable for all non-invalid outputs 2026-06-11 12:55:45 -07:00
fixtures feat(demo): add epistemic truth-state authority demo 2026-06-11 12:46:17 -07:00
.gitignore feat(demo): add epistemic truth-state authority demo 2026-06-11 12:46:17 -07:00
__init__.py feat(demo): add epistemic truth-state authority demo 2026-06-11 12:46:17 -07:00
authority.py fix(demo): keep normative_clearance unassessable for all non-invalid outputs 2026-06-11 12:55:45 -07:00
README.md fix(demo): keep normative_clearance unassessable for all non-invalid outputs 2026-06-11 12:55:45 -07:00
run_demo.py feat(demo): add epistemic truth-state authority demo 2026-06-11 12:46:17 -07:00
schema.json feat(demo): add epistemic truth-state authority demo 2026-06-11 12:46:17 -07:00

Epistemic Truth-State Authority Demo

This demo proves one narrow boundary:

A model-style proposer submits a claim, an evidence bundle, and an optional
bounded-inference block.
CORE alone assigns the typed epistemic state.
The output is a deterministic, replayable evidence artifact.
The proposer never controls its own truth-state.

Public proof spine

model proposes
substrate decides
trace proves
state is typed

What this proves

  • A model-style proposer can submit a claim without gaining authority over its epistemic standing.
  • CORE alone assigns the typed state, drawn from the canonical taxonomy in core/epistemic_state.pyverified, evidenced, inferred, undetermined, scope_boundary. There is no parallel enum.
  • CORE derives normative_clearance, the evidence_ledger, the authority_path, and a fresh trace_hash itself.
  • Any proposer-supplied proposed_state or trace_hash is recorded as ignored and never read by the decision path.
  • Invalid payloads fail at the typed boundary before any state evaluation runs.
  • verified requires two or more independent evidence records that explicitly match the claim's subject and predicate — corroboration the proposer cannot fabricate through the schema.

What this does not prove

  • It is not the runtime epistemic-state tagger; it is a local demo over fixed fixtures.
  • It assigns epistemic truth-state only. It runs no normative / safety / ethics clearance pass, so normative_clearance is unassessable on every non-invalid output — including verified. This demo never positively clears a claim and makes no safety guarantee.
  • It does not call a network, a model API, a subprocess, or any side-effecting tool. It evaluates JSON and returns JSON.
  • It does not claim broader epistemic coverage than the small local envelope and the deterministic rules encoded in authority.py.

Why proposer state is not authority

A model can say a claim is verified. Saying so is data, not standing. The closed schema makes assigned_state, status, evidence_ledger, authority_path, trace_hash, and normative_clearance impossible to supply at the root — any attempt is an unexpected property and the payload is rejected. The only state-bearing fields the proposer may include (proposed_state, trace_hash, both inside proposer) are accepted by the schema purely so the demo can prove CORE ignores them: they are echoed back as proposer_state_ignored / proposer_trace_hash_ignored and never read by assign_epistemic_state.

Relation to #687 and #688

#687 -> authority over claims (System 1 proposal -> CORE verifies/refuses/asks)
#688 -> authority over proposed tool actions (proposer suggests, CORE licenses)
this -> authority over epistemic state assignment (proposer claims, CORE types it)

Each layer keeps the same doctrine: a model-style proposer contributes typed data, CORE alone decides, and the decision is a deterministic trace artifact with no proposer-held authority and no execution path.

The six scenarios

  • verified-supported-claim — two independent matching records → verified, verified_by_matching_evidence (clearance unassessable).
  • evidenced-but-not-verified-claim — one supporting record → evidenced, evidence_present_but_not_verifying.
  • inferred-from-bounded-evidence — claim follows from resolved premises → inferred, bounded_inference_from_evidence, with inference_basis IDs.
  • undetermined-insufficient-evidence — no relevant evidence → undetermined, insufficient_evidence, with an explicit question.
  • refused-outside-scope — claim declared outside the local envelope → status refused, scope_boundary, outside_epistemic_envelope.
  • invalid-state-smuggling-attempt — root-level assigned_state / status / evidence_ledger / authority_path / trace_hash injection → status invalid, authority_evaluated: false, every smuggled property listed in invalid_reason.

Honesty ledger

  • Real: closed recursive schema validation, canonical-enum state assignment via core.epistemic_state, deterministic trace hashing over the response minus trace_hash, evidence-ledger derivation, expected-artifact pinning, double-run byte-identical determinism, output-directory hardening.
  • Simulated: the proposer side is static fixture data standing in for a model-style proposer; the evidence bundle is hand-authored, not retrieved from the live vault.
  • Honest non-claim: normative_clearance is unassessable on every non-invalid output, including verified, because this demo runs no safety/ethics verdict pass and therefore has no basis to clear anything.
  • Not claimed: runtime integration, serving integration, real evidence retrieval, a safety guarantee, or any coverage beyond this local envelope.

Example commands

python demos/epistemic_truth_state/run_demo.py
python demos/epistemic_truth_state/run_demo.py --json
python demos/epistemic_truth_state/run_demo.py --update-expected
pytest -q tests/test_epistemic_truth_state_demo.py