Project

General

Profile

Wiki » History » Revision 8

Revision 7 (Redmine Admin, 08/04/2026 10:04 PM) → Revision 8/9 (Redmine Admin, 08/17/2026 10:17 PM)

# Green Chat 0.2.4 0.2.3 — памятка бета-тестера 

 Спасибо, что участвуете в тестировании Green Chat. Эта памятка объясняет, 
 как подготовиться к бете, что особенно важно проверить в версии 0.2.4 0.2.3 и как 
 составить полезный баг-репорт. 

 ## Версии беты 0.2.x 

 Текущая версия — **0.2.4** (сборка 17 августа 2026). **0.2.3**. Памятка покрывает все 
 возможности линейки 0.2.x; 
 полные списки изменений по версиям: 

 - **[0.2.4](beta-changelog-0.2.4.md)** (17 августа 2026) — доступность личных 
   сообщений («коллеге всегда можно написать»), отмена модераторов в публичных 
   каналах и живое обновление состава, статусы присутствия на втором устройстве, 
   обнаружение расхождения MLS-эпох, камера на Android, сохранение файлов на 
   Android, iOS-клиент. Требует миграции 025/026/027 и обновления push relay 
   **до** сервера. 
 - **[0.2.3](beta-changelog-0.2.3.md)** (сборка **0.2.3** (актуальная сборка 4 августа 2026) — 
   Android-клиент и уведомления на телефон, защита от расхождения MLS-эпох, 
   мобильные вложения и safe areas, приглашения в публичные каналы, исправления 
   композера и push relay. Требует миграции 023/024 и настроенный relay. 
 - **[0.2.2](beta-changelog-0.2.2.md)** **0.2.2** (23 июля 2026) — уведомления, звук и 
   счётчики при свёрнутом или скрытом в tray окне; быстрое переподключение 
   после сна компьютера; исправления восстановления личных чатов. Серверных 
   изменений нет. 
 - **[0.2.1](beta-changelog-0.2.1.md)** **0.2.1** (22 июля 2026) — надёжная доставка: 
   клиент сверяет состояние с сервером и догружает пропущенные сообщения; 
   восстановление личного чата после logout и повторного входа собеседника; 
   диагностический лог `glchat.log`. Требует обновлённый сервер. 
 - **[0.2.0](beta-changelog-0.2.0.md)** **0.2.0** (20 июля 2026) — роли и управление 
   участниками каналов, раздел «Треды», карточки профилей, сохранённые 
   сообщения, история загрузок, просмотрщик изображений и GIF, звуковые 
   уведомления, отметка вышедших со всех устройств пользователей. 

 ## Что изменилось после вашей прошлой сборки релиза 0.2.2 

 Прошлая сборка, которую получали тестировщики, — **0.2.3 от 4 августа 2026 
 года**. Всё перечисленное ниже для вас новое. Обратите внимание: сюда входят не 
 только работы 16–17 августа, но ### Android-клиент и две недели исправлений по вашим репортам от мобильные уведомления 

 - Появился первый Android-клиент, собранный из общего с desktop кода Tauri 2: 
   те же экраны, локальная база и MLS-шифрование. 
 5–14 августа, которые до сих пор ни в одну сборку не попадали — если вы 
 сообщали о баге в этот период - Ключ устройства и он «не чинился», проверять его нужно именно ключ локальной базы хранятся через AndroidKeyStore. 
 сейчас. 

 ### Личные сообщения 

 - Ошибки `404 no key_packages` при открытии DM больше не существует — написать 
   коллеге Устройство можно всегда, даже если он ещё ни разу не заходил. привязать сканированием QR-кода или ручным вводом кода. 
 - Пока устройство собеседника не подключилось, чат открыт Интерфейс адаптирован под один экран телефона, системные safe areas и поле ввода 
   доступно; сообщения ждут в очереди виртуальную клавиатуру. 
 - Нативный Android picker позволяет прикреплять документы и уходят сами. Плашка честно об этом изображения к 
   предупреждает, отметка `✓✓` сообщению или ответу в этом состоянии треде. 
 - Firebase Cloud Messaging будит свёрнутое приложение сигналом без текста 
   сообщения. Клиент сам догружает и расшифровывает сообщение; push relay не ставится. 
   получает содержимое переписки или идентификатор аккаунта. 

 ### Каналы, роли Надёжность MLS и участники доставки 

 - Модераторов в публичных каналах больше нет: роль там ничего не давала. Клиент применяет изменения MLS-группы только после подтверждения сервера, 
   Уже выданные роли снимает миграция `027`. что предотвращает расхождение криптографических веток при гонке Commit. 
 - Owner публичного канала Если устройство уже не может выйти, не назначая преемника. 
 - Состав канала расшифровать сообщение текущей эпохи, оно 
   запрашивает безопасную замену своей MLS-листины и роли обновляются у всех участников сразу, без перезапуска. 
 - Создание приватной группы не срывается из-за одного недобавленного участника. 

 ### Присутствие, доставка и MLS 

 - Статусы собеседников перестают «залипать» серыми и наконец сходятся на автоматически возвращается 
   втором устройстве. 
 - Телефон в фоне честно показывается как «отошёл», затем «офлайн»; свой статус группу через replacement Welcome. Расшифрованная локальная история 
   при пропаже сети больше не остаётся «онлайн». сохраняется. 
 - Открытый чат Сервер получил durable-запросы восстановления membership и открытая панель треда сами показывают сообщения, поднятые миграцию 
   фоновой сверкой, — без переключения канала и перезапуска. `024_membership_recovery.sql`. 
 - Расхождение MLS-эпох обнаруживается в трёх новых ситуациях, включая самую Push relay удаляет недействительные FCM installation IDs, валидирует 
   опасную: устройство молча согласованность секретов при bootstrap, а запуск chat server больше не получает сообщения, а счётчик непрочитанных 
   честно показывает ноль. блокируется недоступным relay. 

 ### Интерфейс Каналы и мобильные клиенты интерфейс 

 - Автопрокрутка в панели треда (свой ответ больше не уходит под нижний край). Любой участник публичного канала может пригласить нового пользователя через 
   **Add member**; исключение участников публичного канала остаётся запрещено. 
 - Понятные сообщения об ошибке при действии без сети. На Android исправлены имя приложения и системные push-строки. 
 - Android: сохранение присланного файла, съёмка фото прямо из поля ввода, Сборка APK очищает старые пакеты перед упаковкой, исключая раздутые 
   новая иконка, убрана серая полоса справа от списка чатов. инкрементальные артефакты. 
 - Появился клиент для iOS (отдельная сборка, ставится по приглашению). Иконки desktop-композера приведены к единому стилю, а emoji picker больше не 
   обрезается у границ окна. 

 Обновление с 0.2.3 0.2.2 требует серверных изменений актуальной версии 0.2.3: 
 миграций `025_last_resort_keypackages.sql`, 
 `026_dm_peer_pending.sql`, `027_public_channel_no_moderators.sql` `023_push_installations.sql`, `024_membership_recovery.sql` и обновления 
 настроенного push relay **раньше** сервера. 

 ## Что проверить в первую очередь в 0.2.4 

 Это короткий список для тех, кто уже тестировал сборку 0.2.3 от 4 августа. 
 Полный набор сценариев — ниже, в разделе «Что особенно важно проверить». фоновых Android-уведомлений. 

 1. **Написать коллеге, который ещё ни разу не заходил.** Заведите или 
    попросите завести новый аккаунт и, **не открывая его**, напишите ему в DM. 
    Чат должен открыться, поле ввода — работать, а над ним должна появиться 
    плашка «hasn't joined this conversation yet». Затем войдите этим аккаунтом: 
    отправленные сообщения должны дойти **сами**, без повторной отправки. 
    Любая техническая ошибка вместо диалога — важный баг. 
 2. **Публичный канал без модераторов.** Убедитесь, что бейдж MODERATOR исчез, 
    выдать роль в публичном канале нельзя, а owner может выйти из канала, не 
    назначая преемника. 
 3. **Живое обновление состава.** С одного устройства добавьте участника или 
    выдайте роль в приватном канале — у остальных список участников должен 
    обновиться **без перезапуска приложения**. 
 4. **Создание приватной группы с «трудным» участником.** Соберите группу, где 
    один из приглашаемых давно не заходил. Канал должен создаться, форма — 
    закрыться, недостающие участники — подтянуться сами. 
 5. **Статус собеседника на втором устройстве.** Привяжите второе устройство 
    (лучше телефон) и **сразу**, не дожидаясь, пока оно «прогреется», посмотрите 
    на статусы. Затем попросите собеседника отключить и включить сеть. Серая 
    точка у человека, от которого при этом приходят сообщения, — важный баг. 
 6. **Сообщение в открытый чат при плохой связи.** Держите чат открытым, 
    ненадолго оборвите сеть у отправителя и верните её. Сообщение должно 
    появиться **в самом открытом чате**, а не только в счётчике и попапе. 
 7. **Ответ в треде.** Откройте тред и отправьте ответ — он должен быть виден 
    сразу, без ручной прокрутки вниз. Отдельно проверьте, что чтение старой 
    истории треда не прерывается при приходе чужих ответов. 
 8. **Действие без сети.** Отключите сеть и попробуйте, например, добавить 
    участника. Сообщение об ошибке должно быть человеческим и предупреждать, 
    что результат нужно проверить, а не показывать сырую техническую строку. 
 9. **Android: сохранение файла и камера.** Сохраните присланный файл через 
    системный диалог — он должен сохраниться без ошибки `save path`. Снимите 
    фото кнопкой 📷 в поле ввода и отправьте; снимок **не должен** появиться в 
    галерее телефона. 
 10. **Долгая проверка на фоне (важнее всего).** Просто поработайте день на всех 
     своих устройствах. Главный класс багов этого выпуска — «сообщения тихо 
     перестали приходить, при этом приложение выглядит нормально и счётчик 
     показывает ноль». Если вы обнаружили переписку, где вы явно пропустили 
     сообщения, — это репорт с приоритетом **High**, даже если вы не можете 
     воспроизвести. 

 ## Перед началом тестирования 

 1. Установите версию **0.2.4 **0.2.3 на все свои устройства**. Старые клиенты 
    несовместимы с новой синхронизацией участников каналов и могут работать 
    некорректно. Исправления MLS этого выпуска работают между устройствами 
    только тогда, когда обновились **все** участники разговора. 
 2. Проверьте номер версии в **Settings → Profile**. 
 3. По возможности подготовьте два тестовых аккаунта и два устройства для 
    одного из аккаунтов. Это позволит проверить доставку, роли и 
    мультиустройство. 
 4. Не используйте единственный рабочий аккаунт для сценариев с выходом из 
    системы: logout безвозвратно удаляет историю на текущем устройстве. 
 5. Бета-версия может содержать ошибки. Не отправляйте через неё данные, 
    потеря которых будет критичной. 

 ## Как устроено хранение сообщений 

 Green Chat — корпоративный мессенджер со сквозным шифрованием MLS. Сервер 
 хранит сообщения и файлы в зашифрованном виде и не располагает ключами для 
 их чтения. 

 Из этого следуют важные ограничения: 

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

 ## Что особенно важно проверить в бете 0.2.x 

 ### 1. Обычные сообщения и восстановление соединения (изменено в 0.2.1–0.2.4) 0.2.1, 0.2.2 и 0.2.3) 

 - Отправьте сообщения в канал и личный чат. 
 - Проверьте доставку текста, эмодзи, форматирования и ответов в треде. 
 - Полностью отключите сеть на одном из устройств на несколько минут, затем 
   включите её обратно. 
 - Убедитесь, что клиент подключился самостоятельно и получил сообщения, 
   отправленные во время офлайна. 
 - Проверьте, что статус online/offline обновляется без повторного открытия 
   канала. 

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

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

 Отдельно проверьте новое в 0.2.4: держите чат **открытым**, пока сообщение 
 догружается фоновой сверкой (например, оборвав и вернув сеть у отправителя). 
 Сообщение должно появиться в самом открытом чате и в открытой панели треда, а 
 не только в счётчике и всплывающем уведомлении. 

 Самый опасный класс багов этого выпуска — **тихая остановка доставки**: 
 приложение выглядит рабочим, ошибок нет, счётчик непрочитанных показывает ноль, 
 а сообщения при этом не приходят. Если вы заметили, что пропустили сообщения в 
 какой-то переписке, заводите репорт с приоритетом **High** даже без сценария 
 воспроизведения — укажите канал, обе стороны и примерное время, когда доставка 
 ещё работала. Группа, надолго застрявшая на баннере «Restoring secure 
 access…», — тот же класс проблемы. 

 ### 2. Треды (новое в 0.2.0) 

 - Создайте несколько тредов в разных каналах. 
 - Откройте раздел **Threads** и проверьте сортировку по последней активности. 
 - Переключите фильтры **All** и **Unread**. 
 - Нажмите на тред в списке и убедитесь, что открылись правильный канал и 
   исходное сообщение. 
 - Ответьте с `@mention`, добавьте вложение или перетащите файл в область 
   ответа. 
 - **Новое в 0.2.4:** отправьте ответ в открытом треде — он должен сразу 
   оказаться в поле зрения, без ручной прокрутки вниз. Затем прокрутите тред 
   к старым ответам и попросите другого тестера ответить: чужой ответ **не 
   должен** перебивать чтение и утаскивать вас вниз. 
 - При наличии второго устройства проверьте синхронизацию прочитанности 
   тредов. 

 ### 3. Роли и участники каналов (новое в 0.2.0, изменено в 0.2.4) 0.2.0) 

 Для полноценной проверки нужны минимум три аккаунта: владелец, модератор и 
 обычный участник. 

 **Важное изменение 0.2.4: модераторов в публичных каналах больше нет.** Роль 
 там ничего не давала — исключать участников в публичном канале запрещено, а 
 приглашать может любой. Проверьте отдельно: 

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

 Ещё одно изменение 0.2.4 — **живое обновление**: выдача роли или добавление 
 участника с одного устройства должны быть видны остальным сразу, без 
 перезапуска приложения. Список участников, который сходится только после 
 релоада, — баг. 

 1. Создайте приватный канал и пригласите двух участников. 
 2. Убедитесь, что создатель отмечен как owner. 
 3. Назначьте одного участника модератором и затем снимите роль. 
 4. Проверьте, что owner может приглашать и исключать участников. 
 5. Проверьте, что moderator может управлять обычными участниками, но не 
    владельцем или другим модератором. 
 6. Исключите обычного участника: канал должен сразу исчезнуть у него из 
    интерфейса, а новые сообщения не должны быть доступны. 
 7. Повторно пригласите участника и убедитесь, что устаревшее событие удаления 
    не убирает канал снова. 
 8. Обычным участником публичного канала пригласите нового пользователя через 
    **Add member**. Приглашённый должен получить канал без доступа к сообщениям, 
    отправленным до его вступления. 

 Дополнительно можно проверить выход из канала: 

 - обычный участник и модератор могут выйти самостоятельно; 
 - в **приватном** канале owner с другими участниками должен сначала назначить 
   модератора, и модератора; 
 - при выходе владение переходит именно ему; 
 - в **публичном** канале (изменено в 0.2.4) owner выходит без назначения: 
   владение автоматически переходит самому раннему активному участнику; назначенному модератору; 
 - из DM выйти нельзя, но его можно скрыть через **Remove for me**; 
 - в публичный канал может приглашать любой участник, но исключение участника 
   недоступно, поскольку он может вступить обратно самостоятельно. 

 ### 4. Профили (новое в 0.2.0) 

 - Заполните аватар, должность, описание и рабочий телефон. 
 - Откройте карточку профиля из сообщения и панели участников. 
 - Проверьте копирование email и телефона. 
 - Измените аватар или данные профиля на одном устройстве и убедитесь, что 
   изменения появились у другого пользователя без перезапуска приложения. 

 Поля профиля видны всем пользователям организации — это справочная информация, 
 а не приватная часть переписки. 

 ### 5. Поиск и действия с сообщениями 

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

 Поиск работает по локально доступной истории устройства. Отсутствие сообщения, 
 которого никогда не было на этом устройстве, само по себе не является багом. 

 ### 6. Файлы, изображения и GIF (расширено в 0.2.0, изменено в 0.2.4) 0.2.0) 

 - выберите файл через кнопку вложения и убедитесь, что он сначала появился в 
   области подготовки к отправке; 
 - удалите подготовленный файл, не отправляя сообщение; 
 - перетащите файлы в основной чат и отдельно в открытый тред; 
 - вставьте изображение из буфера обмена; 
 - отправьте несколько файлов и проверьте, что они остались в исходном чате, 
   даже если во время загрузки переключиться на другой канал; 
 - откройте изображение во встроенном просмотрщике; 
 - проверьте воспроизведение GIF и отсутствие чрезмерной нагрузки интерфейса; 
 - удалите собственное сообщение с вложением и убедитесь, что файл больше не 
   доступен из чата; 
 - скачайте файл и проверьте его содержимое после расшифровки. 
 - на Android выберите документ или изображение системным picker и отправьте 
   его сначала в чат, затем в открытый тред. 
 - **новое в 0.2.4, Android:** сохраните **присланный** файл через системный 
   диалог выбора папки и откройте его штатным приложением. Раньше это 
   заканчивалось ошибкой `save path: …`; 
 - **новое в 0.2.4, Android:** снимите фото кнопкой 📷 в поле ввода и отправьте 
   его. Снимок не должен появиться в галерее телефона, а отмена съёмки не должна 
   оставлять пустое вложение; 
 - **новое в 0.2.4, Windows:** после выхода компьютера из сна откройте 
   изображение во встроенном просмотрщике. Раздвоенная картинка или мигающие 
   полосы прокрутки — баг. 

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

 ### 7. Сохранённые сообщения и загрузки (новое в 0.2.0) 

 - Сохраните сообщения из разных каналов через контекстное меню. 
 - Откройте раздел **Saved**, перейдите из него к исходному сообщению и удалите 
   закладку. 
 - При наличии второго устройства проверьте, что список сохранённых сообщений 
   синхронизировался. 
 - Скачайте несколько файлов и откройте раздел **Downloads**. 
 - Проверьте действия **Open file**, **Show in folder** и 
   **Remove from history**. 

 Сохранённые сообщения синхронизируются между устройствами и видны только 
 владельцу аккаунта. История загрузок хранится только на конкретном устройстве. 
 Удаление записи из Downloads не удаляет сам файл с диска. Файлы, скачанные до 
 установки 0.2.0, в историю автоматически не добавляются. 

 ### 8. Уведомления и звук (изменено в 0.2.2, 0.2.3 0.2.2 и 0.2.4) 0.2.3) 

 - Перед проверкой убедитесь, что в **Settings → Notifications** выключен 
   **Pause all notifications**: включённый тумблер намеренно отключает попапы 
   и звук, при этом сообщения и счётчики продолжают приходить. Кнопка 
   **Send test** проверяет только доставку до операционной системы и работает 
   даже при включённой паузе. 
 - В **Settings → Notifications** нажмите **Send test**. 
 - Оставьте окно приложения без фокуса и попросите другого тестера отправить 
   DM — должен появиться системный попап и прозвучать звук. 
 - Полностью сверните окно или скройте его в tray и попросите отправить ещё 
   один DM: попап и звук должны прийти, не открывая окно, а после открытия 
   счётчики и сами сообщения должны уже быть на месте без ручного обновления. 
 - Проверьте `@mention` в канале. Обычное сообщение без упоминания по умолчанию 
   не показывает попап. 
 - Отключите звук в настройках и убедитесь, что новые сообщения приходят без 
   звукового сигнала. 
 - Проверьте DND, mute канала и quiet hours. 
 - Полностью закройте приложение через tray → **Quit**, отправьте на аккаунт 
   DM и проверьте email-уведомление, если SMTP включён на сервере. 

 Попапы показывает запущенное приложение. После полного выхода через **Quit** 
 desktop-клиент не может показать системное уведомление; в этом случае для DM 
 может прийти только email. 

 На Android 13+ разрешите уведомления при первом запуске. Сверните приложение, 
 отправьте DM с другого аккаунта и проверьте push, догрузку сообщения и переход 
 по тапу. Push требует Google Play services и не приходит после принудительной 
 остановки приложения через системные настройки. 

 На macOS в 0.2.4 уведомления перешли на системный механизм: попап должен 
 приходить от имени **Green Chat** с правильной иконкой, а само приложение — 
 появиться в списке «Системные настройки → Уведомления». Попап от имени 
 **Script Editor**, отсутствие приложения в этом списке или молчание при 
 разрешённых уведомлениях ОС — баг. 

 ### 9. Несколько устройств (изменено в 0.2.4) 

 - Войдите на второе устройство по паролю или привяжите его по QR-коду. 
 - Создайте приватный канал и пригласите пользователя с несколькими активными 
   устройствами. 
 - Убедитесь, что канал, его название и новые сообщения появились на всех 
   устройствах приглашённого. 
 - Проверьте синхронизацию прочитанности, черновиков, сохранённых сообщений и 
   скрытых чатов. 
 - Измените аватар и убедитесь, что он обновился на других клиентах. 
 - Закройте одно устройство, продолжите работу на втором, затем верните первое 
   в сеть и проверьте восстановление состояния. 
 - **Новое в 0.2.4 — статусы на свежепривязанном устройстве.** Сразу после 
   привязки второго устройства, не дожидаясь пока оно «прогреется», посмотрите 
   на точки присутствия собеседников и попросите кого-нибудь отключить и 
   включить сеть. Раньше новое устройство не получало обновлений присутствия, 
   пока восстановление членства не дойдёт до каждого общего канала: сообщения 
   приходили, а точка оставалась серой сколь угодно долго. Серый статус у 
   человека, от которого прямо сейчас приходят сообщения, — баг. 

 ### 10. Android 0.2.4 0.2.3 

 - Установите universal APK на Android 7 или новее и проверьте, что приложение 
   называется **Green Chat** и показывает новую иконку. Chat**. 
 - Проверьте вход по паролю, привязку по QR и ручной ввод кода. 
 - Откройте клавиатуру в чате и треде: поле ввода и нижние кнопки должны 
   оставаться видимыми. 
 - На устройстве с вырезом или жестовой навигацией проверьте верхнюю навигацию, 
   боковые панели, Threads и Devices. Список чатов должен занимать всю ширину 
   экрана — серой полосы справа быть не должно. 
 - Выберите документ и изображение системным picker, отправьте их в чат и тред, 
   затем скачайте и откройте на втором устройстве. 
 - **Новое в 0.2.4:** сохраните присланный файл через системный диалог выбора 
   папки. Ошибка `save path: …` — баг. В истории загрузок на Android действия 
   **Open file** и **Show in folder** намеренно скрыты: система не даёт клиенту 
   пути к сохранённому документу. 
 - **Новое в 0.2.4:** снимите фото кнопкой 📷 в поле ввода и отправьте его. 
   Проверьте отдельно отмену съёмки и отказ в разрешении на камеру — оба случая 
   должны давать понятное сообщение, а не пустое вложение или зависание. На 
   устройстве без камеры кнопки быть не должно. 
 - Сверните приложение, получите push и откройте сообщение по тапу без ручного 
   обновления. 
 - Заблокируйте экран телефона и попросите собеседника посмотреть ваш статус: 
   через некоторое время вы должны стать «отошёл», затем «офлайн», а не 
   оставаться «онлайн». 

 Удаление Android-приложения удаляет локальную историю и ключи этого устройства. 
 Не переустанавливайте его во время сценария, если на аккаунте нет другого 
 активного устройства. 

 ### 11. Выход со всех устройств (новое в 0.2.0) 

 Этот сценарий выполняйте только на специально созданном тестовом аккаунте. 
 Перед выходом убедитесь, что клиент подключён к серверу. 

 1. Выйдите из аккаунта на последнем активном устройстве и подтвердите 
    предупреждение об удалении истории. 
 2. У другого пользователя аккаунт должен получить отметку **Logged out** в 
    списке DM, профиле, панели участников и выборе пользователя. 
 3. В существующем DM история должна остаться читаемой, но поле отправки должно 
    замениться предупреждением. 
 4. Создание нового DM с вышедшим пользователем должно быть заблокировано. Это 
    **не** то же самое, что новый коллега, который ещё ни разу не заходил (§12): 
    вышедший потерял ключи безвозвратно и писать ему действительно нельзя, а 
    новому — можно всегда. 
 5. Отправьте в канал сообщение с его персональным `@mention`: сообщение 
    должно отправиться остальным участникам, а автор должен увидеть 
    предупреждение о недоставке упомянутому пользователю. 
 6. Снова войдите этим аккаунтом. Отметка Logged out должна исчезнуть у других 
    пользователей. 

 Повторный вход создаёт новое активное устройство, но не возвращает историю, 
 уничтоженную при logout. 

 ### 12. Письмо коллеге, который ещё не заходил (новое в 0.2.4) 

 Главное изменение выпуска. До 0.2.4 попытка написать новому сотруднику 
 заканчивалась красной ошибкой `404 no key_packages` — диалог не открывался 
 вообще, и написать было нельзя, пока коллега не напишет первым. 

 Для проверки нужен аккаунт, **в который ещё ни разу не входили** ни на одном 
 устройстве. Попросите администратора завести его и не открывайте. 

 1. Найдите этого человека в списке пользователей и откройте с ним DM. Диалог 
    должен открыться, поле ввода — быть доступным. 
 2. Над полем ввода должна появиться плашка «*Имя* hasn't joined this 
    conversation yet — your messages will be sent automatically once they sign 
    in». 
 3. Отправьте несколько сообщений. Они должны приниматься, а отметка доставки 
    рядом с ними — оставаться честной: `✓✓` в этом состоянии не ставится. 
 4. Войдите этим аккаунтом на любом устройстве. 
 5. Отправленные ранее сообщения должны дойти **сами**, без повторной отправки с 
    вашей стороны, а плашка — исчезнуть. 

 Дополнительно стоит проверить сценарий «человек в отпуске»: аккаунт, который 
 давно не выходил в сеть, но раньше работал. Написать ему тоже должно быть 
 можно. 

 Любая техническая ошибка вместо диалога, навсегда застрявшая плашка после входа 
 собеседника или потерянные сообщения из очереди — важный баг с приоритетом 
 **High**. 

 ## Что обязательно считать багом 

 - Падение, зависание или бесконечная загрузка приложения. 
 - Потеря уже отправленного сообщения или его появление в неправильном чате. 
 - Ошибка расшифровки, нечитаемый текст или повреждённый файл. 
 - Получение доступа к чужому каналу, профилю или данным без разрешения. 
 - Возможность обычного участника выполнить действие owner/moderator. 
 - Доступ исключённого участника к новым сообщениям приватного канала. 
 - Расхождение каналов, ролей, сохранённых сообщений или прочитанности между 
   устройствами, которое не исправляется после переподключения. 
 - Отсутствие DM или `@mention`-уведомления при выполненных условиях доставки. 
 - Неправильный адресат, канал или тред у вложения. 
 - **Тихо прекратившаяся доставка**: сообщения перестали приходить, при этом 
   приложение выглядит рабочим, ошибок нет, а счётчик непрочитанных показывает 
   ноль. Обнаруживается обычно постфактум — «оказалось, мне писали». 
 - Группа, надолго застрявшая на баннере «Restoring secure access…». 
 - Техническая ошибка вместо открытого диалога при попытке написать коллеге. 
 - Неработающая кнопка, обрезанный интерфейс или нечитаемый текст, особенно в 
   тёмной теме. 

 Проблемы безопасности, потерю данных и воспроизводимые падения отмечайте 
 приоритетом **High**. 

 ## Известные ограничения беты 

 - Вход обычно доступен только по приглашению; вкладки создания свободного 
   аккаунта может не быть. 
 - Автоматического обновления нет — новую версию нужно устанавливать вручную. 
 - Windows может показать SmartScreen с предупреждением о неизвестном 
   издателе. 
 - Начиная с 0.2.4 релизные macOS-сборки подписаны Developer ID — Gatekeeper Неподписанная macOS-сборка может быть заблокирована Gatekeeper. После 
   не должен их блокировать. Если вам досталась неподписанная сборка и она 
   заблокирована, после переноса приложения в `/Applications` выполните: 

   ```sh 
   xattr -cr "/Applications/Green Chat.app" 
   ``` 

 - Атрибуция попапов На macOS системные попапы бета-сборки могут отображаться от имени 
   **Script Editor** на macOS исправлена в 0.2.4 для 
   собранного приложения. Она остаётся только при запуске из исходников через 
   `pnpm tauri dev` — этому режиму нечего предъявить системе как приложение. Editor**. 
 - На части серверов отправка файлов и email-уведомления могут быть отключены. 
 - Числовой бейдж учитывает DM и упоминания; обычное непрочитанное сообщение в 
   канале отображается точкой. 
 - Сообщение `SPKI pin mismatch` после плановой смены серверного ключа требует 
   повторного входа. Клиент намеренно не принимает новый ключ молча. 
 - Android APK 0.2.4 остаётся debug-сборкой: релизного ключа подписи у беты нет, 
   в Play она не публикуется, ставится 0.2.3 является debug-сборкой, устанавливается вручную и может 
   вызвать предупреждение 
   Play Protect о неизвестном разработчике. 
 - Фоновые Android-уведомления требуют Google Play services и настроенный push 
   relay. На HMS/чистом AOSP и после Force stop сообщения появятся только после 
   ручного открытия приложения. 
 - Сообщения, ждущие в очереди коллеге, который ещё не вошёл (§12), хранятся 
   **на отправляющем устройстве**. Logout на нём до входа получателя эту очередь 
   уничтожает. 
 - Резервный ключ приглашения, который делает DM доступными всегда, немного 
   ослабляет forward secrecy **первого** приглашающего конверта — до первого 
   изменения в группе. Содержимое сообщений это не затрагивает; разбор принятой 
   цены — в [ADR-0028](ADR-0028-dm-availability-last-resort-keypackages.md). 
 - iOS-сборка распространяется отдельно и требует приглашения в TestFlight; 
   минимальная версия — iOS 15.0. 

 Если поведение не перечислено здесь и выглядит неправильным, лучше отправить 
 репорт. 

 ## Полный changelog всех версий 0.2.x 

 Ниже release notes приведены полностью, от текущей версии к самой ранней. 
 Отдельные файлы по ссылкам в начале памятки содержат тот же текст. 

 ### Green Chat 0.2.4 — Beta Update 

 Дата сборки: **17 августа 2026 года**. 

 Предыдущая сборка, которую получали тестировщики, — **0.2.3 от 4 августа 2026 
 года**. В 0.2.4 вошли не только работы по iOS от 16–17 августа, но и две недели 
 исправлений по бета-репортам (5–14 августа), которые до сих пор ни в одну 
 сборку не попадали. 

 #### Личные сообщения: «коллеге всегда можно написать» 

 Бета-репорт 5 августа: новый пользователь открывал DM с коллегой и вместо 
 диалога получал красный текст `404 no key_packages` — написать было нельзя 
 вообще. Работало только в обратную сторону, если коллега писал первым. 

 - **Экран с этой ошибкой больше не существует.** DM открывается всегда, поле 
   ввода доступно всегда. 
 - Если устройство собеседника ещё ни разу не подключалось, над полем ввода 
   появляется плашка «hasn't joined this conversation yet», а сообщения ждут в 
   локальной очереди и уходят сами, как только собеседник войдёт. Отметка `✓✓` 
   в этом состоянии не ставится. 
 - Устройство заливает ключи для приглашений сразу при регистрации, привязке по 
   QR и входе по паролю, а пополняет их при каждом подключении и раз в 10 минут 
   вместо часа. 
 - У каждого устройства появился постоянный резервный ключ приглашения, поэтому 
   «пул закончился» перестаёт быть тупиком даже у человека в отпуске. 
 - Неудачные попытки приглашения больше не сжигают ключи навсегда. 

 Подробности — [ADR-0028](ADR-0028-dm-availability-last-resort-keypackages.md). 
 Требуются миграции `025_last_resort_keypackages.sql` и `026_dm_peer_pending.sql`. 

 #### Роли, состав каналов и создание группы 

 - **Модераторов в публичных каналах больше нет** — роль там ничего не давала. 
   Уже выданные роли снимает миграция `027_public_channel_no_moderators.sql`. 
 - Owner публичного канала может выйти, не назначая преемника: владение 
   переходит самому раннему активному участнику. 
 - **Список участников обновляется сразу**, без перезапуска приложения. 
 - Создание приватной группы не срывается целиком из-за одного участника, 
   которого не удалось добавить. 
 - Метки «logged out» и «hasn't signed in yet» разведены. 

 #### Статус присутствия 

 - Телефон с заблокированным экраном больше не показывается как «онлайн»: 
   в фоне — «отошёл», через 45 секунд — «офлайн». Побочный эффект — экономия 
   батареи. 
 - Статус собеседника перестаёт «залипать» серым после потери связи или фона. 
 - Свой статус при пропаже сети больше не остаётся «онлайн»; ручной статус при 
   этом не сбрасывается. 
 - **Статусы наконец сходятся на втором устройстве**: свежепривязанный телефон 
   раньше не получал обновлений присутствия вообще, пока восстановление членства 
   не дойдёт до каждого общего канала. 

 #### Восстановление MLS и расхождение эпох 

 - Форк эпох обнаруживается после расхождения номеров эпох и на историческом 
   пути чтения — устройство само запрашивает замену листа вместо вечного 
   «Failed to load / Retry». 
 - Нерасшифровываемый коммит следующей эпохи и сообщение из эпохи впереди 
   локальной теперь тоже считаются доказательством форка. Это закрывает 
   сценарий, при котором устройство молча не получало сообщения, а счётчик 
   непрочитанных честно показывал ноль. 
 - Устройство выбирается из ситуации, когда замена листа построена на ключе, 
   которого у него уже нет. 
 - После замены листа устройство не зацикливается на сообщениях, отправленных 
   до его переприглашения: они помечаются недоступными по дизайну. 
 - Ремонтирующее устройство пересылает имя приватной группы и после 
   замены-ремонта. 
 - Группа в состоянии восстановления показывает баннер «Restoring secure 
   access…» вместо красной крипто-ошибки; отправка на это время блокируется. 

 #### Desktop и Android — по бета-репортам 

 - **Открытая переписка обновляется сама**: раньше фоновая сверка поднимала 
   сообщение и показывала попап, а в самом открытом чате его не было до 
   переключения канала. 
 - **Автопрокрутка в треде** (репорт №48): свой отправленный ответ больше не 
   уходит под нижний край, чтение истории при этом не прерывается. 
 - **Понятные ошибки без сети** (репорт №49) вместо сырых технических строк. 
 - **Сохранение присланного файла на Android** (репорт №57): ошибки 
   `save path: …` больше нет. 
 - **Просмотрщик изображений после выхода из сна** на Windows больше не мигает 
   двумя раскладками. 
 - Убрана серая полоса справа от списка чатов (№46), обновлена иконка 
   приложения на Android (№45). 

 #### Камера на Android 

 Кнопка 📷 в поле ввода снимает фото и сразу прикладывает его к сообщению 
 (пожелание №56). Снимок **не попадает в галерею телефона**. Кнопка появляется 
 только на устройствах с камерой. 

 #### iOS-клиент (новое) 

 - Первая сборка на устройство и симулятор: вход, каналы, DM, треды, реакции, 
   файлы — весь функционал десктопа в мобильной оболочке. 
 - Секреты в Keychain, данные в App-Group-контейнере. 
 - Камера и системный пикер фотографий. 
 - Push-уведомления с **расшифрованным текстом**: Notification Service Extension 
   поднимает MLS-состояние в память, подписанно забирает новые сообщения с 
   вашего сервера и показывает «отправитель / канал / текст» плюс точный бейдж; 
   ничего не сохраняет. Центральный push relay по-прежнему не видит ни 
   идентификаторов беседы, ни шифртекста. При любой неудаче баннер остаётся 
   generic «New message» — это штатный fallback. 
 - Устранена причина падений у всех TestFlight-тестировщиков при сворачивании 
   приложения; размер пакета уменьшен с 186 МБ до 18,6 МБ; минимальная версия — 
   iOS 15.0. 

 #### macOS 

 - Системные уведомления перешли на штатный механизм: правильные имя и иконка, 
   приложение появляется в «Системные настройки → Уведомления», отказ и ошибки 
   доставки видны в диагностике **Send test**. Атрибуция от имени 
   **Script Editor** осталась только для запуска из исходников. 
 - Релизные сборки подписываются Developer ID с hardened runtime. 
 - Иконка приложения приведена к нативной форме macOS. 

 #### Мобильный интерфейс 

 - Список чатов занимает всю ширину экрана. 
 - Просмотрщик изображений и попапы не наезжают на статус-бар и home-индикатор. 
 - Реакция на сообщение с картинкой не «мигает» превью. 
 - Корень треда, отправленный до подключения устройства, помечается «Sent before 
   this device joined» вместо сырой строки. 

 #### Деплой 

 - **Сервер и push relay обязательны к обновлению.** Протокол relay получил поле 
   `kind` (ADR-0027 §1); агрегатный snapshot присутствия `GET /v1/presence` 
   чинит зависшие статусы. 
 - **Порядок строгий: сначала `glchat-push`, потом `glchat-server`.** Старый 
   relay отклоняет запросы нового сервера — пока relay не обновлён, пуши не 
   работают ни на одной платформе. 
 - **Новые миграции: `025_last_resort_keypackages.sql`, 
   `026_dm_peer_pending.sql`, `027_public_channel_no_moderators.sql`.** 
 - Клиенты обновить везде: исправления MLS работают между устройствами только 
   при обновлении всех участников. 

 Границы приватности не менялись. 

 --- 

 ### Green Chat 0.2.3 — Beta Update 

 Дата первой Android-сборки: **30 июля 2026 года**. Последняя выпущенная сборка Актуальная сборка: 
 0.2.3: **4 августа 2026 года**. 

 Версия 0.2.3 добавляет **мобильную сборку (Android)** и уведомления на телефон. 
 В актуальную сборку также вошли исправления Android, защиты от расхождения 
 MLS-эпох, управления публичными каналами, desktop-композера и push relay. 

 Android-сборка **экспериментальная**: это debug-APK, он не подписан релизным 
 ключом, не публикуется в Play и ставится вручную. 

 #### Изменения актуальной сборки от 4 августа 

 ##### Надёжность шифрования и доставки 

 - Клиент больше не применяет локальный MLS Commit до подтверждения сервера. 
   Это предотвращает расхождение криптографических веток при одновременных 
   изменениях состава группы. 
 - Добавлено автоматическое восстановление устройства, уже попавшего в такую 
   ветку: при ошибке расшифровки текущей эпохи здоровый участник заменяет его 
   MLS-листину, а клиент принимает replacement Welcome и продолжает доставку. 
 - Расшифрованная локальная история при восстановлении сохраняется. Pending 
   MLS-состояние и исходящий запрос сохраняются атомарно, поэтому потерянный 
   HTTP-ответ или перезапуск не создают второй отличный Commit. 
 - Серверу требуется миграция `024_membership_recovery.sql`. 

 ##### Android 

 - Интерфейс учитывает вырезы экрана, status bar, навигационную панель и 
   виртуальную клавиатуру. 
 - Выбор файла использует нативный Android picker; документы и изображения 
   можно прикреплять к обычным сообщениям и ответам в тредах. 
 - В launcher и системных настройках отображается имя **Green Chat**, системные 
   push-строки приведены к английской локализации. 
 - Перед упаковкой удаляется старый universal APK/AAB, чтобы прерванная 
   инкрементальная сборка не раздувала новый пакет. 

 ##### Каналы и интерфейс 

 - Любой активный участник публичного канала может пригласить нового 
   пользователя через **Add member**. Исключение участников публичного канала 
   по-прежнему запрещено. 
 - Иконки действий в desktop-композере приведены к единому стилю. 
 - Emoji picker больше не обрезается границами поля ввода. 

 ##### Push relay и эксплуатация 

 - Relay корректно распознаёт реальный ответ FCM `UNREGISTERED` и удаляет 
   недействительные Firebase installation IDs. 
 - Bootstrap dev push-конфигурации останавливается при расхождении секрета в 
   `tenants.json` и переменной окружения. 
 - Локальный chat server больше не зависит по healthcheck от push relay и может 
   работать без фоновых мобильных уведомлений. 

 #### Android-клиент 

 - Приложение собрано из **того же кода**, что и desktop (Tauri 2 mobile): те же 
   MLS-шифрование, те же экраны, та же логика доставки. Отдельного мобильного 
   клиента с собственной криптографией не появилось. 
 - Приватный ключ устройства и ключ локальной базы хранятся в **AndroidKeyStore** 
   (аппаратно, если устройство поддерживает); удаление приложения удаляет и их. 
 - Линковка устройства сканированием QR-кода. Если камера недоступна — работает 
   ручной ввод кода. 
 - Интерфейс перестроен под телефон: список чатов и переписка — один стек с 
   кнопкой «назад», панели тредов, участников и сохранённых открываются на весь 
   экран, учитываются вырезы экрана и виртуальная клавиатура. 

 #### Уведомления на телефон 

 - Приходят через Firebase Cloud Messaging. **Содержимое сообщения в push не 
   передаётся** — приходит только сигнал «есть новое», текст «New message» 
   формирует само приложение на устройстве. 
 - Push будит приложение и запускает догрузку, поэтому при открытии всё уже на 
   месте. 
 - Уведомление приходит **только на устройства без активного соединения** — если 
   телефон онлайн, сообщение и так придёт по WebSocket. 
 - На Android 13+ при первом запуске приложение спросит разрешение на 
   уведомления. Отказ отключает попапы, сообщения продолжают приходить. 
 - Требуются **Google Play services**. На устройствах без них (HMS, чистый AOSP) 
   фоновых уведомлений не будет — ограничение транспорта, не клиента. 
 - Push не приходит, если приложение принудительно остановлено через 
   «Настройки → Приложения → Остановить»: система блокирует доставку до 
   следующего запуска вручную. 

 Уведомления **не заменяют** доставку: если push потерялся, сообщения всё равно 
 догружаются при открытии приложения. 

 #### Сервер 

 Требуется **обновление сервера** и миграции `023_push_installations.sql` и 
 `024_membership_recovery.sql`. 
 Дополнительно администратору нужно настроить push relay — без него мобильный 
 клиент работает полностью, но фоновых уведомлений не будет 
 (см. [docs/push-relay-deployment.md](push-relay-deployment.md) и шаг 4b 
 [бета-чеклиста](beta-checklist.md)). 

 Границы приватности не изменились: сервер по-прежнему не видит текст 
 сообщений и ключи. Появился один новый элемент — центральный push relay 
 получает идентификатор установки приложения (не аккаунт и не сообщение) и 
 время отправки; подробности и принятые риски описаны в 
 [ADR-0026](ADR-0026-central-push-relay.md). 

 #### Обновление 

 1. Администратор обновляет сервер и применяет миграции 023 и 024. 
 2. Desktop: установите **0.2.3** на все устройства. 
 3. Android: установите APK, войдите или привяжите устройство по QR. 

 Что особенно важно проверить на телефоне: 

 1. приходит ли уведомление, когда приложение **свёрнуто**, а не открыто; 
 2. открываются ли после тапа именно новые сообщения — без ручного обновления; 
 3. работает ли одновременно телефон и десктоп на одном аккаунте (счётчики 
    непрочитанных не должны расходиться); 
 4. привязка устройства по QR-коду; 
 5. отправка и открытие вложений с телефона. 

 --- 

 ### Green Chat Desktop 0.2.2 — Beta Update 

 Дата выпуска: **23 июля 2026 года**. 

 Версия 0.2.2 закрывает бета-репорт «клиент в фоне на Windows молчит и не 
 обновляется»: свёрнутое или скрытое в tray окно не получало ни системного 
 уведомления, ни счётчика непрочитанных, а интерфейс показывал новые сообщения 
 только после ручного обновления страницы (Ctrl+R). 

 Обновляется **только desktop-клиент** — серверных изменений в этом выпуске 
 нет (см. раздел «Сервер»). 

 #### Доставка и уведомления при свёрнутом окне 

 - Фоновая сверка с сервером перенесена из интерфейсного слоя в нативный 
   Rust-процесс и выполняется каждые 10 секунд. Windows может приостанавливать 
   таймеры и сам JS-контекст WebView2 у скрытого окна — теперь это не 
   останавливает ни доставку сообщений, ни уведомления. 
 - Системное уведомление для сообщения, пришедшего в свёрнутое/фоновое окно, 
   создаётся непосредственно нативным процессом, до и независимо от 
   интерфейсного слоя. Открывать окно, чтобы получить попап, не требуется. 
   Настройки Pause all notifications, DND, mute, quiet hours и режим 
   уведомлений канала учитываются так же, как раньше. 
 - Возврат окна из фона, minimize или tray запускает немедленную сверку — 
   счётчики и новые сообщения появляются сами, ручной Reload больше не нужен. 
 - Потерянный единичный WebSocket-кадр или half-open соединение больше не 
   оставляют клиент без счётчика, звука и попапа: любое расхождение с сервером 
   устраняется ближайшей 10-секундной сверкой. 
 - После выхода компьютера из сна клиент больше не ждёт до 90 секунд, считая 
   старый WebSocket подключённым: resume-watchdog обнаруживает паузу системных 
   часов и переподключается за несколько секунд, сразу забирая пропущенные 
   сообщения и восстанавливая presence. 
 - Сводное уведомление «N new messages» о сообщениях, восстановленных фоновой 
   сверкой, показывается даже если окно уже получило фокус (например, сразу 
   после открытия крышки ноутбука) и не дублируется при открытии окна после 
   нативного уведомления. 
 - Если звук сообщений включён, уведомления сопровождаются нативным системным 
   звуком; серия подряд идущих сообщений даёт один звук, а не очередь сигналов. 
 - Определение «окно в фокусе» для подавления попапов использует состояние 
   самого интерфейса, а не системный сигнал окна — на Windows системный сигнал 
   недостоверен и мог как показывать попапы поверх активного окна, так и 
   глушить их у скрытого. 

 #### Личные сообщения 

 - Если KeyPackage нового устройства ещё загружается, повторная попытка 
   восстановления membership выполняется через несколько секунд с постепенным 
   увеличением интервала. Чат больше не зависает в состоянии `re-syncing` 
   из-за двухминутного ожидания, которое при каждом перезапуске начиналось 
   заново. 
 - Исправлена ложная блокировка отправки после password login или привязки 
   устройства: старые клиенты создавали пустую MLS BasicCredential, поэтому 
   два реальных листа ошибочно считались одним пользователем. Готовность 
   личного чата теперь проверяется по фактическому MLS roster, а новые 
   устройства сохраняют credential с серверным username. 

 #### Сервер 

 Серверный код в 0.2.2 не менялся. Требования совпадают с 0.2.1: сервер должен 
 быть обновлён до серверной версии выпуска 0.2.1 (endpoints состояния 
 синхронизации и миграция `022_membership_repair_claims.sql`). Со старым 
 сервером клиент продолжает работать в режиме прежней полной догрузки, но 
 10-секундная сверка и восстановление membership недоступны. 

 Как и раньше, содержимое сообщений, ключи и настройки уведомлений не 
 передаются серверу в открытом виде; текст системных уведомлений формируется 
 локально и никогда не покидает устройство. 

 #### Обновление 

 Установите **Green Chat Desktop 0.2.2 на все свои устройства**. 

 Особенно важно повторно проверить: 

 1. сообщения и `@mention` в **свёрнутое или скрытое в tray** окно: системный 
    попап и звук должны прийти без открытия окна, а после открытия счётчики и 
    сообщения должны быть уже на месте — без Ctrl+R; 
 2. перед проверкой уведомлений убедитесь, что в **Settings → Notifications** 
    выключен **Pause all notifications** — включённый тумблер отключает попапы 
    и звук намеренно, при этом сообщения и счётчики продолжают приходить; 
 3. получение сообщений после сна/пробуждения компьютера; 
 4. личный чат после logout и повторного входа одного из участников; 
 5. одновременную работу двух устройств одного аккаунта. 

 --- 

 ### Green Chat Desktop 0.2.1 — Beta Update 

 Дата выпуска: **22 июля 2026 года**. 

 Версия 0.2.1 исправляет проблемы доставки сообщений и уведомлений, 
 обнаруженные во время бета-тестирования 0.2.0. 

 #### Главное 

 - Доставка больше не зависит только от WebSocket-событий. Клиент сверяет 
   локальное состояние с сервером после подключения, при ошибке live-доставки 
   и каждые две минуты, пока соединение активно. 
 - Пропущенные во время офлайна сообщения автоматически догружаются в 
   правильном порядке вместе с необходимыми MLS-коммитами. 
 - Счётчики непрочитанных, список тредов и сохранённые сообщения обновляются 
   после каждой сверки с сервером. 
 - Для сообщений, полученных через фоновую сверку, показывается одно сводное 
   уведомление вместо серии попапов. Настройки DND, mute, quiet hours и режим 
   уведомлений канала продолжают учитываться. 

 #### Исправление личных сообщений после повторного входа 

 - Исправлена ситуация, когда после logout и повторного входа личный чат 
   оставался доступен, но новые сообщения фактически шифровались без устройства 
   собеседника. 
 - Клиент автоматически обнаруживает отсутствующее устройство участника и 
   повторно добавляет его в MLS-группу личного чата. 
 - Одновременное восстановление несколькими устройствами защищено коротким 
   серверным lease: проигравший клиент останавливается до изменения локальной 
   MLS-эпохи. 
 - Пока устройство собеседника ещё не восстановлено в личном чате, поле ввода 
   заменяется сообщением о синхронизации, а отправка временно блокируется. 
   Отметка `✓✓` в этом состоянии заменяется честным предупреждением 
   `not delivered`. 
 - После успешного восстановления чат разблокируется по долговременному 
   состоянию клиента, даже если соответствующее WebSocket-событие потерялось. 

 #### Надёжность и диагностика 

 - Ошибка обработки live-сообщения теперь запускает ускоренную сверку с 
   сервером вместо ожидания следующего переподключения. 
 - Исправлена потеря полной проверки групп, если переподключение совпало по 
   времени с уже выполняющейся фоновой сверкой. 
 - Отложенные reconcile-задачи корректно отменяются при logout. 
 - Desktop-клиент пишет диагностический лог в `glchat.log` в каталоге данных 
   приложения. 
 - Добавлена ротация лога при достижении 5 MiB с сохранением одной предыдущей 
   копии `glchat.log.old`, включая повторную ротацию на Windows. 

 #### Сервер 

 - Добавлены авторизованные endpoints состояния синхронизации: хвосты сообщений 
   по группам и отсутствующие membership-листы. 
 - Добавлен одноразовый lease-token для безопасного восстановления membership. 
 - Добавлена метрика Prometheus для количества обнаруженных membership gaps. 
 - Добавлена миграция `022_membership_repair_claims.sql`. 

 Содержимое сообщений, ключи и настройки уведомлений по-прежнему не передаются 
 серверу в открытом виде. Новые endpoints работают только с уже известными 
 серверу метаданными групп, устройств и последовательностей сообщений. 

 #### Обновление 

 Для проверки исправлений установите **Green Chat Desktop 0.2.1 на все свои 
 устройства**. Сервер также должен быть обновлён и иметь применённую миграцию 
 `022_membership_repair_claims.sql`. 

 Особенно важно повторно проверить: 

 1. получение сообщений после временного отключения сети; 
 2. непрочитанные, звук и системный попап после фоновой догрузки; 
 3. личный чат после logout и повторного входа одного из участников; 
 4. одновременную работу двух устройств одного аккаунта; 
 5. наличие `glchat.log` после перезапуска desktop-приложения. 

 --- 

 ### glchat Desktop 0.2.0 — Beta Update 

 Изменения с 9 по 20 июля 2026 года. 

 #### Новые возможности 

 - Добавлены роли владельца и модератора канала, управление участниками, выход из канала и локальное скрытие чатов. 
 - Появились карточки профилей с аватаром, должностью, описанием и контактами. 
 - Добавлен единый раздел «Треды» со всеми обсуждениями и фильтром непрочитанных. 
 - Сообщения теперь можно сохранять в личные закладки с синхронизацией между устройствами. 
 - Добавлена локальная история загрузок: файл можно открыть, показать в папке или убрать из списка. 
 - Изображения открываются во встроенном просмотрщике, добавлена безопасная анимация GIF. 
 - Изображения из буфера обмена можно вставлять прямо в сообщение. 
 - Добавлены звуковые уведомления о новых сообщениях и настройка звука. 
 - Пользователи, вышедшие со всех устройств, теперь отмечаются в интерфейсе. Перед отправкой им личного сообщения или упоминания показывается предупреждение. 

 #### Улучшения интерфейса 

 - Добавлены контекстные действия для сообщений. 
 - Улучшены редакторы сообщений и ответов в тредах. 
 - Добавлены упоминания пользователей в ответах треда. 
 - Улучшена работа с вложениями: предварительная подготовка, drag-and-drop в треды и удаление отправленных файлов. 
 - Поиск теперь прокручивает чат до найденного сообщения и ограничивает слишком тяжёлые запросы. 
 - Улучшены индикаторы присутствия, подсчёт участников и расположение боковых панелей. 
 - После отправки сообщения чат автоматически прокручивается к нему. 
 - Исправлено восстановление окна приложения из системного трея. 

 #### Исправления и стабильность 

 - Исправлена синхронизация каналов, участников и метаданных между несколькими устройствами. 
 - Восстановлена доставка уведомлений после длительного офлайна. 
 - Статус пользователя обновляется сразу после подключения. 
 - Исправлен учёт непрочитанных сообщений при переключении фокуса окна. 
 - Исключённые каналы сразу удаляются из интерфейса, а устаревшие события больше не удаляют канал после повторного вступления. 
 - Исправлены отображение закреплённых файлов и привязка вложений к исходному чату. 
 - Добавлена корректная обработка максимальной длины сообщений. 
 - Аватары профилей теперь обновляются в реальном времени. 
 - Улучшено восстановление личных чатов после выхода всех участников со всех устройств. 
 - При выходе устройство отзывается на сервере, чтобы не оставлять неактивные устройства и ключи. 

 #### Сервер и эксплуатация 

 - Добавлены Prometheus-метрики для HTTP, WebSocket, PostgreSQL, Redis и Go runtime. 
 - Подготовлены базовые правила мониторинга и алертов. 
 - Улучшена конфигурация TLS для файлового хранилища. 

 Итого: **40 коммитов и 178 изменённых файлов** в ветке `main`. 

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

 Трекер: 
 <https://bug.green-lab.space/projects/greenchat/issues/new>. Регистрация не 
 нужна, репорт можно отправить анонимно. 

 ### Что указать 

 ```text 
 Краткое название: что сломалось и где 

 Шаги: 
 1. … 
 2. … 
 3. … 

 Ожидал: … 
 Получил: … 

 Окружение: 
 - Green Chat 0.2.4 0.2.3 (или версия из Settings → Profile) 
 - ОС и версия 
 - один или несколько аккаунтов/устройств 
 - название канала или DM 
 - точное время события и часовой пояс 

 Воспроизводится: всегда / иногда / один раз 
 Дополнительно: скриншот или короткое видео 
 ``` 

 Для проблем синхронизации укажите ОС и версию клиента **на каждой стороне**, 
 а также какое устройство было офлайн. 

 Трекер публичный. Не прикладывайте пароли, invite-коды, ключи, приватные 
 логи или скриншоты с конфиденциальной перепиской. Перед отправкой замажьте 
 лишние данные. 

 ### Приоритет 

 | Приоритет | Когда использовать | 
 |---|---| 
 | `Normal` | Большинство ошибок интерфейса и поведения | 
 | `High` | Падение, потеря данных, недоставка сообщений, нарушение прав или безопасности | 
 | `Urgent` / `Immediate` | Не выбирайте без отдельной просьбы команды | 

 ## Быстрая диагностика уведомлений 

 1. Нажмите **Settings → Notifications → Send test**. 
 2. Если тест пришёл, проверьте **Pause all notifications**, DND, mute, 
    quiet hours и фокус окна: Send test обходит эти настройки, а обычные 
    уведомления — нет. 
 3. Для канала используйте персональный `@mention`; обычное сообщение может не 
    создавать попап. 
 4. Если приложение было закрыто через tray → Quit, системного попапа быть не 
    должно. 
 5. Если Send test не работает при разрешённых уведомлениях ОС, создайте 
    баг-репорт и обязательно укажите операционную систему.