core/tests/test_contemplation_loop.py
Shay 06bbac86e1
feat(contemplation): ADR-0080 read-only speculative loop (#55)
* docs(adr): ADR-0080 contemplation loop boundary

* feat(contemplation): add read-only contemplation package

* feat(contemplation): add immutable speculative finding schema

* feat(contemplation): add deterministic substrate snapshot

* feat(contemplation): add frontier report miner package

* feat(contemplation): mine frontier compare failures as speculative findings

* feat(contemplation): add read-only contemplation runner

* feat(contemplation): add read-only contemplation CLI

* test(contemplation): prove read-only speculative loop invariants
2026-05-20 11:40:12 -07:00

161 lines
5.6 KiB
Python

from __future__ import annotations
import json
from pathlib import Path
import pytest
from core.contemplation.__main__ import main
from core.contemplation.miners.frontier_compare import mine_frontier_compare_report
from core.contemplation.runner import contemplate_frontier_reports, write_contemplation_run
from core.contemplation.schema import (
ContemplationEvidenceRef,
ContemplationFinding,
FindingKind,
)
from core.contemplation.snapshot import ContemplationSubstrate
from teaching.epistemic import EpistemicStatus
def _sample_frontier_report(path: Path) -> None:
payload = {
"benchmark_family": "frontier_compare_wave1",
"model": "core",
"mode": "native",
"summary": {"suite_count": 1, "case_count": 2, "primary_score": 0.5, "passed": False},
"suites": [
{
"suite": "truth_lock",
"case_count": 2,
"primary_score": 0.5,
"passed": False,
"cases": [
{
"suite": "truth_lock",
"case_id": "known_truth",
"prompt": "What is truth?",
"passed": True,
"score": 1.0,
"elapsed_ms": 1.0,
"details": {},
"failures": [],
},
{
"suite": "truth_lock",
"case_id": "unknown_relation",
"prompt": "Why does xylomorphic matter?",
"passed": False,
"score": 0.0,
"elapsed_ms": 1.0,
"details": {},
"failures": ["unexpected_grounding_source:vault"],
},
],
}
],
}
path.write_text(json.dumps(payload, sort_keys=True), encoding="utf-8")
def test_contemplation_finding_rejects_non_speculative_status() -> None:
evidence = ContemplationEvidenceRef(
source_type="test",
source_id="unit",
pointer="case=1",
)
with pytest.raises(ValueError, match="SPECULATIVE"):
ContemplationFinding(
kind=FindingKind.BENCHMARK_CASE,
subject="suite/case",
predicate="failed_case",
object="prompt",
evidence_refs=(evidence,),
proposed_action="review failure",
substrate_hash="substrate",
epistemic_status=EpistemicStatus.COHERENT,
)
def test_contemplation_finding_requires_evidence() -> None:
with pytest.raises(ValueError, match="evidence"):
ContemplationFinding(
kind=FindingKind.BENCHMARK_CASE,
subject="suite/case",
predicate="failed_case",
object="prompt",
evidence_refs=(),
proposed_action="review failure",
substrate_hash="substrate",
)
def test_frontier_report_miner_emits_failed_cases_only(tmp_path: Path) -> None:
report = tmp_path / "frontier_wave1.json"
_sample_frontier_report(report)
substrate = ContemplationSubstrate.from_report_paths((report,))
findings = mine_frontier_compare_report(report, substrate_hash=substrate.substrate_hash)
assert len(findings) == 1
finding = findings[0]
assert finding.kind is FindingKind.BENCHMARK_CASE
assert finding.subject == "truth_lock/unknown_relation"
assert finding.predicate == "failed_case"
assert finding.object == "Why does xylomorphic matter?"
assert finding.epistemic_status is EpistemicStatus.SPECULATIVE
assert finding.evidence_refs[0].summary == "unexpected_grounding_source:vault"
def test_contemplation_runner_is_replay_deterministic(tmp_path: Path) -> None:
report = tmp_path / "frontier_wave1.json"
_sample_frontier_report(report)
first = contemplate_frontier_reports((report,), pack_ids=("en_core_cognition_v1",))
second = contemplate_frontier_reports((report,), pack_ids=("en_core_cognition_v1",))
assert first.run_id == second.run_id
assert first.as_dict() == second.as_dict()
assert all(
finding.epistemic_status is EpistemicStatus.SPECULATIVE
for finding in first.findings
)
def test_contemplation_runner_does_not_mutate_pack_tree(tmp_path: Path) -> None:
report = tmp_path / "frontier_wave1.json"
_sample_frontier_report(report)
pack_root = Path("language_packs")
before = sorted(
(p.relative_to(pack_root).as_posix(), p.stat().st_mtime_ns, p.stat().st_size)
for p in pack_root.rglob("*")
if p.is_file()
)
contemplate_frontier_reports((report,))
after = sorted(
(p.relative_to(pack_root).as_posix(), p.stat().st_mtime_ns, p.stat().st_size)
for p in pack_root.rglob("*")
if p.is_file()
)
assert before == after
def test_contemplation_write_and_cli(tmp_path: Path, capsys) -> None:
source_report = tmp_path / "frontier_wave1.json"
output_report = tmp_path / "contemplation.json"
_sample_frontier_report(source_report)
run = contemplate_frontier_reports((source_report,))
write_contemplation_run(run, output_report)
written = json.loads(output_report.read_text(encoding="utf-8"))
assert written["run_id"] == run.run_id
assert written["finding_count"] == 1
code = main([str(source_report), "--report", str(output_report)])
out = capsys.readouterr().out
printed = json.loads(out)
assert code == 0
assert printed["finding_count"] == 1
assert json.loads(output_report.read_text(encoding="utf-8")) == printed