Wiki » History » Revision 6
Revision 5 (Redmine Admin, 07/23/2026 09:09 PM) → Revision 6/8 (Redmine Admin, 08/04/2026 10:03 PM)
# Green Chat 0.2.3 0.2.2 — памятка бета-тестера Спасибо, что участвуете в тестировании Green Chat. Эта памятка объясняет, как подготовиться к бете, что особенно важно проверить в версии 0.2.3 0.2.2 и как составить полезный баг-репорт. ## Версии беты 0.2.x Текущая версия — **0.2.3**. **0.2.2**. Памятка покрывает все возможности линейки 0.2.x; полные списки изменений по версиям: - **[0.2.3](beta-changelog-0.2.3.md)** (актуальная сборка 4 августа 2026) — Android-клиент и уведомления на телефон, защита от расхождения MLS-эпох, мобильные вложения и safe areas, приглашения в публичные каналы, исправления композера и push relay. Требует миграции 023/024 и настроенный relay. - **[0.2.2](beta-changelog-0.2.2.md)** (23 июля 2026) — уведомления, звук и счётчики при свёрнутом или скрытом в tray окне; быстрое переподключение после сна компьютера; исправления восстановления личных чатов. Серверных изменений нет. - **[0.2.1](beta-changelog-0.2.1.md)** (22 июля 2026) — надёжная доставка: клиент сверяет состояние с сервером и догружает пропущенные сообщения; восстановление личного чата после logout и повторного входа собеседника; диагностический лог `glchat.log`. Требует обновлённый сервер. - **[0.2.0](beta-changelog-0.2.0.md)** (20 июля 2026) — роли и управление участниками каналов, раздел «Треды», карточки профилей, сохранённые сообщения, история загрузок, просмотрщик изображений и GIF, звуковые уведомления, отметка вышедших со всех устройств пользователей. ## Что изменилось после релиза 0.2.2 ### Android-клиент и мобильные уведомления - Появился первый Android-клиент, собранный из общего с desktop кода Tauri 2: те же экраны, локальная база и MLS-шифрование. - Ключ устройства и ключ локальной базы хранятся через AndroidKeyStore. - Устройство можно привязать сканированием QR-кода или ручным вводом кода. - Интерфейс адаптирован под один экран телефона, системные safe areas и виртуальную клавиатуру. - Нативный Android picker позволяет прикреплять документы и изображения к сообщению или ответу в треде. - Firebase Cloud Messaging будит свёрнутое приложение сигналом без текста сообщения. Клиент сам догружает и расшифровывает сообщение; push relay не получает содержимое переписки или идентификатор аккаунта. ### Надёжность MLS и доставки - Клиент применяет изменения MLS-группы только после подтверждения сервера, что предотвращает расхождение криптографических веток при гонке Commit. - Если устройство уже не может расшифровать сообщение текущей эпохи, оно запрашивает безопасную замену своей MLS-листины и автоматически возвращается в группу через replacement Welcome. Расшифрованная локальная история сохраняется. - Сервер получил durable-запросы восстановления membership и миграцию `024_membership_recovery.sql`. - Push relay удаляет недействительные FCM installation IDs, валидирует согласованность секретов при bootstrap, а запуск chat server больше не блокируется недоступным relay. ### Каналы и интерфейс - Любой участник публичного канала может пригласить нового пользователя через **Add member**; исключение участников публичного канала остаётся запрещено. - На Android исправлены имя приложения и системные push-строки. - Сборка APK очищает старые пакеты перед упаковкой, исключая раздутые инкрементальные артефакты. - Иконки desktop-композера приведены к единому стилю, а emoji picker больше не обрезается у границ окна. Обновление с 0.2.2 требует серверных изменений актуальной версии 0.2.3: миграций `023_push_installations.sql`, `024_membership_recovery.sql` и настроенного push relay для фоновых Android-уведомлений. ## Перед началом тестирования 1. Установите версию **0.2.3 **0.2.2 на все свои устройства**. Старые клиенты несовместимы с новой синхронизацией участников каналов и могут работать некорректно. 2. Проверьте номер версии в **Settings → Profile**. 3. По возможности подготовьте два тестовых аккаунта и два устройства для одного из аккаунтов. Это позволит проверить доставку, роли и мультиустройство. 4. Не используйте единственный рабочий аккаунт для сценариев с выходом из системы: logout безвозвратно удаляет историю на текущем устройстве. 5. Бета-версия может содержать ошибки. Не отправляйте через неё данные, потеря которых будет критичной. ## Как устроено хранение сообщений Green Chat — корпоративный мессенджер со сквозным шифрованием MLS. Сервер хранит сообщения и файлы в зашифрованном виде и не располагает ключами для их чтения. Из этого следуют важные ограничения: - история расшифровывается и хранится на устройствах пользователя; - сервер и служба поддержки не могут прочитать переписку или восстановить уничтоженные ключи; - выход из аккаунта очищает локальную историю и ключи на этом устройстве; - если выйти со всех устройств, прежнюю историю восстановить будет нельзя; - для поиска ошибки особенно важны точное время события, участники, канал и последовательность действий. ## Что особенно важно проверить в бете 0.2.x ### 1. Обычные сообщения и восстановление соединения (изменено в 0.2.1, 0.2.2 0.2.1 и 0.2.3) 0.2.2) - Отправьте сообщения в канал и личный чат. - Проверьте доставку текста, эмодзи, форматирования и ответов в треде. - Полностью отключите сеть на одном из устройств на несколько минут, затем включите её обратно. - Убедитесь, что клиент подключился самостоятельно и получил сообщения, отправленные во время офлайна. - Проверьте, что статус online/offline обновляется без повторного открытия канала. Сообщение со статусом `sent`, которое после восстановления соединения так и не появилось у получателя, считается важным багом. Для проверки защиты 0.2.3 одновременно отправляйте сообщения и меняйте состав одного канала с двух устройств. Постоянная ошибка расшифровки, бесконечная синхронизация или невозможность продолжить отправку после переподключения — важный баг. ### 2. Треды (новое в 0.2.0) - Создайте несколько тредов в разных каналах. - Откройте раздел **Threads** и проверьте сортировку по последней активности. - Переключите фильтры **All** и **Unread**. - Нажмите на тред в списке и убедитесь, что открылись правильный канал и исходное сообщение. - Ответьте с `@mention`, добавьте вложение или перетащите файл в область ответа. - При наличии второго устройства проверьте синхронизацию прочитанности тредов. ### 3. Роли и участники каналов (новое в 0.2.0) Для полноценной проверки нужны минимум три аккаунта: владелец, модератор и обычный участник. 1. Создайте приватный канал и пригласите двух участников. 2. Убедитесь, что создатель отмечен как owner. 3. Назначьте одного участника модератором и затем снимите роль. 4. Проверьте, что owner может приглашать и исключать участников. 5. Проверьте, что moderator может управлять обычными участниками, но не владельцем или другим модератором. 6. Исключите обычного участника: канал должен сразу исчезнуть у него из интерфейса, а новые сообщения не должны быть доступны. 7. Повторно пригласите участника и убедитесь, что устаревшее событие удаления не убирает канал снова. 8. Обычным участником публичного канала пригласите нового пользователя через **Add member**. Приглашённый должен получить канал без доступа к сообщениям, отправленным до его вступления. Дополнительно можно проверить выход из канала: - обычный участник и модератор могут выйти самостоятельно; - owner с другими участниками должен сначала назначить модератора; - при выходе owner владение автоматически переходит назначенному модератору; - из DM выйти нельзя, но его можно скрыть через **Remove for me**; - в публичный канал может приглашать любой участник, но для публичного канала исключение участника недоступно, поскольку он может вступить обратно самостоятельно. ### 4. Профили (новое в 0.2.0) - Заполните аватар, должность, описание и рабочий телефон. - Откройте карточку профиля из сообщения и панели участников. - Проверьте копирование email и телефона. - Измените аватар или данные профиля на одном устройстве и убедитесь, что изменения появились у другого пользователя без перезапуска приложения. Поля профиля видны всем пользователям организации — это справочная информация, а не приватная часть переписки. ### 5. Поиск и действия с сообщениями - Найдите старое сообщение через поиск и перейдите к нему. - Убедитесь, что чат прокрутился к правильному сообщению и выделил его. - Проверьте доступные контекстные действия: ответ, редактирование, сохранение, закрепление и удаление там, где они разрешены. - Отредактируйте длинное сообщение и ответ в треде: поле ввода должно увеличиваться вместе с текстом. - Попробуйте превысить допустимую длину сообщения. Клиент должен показать понятное ограничение, а не зависнуть или молча потерять текст. Поиск работает по локально доступной истории устройства. Отсутствие сообщения, которого никогда не было на этом устройстве, само по себе не является багом. ### 6. Файлы, изображения и GIF (расширено в 0.2.0) - выберите файл через кнопку вложения и убедитесь, что он сначала появился в области подготовки к отправке; - удалите подготовленный файл, не отправляя сообщение; - перетащите файлы в основной чат и отдельно в открытый тред; - вставьте изображение из буфера обмена; - отправьте несколько файлов и проверьте, что они остались в исходном чате, даже если во время загрузки переключиться на другой канал; - откройте изображение во встроенном просмотрщике; - проверьте воспроизведение GIF и отсутствие чрезмерной нагрузки интерфейса; - удалите собственное сообщение с вложением и убедитесь, что файл больше не доступен из чата; - скачайте файл и проверьте его содержимое после расшифровки. - на Android выберите документ или изображение системным picker и отправьте его сначала в чат, затем в открытый тред. Ошибки загрузки, повреждённый скачанный файл, вложение в неправильном канале или зависшая подготовка файла считаются багами. ### 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) - Перед проверкой убедитесь, что в **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 и не приходит после принудительной остановки приложения через системные настройки. ### 9. Несколько устройств - Войдите на второе устройство по паролю или привяжите его по QR-коду. - Создайте приватный канал и пригласите пользователя с несколькими активными устройствами. - Убедитесь, что канал, его название и новые сообщения появились на всех устройствах приглашённого. - Проверьте синхронизацию прочитанности, черновиков, сохранённых сообщений и скрытых чатов. - Измените аватар и убедитесь, что он обновился на других клиентах. - Закройте одно устройство, продолжите работу на втором, затем верните первое в сеть и проверьте восстановление состояния. ### 10. Android 0.2.3 - Установите universal APK на Android 7 или новее и проверьте, что приложение называется **Green Chat**. - Проверьте вход по паролю, привязку по QR и ручной ввод кода. - Откройте клавиатуру в чате и треде: поле ввода и нижние кнопки должны оставаться видимыми. - На устройстве с вырезом или жестовой навигацией проверьте верхнюю навигацию, боковые панели, Threads и Devices. - Выберите документ и изображение системным picker, отправьте их в чат и тред, затем скачайте и откройте на втором устройстве. - Сверните приложение, получите push и откройте сообщение по тапу без ручного обновления. Удаление Android-приложения удаляет локальную историю и ключи этого устройства. Не переустанавливайте его во время сценария, если на аккаунте нет другого активного устройства. ### 11. Выход со всех устройств (новое в 0.2.0) Этот сценарий выполняйте только на специально созданном тестовом аккаунте. Перед выходом убедитесь, что клиент подключён к серверу. 1. Выйдите из аккаунта на последнем активном устройстве и подтвердите предупреждение об удалении истории. 2. У другого пользователя аккаунт должен получить отметку **Logged out** в списке DM, профиле, панели участников и выборе пользователя. 3. В существующем DM история должна остаться читаемой, но поле отправки должно замениться предупреждением. 4. Создание нового DM с вышедшим пользователем должно быть заблокировано. 5. Отправьте в канал сообщение с его персональным `@mention`: сообщение должно отправиться остальным участникам, а автор должен увидеть предупреждение о недоставке упомянутому пользователю. 6. Снова войдите этим аккаунтом. Отметка Logged out должна исчезнуть у других пользователей. Повторный вход создаёт новое активное устройство, но не возвращает историю, уничтоженную при logout. ## Что обязательно считать багом - Падение, зависание или бесконечная загрузка приложения. - Потеря уже отправленного сообщения или его появление в неправильном чате. - Ошибка расшифровки, нечитаемый текст или повреждённый файл. - Получение доступа к чужому каналу, профилю или данным без разрешения. - Возможность обычного участника выполнить действие owner/moderator. - Доступ исключённого участника к новым сообщениям приватного канала. - Расхождение каналов, ролей, сохранённых сообщений или прочитанности между устройствами, которое не исправляется после переподключения. - Отсутствие DM или `@mention`-уведомления при выполненных условиях доставки. - Неправильный адресат, канал или тред у вложения. - Неработающая кнопка, обрезанный интерфейс или нечитаемый текст, особенно в тёмной теме. Проблемы безопасности, потерю данных и воспроизводимые падения отмечайте приоритетом **High**. ## Известные ограничения беты - Вход обычно доступен только по приглашению; вкладки создания свободного аккаунта может не быть. - Автоматического обновления нет — новую версию нужно устанавливать вручную. - Windows может показать SmartScreen с предупреждением о неизвестном издателе. - Неподписанная macOS-сборка может быть заблокирована Gatekeeper. После переноса приложения в `/Applications` выполните: ```sh xattr -cr "/Applications/Green Chat.app" ``` - На macOS системные попапы бета-сборки могут отображаться от имени **Script Editor**. - На части серверов отправка файлов и email-уведомления могут быть отключены. - Числовой бейдж учитывает DM и упоминания; обычное непрочитанное сообщение в канале отображается точкой. - Сообщение `SPKI pin mismatch` после плановой смены серверного ключа требует повторного входа. Клиент намеренно не принимает новый ключ молча. - Android APK 0.2.3 является debug-сборкой, устанавливается вручную и может вызвать предупреждение Play Protect о неизвестном разработчике. - Фоновые Android-уведомления требуют Google Play services и настроенный push relay. На HMS/чистом AOSP и после Force stop сообщения появятся только после ручного открытия приложения. Если поведение не перечислено здесь и выглядит неправильным, лучше отправить репорт. ## Полный changelog всех версий 0.2.x Ниже release notes приведены полностью, от текущей версии к самой ранней. Отдельные файлы по ссылкам в начале памятки содержат тот же текст. ### Green Chat 0.2.3 — Beta Update Дата первой Android-сборки: **30 июля 2026 года**. Актуальная сборка: **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.3 (или версия из Settings → Profile) 0.2.2 - ОС и версия - один или несколько аккаунтов/устройств - название канала или 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 не работает при разрешённых уведомлениях ОС, создайте баг-репорт и обязательно укажите операционную систему.