Part 3/4 of the recovered Fifth Domain upgrade. Applies the persona continuity skill guard from local source commit 18dfdfd without rewriting remote history.
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()
|