{
  "study": "2026 ADI Lab Multi-Account Browser Benchmark",
  "count": 47,
  "checks": [
    {
      "id": 1,
      "key": "ua_string",
      "category": "User agent",
      "criterion": "User-Agent string matches the declared browser, version, OS, and architecture."
    },
    {
      "id": 2,
      "key": "ua_ch_consistency",
      "category": "User agent",
      "criterion": "User-Agent and Client Hints agree on platform, version, and architecture."
    },
    {
      "id": 3,
      "key": "platform_os",
      "category": "User agent",
      "criterion": "navigator.platform and navigator.userAgentData platform are coherent."
    },
    {
      "id": 4,
      "key": "screen_resolution",
      "category": "Display",
      "criterion": "screen.width and screen.height are plausible for the device class."
    },
    {
      "id": 5,
      "key": "viewport",
      "category": "Display",
      "criterion": "innerWidth and innerHeight are consistent with screen and window state."
    },
    {
      "id": 6,
      "key": "device_pixel_ratio",
      "category": "Display",
      "criterion": "devicePixelRatio matches the device class and screen resolution."
    },
    {
      "id": 7,
      "key": "color_depth",
      "category": "Display",
      "criterion": "colorDepth and pixelDepth are coherent with the GPU and display profile."
    },
    {
      "id": 8,
      "key": "timezone",
      "category": "Locale",
      "criterion": "Intl timezone matches the proxy egress country and profile locale."
    },
    {
      "id": 9,
      "key": "timezone_offset",
      "category": "Locale",
      "criterion": "Date timezone offset matches the configured timezone."
    },
    {
      "id": 10,
      "key": "language",
      "category": "Locale",
      "criterion": "navigator.language matches the profile locale and proxy country."
    },
    {
      "id": 11,
      "key": "languages",
      "category": "Locale",
      "criterion": "navigator.languages order and values are coherent."
    },
    {
      "id": 12,
      "key": "webgl_vendor",
      "category": "Graphics",
      "criterion": "WebGL vendor matches the declared GPU profile."
    },
    {
      "id": 13,
      "key": "webgl_renderer",
      "category": "Graphics",
      "criterion": "WebGL renderer matches the declared GPU profile."
    },
    {
      "id": 14,
      "key": "webgl_params",
      "category": "Graphics",
      "criterion": "WebGL parameters fall inside the expected range for the GPU."
    },
    {
      "id": 15,
      "key": "canvas_image",
      "category": "Graphics",
      "criterion": "Canvas image hash is stable and plausible for the profile."
    },
    {
      "id": 16,
      "key": "canvas_text",
      "category": "Graphics",
      "criterion": "Canvas text metrics are stable and plausible."
    },
    {
      "id": 17,
      "key": "audio_context",
      "category": "Audio",
      "criterion": "AudioContext fingerprint is stable and consistent with the platform."
    },
    {
      "id": 18,
      "key": "font_list",
      "category": "Fonts",
      "criterion": "Font enumeration matches the declared OS and font pack."
    },
    {
      "id": 19,
      "key": "font_metrics",
      "category": "Fonts",
      "criterion": "Font measurement is coherent with the enumerated font list."
    },
    {
      "id": 20,
      "key": "hardware_concurrency",
      "category": "Hardware",
      "criterion": "navigator.hardwareConcurrency is plausible for the device class."
    },
    {
      "id": 21,
      "key": "device_memory",
      "category": "Hardware",
      "criterion": "navigator.deviceMemory is plausible for the device class."
    },
    {
      "id": 22,
      "key": "touch_support",
      "category": "Input",
      "criterion": "Touch support matches the declared device class."
    },
    {
      "id": 23,
      "key": "max_touch_points",
      "category": "Input",
      "criterion": "navigator.maxTouchPoints is coherent with touch support."
    },
    {
      "id": 24,
      "key": "webrtc_local_ip",
      "category": "Network",
      "criterion": "WebRTC does not expose a host or private IP outside the proxy path."
    },
    {
      "id": 25,
      "key": "webrtc_public_ip",
      "category": "Network",
      "criterion": "WebRTC public candidate matches the proxy egress IP."
    },
    {
      "id": 26,
      "key": "webrtc_mdns",
      "category": "Network",
      "criterion": "mDNS behavior is consistent with the declared browser."
    },
    {
      "id": 27,
      "key": "dns_leak",
      "category": "Network",
      "criterion": "DNS resolution does not reveal the host network or real location."
    },
    {
      "id": 28,
      "key": "webrtc_proxy_leak",
      "category": "Network",
      "criterion": "No direct UDP or TCP path bypasses the configured proxy."
    },
    {
      "id": 29,
      "key": "geolocation_permission",
      "category": "Permissions",
      "criterion": "Geolocation permission state is coherent with the profile policy."
    },
    {
      "id": 30,
      "key": "geolocation_coords",
      "category": "Permissions",
      "criterion": "Coordinates are near the proxy location and consistent with locale."
    },
    {
      "id": 31,
      "key": "battery_api",
      "category": "Hardware",
      "criterion": "Battery API is plausible or absent for the declared device."
    },
    {
      "id": 32,
      "key": "media_devices_count",
      "category": "Media",
      "criterion": "enumerateDevices returns a plausible device count."
    },
    {
      "id": 33,
      "key": "media_devices_labels",
      "category": "Media",
      "criterion": "Device labels are empty before permission is granted."
    },
    {
      "id": 34,
      "key": "speech_voices",
      "category": "Media",
      "criterion": "Speech synthesis voices match the declared OS and language."
    },
    {
      "id": 35,
      "key": "permissions_state",
      "category": "Permissions",
      "criterion": "Permissions API states are internally coherent."
    },
    {
      "id": 36,
      "key": "notification_permission",
      "category": "Permissions",
      "criterion": "Notification permission state is coherent with the profile."
    },
    {
      "id": 37,
      "key": "plugins",
      "category": "Browser",
      "criterion": "Plugin array matches the declared browser family and version."
    },
    {
      "id": 38,
      "key": "mime_types",
      "category": "Browser",
      "criterion": "MIME types match the plugin array."
    },
    {
      "id": 39,
      "key": "pdf_viewer",
      "category": "Browser",
      "criterion": "PDF viewer flag is consistent with the browser build."
    },
    {
      "id": 40,
      "key": "chrome_runtime",
      "category": "Browser",
      "criterion": "window.chrome is present or absent as expected for the build."
    },
    {
      "id": 41,
      "key": "webdriver_flag",
      "category": "Automation",
      "criterion": "navigator.webdriver is false or absent."
    },
    {
      "id": 42,
      "key": "cdp_artifacts",
      "category": "Automation",
      "criterion": "No Chrome DevTools Protocol runtime artifacts are exposed."
    },
    {
      "id": 43,
      "key": "headless_indicators",
      "category": "Automation",
      "criterion": "No headless-browser markers are present."
    },
    {
      "id": 44,
      "key": "tls_ja3",
      "category": "Transport",
      "criterion": "TLS ClientHello fingerprint matches the declared browser family where observable."
    },
    {
      "id": 45,
      "key": "http2_settings",
      "category": "Transport",
      "criterion": "HTTP/2 SETTINGS fingerprint is consistent with the browser family."
    },
    {
      "id": 46,
      "key": "cookie_isolation",
      "category": "Isolation",
      "criterion": "Cookies do not cross profile boundaries."
    },
    {
      "id": 47,
      "key": "storage_isolation",
      "category": "Isolation",
      "criterion": "LocalStorage and IndexedDB do not cross profile boundaries."
    }
  ]
}
