Phase 0 of the field-reasoner wedge — net hardening regardless of the experiment's outcome. - algebra/cga.py: embed_point gains a dtype kwarg (f32 default byte-unchanged; cl41.geometric_product already preserves f64) + read_scalar_e1 projective dehomogenization read-back (weight-invariant; correct for dilations, where a raw distance-from-origin is wrong) + EMBED_EXACT_MAX pinned magnitude ceiling. f32 silently collapsed integer coordinates past ~1e4. - core/reasoning/evidence.py: verify_tier2_agreement now keys independence on a reader_lineage pathway token (refuses SAME_READER_LINEAGE), replacing the label-only len(set(signatures))<2 check a single reader could satisfy by relabeling. reader_lineage is excluded from canonical serialization, so the entailment trace_hash is unchanged. - tests INV-27: transitive reader-disjointness over TIER2_READER_PATHWAYS makes the lineage check load-bearing (distinct lineage => proven import-disjoint pathway). The two seeded readers share zero transitive first-party modules. Green: smoke 87, algebra 82, cognition 121, 53 architectural invariants, reasoning/deductive/r1 50; 16 new f64-exactness tests; zero regressions.
147 lines
4.8 KiB
Python
147 lines
4.8 KiB
Python
"""Tier-2 reasoning evidence spine tests."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import dataclasses
|
|
import json
|
|
|
|
import pytest
|
|
|
|
from core.contemplation.miners.learning_arena import mine_learning_arena_report
|
|
from core.reasoning import (
|
|
COMMITMENT_DISAGREEMENT,
|
|
DUPLICATE_STRUCTURAL_SIGNATURE,
|
|
MISSING_COMMITMENT,
|
|
SAME_READER_LINEAGE,
|
|
TIER2_VERIFIED,
|
|
EvidenceBundle,
|
|
OperatorEvidence,
|
|
verify_tier2_agreement,
|
|
)
|
|
|
|
|
|
def _ev(
|
|
*,
|
|
signature: str = "shape-a",
|
|
commitment: str = "answer:42",
|
|
outcome: str = "verified",
|
|
lineage: str = "reader-a",
|
|
) -> OperatorEvidence:
|
|
return OperatorEvidence(
|
|
domain="mathematics_logic",
|
|
operator="unit_test_operator",
|
|
outcome=outcome,
|
|
reason="test",
|
|
input_keys=("input-a",),
|
|
check_keys=("check-a",),
|
|
commitment_key=commitment,
|
|
structural_signature=signature,
|
|
reader_lineage=lineage,
|
|
payload={"nested": {"values": [1, 2, "x"]}},
|
|
)
|
|
|
|
|
|
def test_operator_evidence_is_frozen_and_payload_is_immutable() -> None:
|
|
ev = _ev()
|
|
with pytest.raises(dataclasses.FrozenInstanceError):
|
|
ev.domain = "mutated" # type: ignore[misc]
|
|
with pytest.raises(TypeError):
|
|
ev.payload["nested"] = {} # type: ignore[index]
|
|
|
|
|
|
def test_canonical_json_and_hash_are_deterministic() -> None:
|
|
ev1 = _ev()
|
|
ev2 = _ev()
|
|
assert ev1.canonical_json() == ev2.canonical_json()
|
|
assert ev1.evidence_hash == ev2.evidence_hash
|
|
assert json.loads(ev1.canonical_json())["payload"]["nested"]["values"] == [1, 2, "x"]
|
|
|
|
|
|
def test_evidence_bundle_hash_is_ordered_and_stable() -> None:
|
|
bundle = EvidenceBundle((_ev(signature="a"), _ev(signature="b")))
|
|
same = EvidenceBundle((_ev(signature="a"), _ev(signature="b")))
|
|
swapped = EvidenceBundle((_ev(signature="b"), _ev(signature="a")))
|
|
assert bundle.evidence_hash == same.evidence_hash
|
|
assert bundle.evidence_hash != swapped.evidence_hash
|
|
|
|
|
|
def test_tier2_verifies_two_distinct_structures_same_commitment() -> None:
|
|
verdict = verify_tier2_agreement((
|
|
_ev(signature="shape-a", lineage="reader-a"),
|
|
_ev(signature="shape-b", lineage="reader-b"),
|
|
))
|
|
assert verdict.verified is True
|
|
assert verdict.reason == TIER2_VERIFIED
|
|
assert verdict.commitment_key == "answer:42"
|
|
assert verdict.structural_signatures == ("shape-a", "shape-b")
|
|
assert verdict.reader_lineages == ("reader-a", "reader-b")
|
|
|
|
|
|
def test_tier2_refuses_same_reader_lineage() -> None:
|
|
"""The decoration firewall: one reader cannot self-verify by relabeling its
|
|
structural signature. Two evidences from the SAME decoding pathway are refused
|
|
even when their structural_signatures differ and the commitment agrees.
|
|
|
|
Meaningfully-failing guard: under the old label-only check this admitted.
|
|
"""
|
|
verdict = verify_tier2_agreement((
|
|
_ev(signature="shape-a", lineage="one-reader"),
|
|
_ev(signature="shape-b", lineage="one-reader"),
|
|
))
|
|
assert verdict.verified is False
|
|
assert verdict.reason == SAME_READER_LINEAGE
|
|
|
|
|
|
def test_tier2_refuses_duplicate_signature() -> None:
|
|
verdict = verify_tier2_agreement((
|
|
_ev(signature="same", lineage="reader-a"),
|
|
_ev(signature="same", lineage="reader-b"),
|
|
))
|
|
assert verdict.verified is False
|
|
assert verdict.reason == DUPLICATE_STRUCTURAL_SIGNATURE
|
|
|
|
|
|
def test_tier2_refuses_disagreeing_commitments() -> None:
|
|
verdict = verify_tier2_agreement((
|
|
_ev(signature="shape-a", commitment="answer:42", lineage="reader-a"),
|
|
_ev(signature="shape-b", commitment="answer:41", lineage="reader-b"),
|
|
))
|
|
assert verdict.verified is False
|
|
assert verdict.reason == COMMITMENT_DISAGREEMENT
|
|
|
|
|
|
def test_tier2_refuses_missing_commitment() -> None:
|
|
verdict = verify_tier2_agreement((
|
|
_ev(signature="shape-a", commitment=""),
|
|
_ev(signature="shape-b", commitment="answer:42"),
|
|
))
|
|
assert verdict.verified is False
|
|
assert verdict.reason == MISSING_COMMITMENT
|
|
|
|
|
|
def test_learning_arena_miner_emits_speculative_findings(tmp_path) -> None:
|
|
report = {
|
|
"per_class": {
|
|
"alpha": {
|
|
"committed": 2,
|
|
"coverage": 0.2,
|
|
"t2_verified": 0,
|
|
}
|
|
},
|
|
"elimination_records": [
|
|
{
|
|
"case_id": "c-wrong",
|
|
"class_name": "alpha",
|
|
"gold": 10.0,
|
|
"reason": "answer mismatch",
|
|
}
|
|
],
|
|
}
|
|
path = tmp_path / "learning_report.json"
|
|
path.write_text(json.dumps(report), encoding="utf-8")
|
|
|
|
findings = mine_learning_arena_report(path, substrate_hash="substrate")
|
|
|
|
predicates = {finding.predicate for finding in findings}
|
|
assert predicates == {"weak_coverage", "missing_tier2_evidence", "wrong_attempt"}
|
|
assert all(finding.epistemic_status.value == "speculative" for finding in findings)
|