Skip to content

Commit 246f7a5

Browse files
authored
Add unit tests for IX cognition canonical example
1 parent 46a8717 commit 246f7a5

1 file changed

Lines changed: 185 additions & 0 deletions

File tree

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
import io
2+
import json
3+
import tempfile
4+
import unittest
5+
from contextlib import redirect_stdout
6+
from pathlib import Path
7+
8+
from ix.assurance import assess_ix
9+
from ix.cli import main
10+
from ix.cognition import cognition_obligation_ids
11+
from ix.evidence import EvidenceBundleWriter
12+
from ix.formatting import format_ix
13+
from ix.parser import parse_ix
14+
from ix.runtime import run_ix
15+
16+
17+
REPO_ROOT = Path(__file__).resolve().parents[1]
18+
EXAMPLE_FILE = REPO_ROOT / "examples" / "cognitionkernel_wave6_contract.ix"
19+
20+
21+
class TestIXCognitionCanonicalExample(unittest.TestCase):
22+
def test_canonical_example_parses_and_is_canonically_formatted(self):
23+
source = EXAMPLE_FILE.read_text(encoding="utf-8")
24+
program = parse_ix(source, filename=str(EXAMPLE_FILE))
25+
26+
self.assertEqual(format_ix(program), source)
27+
28+
def test_canonical_example_passes_cognitionkernel_wave6_profile(self):
29+
program = parse_ix(
30+
EXAMPLE_FILE.read_text(encoding="utf-8"),
31+
filename=str(EXAMPLE_FILE),
32+
)
33+
34+
report = assess_ix(program, profile="cognitionkernel-wave6")
35+
check_ids = {check.check_id for check in report.checks}
36+
37+
self.assertEqual(report.status, "pass")
38+
self.assertEqual(report.profile, "cognitionkernel-wave6")
39+
self.assertEqual(report.metrics["attempts"], 1)
40+
self.assertEqual(report.metrics["obligations"], len(cognition_obligation_ids()))
41+
self.assertEqual(report.metrics["evidence_requirements"], len(cognition_obligation_ids()))
42+
self.assertEqual(report.metrics["falsification_gates"], len(cognition_obligation_ids()))
43+
self.assertIn("cognition_contract.required_obligations.present", check_ids)
44+
self.assertIn("cognition_contract.obligations.canonical", check_ids)
45+
self.assertIn("cognition_contract.agi_claim_restriction.present", check_ids)
46+
self.assertIn("cognition_contract.research_boundary.present", check_ids)
47+
self.assertIn("cognition_contract.prohibited_claim_language.absent", check_ids)
48+
self.assertIn("cognition_contract.kernel_handoff.present", check_ids)
49+
self.assertIn(
50+
"cognition_contract.obligation_canonical_falsification.present",
51+
check_ids,
52+
)
53+
54+
def test_canonical_example_runtime_exports_metadata_without_execution(self):
55+
program = parse_ix(
56+
EXAMPLE_FILE.read_text(encoding="utf-8"),
57+
filename=str(EXAMPLE_FILE),
58+
)
59+
60+
result = run_ix(program)
61+
62+
self.assertEqual(result.status, "completed")
63+
self.assertEqual(result.outputs, [])
64+
self.assertEqual(result.replies, [])
65+
self.assertEqual(result.approvals_required, [])
66+
self.assertEqual(
67+
result.contract_metadata["runtime_semantics"],
68+
"metadata_only_not_executed",
69+
)
70+
self.assertEqual(result.contract_metadata["counts"]["attempts"], 1)
71+
self.assertEqual(
72+
result.contract_metadata["counts"]["obligations"],
73+
len(cognition_obligation_ids()),
74+
)
75+
self.assertEqual(
76+
result.contract_metadata["attempts"][0]["name"],
77+
"wave6_measured_cognition",
78+
)
79+
self.assertEqual(
80+
[event.kind for event in result.trace],
81+
["run.start", "contract.metadata", "run.complete"],
82+
)
83+
84+
def test_canonical_example_evidence_bundle_contains_kernel_handoff_and_reports(self):
85+
program = parse_ix(
86+
EXAMPLE_FILE.read_text(encoding="utf-8"),
87+
filename=str(EXAMPLE_FILE),
88+
)
89+
result = run_ix(program)
90+
91+
with tempfile.TemporaryDirectory() as tmpdir:
92+
output_dir = Path(tmpdir) / "canonical-cognition-evidence"
93+
bundle = EvidenceBundleWriter().write_bundle(
94+
result,
95+
source_file=EXAMPLE_FILE,
96+
output_dir=output_dir,
97+
command="unit-test",
98+
)
99+
100+
relative_files = set(bundle.relative_files())
101+
self.assertIn("contract.json", relative_files)
102+
self.assertIn("kernel-handoff.json", relative_files)
103+
self.assertIn("satisfaction-report.json", relative_files)
104+
self.assertIn("failure-report.json", relative_files)
105+
106+
summary = json.loads((output_dir / "summary.json").read_text(encoding="utf-8"))
107+
kernel_handoff = json.loads(
108+
(output_dir / "kernel-handoff.json").read_text(encoding="utf-8")
109+
)
110+
satisfaction = json.loads(
111+
(output_dir / "satisfaction-report.json").read_text(encoding="utf-8")
112+
)
113+
failure = json.loads(
114+
(output_dir / "failure-report.json").read_text(encoding="utf-8")
115+
)
116+
117+
self.assertEqual(
118+
summary["counts"]["contract_obligations"],
119+
len(cognition_obligation_ids()),
120+
)
121+
self.assertEqual(summary["counts"]["kernel_handoff_packages"], 1)
122+
self.assertEqual(
123+
summary["counts"]["satisfaction_report_items"],
124+
len(cognition_obligation_ids()),
125+
)
126+
self.assertEqual(
127+
summary["counts"]["failure_report_gates"],
128+
len(cognition_obligation_ids()),
129+
)
130+
self.assertEqual(kernel_handoff["packages"][0]["target"], "IX-CognitionKernel")
131+
self.assertFalse(kernel_handoff["packages"][0]["self_certification_allowed"])
132+
self.assertTrue(kernel_handoff["packages"][0]["human_authority_required"])
133+
self.assertEqual(
134+
len(kernel_handoff["packages"][0]["obligations"]),
135+
len(cognition_obligation_ids()),
136+
)
137+
self.assertEqual(satisfaction["status"], "not_evaluated")
138+
self.assertEqual(failure["status"], "not_evaluated")
139+
140+
def test_cli_check_format_assure_and_evidence_support_canonical_example(self):
141+
check_stdout = io.StringIO()
142+
with redirect_stdout(check_stdout):
143+
check_code = main(["check", str(EXAMPLE_FILE)])
144+
self.assertEqual(check_code, 0)
145+
self.assertIn("OK:", check_stdout.getvalue())
146+
147+
format_stdout = io.StringIO()
148+
with redirect_stdout(format_stdout):
149+
format_code = main(["format", str(EXAMPLE_FILE), "--check"])
150+
self.assertEqual(format_code, 0)
151+
self.assertIn("OK:", format_stdout.getvalue())
152+
153+
assure_stdout = io.StringIO()
154+
with redirect_stdout(assure_stdout):
155+
assure_code = main(
156+
[
157+
"assure",
158+
str(EXAMPLE_FILE),
159+
"--profile",
160+
"cognitionkernel-wave6",
161+
"--json",
162+
]
163+
)
164+
self.assertEqual(assure_code, 0)
165+
assure_payload = json.loads(assure_stdout.getvalue())
166+
self.assertEqual(assure_payload["status"], "pass")
167+
self.assertEqual(assure_payload["metrics"]["obligations"], 20)
168+
169+
with tempfile.TemporaryDirectory() as tmpdir:
170+
evidence_stdout = io.StringIO()
171+
output_dir = Path(tmpdir) / "evidence"
172+
with redirect_stdout(evidence_stdout):
173+
evidence_code = main(
174+
["evidence", str(EXAMPLE_FILE), "--out", str(output_dir)]
175+
)
176+
177+
self.assertEqual(evidence_code, 0)
178+
self.assertTrue((output_dir / "kernel-handoff.json").exists())
179+
self.assertTrue((output_dir / "satisfaction-report.json").exists())
180+
self.assertTrue((output_dir / "failure-report.json").exists())
181+
self.assertIn("- kernel-handoff.json", evidence_stdout.getvalue())
182+
183+
184+
if __name__ == "__main__":
185+
unittest.main()

0 commit comments

Comments
 (0)