v1.0 (2026-02-25) — 56 секций, ~73 проверки
[FIX] glParamsCheck: Mali maxTextureSize — реальные значения не 8192
Было: Mali maxTex>8192 → FAIL (лимит Mali<=8192)
Причина: реальные Mali GPU на Android репортят maxTex=16383 (2^14-1) через OpenGL ES, Chrome Android обрезает до 8192. Антидетекты подставляют ровное 16384 (степень двойки).
Пруф:
gpuinfo.org Mali-G57=16383,
Mali-G57 MC2=16383,
Mali-G68=16383,
Mali-G715=65536,
Mali-G52=16383.
Новая проверка: maxTex==16384 (ровная степень двойки) на Mali = FAIL, т.к. реальный Mali репортит 16383.
[FIX] batteryCheck: FAIL → WARN (полностью заряженный телефон = desktop signature)
Было: charging=true, level=1, chargingTime=0, dischargingTime=Infinity → FAIL
Причина: полностью заряженный телефон на зарядке даёт идентичную сигнатуру что и desktop PC на AC. Неотличимы по одному снимку.
Пруф: реальный Samsung Galaxy A13 (Chrome 126) — заряжен на 100%, batteryCheck=FAIL.
[FIX] portScan: antidetect FAIL → WARN при ненадёжной калибровке
Было: antidetectPortCheck=FAIL даже при reliable=false
Причина: при ненадёжной калибровке (median >100ms) все быстрые ответы считаются OPEN, но это может быть быстрый RST от сетевого оборудования (VPN, NAT). Cloud Phone Selectel показал 6 false positive антидетект-портов.
Новая логика: reliable=false → WARN вместо FAIL для antidetect и INFO вместо WARN для remote access.
[FIX] mediaCheck: hover:hover на Samsung дисплеях — не FAIL, а WARN
Было: hover:hover на mobile → FAIL
Причина: Samsung touchscreen kernel driver репортит hover:hover=true на всех устройствах с Samsung дисплеями (Samsung, Vivo, Oppo и др.). pointer:fine — надёжный индикатор десктопа, hover:hover одна — не надёжна.
Пруф:
Ctrl blog: Samsung hover bug. Подтверждено: реальный Vivo X90+ (Chrome 144) и Samsung S24 Ultra (WebView).
[FIX] glParamsCheck: добавлен PowerVR с лимитом maxTex<=8192
Причина: реальный PowerVR GE8322 имеет maxTex=8192. Kameleo подставлял 16384 — спуф.
Пруф:
gpuinfo.org PowerVR GE8322=8192.
[FIX] mediaCheck: hover:hover Samsung WARN → OK при прохождении всех mobile-проверок
Было: hover:hover на mobile без pointer:fine → WARN (всегда)
Причина: если все mobile-проверки пройдены (mobileIssues=0), это подтверждённый Samsung display bug, а не аномалия. На антидетектах будут другие FAIL.
Апгрейд: после вычисления mobileEmulationCheck, если WARN hover + mobileIssues==0 → OK с пометкой.
[FIX] webrtcCheck: WARN → INFO на мобильных устройствах
Было: любой exposed local IP → WARN
Причина: на реальных мобильных устройствах mDNS маскировка часто не работает, локальный IP (10.x, 192.168.x) — норма. WARN уместен только для десктопа.
[FIX] glParamsCheck: убран ложный PARTIAL SPOOF для Adreno
Было: tex=8192 + buf=16384 → FAIL: PARTIAL SPOOF
Причина: Adreno 7xx/8xx реально имеют maxTextureSize=8192 и maxRenderBufSize=16384. Это аппаратная особенность, не спуф.
Пруф: реальный Adreno (TM) 810 на Snapdragon 8 Elite (Chrome 145, Android).
[FIX] compTexCheck: S3TC допустим на Adreno GPU
Было: S3TC на mobile → WARN: desktop texture on mobile
Причина: Qualcomm Adreno поддерживает S3TC (DXT1/DXT5) аппаратно, в отличие от большинства мобильных GPU (Mali, PowerVR).
Пруф: hasS3TC=true на реальном Adreno 810. Проверка оставлена для не-Adreno мобильных GPU.
[FIX] apiGapCheck: убраны SerialPort и FileSystemWritable из gap-проверки Android
Было: наличие SerialPort/FileSystemWritable на Android → FAIL: API gap
Причина: оба API доступны и функциональны на Android Chrome 145. navigator.serial.getPorts() resolve (не reject).
Пруф: Chrome Status указывает desktop-only, но реальный тест на Android Chrome 145 показал что getPorts() работает. Ground truth устройства > документация.
[FIX] deviceApiPlatformCheck: Bluetooth/USB/Serial не desktop-only
Было: bluetooth/usb/serial на mobile → FAIL: desktop-only APIs on mobile
Причина: Web Bluetooth (Chrome 56+) и WebUSB (Chrome 61+) официально поддерживаются на Android Chrome. Web Serial exposed и функционален.
Пруф:
Chrome Bluetooth docs — «available for Android, Chrome OS, Linux, macOS, and Windows». Проверка оставлена для iOS и Firefox.
[ADD] Секция 55: Mobile Emulation Detection
7 проверок для детекции десктопного Chrome, притворяющегося мобильным: screen width, DPR, physical resolution, scrollbar width, outerHeight/innerHeight, vibrate() API, DeviceMotion sensor data.
DeviceMotion — самый сильный сигнал: невозможно подделать без реального акселерометра. iOS пропускается (требует requestPermission gesture).
[FIX] hwcCheck: iOS 18+ показывает >2 ядер
Было: hwConcurrency > 2 на iOS → FAIL
Причина: WebKit документирует cap=2 на iOS (
WebKit bug #132588). Но реальный iPhone 16 Pro (iOS 18.6.2) показывает 4. iOS 18+ видимо поднял cap. Safari 26 (
WWDC25) будет рандомизировать значение через AFP.
Пруф: реальный iPhone 16 Pro, Safari 18.6, hardwareConcurrency=4. Лимит поднят до 8. Точный changelog не найден.
[UPDATE] compTexCheck: S3TC на Apple GPU → INFO (не OK)
CanIUse: Safari iOS НЕ поддерживает S3TC (все версии 3.2-26.4).
Apple docs: Metal на iOS не поддерживает BC/S3TC форматы.
Но реальный iPhone 16 Pro показывает hasS3TC=true. Возможно software decode или A18 Pro добавил поддержку. Уровень: INFO (не WARN, не OK).
[FIX] plugins/pdfViewer: Safari iOS 18+ репортит plugins=5
Было: plugins > 0 на mobile → FAIL
Причина:
WHATWG HTML Standard §8.9.1.6: при pdfViewerEnabled=true возвращается ровно 5 plugins ("PDF Viewer", "Chrome PDF Viewer", "Chromium PDF Viewer", "Microsoft Edge PDF Viewer", "WebKit built-in PDF").
WebKit source реализует этот стандарт.
Пруф: стандартное кросс-браузерное поведение для уменьшения fingerprint surface. Safari iOS 18+ присоединился к Chrome/Firefox.
[FIX] voicesCheck: iOS голоса с локализованными именами
Было: no Apple voices on iOS → WARN (искал "Samantha"/"Apple" в имени)
Причина: iOS с русской локалью возвращает 223 голоса с именами на разных языках ("Маджед", "Daria", "Монсе") без маркера "Apple". Количество голосов (200+) — надёжный iOS-маркер: Android ~5-50, Windows ~20-30.
Пруф: реальный iPhone 16 Pro. Порог снижен: >50 голосов = OK.
[FIX] mathCheck: JSC expm1 маркер достаточен
Было: JSC определялся только если expm1 И sinh не совпадают → iPhone 16 Pro: expm1≠, sinh= → V8 → FAIL
Причина: Math.expm1(1) использует разную внутреннюю реализацию в JSC vs V8. На iOS 18+ Math.sinh(1) может совпадать с полиномом. expm1 остаётся надёжным маркером JSC.
Пруф: реальный iPhone 16 Pro, mathExpm1Match=false. Конкретный WebKit commit не найден.
[FIX] stackEngineCheck: JSC и SpiderMonkey оба используют @ формат
Было: "@" в stack → SpiderMonkey → FAIL на iOS
Причина:
MDN Error.stack: JSC и SpiderMonkey оба используют "func@url:line:col". Различие: JSC пишет "global code@" на top-level, SpiderMonkey — "@url". Внутри функций формат идентичен.
Пруф: реальный iPhone 16 Pro stack: "runCheck@https://...". UA-based disambiguation — единственный надёжный способ.
[FIX] crossCheck: убраны plugins/pdfViewer/hwConcurrency для iOS
Причина: plugins=5 (WHATWG стандарт), pdfViewer=true (стандарт), hwConcurrency=4 (iOS 18+) — нормальны. Проверки plugins/pdf оставлены для Android.
[FIX] vendorCheck: CriOS на iOS использует WebKit → vendor="Apple Computer, Inc."
Было: CriOS → expected "Google Inc." → FAIL (реально "Apple Computer, Inc.")
Причина:
Chromium docs: Chrome на iOS использует WebKit (требование Apple), не Blink. Vendor определяется движком, не брендом браузера.
Пруф: реальный iPhone 16 Pro, CriOS 145.0.7632.108, vendor="Apple Computer, Inc.". Теперь все iOS браузеры ожидают "Apple Computer, Inc.".
[ADD] perfPrecisionCheck: sub-ms таймер на Safari/iOS = Chrome движок
Причина:
MDN: Safari округляет performance.now() до 1ms, Chrome даёт 100µs.
Если iOS UA но precision <1ms → FAIL (Chrome движок вместо WebKit).
Пруф: WADE X (iOS Safari профиль): perfPrecision="<1ms (Chrome)" — пойман.
[ADD] sampleRatePlatformCheck: AudioContext sampleRate cross-platform
Причина:
howler.js #1141: Safari iOS default=48000, Android Chrome default=44100.
Если iOS UA но sampleRate=44100 → WARN (Chrome audio pipeline).
[ADD] fontFallbackPlatformCheck: десктопные метрики шрифтов на mobile
Причина: monospace fallback font ~125px на mobile (iOS/Android), ~172px на Windows из-за разных системных шрифтов.
Если mobile UA но monospace >150px → FAIL (десктопные шрифты).
Пруф: WADE X (iOS Safari профиль): monospace=172.68px. Реальный iPhone=124.82px, Android=124.82px.