{"schema_version": 1, "start": {"method": "POST", "path": "/api/controller/start"}, "bootstrap": "/api/bootstrap", "token_header": "X-Orbit-Token", "stream": "/api/controller/stream?token=TOKEN&client=Mac-client", "transport": "Binary RFB over WebSocket; same noVNC/VNC transport as /api/stream.", "telemetry": "/api/controller?since=SEQUENCE&limit=80", "capture": "/api/controller/capture", "release": {"method": "POST", "path": "/api/controller/release"}, "stop": {"method": "POST", "path": "/api/controller/stop"}, "guide": "/api/controller/guide", "button_keys": {"j": "Cross", "l": "Circle", "k": "Square", "i": "Triangle", "q": "L1", "e": "R1", "z": "L2", "c": "R2", "left shift": "L3", "right shift": "L3", "left ctrl": "R3", "right ctrl": "R3", "return": "Options", "keypad enter": "Options", "up": "Up", "down": "Down", "left": "Left", "right": "Right", "tab": "TouchPad", "backspace": "TouchPad"}, "axis_keys": {"left_x": ["a", "d"], "left_y": ["w", "s"], "right_x": ["f", "h"], "right_y": ["t", "g"]}, "analog_support": "Basic RFB carries keyboard and absolute pointer events, not native gamepad axes. Stick values here are digital mappings (-1, 0, +1).", "example": {"client_input": "Space", "transmitted_key": "j", "keysym": 106, "code": "KeyJ", "expected_button": "Cross", "expected_release": "j key_up"}, "notes": ["WebRTC also supports the isolated lab; evidence still comes from the Linux SDL receiver.", "Mouse buttons and Space are unmapped by the KytyPS5 default keyboard map.", "Raw mouse coordinates/deltas are observed, not interpreted as analog camera movement.", "All lab clients share one test display. Native clients may omit Origin; browser clients use the server origin.", "A running game is not required and the lab does not inject input into it."]}