Отчёт носит статус с того дня, как отчёты вообще появились, и до вчерашнего дня ничто в интерфейсе не могло его изменить. Фильтровать по нему можно было с трёх экранов, а задать - только через API, из-за чего каждый отчёт вечно висел в ожидании, а значок на карточке был украшением.

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

Кто может им пользоваться, вытекает из того разграничения, которое у экрана уже было. Отчёт попадает к вам, потому что вы в команде, которой принадлежит домен, для которого он отправлен, поэтому отчёт, не привязанный ни к одному сайту, не показывает управления вовсе, а не показывает такое, которое откажет.

Отправить отчёт тому, кто будет его чинить

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

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

Запись использует весь тариф

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

Расширение 1.5.0 вчера вышло в Chrome Web Store и закрывает это. Панель пишет столько, сколько продаёт тариф - пять минут на Free, десять на Starter, тридцать на Professional, - и оба конца трубы теперь сходятся на одном числе.

Тот же выпуск чинит то, что было хуже, чем выглядело. Ни одна кнопка внутри панели не делала ничего, когда панель работала отдельным окном, а не пристыкованной: My Replays, ссылка на магазин, страница приветствия. Хуже всего был вход, потому что он ждал вкладку, которая никогда бы не открылась, и оставлял панель на “Waiting for sign-in…” бесконечно. Установленное веб-приложение - это то место, где с этим сталкиваются первым делом. Вкладки теперь открываются в настоящем окне браузера, где бы панель ни находилась.

Session Replay

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

Установить расширение

Страница MCP теперь говорит, что набирать

Страница, вышедшая на прошлой неделе, выдавала адрес и сообщала, что авторизация - это OAuth 2.1 с PKCE. И то и другое верно, и ни то ни другое не инструкция: адрес в каждом клиенте вводится в разное место, каждый входит по-своему, и тот, у кого был URL, оставался ровно там, откуда начал.

Шаг подключения теперь несёт по вкладке на клиент, в каждой - адрес в том месте, куда этот клиент его принимает, и команда, которая выдаёт авторизацию.

Последний шаг изменился по родственной причине. Раньше он показывал три сырых конверта JSON-RPC и называл их вашим первым вызовом, чем учил единственному, что читателю никогда не нужно, - писать конверты и есть вся работа агента, которого вы только что подключили, - и требовал работы, которую никто не стал бы делать. Теперь он показывает пять фраз, которые можно сказать агенту вслух, собранных из вашего же свежего отчёта и вашего же подтверждённого домена. Команда, у которой отчётов ещё нет, получает более простую первую фразу, называющую домен.

Появился и публичный файл по адресу /agents/install.md: домен, тег подтверждения, оба способа загрузки, разметка кнопки, identify() и то, что зависит от тарифа, отдаваемые обычным текстом и без входа. Если самый быстрый путь к кнопке на вашем сайте - отдать работу тому агенту, который у вас и так открыт, это и есть URL, который ему стоит дать. Будучи публичным, он не содержит ничего, принадлежащего какому-то одному сайту: токен там - заполнитель в квадратных скобках, и файл говорит спросить настоящий у вас.

Три инструмента MCP, которые теперь помещаются в ответ

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

get_report возвращал весь документ. Запись длиной тридцать две секунды дала 114 442 символа, из них 42 302 - сетевой журнал и 22 947 - его заголовки, что больше, чем клиент примет в одном результате инструмента: главный инструмент чтения этой поверхности не мог прочитать отчёт вообще. Теперь он принимает необязательный аргумент sections, называющий любые из network, console и interactions. То, что вы запросили, приходит целиком, за вычетом заголовков, куки и строк запроса, которые не несут сигнала, которого не несёт сам URL запроса. То, чего вы не запрашивали, приходит в сводке.

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

get_frame принимает позицию в записи, а назвать её в документе отчёта было нечем. Каждая запись несла абсолютное время и никакого смещения, и читатель вне приложения не мог вывести из этого начало записи, поэтому на практике смещение угадывали по длительности - что переживает короткую съёмку и ничего длиннее. Теперь отчёт несёт те смещения, которых просит инструмент.

Все пять инструментов к тому же прямо объявляют свои action hints: четыре чтения - только чтение, set_status - нет, и ни один из них не разрушающий. Пропущенный hint клиент не читает как «нет» - он откатывается к осторожному ответу и спрашивает человека перед каждым чтением.

Панель консоли повторяется меньше

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

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

Мелочи

  • Администратор команды может её переименовать. Имя писалось один раз при регистрации и больше никогда, поэтому у всех, кто зарегистрировался до того, как заполнил своё имя, навсегда была команда с названием “someone@example.com’s team”, и это имя их коллеги читают в переключателе.
  • Панель управления теперь в меню пользователя, куда за ней и ходили.
  • Сведения о тарифе на странице команды - одна карточка вместо четырёх.
  • Плоские страницы ошибок проходят по контрасту AA, а тёмная кнопка с обводкой читается в тёмной теме.
  • Веб-вход ограничен по частоте попыток. Он был защищён в API и не был защищён на форме входа - против тех же учётных записей.