75 lines
3.1 KiB
Python
75 lines
3.1 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""CLI for large-scale policy simulation and fuzzing."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import argparse
|
||
|
|
import json
|
||
|
|
|
||
|
|
from prod.clean_arch.sim.fuzzer import FuzzConfig, fuzz_stack
|
||
|
|
|
||
|
|
|
||
|
|
def main() -> int:
|
||
|
|
parser = argparse.ArgumentParser(description="Run clean-arch policy simulation/fuzzing.")
|
||
|
|
parser.add_argument("--transactions", type=int, default=1_000_000)
|
||
|
|
parser.add_argument("--seed", type=int, default=42)
|
||
|
|
parser.add_argument("--bad-input-rate", type=float, default=0.01)
|
||
|
|
parser.add_argument("--network-drop-rate", type=float, default=0.001)
|
||
|
|
parser.add_argument("--network-duplicate-rate", type=float, default=0.001)
|
||
|
|
parser.add_argument("--price-sigma", type=float, default=0.015)
|
||
|
|
parser.add_argument("--capture-limit", type=int, default=2_000)
|
||
|
|
parser.add_argument("--runtime-namespace", type=str, default="pink")
|
||
|
|
parser.add_argument("--anomaly-sensor-key", type=str, default="")
|
||
|
|
parser.add_argument("--mirror-legacy-sensor-key", action="store_true")
|
||
|
|
parser.add_argument("--aggressive", action="store_true", help="Enable aggressive chaos/anomaly injection")
|
||
|
|
parser.add_argument("--json", action="store_true", help="Emit JSON summary")
|
||
|
|
args = parser.parse_args()
|
||
|
|
|
||
|
|
report = fuzz_stack(
|
||
|
|
FuzzConfig(
|
||
|
|
transactions=args.transactions,
|
||
|
|
seed=args.seed,
|
||
|
|
bad_input_rate=args.bad_input_rate,
|
||
|
|
network_drop_rate=args.network_drop_rate,
|
||
|
|
network_duplicate_rate=args.network_duplicate_rate,
|
||
|
|
price_sigma=args.price_sigma,
|
||
|
|
capture_limit=args.capture_limit,
|
||
|
|
aggressive=args.aggressive,
|
||
|
|
runtime_namespace=args.runtime_namespace,
|
||
|
|
anomaly_sensor_key=(args.anomaly_sensor_key.strip() or None),
|
||
|
|
mirror_legacy_sensor_key=args.mirror_legacy_sensor_key,
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
payload = {
|
||
|
|
"transactions": report.transactions,
|
||
|
|
"capital_final": report.capital_final,
|
||
|
|
"equity_final": report.equity_final,
|
||
|
|
"open_notional_final": report.open_notional_final,
|
||
|
|
"policy_events": report.policy_events,
|
||
|
|
"trade_events": report.trade_events,
|
||
|
|
"account_events": report.account_events,
|
||
|
|
"logs_emitted": report.logs_emitted,
|
||
|
|
"network_dropped": report.network_dropped,
|
||
|
|
"network_duplicated": report.network_duplicated,
|
||
|
|
"anomaly_counts": report.anomaly_counts,
|
||
|
|
"anomaly_origin_counts": report.anomaly_origin_counts,
|
||
|
|
"injected_anomaly_counts": report.injected_anomaly_counts,
|
||
|
|
"emergent_anomaly_counts": report.emergent_anomaly_counts,
|
||
|
|
"anomaly_sensor_payload": report.anomaly_sensor_payload,
|
||
|
|
"anomaly_samples": report.anomaly_samples,
|
||
|
|
"sample_policy_events": report.sample_policy_events,
|
||
|
|
}
|
||
|
|
if args.json:
|
||
|
|
print(json.dumps(payload, indent=2, sort_keys=True))
|
||
|
|
else:
|
||
|
|
print("Clean-arch policy simulation complete")
|
||
|
|
for k, v in payload.items():
|
||
|
|
if k != "sample_policy_events":
|
||
|
|
print(f"{k}: {v}")
|
||
|
|
return 0
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
raise SystemExit(main())
|