50 lines
3.3 KiB
Python
50 lines
3.3 KiB
Python
#!/usr/bin/env python3
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
"""Mutation guardrails for Phase-1.0AB feasibility evidence."""
|
|
|
|
from __future__ import annotations
|
|
import argparse
|
|
from copy import deepcopy
|
|
import importlib.util
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
def load(path):
|
|
spec=importlib.util.spec_from_file_location("phase10ab_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():
|
|
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_phase10ab.py");original=validator.load_json(root / "manifests/retroarch/phase-1.0ab-live-adapter-feasibility.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 runtime identity change rejected",lambda r:r["local_runtime"].update(python_version="latest"))
|
|
mutation("10 connect promotion rejected",lambda r:r["feasibility"].update(pending_connect="PROVEN"))
|
|
mutation("11 deadline promotion rejected",lambda r:r["feasibility"].update(hard_wall_clock_deadline="PROVEN"))
|
|
mutation("12 remote cleanup promotion rejected",lambda r:r["feasibility"].update(remote_shell_cleanup="PROVEN"))
|
|
mutation("13 network import rejected",lambda r:r["trace_model"].update(network_import_present=True))
|
|
mutation("14 real clock rejected",lambda r:r["trace_model"].update(real_clock_present=True))
|
|
mutation("15 live implementation stop required",lambda r:r["hard_stops"].update(live_adapter_implementation=False))
|
|
mutation("16 DNS stop required",lambda r:r["hard_stops"].update(dns=False))
|
|
mutation("17 live adapter decision rejected",lambda r:r["decision"].update(live_adapter_allowed=True))
|
|
mutation("18 overall promotion rejected",lambda r:r["decision"].update(overall="PROVEN"))
|
|
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.0AB guardrails passed: {len(cases)}");return 0
|
|
|
|
if __name__ == "__main__":raise SystemExit(main())
|