Project

General

Profile

Wiki » History » Version 7

Redmine Admin, 08/04/2026 10:04 PM

1 6 Redmine Admin
# Green Chat 0.2.3 — памятка бета-тестера
2 1 Redmine Admin
3 5 Redmine Admin
Спасибо, что участвуете в тестировании Green Chat. Эта памятка объясняет,
4 6 Redmine Admin
как подготовиться к бете, что особенно важно проверить в версии 0.2.3 и как
5 5 Redmine Admin
составить полезный баг-репорт.
6 1 Redmine Admin
7 5 Redmine Admin
## Версии беты 0.2.x
8 1 Redmine Admin
9 6 Redmine Admin
Текущая версия — **0.2.3**. Памятка покрывает все возможности линейки 0.2.x;
10 1 Redmine Admin
полные списки изменений по версиям:
11
12 7 Redmine Admin
- **0.2.3** (актуальная сборка 4 августа 2026) —
13 6 Redmine Admin
  Android-клиент и уведомления на телефон, защита от расхождения MLS-эпох,
14
  мобильные вложения и safe areas, приглашения в публичные каналы, исправления
15
  композера и push relay. Требует миграции 023/024 и настроенный relay.
16 7 Redmine Admin
- **0.2.2** (23 июля 2026) — уведомления, звук и
17 5 Redmine Admin
  счётчики при свёрнутом или скрытом в tray окне; быстрое переподключение
18
  после сна компьютера; исправления восстановления личных чатов. Серверных
19
  изменений нет.
20 7 Redmine Admin
- **0.2.1** (22 июля 2026) — надёжная доставка:
21 5 Redmine Admin
  клиент сверяет состояние с сервером и догружает пропущенные сообщения;
22
  восстановление личного чата после logout и повторного входа собеседника;
23
  диагностический лог `glchat.log`. Требует обновлённый сервер.
24 7 Redmine Admin
- **0.2.0** (20 июля 2026) — роли и управление
25 5 Redmine Admin
  участниками каналов, раздел «Треды», карточки профилей, сохранённые
26 1 Redmine Admin
  сообщения, история загрузок, просмотрщик изображений и GIF, звуковые
27
  уведомления, отметка вышедших со всех устройств пользователей.
28
29 6 Redmine Admin
## Что изменилось после релиза 0.2.2
30
31
### Android-клиент и мобильные уведомления
32
33
- Появился первый Android-клиент, собранный из общего с desktop кода Tauri 2:
34
  те же экраны, локальная база и MLS-шифрование.
35
- Ключ устройства и ключ локальной базы хранятся через AndroidKeyStore.
36
- Устройство можно привязать сканированием QR-кода или ручным вводом кода.
37
- Интерфейс адаптирован под один экран телефона, системные safe areas и
38
  виртуальную клавиатуру.
39
- Нативный Android picker позволяет прикреплять документы и изображения к
40
  сообщению или ответу в треде.
41
- Firebase Cloud Messaging будит свёрнутое приложение сигналом без текста
42
  сообщения. Клиент сам догружает и расшифровывает сообщение; push relay не
43
  получает содержимое переписки или идентификатор аккаунта.
44
45
### Надёжность MLS и доставки
46
47
- Клиент применяет изменения MLS-группы только после подтверждения сервера,
48
  что предотвращает расхождение криптографических веток при гонке Commit.
49
- Если устройство уже не может расшифровать сообщение текущей эпохи, оно
50
  запрашивает безопасную замену своей MLS-листины и автоматически возвращается
51
  в группу через replacement Welcome. Расшифрованная локальная история
52
  сохраняется.
53
- Сервер получил durable-запросы восстановления membership и миграцию
54
  `024_membership_recovery.sql`.
55
- Push relay удаляет недействительные FCM installation IDs, валидирует
56
  согласованность секретов при bootstrap, а запуск chat server больше не
57
  блокируется недоступным relay.
58
59
### Каналы и интерфейс
60
61
- Любой участник публичного канала может пригласить нового пользователя через
62
  **Add member**; исключение участников публичного канала остаётся запрещено.
63
- На Android исправлены имя приложения и системные push-строки.
64
- Сборка APK очищает старые пакеты перед упаковкой, исключая раздутые
65
  инкрементальные артефакты.
66
- Иконки desktop-композера приведены к единому стилю, а emoji picker больше не
67
  обрезается у границ окна.
68
69
Обновление с 0.2.2 требует серверных изменений актуальной версии 0.2.3:
70
миграций `023_push_installations.sql`, `024_membership_recovery.sql` и
71
настроенного push relay для фоновых Android-уведомлений.
72
73 1 Redmine Admin
## Перед началом тестирования
74 5 Redmine Admin
75 6 Redmine Admin
1. Установите версию **0.2.3 на все свои устройства**. Старые клиенты
76 5 Redmine Admin
   несовместимы с новой синхронизацией участников каналов и могут работать
77
   некорректно.
78
2. Проверьте номер версии в **Settings → Profile**.
79
3. По возможности подготовьте два тестовых аккаунта и два устройства для
80
   одного из аккаунтов. Это позволит проверить доставку, роли и
81
   мультиустройство.
82
4. Не используйте единственный рабочий аккаунт для сценариев с выходом из
83
   системы: logout безвозвратно удаляет историю на текущем устройстве.
84
5. Бета-версия может содержать ошибки. Не отправляйте через неё данные,
85 1 Redmine Admin
   потеря которых будет критичной.
86 5 Redmine Admin
87 1 Redmine Admin
## Как устроено хранение сообщений
88 5 Redmine Admin
89
Green Chat — корпоративный мессенджер со сквозным шифрованием MLS. Сервер
90
хранит сообщения и файлы в зашифрованном виде и не располагает ключами для
91 1 Redmine Admin
их чтения.
92 5 Redmine Admin
93 1 Redmine Admin
Из этого следуют важные ограничения:
94 5 Redmine Admin
95
- история расшифровывается и хранится на устройствах пользователя;
96
- сервер и служба поддержки не могут прочитать переписку или восстановить
97
  уничтоженные ключи;
98
- выход из аккаунта очищает локальную историю и ключи на этом устройстве;
99
- если выйти со всех устройств, прежнюю историю восстановить будет нельзя;
100 1 Redmine Admin
- для поиска ошибки особенно важны точное время события, участники, канал и
101 5 Redmine Admin
  последовательность действий.
102 1 Redmine Admin
103 5 Redmine Admin
## Что особенно важно проверить в бете 0.2.x
104 1 Redmine Admin
105 6 Redmine Admin
### 1. Обычные сообщения и восстановление соединения (изменено в 0.2.1, 0.2.2 и 0.2.3)
106 5 Redmine Admin
107
- Отправьте сообщения в канал и личный чат.
108
- Проверьте доставку текста, эмодзи, форматирования и ответов в треде.
109
- Полностью отключите сеть на одном из устройств на несколько минут, затем
110
  включите её обратно.
111
- Убедитесь, что клиент подключился самостоятельно и получил сообщения,
112
  отправленные во время офлайна.
113 1 Redmine Admin
- Проверьте, что статус online/offline обновляется без повторного открытия
114
  канала.
115
116
Сообщение со статусом `sent`, которое после восстановления соединения так и
117
не появилось у получателя, считается важным багом.
118
119 6 Redmine Admin
Для проверки защиты 0.2.3 одновременно отправляйте сообщения и меняйте состав
120
одного канала с двух устройств. Постоянная ошибка расшифровки, бесконечная
121
синхронизация или невозможность продолжить отправку после переподключения —
122
важный баг.
123
124 5 Redmine Admin
### 2. Треды (новое в 0.2.0)
125
126
- Создайте несколько тредов в разных каналах.
127
- Откройте раздел **Threads** и проверьте сортировку по последней активности.
128
- Переключите фильтры **All** и **Unread**.
129
- Нажмите на тред в списке и убедитесь, что открылись правильный канал и
130
  исходное сообщение.
131
- Ответьте с `@mention`, добавьте вложение или перетащите файл в область
132
  ответа.
133 1 Redmine Admin
- При наличии второго устройства проверьте синхронизацию прочитанности
134 5 Redmine Admin
  тредов.
135 1 Redmine Admin
136 5 Redmine Admin
### 3. Роли и участники каналов (новое в 0.2.0)
137
138 1 Redmine Admin
Для полноценной проверки нужны минимум три аккаунта: владелец, модератор и
139 5 Redmine Admin
обычный участник.
140
141
1. Создайте приватный канал и пригласите двух участников.
142
2. Убедитесь, что создатель отмечен как owner.
143
3. Назначьте одного участника модератором и затем снимите роль.
144
4. Проверьте, что owner может приглашать и исключать участников.
145
5. Проверьте, что moderator может управлять обычными участниками, но не
146 1 Redmine Admin
   владельцем или другим модератором.
147
6. Исключите обычного участника: канал должен сразу исчезнуть у него из
148
   интерфейса, а новые сообщения не должны быть доступны.
149 5 Redmine Admin
7. Повторно пригласите участника и убедитесь, что устаревшее событие удаления
150
   не убирает канал снова.
151 6 Redmine Admin
8. Обычным участником публичного канала пригласите нового пользователя через
152
   **Add member**. Приглашённый должен получить канал без доступа к сообщениям,
153
   отправленным до его вступления.
154 1 Redmine Admin
155
Дополнительно можно проверить выход из канала:
156
157 5 Redmine Admin
- обычный участник и модератор могут выйти самостоятельно;
158
- owner с другими участниками должен сначала назначить модератора;
159
- при выходе owner владение автоматически переходит назначенному модератору;
160
- из DM выйти нельзя, но его можно скрыть через **Remove for me**;
161 6 Redmine Admin
- в публичный канал может приглашать любой участник, но исключение участника
162
  недоступно, поскольку он может вступить обратно самостоятельно.
163 5 Redmine Admin
164 1 Redmine Admin
### 4. Профили (новое в 0.2.0)
165 5 Redmine Admin
166
- Заполните аватар, должность, описание и рабочий телефон.
167
- Откройте карточку профиля из сообщения и панели участников.
168
- Проверьте копирование email и телефона.
169
- Измените аватар или данные профиля на одном устройстве и убедитесь, что
170 1 Redmine Admin
  изменения появились у другого пользователя без перезапуска приложения.
171 5 Redmine Admin
172
Поля профиля видны всем пользователям организации — это справочная информация,
173 1 Redmine Admin
а не приватная часть переписки.
174 5 Redmine Admin
175 1 Redmine Admin
### 5. Поиск и действия с сообщениями
176 5 Redmine Admin
177
- Найдите старое сообщение через поиск и перейдите к нему.
178
- Убедитесь, что чат прокрутился к правильному сообщению и выделил его.
179
- Проверьте доступные контекстные действия: ответ, редактирование, сохранение,
180
  закрепление и удаление там, где они разрешены.
181
- Отредактируйте длинное сообщение и ответ в треде: поле ввода должно
182
  увеличиваться вместе с текстом.
183
- Попробуйте превысить допустимую длину сообщения. Клиент должен показать
184 1 Redmine Admin
  понятное ограничение, а не зависнуть или молча потерять текст.
185 5 Redmine Admin
186
Поиск работает по локально доступной истории устройства. Отсутствие сообщения,
187 1 Redmine Admin
которого никогда не было на этом устройстве, само по себе не является багом.
188 5 Redmine Admin
189 1 Redmine Admin
### 6. Файлы, изображения и GIF (расширено в 0.2.0)
190 5 Redmine Admin
191
- выберите файл через кнопку вложения и убедитесь, что он сначала появился в
192
  области подготовки к отправке;
193
- удалите подготовленный файл, не отправляя сообщение;
194
- перетащите файлы в основной чат и отдельно в открытый тред;
195
- вставьте изображение из буфера обмена;
196 1 Redmine Admin
- отправьте несколько файлов и проверьте, что они остались в исходном чате,
197
  даже если во время загрузки переключиться на другой канал;
198 5 Redmine Admin
- откройте изображение во встроенном просмотрщике;
199
- проверьте воспроизведение GIF и отсутствие чрезмерной нагрузки интерфейса;
200
- удалите собственное сообщение с вложением и убедитесь, что файл больше не
201
  доступен из чата;
202
- скачайте файл и проверьте его содержимое после расшифровки.
203 6 Redmine Admin
- на Android выберите документ или изображение системным picker и отправьте
204
  его сначала в чат, затем в открытый тред.
205 5 Redmine Admin
206 3 Redmine Admin
Ошибки загрузки, повреждённый скачанный файл, вложение в неправильном канале
207 5 Redmine Admin
или зависшая подготовка файла считаются багами.
208 3 Redmine Admin
209 5 Redmine Admin
### 7. Сохранённые сообщения и загрузки (новое в 0.2.0)
210
211
- Сохраните сообщения из разных каналов через контекстное меню.
212
- Откройте раздел **Saved**, перейдите из него к исходному сообщению и удалите
213
  закладку.
214
- При наличии второго устройства проверьте, что список сохранённых сообщений
215
  синхронизировался.
216
- Скачайте несколько файлов и откройте раздел **Downloads**.
217 1 Redmine Admin
- Проверьте действия **Open file**, **Show in folder** и
218 3 Redmine Admin
  **Remove from history**.
219 5 Redmine Admin
220
Сохранённые сообщения синхронизируются между устройствами и видны только
221
владельцу аккаунта. История загрузок хранится только на конкретном устройстве.
222
Удаление записи из Downloads не удаляет сам файл с диска. Файлы, скачанные до
223 3 Redmine Admin
установки 0.2.0, в историю автоматически не добавляются.
224 5 Redmine Admin
225 6 Redmine Admin
### 8. Уведомления и звук (изменено в 0.2.2 и 0.2.3)
226 5 Redmine Admin
227
- Перед проверкой убедитесь, что в **Settings → Notifications** выключен
228
  **Pause all notifications**: включённый тумблер намеренно отключает попапы
229
  и звук, при этом сообщения и счётчики продолжают приходить. Кнопка
230
  **Send test** проверяет только доставку до операционной системы и работает
231
  даже при включённой паузе.
232
- В **Settings → Notifications** нажмите **Send test**.
233
- Оставьте окно приложения без фокуса и попросите другого тестера отправить
234
  DM — должен появиться системный попап и прозвучать звук.
235
- Полностью сверните окно или скройте его в tray и попросите отправить ещё
236
  один DM: попап и звук должны прийти, не открывая окно, а после открытия
237
  счётчики и сами сообщения должны уже быть на месте без ручного обновления.
238
- Проверьте `@mention` в канале. Обычное сообщение без упоминания по умолчанию
239
  не показывает попап.
240
- Отключите звук в настройках и убедитесь, что новые сообщения приходят без
241
  звукового сигнала.
242 1 Redmine Admin
- Проверьте DND, mute канала и quiet hours.
243
- Полностью закройте приложение через tray → **Quit**, отправьте на аккаунт
244
  DM и проверьте email-уведомление, если SMTP включён на сервере.
245
246
Попапы показывает запущенное приложение. После полного выхода через **Quit**
247 5 Redmine Admin
desktop-клиент не может показать системное уведомление; в этом случае для DM
248
может прийти только email.
249 4 Redmine Admin
250 6 Redmine Admin
На Android 13+ разрешите уведомления при первом запуске. Сверните приложение,
251
отправьте DM с другого аккаунта и проверьте push, догрузку сообщения и переход
252
по тапу. Push требует Google Play services и не приходит после принудительной
253
остановки приложения через системные настройки.
254
255 1 Redmine Admin
### 9. Несколько устройств
256 5 Redmine Admin
257
- Войдите на второе устройство по паролю или привяжите его по QR-коду.
258
- Создайте приватный канал и пригласите пользователя с несколькими активными
259 1 Redmine Admin
  устройствами.
260 5 Redmine Admin
- Убедитесь, что канал, его название и новые сообщения появились на всех
261 1 Redmine Admin
  устройствах приглашённого.
262
- Проверьте синхронизацию прочитанности, черновиков, сохранённых сообщений и
263
  скрытых чатов.
264
- Измените аватар и убедитесь, что он обновился на других клиентах.
265
- Закройте одно устройство, продолжите работу на втором, затем верните первое
266
  в сеть и проверьте восстановление состояния.
267
268 6 Redmine Admin
### 10. Android 0.2.3
269 1 Redmine Admin
270 6 Redmine Admin
- Установите universal APK на Android 7 или новее и проверьте, что приложение
271
  называется **Green Chat**.
272
- Проверьте вход по паролю, привязку по QR и ручной ввод кода.
273
- Откройте клавиатуру в чате и треде: поле ввода и нижние кнопки должны
274
  оставаться видимыми.
275
- На устройстве с вырезом или жестовой навигацией проверьте верхнюю навигацию,
276
  боковые панели, Threads и Devices.
277
- Выберите документ и изображение системным picker, отправьте их в чат и тред,
278
  затем скачайте и откройте на втором устройстве.
279
- Сверните приложение, получите push и откройте сообщение по тапу без ручного
280
  обновления.
281
282
Удаление Android-приложения удаляет локальную историю и ключи этого устройства.
283
Не переустанавливайте его во время сценария, если на аккаунте нет другого
284
активного устройства.
285
286
### 11. Выход со всех устройств (новое в 0.2.0)
287
288 5 Redmine Admin
Этот сценарий выполняйте только на специально созданном тестовом аккаунте.
289 4 Redmine Admin
Перед выходом убедитесь, что клиент подключён к серверу.
290 5 Redmine Admin
291
1. Выйдите из аккаунта на последнем активном устройстве и подтвердите
292
   предупреждение об удалении истории.
293
2. У другого пользователя аккаунт должен получить отметку **Logged out** в
294
   списке DM, профиле, панели участников и выборе пользователя.
295
3. В существующем DM история должна остаться читаемой, но поле отправки должно
296
   замениться предупреждением.
297
4. Создание нового DM с вышедшим пользователем должно быть заблокировано.
298
5. Отправьте в канал сообщение с его персональным `@mention`: сообщение
299
   должно отправиться остальным участникам, а автор должен увидеть
300
   предупреждение о недоставке упомянутому пользователю.
301
6. Снова войдите этим аккаунтом. Отметка Logged out должна исчезнуть у других
302 4 Redmine Admin
   пользователей.
303 5 Redmine Admin
304
Повторный вход создаёт новое активное устройство, но не возвращает историю,
305 4 Redmine Admin
уничтоженную при logout.
306 5 Redmine Admin
307
## Что обязательно считать багом
308
309
- Падение, зависание или бесконечная загрузка приложения.
310
- Потеря уже отправленного сообщения или его появление в неправильном чате.
311
- Ошибка расшифровки, нечитаемый текст или повреждённый файл.
312
- Получение доступа к чужому каналу, профилю или данным без разрешения.
313
- Возможность обычного участника выполнить действие owner/moderator.
314
- Доступ исключённого участника к новым сообщениям приватного канала.
315
- Расхождение каналов, ролей, сохранённых сообщений или прочитанности между
316
  устройствами, которое не исправляется после переподключения.
317
- Отсутствие DM или `@mention`-уведомления при выполненных условиях доставки.
318
- Неправильный адресат, канал или тред у вложения.
319
- Неработающая кнопка, обрезанный интерфейс или нечитаемый текст, особенно в
320
  тёмной теме.
321
322
Проблемы безопасности, потерю данных и воспроизводимые падения отмечайте
323
приоритетом **High**.
324
325
## Известные ограничения беты
326
327
- Вход обычно доступен только по приглашению; вкладки создания свободного
328
  аккаунта может не быть.
329
- Автоматического обновления нет — новую версию нужно устанавливать вручную.
330
- Windows может показать SmartScreen с предупреждением о неизвестном
331
  издателе.
332
- Неподписанная macOS-сборка может быть заблокирована Gatekeeper. После
333
  переноса приложения в `/Applications` выполните:
334
335
  ```sh
336
  xattr -cr "/Applications/Green Chat.app"
337 1 Redmine Admin
  ```
338
339
- На macOS системные попапы бета-сборки могут отображаться от имени
340
  **Script Editor**.
341
- На части серверов отправка файлов и email-уведомления могут быть отключены.
342 5 Redmine Admin
- Числовой бейдж учитывает DM и упоминания; обычное непрочитанное сообщение в
343
  канале отображается точкой.
344
- Сообщение `SPKI pin mismatch` после плановой смены серверного ключа требует
345
  повторного входа. Клиент намеренно не принимает новый ключ молча.
346 6 Redmine Admin
- Android APK 0.2.3 является debug-сборкой, устанавливается вручную и может
347
  вызвать предупреждение Play Protect о неизвестном разработчике.
348
- Фоновые Android-уведомления требуют Google Play services и настроенный push
349
  relay. На HMS/чистом AOSP и после Force stop сообщения появятся только после
350
  ручного открытия приложения.
351 1 Redmine Admin
352
Если поведение не перечислено здесь и выглядит неправильным, лучше отправить
353
репорт.
354
355 6 Redmine Admin
## Полный changelog всех версий 0.2.x
356
357
Ниже release notes приведены полностью, от текущей версии к самой ранней.
358
Отдельные файлы по ссылкам в начале памятки содержат тот же текст.
359
360
### Green Chat 0.2.3 — Beta Update
361
362
Дата первой Android-сборки: **30 июля 2026 года**. Актуальная сборка:
363
**4 августа 2026 года**.
364
365
Версия 0.2.3 добавляет **мобильную сборку (Android)** и уведомления на телефон.
366
В актуальную сборку также вошли исправления Android, защиты от расхождения
367
MLS-эпох, управления публичными каналами, desktop-композера и push relay.
368
369
Android-сборка **экспериментальная**: это debug-APK, он не подписан релизным
370
ключом, не публикуется в Play и ставится вручную.
371
372
#### Изменения актуальной сборки от 4 августа
373
374
##### Надёжность шифрования и доставки
375
376
- Клиент больше не применяет локальный MLS Commit до подтверждения сервера.
377
  Это предотвращает расхождение криптографических веток при одновременных
378
  изменениях состава группы.
379
- Добавлено автоматическое восстановление устройства, уже попавшего в такую
380
  ветку: при ошибке расшифровки текущей эпохи здоровый участник заменяет его
381
  MLS-листину, а клиент принимает replacement Welcome и продолжает доставку.
382
- Расшифрованная локальная история при восстановлении сохраняется. Pending
383
  MLS-состояние и исходящий запрос сохраняются атомарно, поэтому потерянный
384
  HTTP-ответ или перезапуск не создают второй отличный Commit.
385
- Серверу требуется миграция `024_membership_recovery.sql`.
386
387
##### Android
388
389
- Интерфейс учитывает вырезы экрана, status bar, навигационную панель и
390
  виртуальную клавиатуру.
391
- Выбор файла использует нативный Android picker; документы и изображения
392
  можно прикреплять к обычным сообщениям и ответам в тредах.
393
- В launcher и системных настройках отображается имя **Green Chat**, системные
394
  push-строки приведены к английской локализации.
395
- Перед упаковкой удаляется старый universal APK/AAB, чтобы прерванная
396
  инкрементальная сборка не раздувала новый пакет.
397
398
##### Каналы и интерфейс
399
400
- Любой активный участник публичного канала может пригласить нового
401
  пользователя через **Add member**. Исключение участников публичного канала
402
  по-прежнему запрещено.
403
- Иконки действий в desktop-композере приведены к единому стилю.
404
- Emoji picker больше не обрезается границами поля ввода.
405
406
##### Push relay и эксплуатация
407
408
- Relay корректно распознаёт реальный ответ FCM `UNREGISTERED` и удаляет
409
  недействительные Firebase installation IDs.
410
- Bootstrap dev push-конфигурации останавливается при расхождении секрета в
411
  `tenants.json` и переменной окружения.
412
- Локальный chat server больше не зависит по healthcheck от push relay и может
413
  работать без фоновых мобильных уведомлений.
414
415
#### Android-клиент
416
417
- Приложение собрано из **того же кода**, что и desktop (Tauri 2 mobile): те же
418
  MLS-шифрование, те же экраны, та же логика доставки. Отдельного мобильного
419
  клиента с собственной криптографией не появилось.
420
- Приватный ключ устройства и ключ локальной базы хранятся в **AndroidKeyStore**
421
  (аппаратно, если устройство поддерживает); удаление приложения удаляет и их.
422
- Линковка устройства сканированием QR-кода. Если камера недоступна — работает
423
  ручной ввод кода.
424
- Интерфейс перестроен под телефон: список чатов и переписка — один стек с
425
  кнопкой «назад», панели тредов, участников и сохранённых открываются на весь
426
  экран, учитываются вырезы экрана и виртуальная клавиатура.
427
428
#### Уведомления на телефон
429
430
- Приходят через Firebase Cloud Messaging. **Содержимое сообщения в push не
431
  передаётся** — приходит только сигнал «есть новое», текст «New message»
432
  формирует само приложение на устройстве.
433
- Push будит приложение и запускает догрузку, поэтому при открытии всё уже на
434
  месте.
435
- Уведомление приходит **только на устройства без активного соединения** — если
436
  телефон онлайн, сообщение и так придёт по WebSocket.
437
- На Android 13+ при первом запуске приложение спросит разрешение на
438
  уведомления. Отказ отключает попапы, сообщения продолжают приходить.
439
- Требуются **Google Play services**. На устройствах без них (HMS, чистый AOSP)
440
  фоновых уведомлений не будет — ограничение транспорта, не клиента.
441
- Push не приходит, если приложение принудительно остановлено через
442
  «Настройки → Приложения → Остановить»: система блокирует доставку до
443
  следующего запуска вручную.
444
445
Уведомления **не заменяют** доставку: если push потерялся, сообщения всё равно
446
догружаются при открытии приложения.
447
448
#### Сервер
449
450
Требуется **обновление сервера** и миграции `023_push_installations.sql` и
451
`024_membership_recovery.sql`.
452
Дополнительно администратору нужно настроить push relay — без него мобильный
453
клиент работает полностью, но фоновых уведомлений не будет
454
(см. [docs/push-relay-deployment.md](push-relay-deployment.md) и шаг 4b
455
[бета-чеклиста](beta-checklist.md)).
456
457
Границы приватности не изменились: сервер по-прежнему не видит текст
458
сообщений и ключи. Появился один новый элемент — центральный push relay
459
получает идентификатор установки приложения (не аккаунт и не сообщение) и
460
время отправки; подробности и принятые риски описаны в
461
[ADR-0026](ADR-0026-central-push-relay.md).
462
463
#### Обновление
464
465
1. Администратор обновляет сервер и применяет миграции 023 и 024.
466
2. Desktop: установите **0.2.3** на все устройства.
467
3. Android: установите APK, войдите или привяжите устройство по QR.
468
469
Что особенно важно проверить на телефоне:
470
471
1. приходит ли уведомление, когда приложение **свёрнуто**, а не открыто;
472
2. открываются ли после тапа именно новые сообщения — без ручного обновления;
473
3. работает ли одновременно телефон и десктоп на одном аккаунте (счётчики
474
   непрочитанных не должны расходиться);
475
4. привязка устройства по QR-коду;
476
5. отправка и открытие вложений с телефона.
477
478
---
479
480
### Green Chat Desktop 0.2.2 — Beta Update
481
482
Дата выпуска: **23 июля 2026 года**.
483
484
Версия 0.2.2 закрывает бета-репорт «клиент в фоне на Windows молчит и не
485
обновляется»: свёрнутое или скрытое в tray окно не получало ни системного
486
уведомления, ни счётчика непрочитанных, а интерфейс показывал новые сообщения
487
только после ручного обновления страницы (Ctrl+R).
488
489
Обновляется **только desktop-клиент** — серверных изменений в этом выпуске
490
нет (см. раздел «Сервер»).
491
492
#### Доставка и уведомления при свёрнутом окне
493
494
- Фоновая сверка с сервером перенесена из интерфейсного слоя в нативный
495
  Rust-процесс и выполняется каждые 10 секунд. Windows может приостанавливать
496
  таймеры и сам JS-контекст WebView2 у скрытого окна — теперь это не
497
  останавливает ни доставку сообщений, ни уведомления.
498
- Системное уведомление для сообщения, пришедшего в свёрнутое/фоновое окно,
499
  создаётся непосредственно нативным процессом, до и независимо от
500
  интерфейсного слоя. Открывать окно, чтобы получить попап, не требуется.
501
  Настройки Pause all notifications, DND, mute, quiet hours и режим
502
  уведомлений канала учитываются так же, как раньше.
503
- Возврат окна из фона, minimize или tray запускает немедленную сверку —
504
  счётчики и новые сообщения появляются сами, ручной Reload больше не нужен.
505
- Потерянный единичный WebSocket-кадр или half-open соединение больше не
506
  оставляют клиент без счётчика, звука и попапа: любое расхождение с сервером
507
  устраняется ближайшей 10-секундной сверкой.
508
- После выхода компьютера из сна клиент больше не ждёт до 90 секунд, считая
509
  старый WebSocket подключённым: resume-watchdog обнаруживает паузу системных
510
  часов и переподключается за несколько секунд, сразу забирая пропущенные
511
  сообщения и восстанавливая presence.
512
- Сводное уведомление «N new messages» о сообщениях, восстановленных фоновой
513
  сверкой, показывается даже если окно уже получило фокус (например, сразу
514
  после открытия крышки ноутбука) и не дублируется при открытии окна после
515
  нативного уведомления.
516
- Если звук сообщений включён, уведомления сопровождаются нативным системным
517
  звуком; серия подряд идущих сообщений даёт один звук, а не очередь сигналов.
518
- Определение «окно в фокусе» для подавления попапов использует состояние
519
  самого интерфейса, а не системный сигнал окна — на Windows системный сигнал
520
  недостоверен и мог как показывать попапы поверх активного окна, так и
521
  глушить их у скрытого.
522
523
#### Личные сообщения
524
525
- Если KeyPackage нового устройства ещё загружается, повторная попытка
526
  восстановления membership выполняется через несколько секунд с постепенным
527
  увеличением интервала. Чат больше не зависает в состоянии `re-syncing`
528
  из-за двухминутного ожидания, которое при каждом перезапуске начиналось
529
  заново.
530
- Исправлена ложная блокировка отправки после password login или привязки
531
  устройства: старые клиенты создавали пустую MLS BasicCredential, поэтому
532
  два реальных листа ошибочно считались одним пользователем. Готовность
533
  личного чата теперь проверяется по фактическому MLS roster, а новые
534
  устройства сохраняют credential с серверным username.
535
536
#### Сервер
537
538
Серверный код в 0.2.2 не менялся. Требования совпадают с 0.2.1: сервер должен
539
быть обновлён до серверной версии выпуска 0.2.1 (endpoints состояния
540
синхронизации и миграция `022_membership_repair_claims.sql`). Со старым
541
сервером клиент продолжает работать в режиме прежней полной догрузки, но
542
10-секундная сверка и восстановление membership недоступны.
543
544
Как и раньше, содержимое сообщений, ключи и настройки уведомлений не
545
передаются серверу в открытом виде; текст системных уведомлений формируется
546
локально и никогда не покидает устройство.
547
548
#### Обновление
549
550
Установите **Green Chat Desktop 0.2.2 на все свои устройства**.
551
552
Особенно важно повторно проверить:
553
554
1. сообщения и `@mention` в **свёрнутое или скрытое в tray** окно: системный
555
   попап и звук должны прийти без открытия окна, а после открытия счётчики и
556
   сообщения должны быть уже на месте — без Ctrl+R;
557
2. перед проверкой уведомлений убедитесь, что в **Settings → Notifications**
558
   выключен **Pause all notifications** — включённый тумблер отключает попапы
559
   и звук намеренно, при этом сообщения и счётчики продолжают приходить;
560
3. получение сообщений после сна/пробуждения компьютера;
561
4. личный чат после logout и повторного входа одного из участников;
562
5. одновременную работу двух устройств одного аккаунта.
563
564
---
565
566
### Green Chat Desktop 0.2.1 — Beta Update
567
568
Дата выпуска: **22 июля 2026 года**.
569
570
Версия 0.2.1 исправляет проблемы доставки сообщений и уведомлений,
571
обнаруженные во время бета-тестирования 0.2.0.
572
573
#### Главное
574
575
- Доставка больше не зависит только от WebSocket-событий. Клиент сверяет
576
  локальное состояние с сервером после подключения, при ошибке live-доставки
577
  и каждые две минуты, пока соединение активно.
578
- Пропущенные во время офлайна сообщения автоматически догружаются в
579
  правильном порядке вместе с необходимыми MLS-коммитами.
580
- Счётчики непрочитанных, список тредов и сохранённые сообщения обновляются
581
  после каждой сверки с сервером.
582
- Для сообщений, полученных через фоновую сверку, показывается одно сводное
583
  уведомление вместо серии попапов. Настройки DND, mute, quiet hours и режим
584
  уведомлений канала продолжают учитываться.
585
586
#### Исправление личных сообщений после повторного входа
587
588
- Исправлена ситуация, когда после logout и повторного входа личный чат
589
  оставался доступен, но новые сообщения фактически шифровались без устройства
590
  собеседника.
591
- Клиент автоматически обнаруживает отсутствующее устройство участника и
592
  повторно добавляет его в MLS-группу личного чата.
593
- Одновременное восстановление несколькими устройствами защищено коротким
594
  серверным lease: проигравший клиент останавливается до изменения локальной
595
  MLS-эпохи.
596
- Пока устройство собеседника ещё не восстановлено в личном чате, поле ввода
597
  заменяется сообщением о синхронизации, а отправка временно блокируется.
598
  Отметка `✓✓` в этом состоянии заменяется честным предупреждением
599
  `not delivered`.
600
- После успешного восстановления чат разблокируется по долговременному
601
  состоянию клиента, даже если соответствующее WebSocket-событие потерялось.
602
603
#### Надёжность и диагностика
604
605
- Ошибка обработки live-сообщения теперь запускает ускоренную сверку с
606
  сервером вместо ожидания следующего переподключения.
607
- Исправлена потеря полной проверки групп, если переподключение совпало по
608
  времени с уже выполняющейся фоновой сверкой.
609
- Отложенные reconcile-задачи корректно отменяются при logout.
610
- Desktop-клиент пишет диагностический лог в `glchat.log` в каталоге данных
611
  приложения.
612
- Добавлена ротация лога при достижении 5 MiB с сохранением одной предыдущей
613
  копии `glchat.log.old`, включая повторную ротацию на Windows.
614
615
#### Сервер
616
617
- Добавлены авторизованные endpoints состояния синхронизации: хвосты сообщений
618
  по группам и отсутствующие membership-листы.
619
- Добавлен одноразовый lease-token для безопасного восстановления membership.
620
- Добавлена метрика Prometheus для количества обнаруженных membership gaps.
621
- Добавлена миграция `022_membership_repair_claims.sql`.
622
623
Содержимое сообщений, ключи и настройки уведомлений по-прежнему не передаются
624
серверу в открытом виде. Новые endpoints работают только с уже известными
625
серверу метаданными групп, устройств и последовательностей сообщений.
626
627
#### Обновление
628
629
Для проверки исправлений установите **Green Chat Desktop 0.2.1 на все свои
630
устройства**. Сервер также должен быть обновлён и иметь применённую миграцию
631
`022_membership_repair_claims.sql`.
632
633
Особенно важно повторно проверить:
634
635
1. получение сообщений после временного отключения сети;
636
2. непрочитанные, звук и системный попап после фоновой догрузки;
637
3. личный чат после logout и повторного входа одного из участников;
638
4. одновременную работу двух устройств одного аккаунта;
639
5. наличие `glchat.log` после перезапуска desktop-приложения.
640
641
---
642
643
### glchat Desktop 0.2.0 — Beta Update
644
645
Изменения с 9 по 20 июля 2026 года.
646
647
#### Новые возможности
648
649
- Добавлены роли владельца и модератора канала, управление участниками, выход из канала и локальное скрытие чатов.
650
- Появились карточки профилей с аватаром, должностью, описанием и контактами.
651
- Добавлен единый раздел «Треды» со всеми обсуждениями и фильтром непрочитанных.
652
- Сообщения теперь можно сохранять в личные закладки с синхронизацией между устройствами.
653
- Добавлена локальная история загрузок: файл можно открыть, показать в папке или убрать из списка.
654
- Изображения открываются во встроенном просмотрщике, добавлена безопасная анимация GIF.
655
- Изображения из буфера обмена можно вставлять прямо в сообщение.
656
- Добавлены звуковые уведомления о новых сообщениях и настройка звука.
657
- Пользователи, вышедшие со всех устройств, теперь отмечаются в интерфейсе. Перед отправкой им личного сообщения или упоминания показывается предупреждение.
658
659
#### Улучшения интерфейса
660
661
- Добавлены контекстные действия для сообщений.
662
- Улучшены редакторы сообщений и ответов в тредах.
663
- Добавлены упоминания пользователей в ответах треда.
664
- Улучшена работа с вложениями: предварительная подготовка, drag-and-drop в треды и удаление отправленных файлов.
665
- Поиск теперь прокручивает чат до найденного сообщения и ограничивает слишком тяжёлые запросы.
666
- Улучшены индикаторы присутствия, подсчёт участников и расположение боковых панелей.
667
- После отправки сообщения чат автоматически прокручивается к нему.
668
- Исправлено восстановление окна приложения из системного трея.
669
670
#### Исправления и стабильность
671
672
- Исправлена синхронизация каналов, участников и метаданных между несколькими устройствами.
673
- Восстановлена доставка уведомлений после длительного офлайна.
674
- Статус пользователя обновляется сразу после подключения.
675
- Исправлен учёт непрочитанных сообщений при переключении фокуса окна.
676
- Исключённые каналы сразу удаляются из интерфейса, а устаревшие события больше не удаляют канал после повторного вступления.
677
- Исправлены отображение закреплённых файлов и привязка вложений к исходному чату.
678
- Добавлена корректная обработка максимальной длины сообщений.
679
- Аватары профилей теперь обновляются в реальном времени.
680
- Улучшено восстановление личных чатов после выхода всех участников со всех устройств.
681
- При выходе устройство отзывается на сервере, чтобы не оставлять неактивные устройства и ключи.
682
683
#### Сервер и эксплуатация
684
685
- Добавлены Prometheus-метрики для HTTP, WebSocket, PostgreSQL, Redis и Go runtime.
686
- Подготовлены базовые правила мониторинга и алертов.
687
- Улучшена конфигурация TLS для файлового хранилища.
688
689
Итого: **40 коммитов и 178 изменённых файлов** в ветке `main`.
690
691 5 Redmine Admin
## Как оставить баг-репорт
692
693
Трекер:
694
<https://bug.green-lab.space/projects/greenchat/issues/new>. Регистрация не
695
нужна, репорт можно отправить анонимно.
696
697
### Что указать
698
699
```text
700
Краткое название: что сломалось и где
701 1 Redmine Admin
702 5 Redmine Admin
Шаги:
703
1. …
704
2. …
705
3. …
706
707
Ожидал: …
708
Получил: …
709
710
Окружение:
711 6 Redmine Admin
- Green Chat 0.2.3 (или версия из Settings → Profile)
712 5 Redmine Admin
- ОС и версия
713
- один или несколько аккаунтов/устройств
714
- название канала или DM
715
- точное время события и часовой пояс
716
717
Воспроизводится: всегда / иногда / один раз
718
Дополнительно: скриншот или короткое видео
719
```
720
721
Для проблем синхронизации укажите ОС и версию клиента **на каждой стороне**,
722
а также какое устройство было офлайн.
723
724
Трекер публичный. Не прикладывайте пароли, invite-коды, ключи, приватные
725
логи или скриншоты с конфиденциальной перепиской. Перед отправкой замажьте
726
лишние данные.
727
728
### Приоритет
729
730
| Приоритет | Когда использовать |
731
|---|---|
732
| `Normal` | Большинство ошибок интерфейса и поведения |
733
| `High` | Падение, потеря данных, недоставка сообщений, нарушение прав или безопасности |
734
| `Urgent` / `Immediate` | Не выбирайте без отдельной просьбы команды |
735
736
## Быстрая диагностика уведомлений
737
738
1. Нажмите **Settings → Notifications → Send test**.
739
2. Если тест пришёл, проверьте **Pause all notifications**, DND, mute,
740
   quiet hours и фокус окна: Send test обходит эти настройки, а обычные
741
   уведомления — нет.
742
3. Для канала используйте персональный `@mention`; обычное сообщение может не
743
   создавать попап.
744
4. Если приложение было закрыто через tray → Quit, системного попапа быть не
745
   должно.
746
5. Если Send test не работает при разрешённых уведомлениях ОС, создайте
747
   баг-репорт и обязательно укажите операционную систему.