{ "schema_version": 1, "scenario_id": "first-mac-playable-forest", "protocol": "classic", "server": { "server_index": 0, "channel": 1, "auth_host": "", "auth_port": 0, "game_host": "", "game_port": 0 }, "character_slot": 0, "map_key": "", "waypoints_cm": [], "allowed_mob_vnums": [], "allowed_drop_vnums": [], "skill_cases": [], "resolution": [1280, 720], "loops": 3, "timeout_seconds": 900, "soak": { "duration_seconds": 7200, "rest_seconds": 30, "warmup_rounds": 1, "min_rounds": 10, "reconnects": 10, "exits": 10, "resolutions": { "sizes": [[1280, 720], [1440, 900], [1600, 1000]], "switches_per_size": 10 }, "warp": { "status": "unconfirmed", "notes": "Set status=confirmed only after the environment owner verifies a legal portal: required (even, >=20 out-and-back legs), portal_cm, destination_map_key, return_portal_cm, cross_server." }, "faults": { "status": "unconfirmed", "notes": "Set status=confirmed only with a confirmed 127.0.0.1 test proxy (mode local_proxy, per_type, unreachable_seconds 1..20, upstream {auth_host,auth_port,game_host,game_port} = the real test server). server.* and the serverlist entry must then be 127.0.0.1 proxy ports; script/run_client_gate.sh starts script/playable_fault_proxy.mjs for this client only. A server warp that hands out a direct game address bypasses the proxy. Never change global routes or firewall; active reconnect is not a substitute." } }, "notes": "Copy to test/playable/.local.json (ignored) and fill from the confirmed server fixture: server.* must equal the serverinfo entry for server_index/channel; map_key is the asset directory holding Setting.txt; waypoints are server cm. Never add credentials here. The soak suite (STB-01) additionally needs timeout_seconds >= soak.duration_seconds + 900." }