A tester that treats the Gamepad API honestly
If you have ever opened a gamepad tester and wondered whether axis 2 is a trigger or the right stick, you have already met the real problem. The Gamepad API is a compatibility layer, not a schematic. Standard mapping puts left stick on 0/1, right stick on 2/3, and analog triggers on buttons 6 and 7. Plenty of real hardware — DualSense over Bluetooth on macOS Firefox in particular — does not ship that mapping.
CTRLCHK resolves a layout before any diagnostic math. Standard mapping is trusted. Sony devices get ABS or HID profiles when triggers rest at −1. Hat axes become D-pad buttons. Heuristic layouts are labeled heuristic so a lucky guess cannot hide inside a High confidence score.
How to run the guided check
Connect the pad and press a button. When you start the health check you get a 3-2-1 countdown, then five seconds of hands-off centre, a slow circle on each stick, a flick-and-release for snapback, a required-button checklist, analog trigger peaks, and a rumble pulse if vibrationActuator.playEffect exists. Skip anything the browser cannot see. The score will not punish you for Firefox omitting rumble.
Developers can leave the guided flow and stay on live overview with Raw frame enabled. Mapped axes, raw axes, pressed bits, and the mapping profile update with the UI tick — not with Gamepad.timestamp — so a still pad still redraws.
What this is not
It is not a USB 1000 Hz cert, a DualSense haptic lab, or an Xbox Elite paddle programmer. Those signals do not appear in the Gamepad API. For the measurements that do, see stick drift, circularity, snapback, vibration, and update rate.