Телеметрия
MailCopilot может отправлять небольшое количество диагностических данных и сведений об использовании — но только после того, как вы активно на это согласитесь. В них нет содержимого вашей почты, но есть случайный идентификатор этой установки, поэтому полностью анонимными они не являются: что именно этот идентификатор позволяет и не позволяет узнать, см. в разделе Идентификатор установки ниже. На этой странице описано ровно то, что собирается, и — что не менее важно — то, что не собирается никогда.
Согласие при первом запуске
При первом запуске MailCopilot, ещё до открытия мастера настройки аккаунта, вы видите экран согласия с заголовком Отправлять диагностические данные?. Он перечисляет, что будет отправляться, если вы разрешите, и что не отправляется никогда, и предлагает две одинаковые по размеру кно пки: Разрешить и Не разрешать. Ни одна из кнопок не выделена и не выбрана заранее, и нет никакого предустановленного флажка — вам нужно сделать активный выбор.
Из этого следует несколько вещей:
- До вашего ответа ничего не собирается, а не только не отправляется. Счётчики и буферы диагностики и использования не открываются, пока согласие не получено, — MailCopilot не копит данные тихо про запас, чтобы отправить их разом после разрешения. Всё, что произошло до вашего ответа, просто пропадает; в момент, когда вы разрешите отправку, отсчёт начинается заново именно с этого момента (например, замер длительности сессии начинает считать с момента согласия, а не с запуска приложения).
- Закрытие экрана или нажатие Escape равносильно ответу «Не разрешать». Закрыть экран так, чтобы согласие оказалось дано, невозможно.
- Ваше решение запоминается вместе с версией этого перечня. MailCopilot покажет экран повторно только если список собираемых данных действительно расширится — появится новая категория данных, новый получатель или более широкий охват, че м раньше. Обычные обновления приложения, правки формулировок и исправления ошибок никогда не вызывают повторный запрос.
- Если вы уже отключили диагностику в Настройках → О программе до появления этого экрана, этот отказ учитывается, и вопрос вам больше не задаётся. Всем остальным диагностика автоматически отключается, и вопрос задаётся один раз при следующем запуске.
- Вы можете изменить решение в любой момент в Настройках → О программе. Пока вы не ответили на первоначальный вопрос, переключатель там показан выключенным и заблокированным, с пояснением, что он вступит в силу только после того, как вы ответите на экране согласия.
Что мы отправляем
Если вы разрешите, MailCopilot отправляет:
- Ошибки и сбои — тип ошибки и стек вызовов, показывающий, в каком месте кода это произошло. Некоторые пути сбоев уже проходят через закрытый набор структурных полей, который полностью исключает сторонний серверный текст — например, когда не удаётся сохранить копию отправленного письма в папку «Отправленные», диагностика несёт роль папки (
sent, но никогда её название), солёный SHA-256-хеш идентификатора письма, усечённый до 12 шестнадцатеричных знаков (но никогда сам идентификатор — это псевдонимная метка, а не анонимизация: тот, у кого есть предполагаемый идентификатор письма, может подтвердить совпадение, пересчитав хеш), длину ответа сервера и закрытый набор протокольных кодов (например,AUTHENTICATIONFAILEDилиOVERQUOTA). Другие отчёты об ошибках, ещё не переведённые на эту структурную форму, всё ещё могут передавать сторонний серверный текст — его перехватывает только вычистка адресов и путей, описанная ниже, а не структурная гарантия, — см. Как вычищаются адреса и пути. - Версии — версию MailCopilot, вашу операционную систему и её версию.
- Производительность — длительность операций: синхронизации почты, поиска, отправки и запросов к ИИ.
- Использование функций — какими функциями вы пользовались в сессии и как часто (поиск, написание писем, ИИ, правила, шаблоны, откладывание и другое), а также, при использовании ИИ-ассистента, какой поставщик и модель обработали запрос и во сколько примерно он обошёлся. Подробности об ИИ-полях — в разделе Лог использования ИИ ниже.
- Действия с хранилищем AI-ключей — операции с хранилищем, где лежат ваши API-ключи ИИ: какой провайдер, читался ли ключ, сохранялся или удалялся, и чем это закончилось, включая то, был ли ключ там найден. Само значение ключа никогда не отправляется — ни как текст, ни как длина, ни как хеш.
- Настроечный контекст — сколько у вас подключено учётных записей, какого типа почтовая служба у каждой (например, Gmail или Outlook), способ входа (OAuth или пароль), язык интерфейса и тема оформления.
- Идентификатор установки — случайный идентификатор, создаваемый при первом запуске, подробно описан ниже. Он связывает данные из разных сеансов между собой — именно поэтом у данные не являются полностью анонимными.
Что мы никогда не собираем
MailCopilot не проектирует ни один путь в коде так, чтобы отправлять следующее. Для типизированных метрик и диагностики сохранения копии письма это абсолютная гарантия: она обеспечена закрытым набором структурных полей, которые код вообще имеет право заполнить. Все остальные диагностические отчёты полагаются в первую очередь на то, что точка отправки просто не кладёт туда содержимое, а вычистка распознаваемых форм адресов и путей — это подстраховочный второй рубеж, а не универсальный фильтр содержимого. Что именно делает и чего не делает этот второй рубеж — см. Как вычищаются адреса и пути ниже.
- Текст ваших писем (тема, тело, вложения, черновики)
- Ваши email-адреса или адреса ваших контактов — форма обратной связи в Настройках → О программе является единственным местом, куда адрес отправляется намеренно, когда вы сами вписываете его, чтобы получить ответ.
- Имена и пути папок на вашем IMAP-сервере — в данные попадает только общий тип папки (например, «Входящие», «Отправленные» или «Корзина»), но никогда название, которое вы ей дали
- Имена файлов вложений
- То, что вы вводите в поиск, — учитываются только длина запроса и число результатов, но никогда сам текст
- Содержимое чатов с AI или AI-памяти
- Хосты серверов, порты или учётные данные
- Ваш IP-адрес как прикреплённые данные — каждое событие явно указывает Sentry не записывать его. Само сетевое соединение неизбежно раскрывает ваш IP всем, через кого проходит трафик; что с ним делает принимающий сервер, прокси или его журналы — это настройка инфраструктуры получателя, а не то, чем управляет полезная нагрузка MailCopilot.
- Имя вашей учётной записи операционной системы в диагностических отчётах, которые мы формируем — задокументированные пробелы см. в Как вычищаются адреса и пути
Как маршрутизируются данные
Вся телеметрия отправляется в Sentry — нашу платформу мониторинга ошибок и производительности, и только после того, как вы разрешили это на экране согласия (либо позже, включив переключатель в Настройках → О программе). Когда диагностика выключена — потому ли что вы отказались, ещё не ответили, или позже отключили переключатель — конвейер обходится полностью, и ничего не отправляется. Если включить отладочное логирование, те же события дополнительно появляются в локальном main.log, чтобы вы могли просмотреть, что именно было бы отправлено.
Идентификатор установки
При первом запуске MailCopilot генерирует случайный UUID и сохраняет его в локальном конфигурационном файле. Этот UUID никогда не покидает ваше устройство. Вместо него передаётся SHA-256 хеш — обрезанный до 16 шестнадцатеричных символов — который мы называем install_id_hash. Он прикрепляется к каждому телеметрическому событию как Sentry user id — к каждому событию и транзакции, а не только к событиям уровня сессии, — чтобы мы могли отвечать на вопросы вроде «сколько уникальных установок работает на версии X» или «на сколько пользователей повлиял краш Y — на одного или сотню». Хеш:
- Псевдонимный, не идентифицирующий, но и не несвязываемый — он не выводится из email аккаунта, отпечатка устройства, IP-адреса или аппаратного идентификатора, и на нашей стороне нет способа сопоставить его обратно с UUID или вашим устройством. Но он намеренно устроен как стабильный идентификатор конкретной установки: он связывает воедино каждое событие и транзакцию, которые эта установка когда-либо отправит, — и, как любой псевдонимный идентификатор, переданный третьей стороне, в принципе может быть с опоставлен с другими данными, доступными Sentry или нам. Именно поэтому экран согласия называет данные «не полностью анонимными», а не анонимными.
- Стабилен между релизами — одна и та же установка сохраняет тот же хеш при автообновлении приложения, поэтому метрики удержания переживают апдейты версий.
- Сбрасывается при выключении телеметрии — переключение тумблера в Настройках в положение «выкл» немедленно очищает идентификатор у Sentry-клиента и останавливает дальнейшие передачи.
Мы используем этот идентификатор так же, как веб-аналитика использует visitor id: он позволяет считать уникальные инсталляции, а не общее число событий. Эта разница и есть причина, по которой телеметрия вообще полезна — без неё одна шумная установка выглядела бы так же, как сотня тихих.
Как вычищаются адреса и пути
Два фильтра, основанных на распознавании формы, применяются к каждому исходящему событию и структурной записи лога, в обоих процессах — основном и рендерере, — как последний шаг перед отправкой, за одним исключением: конверт формы обратной связи, куда вы сами вписываете адрес, чтобы получить ответ, намеренно исключён из фильтра адресов. Это подстраховка для содержимого, которое вообще не должно было туда попасть, а не основной механизм: основной механизм — то, что теги типизированных метрик изначально являются закрытыми перечислениями и структурными полями, поэтому там просто нечего вычищать.
- Текст в форме email-адреса заменяется на
<email>. Шаблон распознаёт практичную, распространённую форму адреса (буквы, цифры и небольшой набор знаков препинания до@, домен с точкой после) — а не полную формальную грамматику email. Намеренное исключение:root@localhostи похожие адреса без домена с точкой оставляются как есть, чтобы обычный текст со упоминанием пакета вроде@types/nodeне искажался. Локальная часть, построенная из необычных знаков препинания, может оставить после себя обрывок текста после того, как её@domain.tldвырезан. - Пути к домашней директории (
/home/<имя>/...,/Users/<имя>/...,C:\Users\<имя>\...) — сегмент с именем учётной записи заменяется на<user>. Единственный документированный остаточный случай: имя учётной записи с пробелом внутри, стоящее в самом конце пути без закрывающей кавычки или разделителя после него, может оставить свою вторую часть (C:\Users\Иван Петровв конце строки сохранит «Петров»). Основной процесс дополнительно подставляет вместо буквального пути к вашей домашней директории плейсхолдер везде, где он встречается дословно, — это то, что песочница рендерера сделать не может. - Оба фильтра обходят известный, ограниченный набор полей события (текст стека вызовов, сообщения, данные запроса, breadcrumbs и подобное), плюс ограниченный по глубине и размеру обход свободных контейнеров (не глубже 4 уровней и не более 500 посещённых узлов, где в этот бюджет засчитывается каждый элемент контейнера и каждый ключ объекта, а не только реально переписанные строки) — а не безграничную развёртку всего события целиком, поэтому содержимое глубже или шире этого предела не осматривается. Одно поле намеренно не трогается: имя хоста машины, которое сам SDK Sentry прикрепляет к каждому событию (
server_name), — потому что на macOS и Windows оно часто выводится из имени учётной записи, а никакое правило вычистки не может надёжно отличить это от несвязанного имени хоста. - Утечка в форме, которую ни один из фильтров не распознаёт, — имя папки, тема письма, произвольный текст сервера — здесь не перехватывается. Именно поэтому таблицы метрик ниже и диагностика сохранения копии построены из закрытых структурных полей, а не полагаются на вычистку свободного текста.
Лог использования ИИ
Каждый раз, когда вы отправляете сообщение ИИ-ассистенту, после завершения запроса MailCopilot записывает одну структурную запись лога — в дополнение к булеву флагу в сводке использования, описанной выше. В этой записи: поставщик ИИ (поставщик вашего API-ключа), модель, обр аботавшая запрос, общее число вызовов инструментов и имена вызванных инструментов (например, send_email или mail_action, но никогда — переданные им аргументы), был ли запрос прерван или завершился ошибкой, и примерная стоимость запроса в долларах США, если поставщик раскрывает цены. Ничего из этого не включает текст вашего запроса, ответ ИИ или содержимое писем — полный разбор того, что сам ИИ-ассистент отправляет поставщикам (это отдельная и гораздо более обширная тема, не связанная с этой структурной записью лога), см. в разделе Данные ИИ и журнал аудита. Отдельные замеры задержки для конкретных функций ИИ несут собственные агрегатные поля (тип контекста разговора, был ли уже сформирован контекст переписки, счётчики токенов, выбранный пресет переписывания, число сгенерированных вариантов ответа и подобное) — см. Замеры производительности ниже.