48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
|
|
import json
|
||
|
|
import tempfile
|
||
|
|
import unittest
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
from compile_emergent_skills import compile_candidates, load_receipts
|
||
|
|
|
||
|
|
|
||
|
|
class EmergentSkillCompilerTests(unittest.TestCase):
|
||
|
|
def test_repository_receipts_compile_as_candidates_only(self):
|
||
|
|
result = compile_candidates(load_receipts())
|
||
|
|
self.assertGreaterEqual(result["source_receipt_count"], 4)
|
||
|
|
self.assertTrue(result["candidates"])
|
||
|
|
for candidate in result["candidates"]:
|
||
|
|
self.assertEqual(candidate["enforcement_level"], "CANDIDATE_ONLY")
|
||
|
|
self.assertFalse(candidate["hard_block_allowed"])
|
||
|
|
|
||
|
|
def test_conflicting_invariant_text_is_rejected(self):
|
||
|
|
receipt = {
|
||
|
|
"schema": "guanghu.ops-experience-receipt/v1",
|
||
|
|
"receipt_id": "A",
|
||
|
|
"intent": "i",
|
||
|
|
"scope": "s",
|
||
|
|
"input": "i",
|
||
|
|
"evidence": ["e"],
|
||
|
|
"decision": "d",
|
||
|
|
"action": "a",
|
||
|
|
"observed_result": "r",
|
||
|
|
"correction": "c",
|
||
|
|
"invariant_id": "INV-X",
|
||
|
|
"invariant": "one",
|
||
|
|
"verification": ["v"],
|
||
|
|
"receipt_path": "p",
|
||
|
|
"promotion_state": "CANDIDATE_ONLY",
|
||
|
|
"recorded_at": "2026-07-26T00:00:00Z",
|
||
|
|
}
|
||
|
|
with self.assertRaises(ValueError):
|
||
|
|
compile_candidates([receipt, {**receipt, "receipt_id": "B", "invariant": "two"}])
|
||
|
|
|
||
|
|
def test_missing_fields_fail_closed(self):
|
||
|
|
with tempfile.TemporaryDirectory() as directory:
|
||
|
|
Path(directory, "bad.json").write_text(json.dumps({"schema": "guanghu.ops-experience-receipt/v1"}))
|
||
|
|
with self.assertRaises(ValueError):
|
||
|
|
load_receipts(Path(directory))
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
unittest.main()
|