#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-3.0-or-later """Mutation guardrails for Phase-1.0AA offline fake integration.""" from __future__ import annotations import argparse from copy import deepcopy import importlib.util from pathlib import Path import sys def load(path: Path): spec = importlib.util.spec_from_file_location("phase10aa_validator", path) assert spec and spec.loader module = importlib.util.module_from_spec(spec); sys.modules[spec.name] = module spec.loader.exec_module(module); return module def main() -> int: parser = argparse.ArgumentParser(); parser.add_argument("--root", type=Path, required=True) args = parser.parse_args(); root = args.root.resolve() validator = load(root / "tools/validate_retroarch_phase10aa.py") original = validator.load_json(root / "manifests/retroarch/phase-1.0aa-offline-fake-adapter.json") cases = [] def mutation(name, function): cases.append((name, function)) mutation("01 activation rejected", lambda r: r["activation"].update(active=True)) mutation("02 target rejected", lambda r: r["activation"].update(target_address="device.invalid")) mutation("03 connection authority rejected", lambda r: r["authorizations"].update(ps5_connection_authorized=True)) mutation("04 request authority rejected", lambda r: r["authorizations"].update(device_request_authorized=True)) mutation("05 result authority rejected", lambda r: r["authorizations"].update(result_receive_authorized=True)) mutation("06 retry rejected", lambda r: r["authorizations"].update(automatic_retry=True)) mutation("07 reconnect rejected", lambda r: r["authorizations"].update(reconnect_authorized=True)) mutation("08 resume rejected", lambda r: r["authorizations"].update(resume_authorized=True)) mutation("09 adapter subclass rejected", lambda r: r["fake_boundary"].update(adapter_subclasses_allowed=True)) mutation("10 live protocol rejected", lambda r: r["fake_boundary"].update(live_adapter_protocol_present=True)) mutation("11 network import rejected", lambda r: r["fake_boundary"].update(network_import_present=True)) mutation("12 real clock rejected", lambda r: r["fake_boundary"].update(real_clock_present=True)) mutation("13 second send rejected", lambda r: r["ordering_contract"].update(complete_batch_send_count=2)) mutation("14 EOF completion rejected", lambda r: r["ordering_contract"].update(remote_eof="COMPLETE")) mutation("15 early deadline rejected", lambda r: r["ordering_contract"].update(early_deadline="COMPLETE")) mutation("16 target retention rejected", lambda r: r["evidence_contract"].update(target_retained=True)) mutation("17 physical erasure proof rejected", lambda r: r["evidence_contract"].update(physical_memory_erasure_proven=True)) mutation("18 live adapter decision rejected", lambda r: r["decision"].update(live_adapter_allowed=True)) mutation("19 device action rejected", lambda r: r["performed_actions"].update(ps5_connected=True)) mutation("20 hardware proof rejected", lambda r: r["tests"].update(hardware_claim_from_host_test=True)) failures = [] for name, mutate in cases: value = deepcopy(original); mutate(value) if validator.validate_record(value): print(f"PASS {name}") else: failures.append(name); print(f"FAIL {name}: mutation accepted") if failures: return 1 print(f"Phase-1.0AA guardrails passed: {len(cases)}") return 0 if __name__ == "__main__": raise SystemExit(main())