Отчёты о проблемах: что содержит отчёт

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

Исходник на GitHub ↗Эта страница переведена с английской; если они расходятся, верна английская версия. English

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

Как его отправить#

Отправить отчёт из Telegram может только владелец установки aipager: человек из собственного личного чата установки с ботом (если таких чатов несколько и одного владельца нет, нет ни кнопки «Сообщить о проблеме», ни автоматического предложения, а aipager report в терминале по-прежнему работает). В Mini App есть своя страница отчёта; все остальные пути из Telegram открывают одну и ту же карточку предпросмотра в твоём личном чате с ботом:

  • /help: когда его отправляет владелец, текст справки приходит с кнопкой «🐞 Сообщить о проблеме». В группе срабатывает только нажатие владельца, а предпросмотр открывается в личном чате владельца, никогда в группе.
  • Mini App: вкладка Настройки, «Сообщить о проблеме» (когда приложение открыто на твоём личном чате) открывает страницу внутри приложения. Твоя заметка сверху (по желанию, до 500 символов, со счётчиком). Ниже короткая сводка отчёта: версии, настройка, ошибки (нажми на одну, чтобы увидеть её места в коде) и Подробнее. Показать точный текст отчёта показывает точный текст, который будет отправлен, вместе с твоей заметкой, и он меняется по мере набора. Отправить отчёт (кнопка Telegram внизу) отправляет ровно это, один раз, а потом страница показывает номер с кнопкой Копировать. Назад ничего не отправляет. Если aipager подчищает твою заметку (пробелы по краям, невидимые символы, всё после 500 символов), страница показывает подчищенную заметку, и ничего не отправляется, пока ты снова не нажмёшь «Отправить отчёт».
  • Уведомление о лимите памяти: когда hook aipager упирается в лимит памяти, в уведомлении в чате есть кнопка «🐞 Сообщить об этом».
  • Автоматическое предложение: изредка aipager предлагает отправить отчёт о баге, который он заметил (см. Когда aipager предлагает отчёт).
  • В терминале: aipager report выводит отчёт и спрашивает Send this report? [y/N]. В нём те же виды полей, но меньше сведений о работающем aipager (режим, чаты, функции, время работы, сессии и подробности о Claude Code остаются неизвестными или пустыми). aipager report --note "what you were doing" добавляет заметку. Без терминала (скрипт, pipe, shell сессии Claude Code) он выводит отчёт и никогда его не отправляет.

Карточка предпросмотра показывает отчёт ровно таким, каким он уйдёт: JSON в свёрнутом блоке, который можно развернуть, или, если он слишком длинный для одного сообщения, файл report.json в ответ на карточку. Её кнопки:

  • 📤 Отправить: отправляет этот точный отчёт, один раз. Потом карточка пишет Отправлено. Номер ap1-....
  • ✏️ Добавить заметку: твоё следующее сообщение в этом чате в течение 10 минут становится заметкой отчёта (обрезается на 500 символах), и карточка снова показывает отчёт уже с заметкой, прежде чем ты его отправишь. Если вместо этого сделать что-то другое (команда, другая кнопка, фото, действие в Mini App), вопрос о заметке закрывается без заметки, а через 10 минут следующее сообщение уходит Claude, как обычно. У вопроса есть ‹ Назад, который возвращает к предпросмотру без заметки, и Отмена.
  • ✖️ Отмена: ничего не отправляется.

Предпросмотр остаётся открытым 24 часа, открытыми остаются 5 последних (6-й закрывает самый старый). После перезапуска aipager старую карточку уже нельзя отправить: открой «Сообщить о проблеме» снова, чтобы получить новую. Отчёт, открытый в Mini App, можно отправить в течение 24 часов (3 последних); после перезапуска страница загружает новый.

Что содержит отчёт#

Каждая часть, простыми словами. Каждое значение сверяется со списком допустимых значений перед показом предпросмотра и ещё раз перед отправкой; всё, что не подходит, заменяется на <invalid> или опускается, но никогда не отправляется как есть.

Об отчёте

  • schema: формат отчёта (aipager-report/1).
  • trigger: manual (отчёт открыт вручную) или auto (автоматическое предложение).
  • day: дата, в UTC (без времени суток).
  • note: только если ты её добавишь: твои слова, ровно такие, как их показал предпросмотр (не больше 500 символов, без невидимых символов).

aipager и компьютер

  • aipager: версия; как он установлен (pipx, uv, brew, pip, editable, nix, snap, docker, system, foreign или unknown); откуда (каталог пакетов, локальная папка, копия git); может ли aipager update его обновить.
  • python: версия Python и CPython это или PyPy.
  • os: система (linux, darwin, windows, freebsd), тип процессора, дистрибутив Linux из фиксированного списка и номер его версии, версия ядра major.minor, тип контейнера, если он есть (docker, lxc, wsl, podman), и настроен ли aipager как служба systemd или launchd.
  • deps: версии библиотек, от которых зависит aipager (python-telegram-bot, httpx, aiohttp, PyYAML, rich, questionary, dtach-bin).
  • claude_code: версия Claude Code, сколько установок Claude Code найдено и как он входит (env, file, keychain или почему это не удалось определить). Никогда не сами данные для входа.

Твоя настройка в числах

  • config: режим (personal, team, scope); сколько настроено личных чатов и сколько групп; сколько есть своих ролей (их имена не включаются); какие функции включены (Mini App, вид её туннеля, голосовые, предпросмотр изменений, расширенные сводки).
  • runtime: сколько aipager уже работает, диапазоном (<10m, 10m-1h, 1-24h, 1-7d, >7d); сколько сессий запущено и работает; сколько раз aipager неожиданно останавливался за последние 7 дней и как он завершился в прошлый раз (clean, crash, reboot).
  • doctor: результаты (ok, warn, fail) фиксированного списка проверок здоровья, когда они доступны без повторного запуска проверок (отчёты из бота и из терминала оставляют это поле пустым).
  • flood: состояние лимитов Telegram, суммированное по всем чатам: блокировки за последние 7 дней, есть ли сейчас чат с отключённой отправкой, в минимальном режиме или с притормаживанием, и доля часового бюджета самого загруженного чата диапазоном. Никаких ID чатов.

Что пошло не так

  • counters_24h: сколько раз за последние 24 часа случилось каждое событие из фиксированного списка (например, сторож рабочей карточки перезапустился, ошибка Telegram определённого вида, hook упёрся в лимит памяти, ошибка сети или диска). Только количества.
  • log_digest_24h: для 15 мест в коде aipager, которые чаще всего писали в лог предупреждения или ошибки за последние 24 часа, место (aipager/state.py:1234), уровень и сколько раз. Никогда не текст лога.
  • errors: до 10 ошибок, которые записал aipager, у каждой:
    • fingerprint: имя бага с ap1- (хеш типа ошибки и имён до 8 мест в коде aipager, никогда не текста или данных);
    • где она случилась (сам aipager, hook, строка состояния, команда, Mini App), как её поймали, и баг это или просто что-то необычное (tier);
    • для ошибки, которую aipager записал в лог, имя логгера (модуль aipager, asyncio или часть telegram.ext);
    • имя типа исключения (например, builtins.KeyError или <other> для исключения не из фиксированного списка пакетов), типы до трёх причин и имя номера ошибки вроде ENOSPC;
    • для ошибки hook событие hook и инструмент (встроенный инструмент по имени, любой инструмент MCP как mcp);
    • сколько раз, в какие дни и на каких версиях aipager она случалась;
    • до 12 мест в собственном коде aipager, через которые она прошла (файл, строка, имя функции), и до 8 имён внешних пакетов из фиксированного списка, через которые она прошла.

Никогда не включаются: твои чаты, сообщения, ответы Claude, имена сессий, пути к папкам или файлам, токены или ключи, ID чатов или пользователей, имена пользователей, имя компьютера, текст любого сообщения об ошибке и строки лога. В полях выше для них нет места, и отчёт сверяется с этим списком перед показом и перед отправкой.

Куда он уходит#

Отчёт уходит без твоего имени в закрытый ящик ошибок того, кто поддерживает aipager, на Sentry: без аккаунта и без ID установки. Как любой веб-запрос, он приходит с интернет-адреса твоего компьютера, который видят GitHub и Sentry; ящик настроен так, чтобы его не хранить (настройка Sentry «Prevent Storing of IP Addresses»). aipager отправляет его сам одним HTTPS-запросом (он не использует собственную библиотеку Sentry, которая собирает гораздо больше): отчёт, который был в предпросмотре, уходит вложением report.json, рядом с короткой сводкой для группировки (версия, как установлен aipager и не установка ли это для разработки, система, версии Python и Claude Code, повод и отпечаток, тип и места в коде первой ошибки). Запрос называет только aipager/<version>.

После отправки карточка (или терминал) показывает номер: отпечаток ap1- первой ошибки или, для отчёта без ошибок, его 32-символьный ID события. Если ты ещё и открываешь issue на GitHub, укажи номер, чтобы тот, кто поддерживает aipager, нашёл твой отчёт. Не вставляй в issue логи и вывод aipager doctor: в них есть ID твоего чата, пути твоей домашней папки и начало твоих сообщений.

Прямо перед отправкой aipager читает report-endpoint.json из репозитория aipager на GitHub, чтобы узнать, куда отправлять (работающий aipager хранит хорошую копию сутки; неудачное чтение повторяется при следующей отправке, а каждый aipager report читает файл заново). Так тот, кто поддерживает aipager, может сменить ключ Sentry, выключить отчёты для всех или запретить отправку версиям ниже заданного номера (сборка, которая не знает своей версии, считается ниже), не выпуская новую версию. Если GitHub недоступен или файл не из тех, что понимает aipager, aipager берёт ключ, встроенный в эту версию; читаемый файл, который говорит «выключено», выполняется всегда.

Ограничения#

  • Не больше 5 попыток отправки в день (UTC) с одного компьютера, ручных и автоматических вместе, и неудачная попытка тоже считается. Следующая скажет С одного компьютера можно отправить не больше 5 отчётов в день. Попробуй завтра.
  • В фоне ничего не повторяется: если отправка не удалась, карточка пишет Сейчас не удалось отправить. Ничего не потеряно; попробуй позже. и оставляет кнопку Отправить.

Когда aipager предлагает отчёт#

aipager замечает свои собственные баги и изредка предлагает отправить отчёт о них в твоём личном чате: aipager N раз столкнулся с внутренней ошибкой (TypeError, область: рабочая карточка). Отчёт помогает это быстрее исправить. ... с Посмотреть отчёт, Не сейчас и Больше не спрашивать. «Посмотреть отчёт» открывает карточку предпросмотра только с этими ошибками; ничего не отправляется, пока ты не нажмёшь там Отправить.

Предложение приходит, только если выполнено всё это:

  • Это настоящий баг в aipager: ошибка в собственном коде aipager, которая случилась хотя бы дважды с перерывом хотя бы 10 минут, или сразу, если aipager упал, работая как служба (aipager start на переднем плане, который принудительно завершили, например закрыв его терминал, только учитывается). Ошибки, о которых aipager сообщают hook, программа строки состояния или команда (включая hook, которому не хватило памяти), должны ещё и растянуться хотя бы на сутки, так что одна такая ошибка никогда не вызывает предложение; для них есть кнопка «Сообщить об этом» в уведомлении. То, в чём aipager не виноват (лимиты Telegram, сеть, заполненный диск), никогда не вызывает предложение; это только учитывается для отчёта, который ты отправишь вручную.
  • Не больше одного предложения раз в 3 дня, со всем накопившимся в этом одном предложении.
  • Не в первые 48 часов после самого первого запуска aipager на этом компьютере (обновления этот срок не сбрасывают) и не в первый час после перезапуска aipager.
  • Только когда 2 минуты ничего не работает и ничего не ждёт отправки, и твой личный чат с ботом использовался в последние 30 минут. Никогда в группе и никогда, пока Telegram ограничивает этот чат.
  • Каждый баг предлагается один раз на версию aipager. После любого ответа он на этой версии больше не предлагается; после обновления он может вернуться, только если случится снова.
  • Не сейчас и Больше не спрашивать оба считаются как «нет», и так же считается предложение, на которое не ответили в течение суток. Посмотреть отчёт сбрасывает счёт, даже если потом отменить. Два «нет» подряд выключают автоматические предложения: если второе это нажатие, об этом скажет строка; в любом случае это видно в /settings.
  • Никогда для установки для разработки (aipager установлен из локальной папки, копии git или в режиме editable).

Чтобы выключить автоматические предложения, открой /settings в своём личном чате: Отчёты о проблемах: Выкл. Когда их выключили два «нет», на той же странице есть Снова включить предложения. reports.json, который существует, но не читается, тоже выключает автоматические предложения (aipager больше не может знать, какие ответы были раньше); Снова включить предложения исправляет и это. На компьютере без чата, где можно спросить, задай AIPAGER_REPORT_PROMPTS=0 в окружении aipager. «Сообщить о проблеме» и aipager report работают всегда, что бы ни говорили эти настройки.

Что хранится на твоём компьютере#

  • ~/.local/state/aipager/reports.json: ошибки, которые записал aipager (в виде, показанном выше: имена типов, версии, места в коде, не больше 50), почасовые количества за 8 дней, сводка лога за 2 дня, как закончились последние остановки, и состояние предложений (когда было последнее предложение, «нет» подряд, какие баги на какой версии предлагались). Читать его можешь только ты.
  • ~/.local/state/aipager/report-sends.json: сколько отчётов сегодня отправлено или пытались отправить.
  • ~/.local/share/aipager/install.json: когда aipager впервые запустился на этом компьютере (для 48 часов выше).
  • ~/.local/share/aipager/running.json: пишется, пока aipager работает (номер его процесса, время запуска, работает ли он как служба и ID этой загрузки системы), чтобы отличать падение от нормальной остановки.

Ни в одном из них нет чата, сообщения, имени, пути или токена. aipager uninstall сохраняет их вместе с остальными данными aipager, чтобы переустановка продолжила с того же места; он перечисляет, что сохраняет, и выводит команду, которая это удаляет (см. aipager uninstall). Чтобы удалить только их, удали эти четыре файла: удаление всей папки ~/.local/state/aipager убирает первые два (а с ними и состояние языков, languages.json), но install.json и running.json нужно удалять по именам (не удаляй ~/.local/share/aipager, где лежат ещё и папки сессий aipager).

См. также#