~/Downloads. Отличается то, что видит агент: Playwriter получает событие, но его API сохранения отдаёт пустые байты; Codex Chrome получает путь к файлу; Claude не узнаёт о скачивании вообще.В ячейке: статус, сколько подзадач комнаты выполнено, и стоимость — минуты · output-токены (с reasoning/thinking). Статус считается по одному правилу из таблиц подзадач в отчётах лейнов, а не по самооценке агента: «готово» — все подзадачи DONE, «блок» — ни одной, иначе «частично». Чем светлее серая ячейка, тем меньше сделано. Подзадача с оговоркой вроде «DONE (partial)» или «DONE / UNAVAILABLE» не засчитывается. Агенты по-разному дробят подзадачи (у Claude in Chrome их 147, у остальных 131–134), поэтому доли сравнимы примерно.
| # | Комната | Playwriter GPT-6-Sol | Codex Chrome GPT-6-Sol | Playwriter Opus 5.5 | Claude in Chrome Opus 5.5 |
|---|---|---|---|---|---|
| 01 | Сохранённые пароли | частично 1/80.5′ · 537 | частично 2/82.8′ · 5.0k | частично 1/82.2′ · 2.6k | частично 1/80.9′ · 3.6k |
| 02 | Диалоги и разрешения | частично 8/106.0′ · 6.4k | частично 2/82.3′ · 2.1k | частично 6/81.9′ · 5.9k | частично 7/126.5′ · 10k |
| 03 | Скриншоты | готово 8/80.7′ · 1.1k | частично 6/80.9′ · 1.2k | частично 6/82.7′ · 9.1k | частично 7/81.7′ · 5.7k |
| 04 | Clipboard | частично 2/81.1′ · 1.6k | частично 6/80.9′ · 981 | частично 3/80.6′ · 3.7k | готово 8/81.4′ · 6.7k |
| 05 | Файлы и скачивания | частично 1/80.8′ · 1.3k | частично 3/92.2′ · 2.5k | частично 4/81.6′ · 7.6k | частично 6/112.2′ · 8.4k |
| 06 | Trusted input | частично 7/80.5′ · 960 | частично 6/82.3′ · 4.3k | частично 7/81.6′ · 7.7k | частично 7/92.5′ · 7.9k |
| 07 | Окна и попапы | частично 5/81.6′ · 2.1k | частично 7/81.2′ · 994 | частично 4/81.4′ · 3.4k | частично 6/82.1′ · 5.9k |
| 08 | Произвольный JS | частично 6/70.7′ · 1.1k | частично 7/80.8′ · 1.1k | готово 8/81.3′ · 4.6k | готово 8/81.2′ · 5.0k |
| 09 | Iframes, workers, shadow | готово 8/81.0′ · 1.3k | частично 6/80.7′ · 654 | готово 8/81.0′ · 4.4k | частично 7/80.7′ · 2.8k |
| 10 | Activation bridge | готово 7/70.4′ · 333 | готово 7/71.5′ · 2.2k | готово 7/71.6′ · 4.1k | готово 11/111.1′ · 4.1k |
| 11 | Debugger | частично 7/80.7′ · 815 | частично 5/81.9′ · 5.8k | готово 8/80.6′ · 2.8k | частично 3/80.4′ · 1.6k |
| 12 | Preload | частично 6/70.6′ · 897 | частично 2/70.3′ · 394 | готово 7/70.5′ · 2.0k | частично 2/70.2′ · 1.3k |
| 13 | Диагностика | частично 6/80.5′ · 593 | частично 7/80.6′ · 529 | готово 8/80.9′ · 4.5k | частично 5/80.6′ · 2.8k |
| 14 | Ассеты | частично 6/70.3′ · 468 | готово 7/70.4′ · 461 | готово 7/70.8′ · 3.8k | частично 6/70.5′ · 2.2k |
| 15 | Запись экрана | частично 4/80.6′ · 607 | частично 3/80.4′ · 383 | частично 4/80.6′ · 2.6k | частично 6/80.7′ · 2.6k |
| 16 | Состояние браузера | частично 6/81.1′ · 1.3k | частично 6/80.8′ · 921 | частично 7/81.1′ · 4.2k | частично 8/101.2′ · 5.0k |
| 17 | CSP и Trusted Types | готово 8/80.5′ · 738 | готово 8/80.6′ · 640 | готово 8/80.7′ · 3.6k | частично 7/80.7′ · 3.2k |
У Opus на Playwriter дороже всего вышли скриншоты (03), у Claude in Chrome — диалоги (02): alert вешает вкладку на 30–45 с. У GPT на Playwriter дорогой вышла 02 из-за упавшего relay и повторного прогона.
Чтобы отделить вклад модели от вклада инструмента, Opus 5.5 отдельно прогнал тот же набор через Playwriter. Получилось 2×2: одна модель на двух инструментах и один инструмент под двумя моделями. Reasoning у всех четырёх лейнов medium. Codex Chrome шёл по контракту v2 (CDP разрешён, см. методику), поэтому пара Codex Chrome ↔ Claude in Chrome сравнивает ещё и контракт; пара на Playwriter — чистая.
Output раскладывается на код, который агент пишет в вызовы инструментов, видимый текст и мышление. У GPT мышление Codex сообщает отдельно. У Opus в транскрипте его нет, поэтому оно считается как остаток. Главная поправка — токенайзер. По сообщениям Opus без мышления видно, что один и тот же текст у Claude стоит в 1.56 раза больше токенов, чем в o200k, плюс ~49 токенов на каждый вызов (317 сообщений, R² 0.998). Ниже части Opus — в токенах Claude, как их и считает биллинг.
| Метрика | Playwriter GPT-6-Sol | Codex Chrome GPT-6-Sol | Playwriter Opus 5.5 | Claude in Chrome Opus 5.5 |
|---|---|---|---|---|
| Output за лейн | 45k | 36k | 97k | 92k |
| То же в токенах GPT (o200k) | 45k | 36k | ~57k | ~53k |
| Мышление | 8.6k (19%) | 7.5k (21%) | ~9.7k (10%) | ~5.3k (6%) |
| Запросов / вызовов инструментов | 173 / 171 | 121 / 119 | 138 / 153 | 166 / 185 |
| Кода на вызов, токены o200k | 193 | 219 | 321 | 261 |
| Скриншотов, увиденных моделью | 0 | 4 | 9 | 56 |
| Контекст на запрос: медиана / макс. | 110k / 151k | 104k / 155k | 181k / 284k | 190k / 277k |
| Секунд на запрос (без очереди) | 8.2 | 11.4 | 10.9 | 9.9 |
«Человек» — действие возможно только через интерфейс браузера или ОС, который агенту не виден. «Не добито» — упёрлись не в инструмент, а в постановку задачи, решение агента или сбой прогона; тест стоит повторить. Каждое «нет» и «частично» сверено с отчётами: где отказ вызван состоянием профиля Chrome (разрешения сайта), зумом стенда или каскадом после сбоя, это сказано в ячейке. В скобках — номер комнаты. Колонка Playwriter объединяет находки обоих агентов, пометка «Opus» — то, что нашёл только он.
| Выполнение кода | Playwriter | Codex Chrome | Claude in Chrome |
| JS в контексте страницыВыполнить свой JS прямо в странице и увидеть её переменные и функции | даpage.evaluate вызвал и подменил функции приложения; Opus достал даже переменную из замыкания, подменив crypto.randomUUID init-скриптом (08) | да Штатный evaluate изолированный и только читает. Через CDP Runtime.evaluate — полный доступ: вызвал, изменил и подменил browserLabApp (08) | даjavascript_tool видит и патчит глобалы страницы, умеет top-level await (08) |
| Изменение DOM и подмена функцийПоменять текст/элементы и подменить функцию, которую вызывает сама страница | да Текст изменён, increment подменён, настоящий клик идёт через патч (08) | да Через CDP: текст, счётчик и функции изменены (08), обработчики навешаны (10) | да Как у Playwriter; Trusted Types соблюдается (08, 10) |
| Скрипты до загрузки страницыПерехватить fetch, WebSocket, console раньше, чем их вызовет код страницы | даaddInitScript перехватил fetch/Worker/WebSocket, поменял ранний аргумент, пережил reload и навигацию (12) | нет API нет; CDP Page.addScriptToEvaluateOnNewDocument и Target.setAutoAttach отклонены (12) | нет API нет; патчи из javascript_tool пропадают после reload (08, 12) |
| DebuggerОстановиться на breakpoint и достать локальную переменную из замыкания | даcreateDebugger поймал паузу и передал локальный токен в верификатор — TOKEN MATCH (11) | частично CDP поймал Debugger.paused и call frame, но JS-сессия инструмента сбросилась до передачи токена (11). В июле тот же путь дошёл до TOKEN MATCH | нет Debugger и CDP наружу не отдаются (11) |
| Raw CDPПрямой доступ к DevTools-протоколу — универсальная отмычка для всего, чего нет в API | даgetCDPSession: Target, Network, Runtime, addScriptToEvaluateOnNewDocument работают (09, 12, 16, 17) | частично Выборочно: Runtime, Network, Debugger — да; init-скрипты, Target.setAutoAttach и Target.getTargets отклонены (09, 12) | нет Не отдаётся |
| CSP и Trusted TypesОбходит ли код инструмента политику безопасности страницы | даeval выполняется вопреки CSP, строковый innerHTML блокируется Trusted Types (17) | да Реальные заголовки прочитаны; eval через CDP работает, строковый sink блокирует Trusted Types (17) | даeval вопреки CSP, Trusted Types соблюдается (17) |
| Ввод | Playwriter | Codex Chrome | Claude in Chrome |
Настоящие клики, ввод, hoverСобытия, которые браузер считает настоящими (isTrusted), а не синтетическими | да Все события isTrusted:true (06) | да click, dblclick, contextmenu, hover — trusted (06) | да Trusted, координаты точные (06). Но клики сразу после перехода на страницу молча теряются, пока не сделан скриншот (02, 08) |
| Клавиатура: down/up, удержаниеДержать клавишу, отдельно нажать и отпустить, аккорды | да Shift down/up, стрелки, Tab, аккорды (06) | не добито Штатно только атомарные нажатия и аккорды (06). Удержание через CDP Input агент не пробовал | частично Аккорды и повтор есть, отдельных down/up нет; не-ASCII — через insertText; shift+a печатает строчную «a» (06) |
| Колесо мышиНастоящие wheel-события: на них завязаны карты, зум, кастомный скролл | да Вертикальное и горизонтальное (06) | да dy и dx в ledger (06) | нетscroll двигает страницу, но wheel-событий ноль (06) |
| Drag & drop, рисование на canvasПеретаскивание и рисование с зажатой кнопкой | даTRUSTED DROP COMPLETE, треугольник одним удержанием (06) | да Drop и траектория с buttons=1 (06) | частично Drop работает, но только прямые штрихи: треугольник из трёх drag (06) |
| Activation bridgeВставить свой обработчик и нажать его настоящим кликом — так открываются API, требующие жеста пользователя | да 5 из 5: clipboard, попап, пикер открылись (10). Нюанс от Opus: сам page.evaluate даёт странице user activation, поэтому синтетический клик внутри него тоже открывает попап и пишет в clipboard | да Обработчики вставлены через CDP; настоящие клики дали user activation, синтетика — нет (10) | да Все 5 обработчиков получили настоящий клик с user activation. Clipboard и попап сработали; fullscreen, уведомления и пикер упёрлись в состояние окна и профиля, как и у Playwriter (10) |
| Clipboard | Playwriter | Codex Chrome | Claude in Chrome |
| ТекстЗаписать и прочитать текст в системном буфере обмена | частично Запись работает. Чтение упирается в разрешение сайта clipboard-read: 29.09 висел запрос разрешения, 30.09 оно уже было denied. Выдать его из инструмента нельзя, grantPermissions падает с ошибкой протокола (04) | частично Инструмент пишет — страница читает. Обратное чтение сразу после записи страницей не совпало (04) | частично Своего API нет; через JS страницы и настоящие cmd+c/cmd+v — MARKER MATCH (04) |
| HTML и PNGБуфер с несколькими форматами сразу: текст, HTML, картинка | частично Запись прошла; прочитать обратно не дало то же разрешение сайта (04) | да Штатный clipboard.read: text/plain + text/html и image/png (04) | частично Через paste-событие: форматы и байты PNG сохранились (04) |
| Копирование и вставка с клавиатурыВыделить → cmd+c → cmd+v, как человек | нет Cmd+A/C/V доходят как нажатия, но не работают как команды редактирования: NO MATCH (04, 06) | да Маркер совпал (04, 06) | даMARKER MATCH (04, 06) |
| Чтение без жеста пользователяПрочитать буфер без свежего клика по странице | человек Нужно разрешение clipboard-read, его даёт человек в запросе браузера: 29.09 запрос повис, 30.09 разрешение было denied (04) | да Читает без жеста (04) | человек Нужно то же разрешение сайта clipboard-read: в профиле оно было denied, своего API у инструмента нет (04) |
| Скриншоты | Playwriter | Codex Chrome | Claude in Chrome |
| Страница: viewport, full-page, точный clipСнимок видимой части, всей страницы и заданного прямоугольника | частично PNG всех трёх видов; clip и скриншот элемента точные (Opus, 03). Cross-origin iframe в full-page пустой | частично Viewport, full-page и точный clip 320×180 (03). Cross-origin iframe в кадре пустой | частично Только viewport (JPEG): full-page и точного clip нет, zoom даёт кроп в разрешении устройства. Кадры чистые даже в скрытом окне (03) |
| Интерфейс браузераАдресная строка, запросы разрешений, автозаполнение паролей, нативные меню | нет Только пиксели страницы (01–03) | нет Только пиксели страницы (01–03) | нет Только пиксели страницы (01–03) |
| Диалоги и окна | Playwriter | Codex Chrome | Claude in Chrome |
| JS alert, confirm, promptСистемные JS-диалоги, блокирующие страницу | да Dialog-события: alert, confirm, точный prompt, отложенный alert (02). Relay падал на первом диалоге в обоих прогонах: к нему было подключено несколько клиентов Playwright, и каждый отвечал на диалог. С одним клиентом все 6 диалогов прошли | частично Alert виден и закрывается через getJsDialog; следующий confirm завис по таймауту, prompt и отложенный alert не проверены (02) | нет API нет; alert вешает вкладку на 30–45 с. Вернуть вкладку можно через navigate с force:true (02) |
| beforeunloadДиалог «Покинуть сайт?» при уходе со страницы | да dismiss оставил на странице, accept увёл (02) | не добито Не проверено: после сбоя на confirm связь с вкладкой оборвалась (02) | даnavigate сообщает о диалоге и остаётся; force:true уходит (02) |
| Попапы и дочерние вкладкиНайти окно, которое открыла страница, прочитать его и закрыть | частично Попап с размерами, отложенный и OAuth пойманы; _blank и window.open не увидел (07) | да Свои вкладки находит через перечисление с фильтром, OAuth-обмен прошёл; второй одновременный попап не открылся по политике Chrome, поля opener нет (07) | частично_blank, window.open и отложенный попап попадают в группу вкладок инструмента. Окна с размерами и OAuth-попап — нет, хотя OAuth-обмен проходит; до них достаётся только через JS родителя (07) |
| Разрешения и fullscreenУведомления, геолокация, полноэкранный режим | частично Уведомления в профиле заранее denied, запрос не проверить. Fullscreen зависит от состояния окна: у Opus настоящий клик включил его в 10, у GPT и в 02 — «not granted». Выйти из fullscreen клавишей Escape из инструмента нельзя (02, 10) | не добито Уведомления в профиле denied; в 02 fullscreen не проверен из-за обрыва связи, в 10 настоящий клик дал «not granted» (02, 10) | не добито Уведомления в профиле denied; fullscreen «not granted», окно Chrome было скрыто — вероятная причина (02, 10) |
| Структура страницы | Playwriter | Codex Chrome | Claude in Chrome |
| IframesРабота внутри встроенных фреймов, в том числе с другого домена и в песочнице | да Frame-объекты для всех 4 фреймов, включая sandbox и cross-origin (09) | частично Снапшот показал текст всех фреймов, адресно — только same-origin (09) | частично Только same-origin через DOM; cross-origin и sandbox недоступны (09) |
| Closed Shadow DOMСодержимое веб-компонента, закрытое от JS страницы | частичноshadowRoot = null; snapshot показывает содержимое, но предложенный локатор не работает; достаётся через CDP DOM.getDocument с pierce (Opus, 09) | не добитоshadowRoot = null; CDP DOM с pierce агент не пробовал (09) | нетshadowRoot = null; find и read_page не заходят даже в открытый shadow DOM (02, 09) |
| WorkersФоновые JS-потоки страницы (dedicated, shared, service worker): видит ли их инструмент и ловит ли их ошибки | частично Результаты воркеров видны через страницу, но page.workers() пуст; падение воркера ловится только через CDP Log.entryAdded (Opus, 09, 13) | частично Результаты воркеров видны через страницу; таргетов нет, CDP Target.getTargets не поддержан (09) | нет Ни воркеров, ни их ошибок (09, 13) |
| Файлы | Playwriter | Codex Chrome | Claude in Chrome |
Загрузка файлов на страницуПодать файлы в input type=file | даsetInputFiles: 3 файла, хэши совпали (05) | да Одиночная и множественная загрузка фикстур (05) | даfile_upload из рабочей папки, хэши совпали (05) |
Загрузка папкиВыбор целой папки (webkitdirectory) с сохранением относительных путей | даsetInputFiles(папка): 6 файлов с относительными путями за 0.5 с (Opus, 05) | нетwebkitdirectory: setFiles молча ничего не загрузил (05) | нет Папку не принимает, webkitRelativePath пустой (05) |
| Нативные диалоги выбора файлаСистемные окна «Открыть», «Выбрать папку», «Сохранить как» | человек Открываются настоящим кликом, выбрать путь может только человек (05) | человек То же (05) | человек То же; первый диалог повисает на экране пользователя, закрыть его можно клавишей Escape из инструмента (05) |
| СкачиванияСкачать файл и получить его байты | да Событие и имя файла есть, сам файл ложится в ~/Downloads — проверено вручную. Сломана обёртка Playwright: saveAs, stream и response.body() пустые, байты надо брать с диска (05) | частично ZIP и три вложения скачаны и захэшированы по пути из события; Blob-скачивание не дало события (05) | частично Файлы ложатся в ~/Downloads — проверено вручную по времени, — но инструмент об этом не знает: ни события, ни пути, в сетевом логе 503 (05) |
| Состояние и диагностика | Playwriter | Codex Chrome | Claude in Chrome |
| Cookies, включая HttpOnlyCookies, которые JS страницы не видит | частично Штатные context.cookies и storageState падают с ошибкой протокола; CDP Network.getCookies отдаёт и HttpOnly (16) | частично Только через CDP: метаданные cookies, включая HttpOnly (16) | нет Только document.cookie, HttpOnly недоступны вообще (16) |
| localStorage, IndexedDB, Cache, SWХранилища страницы и их переживание reload | да Записи и переживание reload подтверждены; Opus проверил и новую вкладку (16) | не добито Переживание reload подтверждено частично, новую вкладку агент не проверял (16) | да Хэши до и после reload совпали, новая вкладка проверена (16) |
| КонсольЛоги, предупреждения, исключения со стеком | да Уровни, исключения, ранние логи; page.on('console') даёт время и источник (Opus, 13) | да Уровни, ISO-время, URL (13) | да Уровни, время, строка:колонка, стеки (13) |
| СетьЗапросы и ответы: статусы, редиректы, SSE, WebSocket | да 200/404/500/307→200, тайминги, тела ответов, WS-фреймы; содержимое SSE — через response.text() (Opus, 13) | да CDP Network: запросы, ответы, исключения, WebSocket-фреймы (13) | частично Только URL, метод, статус: нет заголовков, тел и WebSocket, редирект без 3xx (13) |
| Инвентарь и выгрузка ассетовНайти все картинки, CSS-фоны, SVG и выгрузить их пачкой | да Инвентарь с байтами и SHA-256, выгрузка пачкой и источник CSS-фона (Opus, 14). GPT-агент выгрузку не делал | даpageAssets нашёл и CSS-фон, выгрузил 5 файлов пачкой (14) | частично Всё нашёл через DOM и Performance, выгрузки нет (14) |
| Запись экранаВидео или анимация действий на странице | человекrecording.start требует клика по иконке расширения (15) | нет API нет (15) | частично GIF до 50 кадров без жеста; кадр пишется только на действии, файл уходит в ~/Downloads (15) |
| Сохранённый пароль (dummy)Автозаполнение из менеджера паролей Chrome | человек Сохранение подтверждает только человек; выбирать вслепую запрещено (01) | человек То же (01) | человек То же (01) |
| Итого строк | 21 да · 8 част. · 2 нет · 4 чел. · 0 не доб. | 15 да · 9 част. · 4 нет · 2 чел. · 5 не доб. | 10 да · 11 част. · 10 нет · 3 чел. · 1 не доб. |
Комнаты 01, 02, 04, 05 и 10 затрагивают общее состояние браузера (clipboard, фокус, пикеры, разрешения), поэтому шли строго по одной на все лейны одного дня — отсюда очередь. 30.09 два Opus-лейна ждали друг друга: Playwriter простоял около 12 минут перед комнатой 01. Очередь в минуты комнат не входит.
| Метрика | Playwriter GPT-6-Sol | Codex Chrome GPT-6-Sol | Playwriter Opus 5.5 | Claude in Chrome Opus 5.5 |
|---|---|---|---|---|
| Весь лейн, минут | 32.2 | 23.0 | 36.7 | 31.6 |
| Из них на комнаты, минут | 17.6 | 20.6 | 21.1 | 24.6 |
| Output-токены, всего | 45k | 36k | 97k | 92k |
| Output-токены на комнаты | 22k | 30k | 77k | 79k |
| Некэшированный input, всего | 284k | 146k | 272k | 303k |
| Input с кэшем, всего | 17.6M | 12.1M | 24.7M | 29.7M |
| Автопроверка Codex: input / output | 0.56M / 1.5k | 9.9M / 8.0k | — | — |
В Codex Chrome автопроверка каждого вызова node_repl съела ~9.9M input, почти всё из кэша, — сопоставимо с самим лейном.
~/Downloads, копирование и вставка с клавиатуры не работают.Модель. При одинаковом reasoning medium GPT-6-Sol в 2–3.5 раза дешевле по токенам и немного быстрее, для рутинных браузерных задач его хватает. Opus 5.5 дороже в основном из-за токенайзера, зато проверяет глубже и сам находит подвохи — скрытые переменные, причину падения relay. Его стоит брать для исследования и отладки.
browser:control-in-app-browser 26.924.22138 (Codex 0.156.1) через расширение ChatGPT 1.26.901.11451; Claude in Chrome — расширение Claude 1.0.94.data/subtasks.ts): самооценки агентов расходились — в 11 комнатах из 68 агент назвал статус иначе при том же наборе исходов.data/seg_claude.ts: в очередь идёт только само ожидание лока, работа после захвата — в комнату.127.0.0.1 в Chrome был выставлен зум 75% (zoom_level -1.58). GPT + Playwriter шёл при нём и при 100% не перепроверялся. Codex Chrome при 75% снял clip не туда, а при 100% — точно. 30.09 зум сброшен на 100%, все остальные лейны шли при нём.~/Downloads через 2 с после клика, а временный артефакт Playwright остался пустым.