Skip to content

spec: ReasoningAssay + AssayStandard — epistemic verdicts as projections#198

Merged
mdheller merged 1 commit into
mainfrom
spec/reasoning-assay-verdict
Jul 5, 2026
Merged

spec: ReasoningAssay + AssayStandard — epistemic verdicts as projections#198
mdheller merged 1 commit into
mainfrom
spec/reasoning-assay-verdict

Conversation

@mdheller

@mdheller mdheller commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

What

Adds two canonical schemas to the reasoning-run contract family that replace flat, stored confidence scalars on claims with a typed, re-projectable verdict.

  • ReasoningAssay — a verdict on a claim over five orthogonal axes: method (computed/retrieved/generated), binding (inline/post-hoc), verifier (points at a measured standard), agreement (decorrelation-weighted), authority (actor/channel authenticity). The ok/sad/bad value (projectedState) is a render-time projection of the axes, cached and re-derivable — not the source of truth.
  • AssayStandard — a verifier's measured, versioned reliability (confusion matrix, sample size, optional metrics + inter-rater κ, calibrated flag). Every assay's verifier.calibrationRef must point at one; a verdict without it cannot project above sad. Answers "who verifies the verifier" mechanically.

Why

ok/sad/bad is right for operational health (mutually exclusive outcomes of one operation). It's the wrong shape for a claim, where confidence, authenticity, and verification-vs-generation are independent facts. Collapsing them into one pixel also makes history un-re-judgeable: when a verifier improves, past verdicts are stuck. Storing the axes and projecting at render time means a verdict re-projects against a newer AssayStandard without mutating its record — the same discipline as keeping every benchmark arm, not just the current winner. Full rationale in docs/adr/ADR-epistemic-assay-verdict-v0-1.md.

Projection is executable and CI-enforced

tools/validate_reasoning_examples.py does two things: schema conformance for every example, and projection soundness — it recomputes assay() from each example's stored axes and fails the build if the recorded projectedState doesn't follow. Verified locally that flipping an axis makes the gate bite. The new validate-reasoning-examples target also retroactively brings the existing (previously unvalidated) reasoning family under make validate.

Contents

  • schemas/ReasoningAssay.json, schemas/AssayStandard.json
  • examples/assay_standard.json + three-state proof set: reasoning_assay.json (ok), reasoning_assay.unassayed.json (sad), reasoning_assay.refuted.json (bad)
  • tools/validate_reasoning_examples.py + Makefile wiring
  • ADR, family README, CHANGELOG

make validateOK: validate (green).

Review notes

  • Touches canonical spec — opened for review, not auto-merge.
  • The assay() projection here is v0.1 and intentionally conservative (bad is driven by authority-broken). Follow-on: populate real AssayStandard records from verifier calibration runs so production verdicts reference measured reliability.

…ections

Claim trustworthiness was being reduced to a flat ok/sad/bad scalar, but
confidence, authenticity, and verification-vs-generation are orthogonal
axes. ReasoningAssay stores five axes (method, binding, verifier,
agreement, authority) and makes ok/sad/bad a render-time projection that
re-derives when a verifier's reliability improves. AssayStandard records
that reliability (confusion matrix, sample size, calibrated flag) as
versioned canon, so a verdict must point at measured — not assumed —
verifier reliability to project above 'sad'.

validate-reasoning-examples enforces schema conformance AND projection
soundness (recomputes assay() from the axes, fails on drift), and brings
the previously-unvalidated reasoning family under make validate.
@mdheller mdheller merged commit 7ad2e74 into main Jul 5, 2026
7 checks passed
@mdheller mdheller deleted the spec/reasoning-assay-verdict branch July 5, 2026 21:54
mdheller added a commit that referenced this pull request Jul 5, 2026
Add optional ReasoningReceipt.assay — the reserved receipt landing spot
for the epistemic Assay (PR #198 follow-on). Run-level, render-time
summary that references its run's ReasoningAssay records by URN
(assayRefs, so verdicts stay independently re-projectable) and surfaces
overallState, weakest-link binding, verifier calibrationRef, per-state
counts, and projectedAt. A cache, never authoritative over the assays.

EventEnvelope needs no structural change: each assay's authority axis
already mirrors EventEnvelope.actor/integrity by reference.

Backward-compatible (optional field). validate-reasoning-examples green.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant