Звіти про проблеми: що містить звіт

Коли 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).

Див. також#