diagnose: a verification verdict must say which instrument produced it #91
Loading…
Reference in a new issue
No description provided.
Delete branch "diagnose/grounding-backing"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The grounding labels under a
VerificationReportcome from a learned model — a DeBERTa-v3 NLI head, per §6.4. That is the right instrument for the job: whether prose entails a claim is not decidable, and a calibrated judgement is the honest tool. The problem was never the model. It was that nothing downstream had to notice there was one.What was already right
Worth stating, because the finding that prompted this overstated it: the provenance was already carried.
EntailmentResultrecordsmodel_id, calibratedlabel_probabilitiesandjoules_spent;Provenance.entailmentspreserves all of it into the sealed artifact;FixtureEntaileralready names itself. Andgrounding_violations()is a pure function over supplied results — it does not call a model. This is not the "claim as its own evidence" shape of the proof T3 stand-in.What was actually missing
The other half — the family's discipline call.
jcp-action-receipthascheck_discipline,proof-cascadehasrequire_substantive_proof,sandbox-attesthasrequire_mechanism_evidence. The entailment path had norequire_*at all. Carried provenance that nothing can be made to check is a record, not a control.So:
Backingon the report, andrequire_substantive_grounding().Unstated,UnconsultedandFixtureare refused;SingleModel,ConcurringandContestedpass.require_grounding_fromadditionally pins a model.Three decisions carry the weight
The default is the floor.
Entailer::backing()defaults toUnstated, which is refused — an implementation that forgets under-claims instead of over-claiming, the same discipline asVmm::attained_tierreturning S0.A declaration cannot outrun its evidence. The check cross-references the declared backing against the
model_ids actually inentailments_consulted. A report claiming two concurring models while carrying one model's results is refused: asserting corroboration a reader cannot obtain from the artifact is worse than asserting nothing.Cache rehydration declares the floor, not a reconstructed backing. The cached entailments carry
model_ids, so a backing could be derived — and that is exactly the laundering path: aFixtureEntailerrun records model_id"fixture-entailer", and reconstructingSingleModelfrom it would promote a stand-in into a substantive backing on the way out of the cache. Evidence that a model ran is not a claim about what its labels are worth. The consequence is stated rather than hidden — rehydrated reports are refused, and the fix is persisting backing inProvenance, a cache-format change this PR deliberately does not make.Compatibility
grounding_backingisOption+skip_serializing_if = "Option::is_none", and a test asserts it never reaches the wire when unset — so reports and vectors written before it existed serialize byte-identically and keep verifying.require_*is opt-in, so no existing consumer changes behaviour until it asks.The sharpest test
a_clean_verdict_from_a_fixture_is_still_not_grounded: an existing fixture-backed report with no violations, verdictProceedToCompositionand invariant I2 verified — every previously-checkable signal saying "verified", and all of them true — is now refused as grounded. The verdict is about the labels; the backing is about whether the labels are worth anything.Verification
475 test binaries green across the workspace, 9 new. All 7 dependents of
jouleclaw-schemaare in-workspace — checked rather than assumed, since this repo's separate workspaces mean--workspacedoes not always cover a shared-schema change.🤖 Generated with Claude Code