# Каким должен стать продукт

Документ отвечает на вопрос владельца: **как дать человеку десятки и сотни
профилей на одном компьютере, чтобы это работало, а не изображало работу.**

Это не пересказ ТЗ. [PLAN-antidetect-browser.md](PLAN-antidetect-browser.md)
описывает честный запуск профилей на своей машине и остаётся верным для того,
что в нём написано. Здесь — то, чего в нём нет и что придётся добавить, чтобы
продукт стоял рядом с Vision, Octo и Dolphin. Где новое противоречит старому,
это сказано прямо.

## Два уровня, и разница между ними не косметическая

Владелец сформулировал точно, и формулировку стоит закрепить в самом продукте,
потому что она честная, а у конкурентов такой честности нет.

**Уровень 1 — свой отпечаток.** Профиль запускается на настоящем железе
хозяина. Ничего не подменяется: canvas, WebGL, шрифты, звук — всё родное.
Меняются только те слои, которые у настоящего человека и так свои: прокси,
часовой пояс, язык, окно. Это даёт **максимальное доверие площадки**, потому
что подделывать нечего — машина настоящая.

Цена уровня: таких профилей на одну машину мало. Замер лежит в
[fingerprint-diversity.md](fingerprint-diversity.md), и он не оптимистичный:
**две** по-настоящему разные машины с одного компьютера. Не десять и не сто.
Всё остальное — один и тот же canvas, один и тот же рендерер, один и тот же
набор шрифтов, то есть одна связка для любого, кто группирует по отпечатку.

**Уровень 2 — масштабирование.** Профилей столько, сколько нужно, и каждый
выглядит другой машиной. Это то, что продают конкуренты, и то, за что платят
сто долларов в месяц. Здесь подделка неизбежна, а значит неизбежна и её цена:
любая подделка может быть поймана, если сделана неаккуратно.

**Продукт обязан показывать человеку, на каком он уровне и чем платит.**
Ни один из семи разобранных этого не делает: у всех есть только уровень 2, и
он подан как «уникальный отпечаток на каждый профиль», без оговорок. Наша
честность здесь — не благородство, а преимущество: человек, потерявший аккаунт,
должен понимать, за что именно он рискнул.

## Сколько профилей помещается на одну машину: арифметика

Вопрос владельца звучал как «десяток или сотня». Ответ разный для двух разных
величин, и путать их нельзя — рынок как раз путает намеренно.

**Сколько профилей можно ЗАВЕСТИ.** Замерено на этой машине (MacBook, Intel
i7-9750H, 6 ядер, 16 ГБ):

* каталог профиля — в среднем 35 МБ и растёт от работы (самый большой из 27
  живых — 258 МБ). Сотня профилей это примерно 3,5 ГБ;
* бандл с иконкой на профиль — по `du` 365 МБ, а **реально съедает 0,1 МБ**:
  `cp -Rc` делает клон APFS, блоки общие с исходной сборкой. Проверено по
  свободному месту до и после, а не по `du`, который показывает 6,1 ГБ на
  17 бандлов и вводит в заблуждение;
* отладочных портов в диапазоне 42000–48999 — семь тысяч, не ограничение.

Итог: **сотня заведённых профилей — не проблема.**

**Сколько профилей можно ЗАПУСТИТЬ ОДНОВРЕМЕННО.** Здесь честный ответ жёсткий.
Профиль — это целый Chromium, и `mantia doctor` на этой машине говорит:

> Рекомендуемый предел флота: 3 профилей

Три. Не сто. У Dolphin в документации то же самое, только словами: «нагрузка от
одного профиля равна обычному Chrome… посчитайте, сколько потянете», и
единственный пример — пять профилей на i7 с 8 ГБ.

**Отсюда устройство флота.** Сотня профилей работает не одновременно, а
очередью: столько-то одновременно, остальные ждут, старт каждого разнесён по
времени. Разброс нужен не для нагрузки, а для незаметности: сотня аккаунтов,
действующих в одну секунду, — это связка по времени, которую площадка видит без
всякого отпечатка.

И это же ответ на вопрос «а как конкуренты обещают сотни». Они обещают сотни
**ячеек в подписке**, а не сотни одновременных браузеров. Сколько запустится
разом, ни один из пяти проверенных сайтов не называет.

## Уровень 2 сделан. Движок — Camoufox

**Свой форк писать не пришлось.** Camoufox — открытый форк Firefox (MPL-2.0,
11 тысяч звёзд, обновляется) — делает ровно то, ради чего затевался наш форк:
подменяет отпечаток **на уровне C++**, а не инъекцией в прототипы.

Проверено нашим же зондом и нашим же детектором подделки:

* `struct.fn` — строка из нулей, кроме одного бита на `getBattery`, которого в
  Firefox просто нет (та же единица была у Safari). Собственных свойств у
  `navigator` и `screen` — **ноль**. Главный мир и соседний кадр отвечают
  одинаково;
* `navigator.webdriver` — false, меток автоматизации в `window` и `document`
  нет, `toDataURL`, `getParameter`, `getClientRects` и сам
  `Function.prototype.toString` отдают «[native code]»;
* **звук разный на профиль** и побайтно стабилен между запусками. Это та самая
  поверхность, которую не двигает ни один флаг запуска.

### Проверка чужим детектором лжи

Профиль уровня 2 прогнан через CreepJS — самый строгий из публичных: он не
меряет отпечаток, а ищет ПРОТИВОРЕЧИЯ и следы патчей.

    0% stealth       — следов антидетект-патча не найдено
    0% headless      — не опознан как headless, хотя запущен именно так
    6% like headless — остаточное сходство
    chromium: false  — опознан как не-Chromium, и это правда, а не ложь
    platform hints: Segoe UI:Windows — шрифты совпадают с заявленной системой

Последняя строка важнее остальных: подмена шрифтов согласована с UA, а не
живёт отдельно. Именно на таком рассогласовании ловятся конкуренты — у них
подпись видеокарты чужая, а картинка своя (см. замер восьми профилей выше).

Отдельно проверено НАШИМ детектором (`struct.fn` в зонде корпуса): строка из
нулей, кроме бита на `getBattery`, которого в Firefox нет. Собственных свойств
у `navigator` и `screen` — ноль.

**Уровень 1 на том же детекторе: тоже `0% stealth`.** То есть подмены не видно
ни там, ни там — и это правильно: на уровне 1 её и нет.

Оговорка, без которой сравнение врёт: в том прогоне уровень 1 запускался
headless, и `HeadlessChrome` стоял прямо в строке UA — отсюда его «67 %
headless» против нуля у Camoufox. Это артефакт замера, а не свойство продукта:
в бою профиль уровня 1 запускается видимым окном. Но вывод на будущее
запомнить стоит: **headless нашего Chromium детектор видит насквозь**, и если
когда-нибудь захочется гонять профили без окна — сначала замер, потом
обещания.

### Что добавляет наш продукт поверх движка

Camoufox — библиотека, а не продукт. Сам по себе он не годится для аккаунтов:

1. **Пришпиливает отпечаток к профилю.** Из коробки он выдаёт новый отпечаток
   на каждый запуск — для аккаунта это хуже, чем чужое устройство. Мы считаем
   конфиг один раз при создании и храним в `profiles.engine_config_json`;
   посевы шума выводятся из идентификатора профиля. Проверено: два запуска
   одного профиля дали побайтно одинаковые ядра, экран и звук, а два разных
   профиля — разные.
2. **Даёт ему выйти через платный прокси.** Firefox не умеет SOCKS5 с паролем
   вовсе — «Browser does not support socks5 proxy authentication». Наш
   форвардер, написанный ради fail-closed, оказался единственным способом:
   он снимает авторизацию на себя. Проверено сквозным прогоном через немецкий
   прокси, IP на выходе — прокси, шесть живых соединений с апстримом.
3. **Возвращает Windows-профилю панель задач.** Camoufox иногда отдаёт
   `availHeight == height`, то есть экран без панели. По нашему корпусу все три
   найденные машины с Windows дают разницу ровно 40 — ни одной с равными.
   Правило замерено на живых посетителях, а не взято из спецификации.
4. **Говорит человеку цену выбора.** В окне создания профиля два уровня и
   честное объяснение под каждым. Ни один из семи разобранных конкурентов
   этого не делает.

### Чего он НЕ даёт, и это надо знать до продажи

**Холст разобран до дна. Картина сложнее, чем казалось.**

Замерено по трём разным холстам на трёх профилях:

| Что рисуем | Между профилями | Между страницами |
|---|---|---|
| канонический холст fingerprintjs (текст + эмодзи + фигуры) | **различается** | `toDataURL` дрожит |
| любой холст с текстом | **различается** | то же |
| холст БЕЗ единой буквы | **ОДИНАКОВЫЙ** | то же |

Причина найдена: подмена держится на `fonts:spacing_seed` — расстановка букв
посеяна на профиль, и всё, где есть текст, расходится. Геометрию не трогает
ничто.

`getImageData` при этом отдаёт НАСТОЯЩИЕ пиксели: возмущается только выдача
`toDataURL` — длина та же, байты разные, и меняются они от документа к
документу.

**Почему не чинится настройкой.** `privacy.fingerprintingProtection` и
`privacy.resistFingerprinting` выключены в их сборке и на холст не влияют
(проверено обоими). `gfx.canvas.accelerated` и `gfx.webrender.software` тоже
ничего не меняют — на macOS 2D-холст Firefox и так считается процессором.

**Почему не чинится нами прямо сейчас.** Чинил бы `canvas:seed` — свойство
задокументировано у них в `properties.json`, но **в бинаре сборки его нет**:
`strings` по XUL находит `audio:seed` и `fonts:spacing_seed`, а `canvas:seed`
отсутствует. То есть свойство объявлено, но не реализовано.

Правка нужна в их C++, и собрать её на этой машине нельзя по двум причинам, обе
проверены: свободно 14 ГБ при потребности 40+, и в их README прямо написано —
«build system is designed to be used in **Linux**». Маковские сборки они
кросс-компилируют у себя.

**Практический вывод.** Дыра узкая: она есть только у проверок, рисующих холст
БЕЗ текста. Канонический отраслевой холст профили различает. Но дыра настоящая,
и продукт обязан о ней говорить, а не молчать.

**Это Firefox.** Для площадок, где ждут Chrome, уровень 2 пока без ответа.
Свой форк Chromium остаётся в планах — но уже не как единственный путь, и не
завтра.

**Агент на уровне 2 не работает.** Наш агент и MCP говорят по CDP, а здесь
другой канал. Уровень 2 сейчас — ручная работа человека.

## Что физически нужно для уровня 2

Разбор семи конкурентов ([competitors.md](competitors.md)) дал однозначный
ответ, и он неудобный.

**Все шестеро всерьёз работающих — это форк Chromium с патчем на C++.**
Не расширение, не инъекция JavaScript, не флаги запуска. У Dolphin своё дерево
`components/zubre/overrides/` из девяти файлов, у Vision —
`components/vision_fingerprinting_helper/`, у Octo — целый каталог `0cto/`
поверх исходников Chromium, у Undetectable — `undetectable/core/`.
Седьмой, Incogniton, своего патча не имеет — и сидит на Chromium 99 из 2022
года, то есть узнаётся по одной версии, без всяких измерений.

Инъекция JS не работает не потому, что «некрасиво», а потому, что обёртка
видна: у настоящего Chrome собственных свойств у `navigator` **ноль**, всё
лежит на прототипе, — а подделка на экземпляре их создаёт. Это замерено в этой
же сессии, на чистом Chrome и на чистом Safari. У 0detect в 171 924 строках
разницы с чистой сборкой **ноль** вхождений `defineProperty`.

Значит, для уровня 2 нужны две вещи, и обе долгие.

### Первая: библиотека настоящих отпечатков

Это главный вывод всего разбора, и он меняет порядок работ.

У **всех** конкурентов настоящая библиотека живёт на сервере, а локально почти
пусто. У AdsPower в приложении лежит 34 пары «вендор + рендерер» образца 2019
года (Intel HD 520, GTX 750, Quadro K600) — и всё. У 0detect локально нет
ничего, набор приходит ручкой `GET /dictionary`. У Undetectable отпечаток
целиком берётся из облака готовых «конфигов», то есть снимков настоящих машин.

**Патч бинаря без библиотеки подставлять нечего.** Форк — это исполнитель;
библиотека — это то, что он исполняет. Начинать с форка значит получить
дорогой механизм, который выдаёт профилям выдуманные значения, а выдуманное
сочетание ловится одной проверкой связности и сразу у всего флота.

Двое — Vision и Octo — делают ровно то, что мы начали. Vision качает с
`/api/v1/fingerprints/cache/v2` файлы вида «хеш рисующего скрипта → готовая
картинка PNG», и на диске их 21 штука по 130 КБ. Octo идёт с другой стороны:
в ядре сидит `OctoCanvasLogger`, который **подсматривает, что рисуют на живых
сайтах их же клиенты**, и отправляет к себе.

Наш корпус уже стоит на шести сайтах и собирает то же самое, но честнее: со
своих площадок, по человеческому клику, без личных данных. На сегодня в нём
31 разное устройство и 79 замеров — мало, но механизм работает и проверен.

### Вторая: сам форк

Что именно надо патчить, теперь известно поимённо — конкуренты оставили в
своих бинарях пути исходников. Сводный перечень поверхностей и правил лежит в
[competitors.md](competitors.md). Коротко, патч обязан уметь:

* подставлять **перечислимое** — `navigator`, экран, параметры WebGL и WebGPU,
  голоса синтеза речи, шрифты, счётчики медиаустройств, `connection`;
* **зашумлять** то, что рождается из пикселей и раскладки — canvas, отрисовку
  WebGL, `ClientRects`, отрисовку звука, — с посевом на профиль и версией
  алгоритма;
* делать это **одним связанным кортежем**, а не полем за полем: у всех
  конкурентов подмена приезжает единым объектом, независимого случайного
  выбора нет ни у кого.

Разделение «подставлять / зашумлять» — не вкус. Перечислимое поле от шума
станет **невозможным**: не бывает `MAX_TEXTURE_SIZE = 16383`.

Ребейз — постоянная работа. Dolphin и Vision собраны из одного и того же тега
Chromium 151.0.7922.72; все сидят на свежем, потому что отставание видно по
версии.

## Чего не закрывает ни один их форк

**Сетевой отпечаток.** TLS (JA3/JA4), ALPN, порядок и значения `SETTINGS` в
HTTP/2, HTTP/3. Патчем Blink туда не дотянуться — это сетевой стек, а площадка
уровня Cloudflare смотрит именно туда. Косвенное подтверждение: AdsPower держит
**отдельный движок Firefox** (FlowerBrowser 132) — именно потому, что другого
TLS подменой внутри Chromium не получить.

Зондом на JavaScript это не снять: нужен приёмник на стороне сервера. У нас
покрытия нет, и это место, где можно обогнать всех, а не догонять.

## Агенты: место уже занято, но не целиком

**Поправка, купленная чтением их сайтов.** Здесь стояло «это единственное, чего
нет ни у кого из семи». Неправда, и проверять надо было раньше.

* **Undetectable уже отгрузил MCP**, и не обещанием, а двумя открытыми
  репозиториями: `undetectable-io/Undetectable-browser-MCP` (обёртка их Local
  API — профили, прокси, куки) и `undetectable-io/chromium-cdp-mcp` (вождение
  любого Chromium сырым CDP). На главной прямым текстом: «Connect Undetectable
  to Claude, Codex, Gemini, Cursor, or any MCP client… assign tasks in plain
  text (e.g. „create 50 profiles and assign proxies from the list")».
* **Dolphin** держит `Dolphin{agent}` в тарифной таблице со статусом
  «coming soon…».

Значит преимущество не в самом факте агентов. Оно в трёх вещах, и каждую надо
называть отдельно, потому что «у нас тоже есть ИИ» уже ничего не значит.

**Первое: восприятие.** Их CDP-сервер работает по CSS-селекторам —
`fill { selector: "input#password" }`. Классы вида `UserItem_link__kgEWg` это
хэш CSS-модуля, он меняется при каждой пересборке фронтенда площадки, и
сценарий на селекторах умирает молча. Мы читаем AX-дерево — то же самое, что
читает программа экранного доступа; оно переживает пересборку.

**Второе: пароль не попадает в модель.** У них в примере пароль идёт в вызов
обычным текстом. У нас `type_secret`: модель называет ПОЛЕ, значение
подставляет продукт, и обратно оно не возвращается. Это §3 п.9 нашего ТЗ, а не
украшение.

**Третье: флот, а не одиночный вызов.** Разброс стартов по времени, предел
одновременности из живых ресурсов машины, правила повторов, экран «кого
позвали». Сотня аккаунтов, действующих в одну секунду, — это связка по
времени, которую площадка видит без всякого отпечатка; у них про это ни слова.

Ниже — то, что уже сделано.

Сегодня в продукте есть:

* `agent/llm.py` — единственная точка вызова модели; поставщик выбирается в
  окне, и **работает по подписке владельца**, а не по ключу API (`claude-cli`);
* `agent/loop.py` — цикл «снимок AX-дерева → решение → действие»;
* `mcp/server.py` — двенадцать ручек, которыми открытый профиль отдаётся любой
  внешней нейронке: `profiles`, `open`, `snapshot`, `click`, `type`,
  `type_secret`, `scroll`, `press`, `navigate`, `back`, `screenshot`, `close`.

Отдельно стоит `type_secret`: модель называет **поле**, а не значение; пароль
подставляет продукт и обратно его не возвращает. Это ровно то, чего нет в
чужих API, и это надо показывать в описании продукта.

Чтобы получилось обещанное «дал задачу — сотня агентов пошла работать», не
хватает трёх вещей:

1. **Очередь и флот.** Сейчас агент работает по одному профилю. Нужен слой
   «задача на список профилей», с ограничением одновременности (по числу ядер
   и памяти, а не наугад), с повторами и с журналом на каждый профиль.
2. **Правило остановки.** Агент, упёршийся в проверку личности или CAPTCHA,
   обязан остановиться и позвать человека — это записано в границах задачи и
   не обсуждается. При сотне агентов нужен экран «кого позвали и почему».
3. **Расписание.** Сотня аккаунтов, действующих одновременно и одинаково, —
   это связка по времени, которую площадка видит без всякого отпечатка.
   Разброс по времени обязан быть частью задачи, а не пожеланием.

## Порядок работ

Порядок выбран так, чтобы каждый шаг давал пользу сам по себе, даже если
следующий не начнётся.

**Шаг 1. Достроить корпус — идёт сейчас.**
Вторая версия зонда собрана — это сам `src/mantia/corpus/probe.js`
(`VERSION = 2`), отдельного файла у неё нет; чего ей не хватает и что уже
замерено, написано в [probe-surfaces.md](probe-surfaces.md). Пять новых групп
поверхностей взяты не с потолка, а из того, что конкуренты правят патчем:
WebGPU, подсказки UA-CH высокой энтропии, настоящая частота звукового
устройства и голоса, следы подделки, цветовой охват экрана и шрифты по
версиям ОС.

Здесь же — **измеренная метка популяции** вместо нынешней догадки по домену:
проверка собственных свойств `navigator` и `adapter.info` прямо отвечает,
сидит ли посетитель в антидетекте. Это даёт то, ради чего корпус затевался:
чем множество антидетектов отличается от множества людей.

**Шаг 2. Правила связности из корпуса.**
Когда наберётся несколько тысяч машин, из распределений выводятся запреты:
какие сочетания не встречаются ни у кого. Это работает **до** всякого форка и
сразу — ими проверяются наши собственные профили. Часть правил можно взять
готовыми: у Undetectable в бинаре зашита таблица «какой шрифт появился в какой
версии ОС» (Windows 11 → Segoe Fluent Icons, macOS 10.15 → Galvji), и это
готовый генератор проверок.

**Шаг 3. Офлайновая геолокация.**
Заменить обращение к внешнему сервису на локальную базу MaxMind, как у
Undetectable. Даёт три вещи: исчезает третья сторона, видящая список всех наших
выходов; исчезает лимит запросов; IPv6 покрывается наравне с IPv4. Цена — 83 МБ
в поставке и **лицензия GeoLite2, которую надо разобрать до того**, как класть
базу в установщик.

**Шаг 4. Форк.**
Только после того, как есть что подставлять. Объём известен по чужим патчам:
своё дерево в исходниках Chromium, около десятка файлов перехвата, сборка под
три платформы, ребейз на каждый релиз.

**Шаг 5. Флот агентов.** Очередь, ограничение одновременности, разброс по
времени, экран «кого позвали».

## Платформы

Владелец назвал три, и это правильный набор:

* **Windows** — боевая платформа, на ней сегодня зелёная вся приёмка;
* **macOS на Intel** — машина разработки, профили запускаются, приёмка зелёная;
* **macOS на Apple Silicon** — **не проверено ни разу.** Отдельный ключ пула
  сборок (`mac-arm64`), другая подпись, и главное — другой отпечаток: у
  M-чипов WebGL отдаёт `Apple GPU`, а не `Intel/AMD`, то есть это отдельная
  популяция в корпусе, а не разновидность мака.

### Linux — не платформа для клиента, а станок под Windows-профили

Замерено 15 августа на Ubuntu 24.04, и это меняет расстановку сильнее, чем
выглядит. **Второй уровень выдаёт профиль за чужую систему только с Linux, и
только за Windows.** Camoufox подключает шрифты чужих систем через fontconfig,
а эта ветка в его коде стоит под `if OS_NAME == 'lin'`; на macOS и Windows она
не выполняется вовсе.

Что это значит по деньгам. Windows — самая ходовая система у покупателей
профилей, и выдать её может только машина на Linux. Значит машина под флот —
это Linux-сервер, а не макбук владельца и не Windows-VPS. Мак и Windows
остаются машинами, на которых продукт работает со СВОИМИ отпечатками (первый
уровень) — там их сила, а не в подмене.

Оговорки, которые нельзя прятать:

* **macOS-профилей не будет ни с какой машины, кроме мака.** Шрифты Camoufox
  подменяет верно, а цветные эмодзи — нет: у него метрический дублёр «Apple
  Color Emoji» без рисунков, потому что шрифт Apple распространять нельзя;
* **Linux-профилей не будет вовсе**, даже на самом Linux: профиль видит один
  шрифт из всех. Для продажи это не потеря — Linux-покупателей у площадок
  почти нет, — но обещать его нельзя.

Сборка Chromium для каждой платформы берётся из пула; версия пришпиливается к
профилю на всю его жизнь, и `_build_for` бросает ошибку, если пришпиленной
сборки нет, — тихой подмены на соседнюю версию не происходит. Это уже сделано
правильно и совпадает с тем, как поступает AdsPower (у них две ветки ядра,
131 и 150, и профиль остаётся на своей).

## Что нужно продать, кроме браузера

Владелец назвал это отдельно, и это не «потом», а часть продукта.

* **Сервер обновлений.** Кнопка «обновиться» в окне, как в Claude Code. У всех
  конкурентов это есть, у Vision — с тремя способами загрузки подряд, включая
  обход системного прокси.
* **Учётная запись и баланс.** Регистрация, оплата подписки.
* **Раздача сборок браузера.** Пул качается с нашего сервера, а не с чужого.

Здесь же — предупреждение, купленное разбором. **Все конкуренты ходят к себе
домой из самого браузера.** У Dolphin в ядре сидит `call_home_service.cc` и
обращение к `geo.anty-proxy-checker.com/ip-info`; у Octo —
`telemetry/telemetry_impl.cc`; у Vision — три клиента загрузки с
домен-фронтингом. То есть поставщик антидетекта видит список профилей и прокси
своего клиента. Если мы этого не делаем — об этом надо говорить вслух, это
довод в нашу пользу.

## Стенд для фрода: проверка враждой, а не самопроверкой

Замысел владельца от 15 августа, и он важнее, чем выглядит.

**Что строим.** Отдельный проект — самодельный сайт с намеренно злой
антифрод-системой. Владелец даёт агентам задачу: зайти, зарегистрироваться,
поротировать прокси, создать обычную активность. Ничего кроме — ни взлома, ни
нагрузки, только учётные записи и поведение. А антифрод с другой стороны
пытается **поймать, что всё это одна машина**.

**Почему это правильнее всего, что мы делали до сих пор.** Сегодня продукт
проверяет себя сам: наш зонд, наш `combo_hash`, наши же представления о том,
что палевно. Это замкнутый круг — мы не увидим того, о чём не догадались.
Стенд ломает круг: ловит нас чужая логика, написанная с позиции площадки, и
каждый пойманный признак — это дыра, которую иначе нашёл бы покупатель своим
забаненным аккаунтом.

Сюда же ложится всё, что мы уже знаем о связывании и чего зонд не мерил:
одинаковый набор шрифтов, общий выходной адрес, совпадающие тайминги стартов,
один и тот же порядок действий у «разных людей», одинаковая скорость печати.
Отпечаток — только половина; вторая половина это поведение, и её проверить
можно только так.

**Как это меняет порядок работ.** Стенд — отдельный проект и отдельный
репозиторий; Mantia про него ничего не знает и знать не должна. Наша сторона
обязана лишь уметь то, что от неё потребуют: пачка профилей, ротация прокси,
задача агенту, честный отчёт. Когда со стороны Mantia всё готово к бою, об
этом говорится прямо — и владелец идёт натравливать агентов.

## Сеть — вторая ось, и по ней у нас нет ничего

Замерено 15 августа на живом проверяльщике `proxydetect.live` (тот самый, что
знакомый владельца прислал по ссылке `proxy.incolumitas.com` — она отдаёт
чужой сертификат и в браузере не открывается, рабочий адрес другой). Наш
профиль второго уровня через немецкий прокси:

    Proxy Detected. Proxy Score 70%, VPN Score 0%

    HTTP Headers Test .................. чисто
    Passive AI-based Proxy Detection ... ПРОКСИ
    IP belongs to Hosting Provider ..... чисто
    IP on Proxy List ................... чисто
    IP on VPN List ..................... чисто
    VPN Exit Node Enumeration .......... чисто
    TOR Detection Test ................. чисто
    TCP/IP Fingerprint Test ............ ПРОКСИ
    Timezone Test ...................... чисто

Прочитать это надо внимательно, потому что вывод не «прокси плохой».

**Часовой пояс сошёлся** — то, ради чего делалась привязка к географии
прокси, работает. **Заголовки чисты.** **Адреса нет ни в одном списке** и он
не опознан как хостинг — то есть прокси у владельца не из битых.

А красное — вот что.

**TCP/IP Fingerprint Test.** Отпечаток сетевого стека принадлежит НЕ профилю, а
машине, которая устанавливает соединение с сайтом, — то есть прокси. Браузер
говорит «я Windows», а пакеты приходят со стека Linux-сервера. Это ровно то же
противоречие «сказал одно, показал другое», что и с шрифтами, только этажом
ниже, и никакая работа с отпечатком браузера его не лечит.

Отсюда правило, которого у нас нигде не записано: **система профиля должна
согласовываться не только с машиной, но и с прокси.** Дата-центровый прокси на
Linux не подходит профилю, заявляющему Windows. Резидентные и мобильные прокси
проходят эту проверку не потому, что «чище», а потому что за ними стоит
домашний роутер или телефон — их стек и выглядит как потребительский.

**Passive AI-based Proxy Detection** — их модель по совокупности сетевых
признаков. Против неё честного приёма нет: это вопрос качества прокси, а не
нашей работы.

**Что из этого следует для продукта.**

* мы не измеряем сеть ВООБЩЕ. Весь зонд — про браузер. Между тем половина
  вердикта площадки складывается ниже, и там мы слепы;
* в стенд для фрода это ложится первым пунктом: он обязан снимать TCP/IP-
  отпечаток и сверять с заявленной системой. Это дешевле любой другой проверки
  и ловит почти любую связку «антидетект + дешёвый прокси»;
* в строку на spoof.expert — тоже: расхождение сетевого стека с заявленной
  системой это самый честный признак подмены из всех, что мы видели;
* и владельцу это стоит знать до продаж: продавать «Windows-профили» вместе с
  дата-центровым прокси значит продавать связку, которую видно сразу.

### Резидентный прокси: замер 15 августа, и он не такой, как ждали

Владелец дал резидентный прокси (шлюз в США, выход — маленький провайдер в
Польше, `mobile=false, proxy=false, hosting=false` по внешним базам). Прогнали
тем же чекером, что и дата-центровый. Три факта, все замеренные.

**Первое: адрес действительно резидентный и чистый.** Внешние базы не помечают
его ни как прокси, ни как хостинг — в отличие от «хостинг» у дата-центрового.
Выходной адрес при пяти запросах подряд НЕ менялся: ротации на каждое
соединение нет, и это хорошо — иначе площадка видела бы одну сессию с десятка
адресов, что хуже любого дата-центра.

**Второе: вердикта по нему получить НЕ УДАЛОСЬ, и это не «чисто».** Движок
проверяльщика дважды оборвался по таймауту («Detection timeout — please
reload»). Записывать это как успех нельзя: проверка не завершилась, а не
прошла.

**Третье, и оно объясняет второе: он в пять раз медленнее.** Замер одной и той
же страницы, по три раза:

    напрямую .................. 0,20 с
    дата-центр (Германия) ..... 0,40 с   (подключение 0,05 с)
    резидентный (Польша) ...... 2,00 с   (подключение 0,19 с)

Подключение у резидентного быстрое, а полный запрос — две секунды: тормозит не
сеть, а сам шлюз. Проверяльщик гоняет десяток сетевых тестов параллельно и в
бюджет не укладывается.

**Что из этого следует для продукта.** Резидентный прокси решает вопрос
«похож ли адрес на домашний», но платит за это временем, и платит много: у
агента на каждый шаг есть навигация, а это плюс полторы секунды к каждому.
Задача на десять шагов дорожает на пятнадцать секунд. Это надо знать до того,
как обещать альфа-тестерам скорость.

И отдельно: мы до сих пор НЕ ЗНАЕМ, как резидентный проходит проверку
TCP/IP-отпечатка, — ровно тот вопрос, ради которого его и брали. Чтобы
ответить, нужен проверяльщик без жёсткого бюджета времени: либо свой (он же
стенд для фрода), либо чужой попроще.

## Строка «антидетект найден» на spoof.expert

Второй замысел того же дня, на потом. На странице проверки IP у владельца уже
показываются адрес, DNS и география. Добавляется ещё одна строка: **найден ли
антидетект** — выглядит ли сборка натуральной или видно подмену.

Почему это стоит сделать именно нам. Такую строку невозможно написать из
общих соображений: она вырастает ровно из того, что мы намерили за эти дни —
противоречие между заявленной системой и набором шрифтов, пустой набор
шрифтов, отсутствие цветных эмодзи там, где они обязаны быть, собственные
свойства у `navigator`, расхождение строки видеокарты с пикселями. Восемь
чужих профилей в `competitors.md` ловятся именно так.

Побочная выгода двойная. Люди получают проверку, которой нигде больше нет, а
мы — поток живых замеров с чужих антидетектов прямо в корпус: каждый, кто
пришёл проверить свою сборку, показывает нам, как выглядит чужая работа.

И оговорка, без которой строка станет враньём: она должна отвечать «похоже на
подмену» и «признаков не видно», а не «чисто». Отсутствие признаков не
доказывает натуральность — доказывает лишь, что наши проверки этого не
поймали.

## Чего мы не делаем

Границы из [CLAUDE.md](../CLAUDE.md) остаются в силе и на уровне 2: не обходим
CAPTCHA, не обходим проверку личности и живости, не подменяем видеопоток для
верификации, не делаем массовую автоматическую регистрацию. Агент, упёршийся в
проверку, останавливается и зовёт человека.

Отдельно — чего не берём у конкурентов, хотя могли бы:

* **чужие значения отпечатков в свои профили.** Сто профилей с одинаковым
  canvas ищутся одним `GROUP BY`. У них самих один холст никогда не выдаётся
  многим профилям;
* **их наборы «вендор + рендерер»** — у AdsPower это железо 2019 года, копировать
  такое значит выдать себя возрастом, а не спрятаться;
* **инъекцию JS в прототипы** — видна, см. выше.

## Цены и что рынок продаёт на самом деле

Тарифы сняты с сайтов в августе 2026, без регистрации, из открытых страниц.

### Главное открытие: числа отпечатков не продаёт никто

Посылка «конкуренты заявляют сотню аккаунтов на одной платформе» **при проверке
не подтвердилась**, и это хорошая новость.

Ни один из пяти проверенных сайтов не называет числа отпечатков на машину.
Ни разу. Продаётся **число профилей в подписке** — то есть место в хранилище и
право их завести, — а качество отпечатка описывается только словами:

* Octo: «Work with thousands of unique profiles from a single device»;
* Multilogin: «Create and manage hundreds of accounts from a single device»;
* Vision: «built for running multiple accounts on one computer without risk of
  bans».

«Тысяча профилей» здесь означает «тысяча ячеек с куками», а не «тысяча разных
машин». Сколько из них площадка увидит как одно устройство — не говорит никто.

Отсюда следствие для нас: **честное разделение на два уровня не проигрывает
рынку, потому что рынок про это просто молчит.** Мы не обещаем меньше — мы
единственные, кто вообще называет величину.

### Библиотека на сервере — теперь и их словами

Разбор бинарей показал, что настоящая библиотека отпечатков у всех живёт на
сервере. Документация Dolphin говорит это прямым текстом, ручка за ручкой:

* `/fingerprints/fingerprint` — «Returns a real-world browser fingerprint
  randomly selected from the Dolphin{anty} dataset… Values are sampled from
  devices with realistic hardware specs»;
* `/fingerprints/useragent` — «from Dolphin{anty}'s internal dataset collected
  from genuine devices»;
* `/fingerprints/webglList` — «draws from Dolphin{anty}'s internal dataset
  captured from real devices»;
* `/fingerprints/font-list` — «the complete list of font families known to
  exist on real devices running the requested platform».

На самом сайте про происхождение базы нет ни слова — только «Use and flexibly
customize real fingerprints». Откуда «real», сказано лишь в спецификации API.

**Дольфин отказывается называть, сколько профилей запустится одновременно**, и
перекладывает счёт на пользователя: «the load on your processor from one
profile will be the same as in Google Chrome itself… calculate how many you can
run at once». Единственный пример во всей документации — пять профилей на i7 с
8 ГБ. Это ещё одно подтверждение, что число профилей в тарифе и число рабочих
машин — разные величины, и рынок их сознательно не разделяет.

### Ниша с агентами закрывается

В тарифной таблице Dolphin, в разделе «Integrations», стоит строка
**`Dolphin{agent}` со статусом «coming soon…»** — на всех тарифах. Больше нигде
на сайте он не описан.

Вывод простой: наше единственное отличие имеет срок. Оно ценно сейчас, и
делать флот агентов надо не «когда-нибудь после форка», а параллельно с
корпусом.

### Ступени, за которые платят

| Продукт | Вход | 100 профилей | 300–500 | Тысяча и выше |
|---|---|---|---|---|
| Dolphin{anty} | бесплатно, 5 | Base $89 | Team $159 (300) | Enterprise $299 (1000) |
| Vision | Micro $29 (50) | Base $79 (150) | Standard $129 (300), Pro $189 (500) | Max $289 (1000) |
| Octo | Lite €10 (3) | Base €79 (100) | Team €169 (350) | Advanced €329 (1200) |
| Multilogin | бесплатно, 5 в облаке | Pro 100 $40 | Business 300 $89, 500 $115 | 1000 $185, 10000 $900 |
| Undetectable | бесплатно, 5 в облаке | Professional $99 | — | Base $49: **локальных без ограничения** |

Скидка за год у всех: 30–40 %.

Три вещи, которые видно только вблизи.

**Undetectable продаёт иначе всех.** У него локальные профили **не
ограничены на любом платном тарифе, от $49**, а платят за облачные (50 на Base,
100 на Professional). То есть цена привязана к синхронизации между машинами, а
не к числу профилей на своей. Для человека, работающего на одном компьютере, —
это самое дешёвое предложение рынка, и именно с ним нам придётся спорить.

**Octo показывает на карточке потолок с докупками, а не то, что входит.** На
карточке Starter написано «30 профилей», входит **10**; на Base написано 200,
входит 100; на Team — 600, входит 350. Разница берётся отдельными платежами.
Это тот случай, когда «как у них» делать нельзя: продукт, который так считает,
теряет доверие ровно один раз.

**Автоматизацию везде продают дороже.** У Vision очеловеченный ввод (`Human
Type`, `VirtualMouse` через CDP) доступен **начиная с Base $79** — на Micro за
$29 его нет, и в тарифной таблице это не написано, только в документации.
У Multilogin в бесплатном тарифе API нет вовсе. У Octo API появляется только
на Base €79.

### Где встать нам

Клиент за 100 долларов в месяц, о котором говорит владелец, — это ступень
«около сотни профилей»: Vision Base $79, Dolphin Base $89, Octo Base €79,
Undetectable Professional $99. Значит наша ступень того же объёма должна стоять
заметно ниже — порядка **$39–49**, — но не ниже $25: цена вдвое ниже рынка
читается не как выгода, а как несерьёзность, и в этой нише особенно.

Три решения, вытекающие из разбора, а не из вкуса:

1. **Агенты входят в тариф с самого низа.** Это наше единственное отличие, и
   прятать его за верхнюю ступень значит отдать преимущество. У всех
   конкурентов автоматизация — предмет доплаты; у нас она должна быть причиной
   прийти.
2. **Локальные профили не считаем.** Как у Undetectable: платим за облако и
   синхронизацию между машинами, а не за право завести профиль на своём
   компьютере. Считать локальные профили — значит продавать воздух: они ничего
   нам не стоят.
3. **На карточке пишем то, что входит.** Без потолков с докупками.

Бесплатный тариф нужен: он есть у Dolphin (5 профилей), Multilogin (5) и
Undetectable (5). Без него человек не попробует.

### Чего в этих цифрах нет

Сколько стоит нам самим: сервер обновлений, раздача сборок, хранение облачных
профилей, трафик. Это отдельный расчёт, и без него любая цена — пожелание.
Здесь он не сделан и выдавать его за сделанный нельзя.
