Project

General

Profile

Wiki » History » Version 8

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

1 8 Redmine Admin
# Green Chat 0.2.4 — памятка бета-тестера
2 1 Redmine Admin
3 5 Redmine Admin
Спасибо, что участвуете в тестировании Green Chat. Эта памятка объясняет,
4 8 Redmine Admin
как подготовиться к бете, что особенно важно проверить в версии 0.2.4 и как
5 5 Redmine Admin
составить полезный баг-репорт.
6 1 Redmine Admin
7 5 Redmine Admin
## Версии беты 0.2.x
8 1 Redmine Admin
9 8 Redmine Admin
Текущая версия — **0.2.4** (сборка 17 августа 2026). Памятка покрывает все
10
возможности линейки 0.2.x; полные списки изменений по версиям:
11 1 Redmine Admin
12 8 Redmine Admin
- **[0.2.4](beta-changelog-0.2.4.md)** (17 августа 2026) — доступность личных
13
  сообщений («коллеге всегда можно написать»), отмена модераторов в публичных
14
  каналах и живое обновление состава, статусы присутствия на втором устройстве,
15
  обнаружение расхождения MLS-эпох, камера на Android, сохранение файлов на
16
  Android, iOS-клиент. Требует миграции 025/026/027 и обновления push relay
17
  **до** сервера.
18
- **[0.2.3](beta-changelog-0.2.3.md)** (сборка 4 августа 2026) —
19 1 Redmine Admin
  Android-клиент и уведомления на телефон, защита от расхождения MLS-эпох,
20 6 Redmine Admin
  мобильные вложения и safe areas, приглашения в публичные каналы, исправления
21 5 Redmine Admin
  композера и push relay. Требует миграции 023/024 и настроенный relay.
22 8 Redmine Admin
- **[0.2.2](beta-changelog-0.2.2.md)** (23 июля 2026) — уведомления, звук и
23 1 Redmine Admin
  счётчики при свёрнутом или скрытом в tray окне; быстрое переподключение
24
  после сна компьютера; исправления восстановления личных чатов. Серверных
25
  изменений нет.
26 8 Redmine Admin
- **[0.2.1](beta-changelog-0.2.1.md)** (22 июля 2026) — надёжная доставка:
27 1 Redmine Admin
  клиент сверяет состояние с сервером и догружает пропущенные сообщения;
28
  восстановление личного чата после logout и повторного входа собеседника;
29
  диагностический лог `glchat.log`. Требует обновлённый сервер.
30 8 Redmine Admin
- **[0.2.0](beta-changelog-0.2.0.md)** (20 июля 2026) — роли и управление
31 1 Redmine Admin
  участниками каналов, раздел «Треды», карточки профилей, сохранённые
32
  сообщения, история загрузок, просмотрщик изображений и GIF, звуковые
33
  уведомления, отметка вышедших со всех устройств пользователей.
34
35 8 Redmine Admin
## Что изменилось после вашей прошлой сборки
36 1 Redmine Admin
37 8 Redmine Admin
Прошлая сборка, которую получали тестировщики, — **0.2.3 от 4 августа 2026
38
года**. Всё перечисленное ниже для вас новое. Обратите внимание: сюда входят не
39
только работы 16–17 августа, но и две недели исправлений по вашим репортам от
40
5–14 августа, которые до сих пор ни в одну сборку не попадали — если вы
41
сообщали о баге в этот период и он «не чинился», проверять его нужно именно
42
сейчас.
43 1 Redmine Admin
44 8 Redmine Admin
### Личные сообщения
45 1 Redmine Admin
46 8 Redmine Admin
- Ошибки `404 no key_packages` при открытии DM больше не существует — написать
47
  коллеге можно всегда, даже если он ещё ни разу не заходил.
48
- Пока устройство собеседника не подключилось, чат открыт и поле ввода
49
  доступно; сообщения ждут в очереди и уходят сами. Плашка честно об этом
50
  предупреждает, отметка `✓✓` в этом состоянии не ставится.
51 1 Redmine Admin
52 8 Redmine Admin
### Каналы, роли и участники
53 1 Redmine Admin
54 8 Redmine Admin
- Модераторов в публичных каналах больше нет: роль там ничего не давала.
55
  Уже выданные роли снимает миграция `027`.
56
- Owner публичного канала может выйти, не назначая преемника.
57
- Состав канала и роли обновляются у всех участников сразу, без перезапуска.
58
- Создание приватной группы не срывается из-за одного недобавленного участника.
59 1 Redmine Admin
60 8 Redmine Admin
### Присутствие, доставка и MLS
61 1 Redmine Admin
62 8 Redmine Admin
- Статусы собеседников перестают «залипать» серыми и наконец сходятся на
63
  втором устройстве.
64
- Телефон в фоне честно показывается как «отошёл», затем «офлайн»; свой статус
65
  при пропаже сети больше не остаётся «онлайн».
66
- Открытый чат и открытая панель треда сами показывают сообщения, поднятые
67
  фоновой сверкой, — без переключения канала и перезапуска.
68
- Расхождение MLS-эпох обнаруживается в трёх новых ситуациях, включая самую
69
  опасную: устройство молча не получает сообщения, а счётчик непрочитанных
70
  честно показывает ноль.
71 1 Redmine Admin
72 8 Redmine Admin
### Интерфейс и мобильные клиенты
73
74
- Автопрокрутка в панели треда (свой ответ больше не уходит под нижний край).
75
- Понятные сообщения об ошибке при действии без сети.
76
- Android: сохранение присланного файла, съёмка фото прямо из поля ввода,
77
  новая иконка, убрана серая полоса справа от списка чатов.
78
- Появился клиент для iOS (отдельная сборка, ставится по приглашению).
79
80
Обновление с 0.2.3 требует серверных миграций `025_last_resort_keypackages.sql`,
81
`026_dm_peer_pending.sql`, `027_public_channel_no_moderators.sql` и обновления
82
push relay **раньше** сервера.
83
84
## Что проверить в первую очередь в 0.2.4
85
86
Это короткий список для тех, кто уже тестировал сборку 0.2.3 от 4 августа.
87
Полный набор сценариев — ниже, в разделе «Что особенно важно проверить».
88
89
1. **Написать коллеге, который ещё ни разу не заходил.** Заведите или
90
   попросите завести новый аккаунт и, **не открывая его**, напишите ему в DM.
91
   Чат должен открыться, поле ввода — работать, а над ним должна появиться
92
   плашка «hasn't joined this conversation yet». Затем войдите этим аккаунтом:
93
   отправленные сообщения должны дойти **сами**, без повторной отправки.
94
   Любая техническая ошибка вместо диалога — важный баг.
95
2. **Публичный канал без модераторов.** Убедитесь, что бейдж MODERATOR исчез,
96
   выдать роль в публичном канале нельзя, а owner может выйти из канала, не
97
   назначая преемника.
98
3. **Живое обновление состава.** С одного устройства добавьте участника или
99
   выдайте роль в приватном канале — у остальных список участников должен
100
   обновиться **без перезапуска приложения**.
101
4. **Создание приватной группы с «трудным» участником.** Соберите группу, где
102
   один из приглашаемых давно не заходил. Канал должен создаться, форма —
103
   закрыться, недостающие участники — подтянуться сами.
104
5. **Статус собеседника на втором устройстве.** Привяжите второе устройство
105
   (лучше телефон) и **сразу**, не дожидаясь, пока оно «прогреется», посмотрите
106
   на статусы. Затем попросите собеседника отключить и включить сеть. Серая
107
   точка у человека, от которого при этом приходят сообщения, — важный баг.
108
6. **Сообщение в открытый чат при плохой связи.** Держите чат открытым,
109
   ненадолго оборвите сеть у отправителя и верните её. Сообщение должно
110
   появиться **в самом открытом чате**, а не только в счётчике и попапе.
111
7. **Ответ в треде.** Откройте тред и отправьте ответ — он должен быть виден
112
   сразу, без ручной прокрутки вниз. Отдельно проверьте, что чтение старой
113
   истории треда не прерывается при приходе чужих ответов.
114
8. **Действие без сети.** Отключите сеть и попробуйте, например, добавить
115
   участника. Сообщение об ошибке должно быть человеческим и предупреждать,
116
   что результат нужно проверить, а не показывать сырую техническую строку.
117
9. **Android: сохранение файла и камера.** Сохраните присланный файл через
118
   системный диалог — он должен сохраниться без ошибки `save path`. Снимите
119
   фото кнопкой 📷 в поле ввода и отправьте; снимок **не должен** появиться в
120
   галерее телефона.
121
10. **Долгая проверка на фоне (важнее всего).** Просто поработайте день на всех
122
    своих устройствах. Главный класс багов этого выпуска — «сообщения тихо
123
    перестали приходить, при этом приложение выглядит нормально и счётчик
124
    показывает ноль». Если вы обнаружили переписку, где вы явно пропустили
125
    сообщения, — это репорт с приоритетом **High**, даже если вы не можете
126
    воспроизвести.
127
128 5 Redmine Admin
## Перед началом тестирования
129 1 Redmine Admin
130 8 Redmine Admin
1. Установите версию **0.2.4 на все свои устройства**. Старые клиенты
131 5 Redmine Admin
   несовместимы с новой синхронизацией участников каналов и могут работать
132 8 Redmine Admin
   некорректно. Исправления MLS этого выпуска работают между устройствами
133
   только тогда, когда обновились **все** участники разговора.
134 1 Redmine Admin
2. Проверьте номер версии в **Settings → Profile**.
135
3. По возможности подготовьте два тестовых аккаунта и два устройства для
136
   одного из аккаунтов. Это позволит проверить доставку, роли и
137
   мультиустройство.
138
4. Не используйте единственный рабочий аккаунт для сценариев с выходом из
139
   системы: logout безвозвратно удаляет историю на текущем устройстве.
140
5. Бета-версия может содержать ошибки. Не отправляйте через неё данные,
141
   потеря которых будет критичной.
142
143
## Как устроено хранение сообщений
144
145
Green Chat — корпоративный мессенджер со сквозным шифрованием MLS. Сервер
146 5 Redmine Admin
хранит сообщения и файлы в зашифрованном виде и не располагает ключами для
147 1 Redmine Admin
их чтения.
148 5 Redmine Admin
149
Из этого следуют важные ограничения:
150
151
- история расшифровывается и хранится на устройствах пользователя;
152
- сервер и служба поддержки не могут прочитать переписку или восстановить
153
  уничтоженные ключи;
154 1 Redmine Admin
- выход из аккаунта очищает локальную историю и ключи на этом устройстве;
155
- если выйти со всех устройств, прежнюю историю восстановить будет нельзя;
156
- для поиска ошибки особенно важны точное время события, участники, канал и
157
  последовательность действий.
158
159 5 Redmine Admin
## Что особенно важно проверить в бете 0.2.x
160 1 Redmine Admin
161 8 Redmine Admin
### 1. Обычные сообщения и восстановление соединения (изменено в 0.2.1–0.2.4)
162 5 Redmine Admin
163 1 Redmine Admin
- Отправьте сообщения в канал и личный чат.
164 6 Redmine Admin
- Проверьте доставку текста, эмодзи, форматирования и ответов в треде.
165 5 Redmine Admin
- Полностью отключите сеть на одном из устройств на несколько минут, затем
166 1 Redmine Admin
  включите её обратно.
167
- Убедитесь, что клиент подключился самостоятельно и получил сообщения,
168
  отправленные во время офлайна.
169
- Проверьте, что статус online/offline обновляется без повторного открытия
170
  канала.
171
172
Сообщение со статусом `sent`, которое после восстановления соединения так и
173
не появилось у получателя, считается важным багом.
174
175
Для проверки защиты 0.2.3 одновременно отправляйте сообщения и меняйте состав
176
одного канала с двух устройств. Постоянная ошибка расшифровки, бесконечная
177
синхронизация или невозможность продолжить отправку после переподключения —
178
важный баг.
179
180 8 Redmine Admin
Отдельно проверьте новое в 0.2.4: держите чат **открытым**, пока сообщение
181
догружается фоновой сверкой (например, оборвав и вернув сеть у отправителя).
182
Сообщение должно появиться в самом открытом чате и в открытой панели треда, а
183
не только в счётчике и всплывающем уведомлении.
184
185
Самый опасный класс багов этого выпуска — **тихая остановка доставки**:
186
приложение выглядит рабочим, ошибок нет, счётчик непрочитанных показывает ноль,
187
а сообщения при этом не приходят. Если вы заметили, что пропустили сообщения в
188
какой-то переписке, заводите репорт с приоритетом **High** даже без сценария
189
воспроизведения — укажите канал, обе стороны и примерное время, когда доставка
190
ещё работала. Группа, надолго застрявшая на баннере «Restoring secure
191
access…», — тот же класс проблемы.
192
193 6 Redmine Admin
### 2. Треды (новое в 0.2.0)
194
195
- Создайте несколько тредов в разных каналах.
196 1 Redmine Admin
- Откройте раздел **Threads** и проверьте сортировку по последней активности.
197
- Переключите фильтры **All** и **Unread**.
198
- Нажмите на тред в списке и убедитесь, что открылись правильный канал и
199
  исходное сообщение.
200 6 Redmine Admin
- Ответьте с `@mention`, добавьте вложение или перетащите файл в область
201 5 Redmine Admin
  ответа.
202 8 Redmine Admin
- **Новое в 0.2.4:** отправьте ответ в открытом треде — он должен сразу
203
  оказаться в поле зрения, без ручной прокрутки вниз. Затем прокрутите тред
204
  к старым ответам и попросите другого тестера ответить: чужой ответ **не
205
  должен** перебивать чтение и утаскивать вас вниз.
206 5 Redmine Admin
- При наличии второго устройства проверьте синхронизацию прочитанности
207
  тредов.
208
209 8 Redmine Admin
### 3. Роли и участники каналов (новое в 0.2.0, изменено в 0.2.4)
210 5 Redmine Admin
211 1 Redmine Admin
Для полноценной проверки нужны минимум три аккаунта: владелец, модератор и
212 5 Redmine Admin
обычный участник.
213
214 8 Redmine Admin
**Важное изменение 0.2.4: модераторов в публичных каналах больше нет.** Роль
215
там ничего не давала — исключать участников в публичном канале запрещено, а
216
приглашать может любой. Проверьте отдельно:
217
218
- в публичном канале бейджа MODERATOR нет ни у кого, даже если роль выдавалась
219
  раньше, и выдать её заново нельзя;
220
- owner публичного канала может выйти, **не назначая** преемника: владение
221
  переходит самому раннему участнику автоматически;
222
- в приватном канале роль moderator работает как прежде.
223
224
Ещё одно изменение 0.2.4 — **живое обновление**: выдача роли или добавление
225
участника с одного устройства должны быть видны остальным сразу, без
226
перезапуска приложения. Список участников, который сходится только после
227
релоада, — баг.
228
229 1 Redmine Admin
1. Создайте приватный канал и пригласите двух участников.
230
2. Убедитесь, что создатель отмечен как owner.
231 5 Redmine Admin
3. Назначьте одного участника модератором и затем снимите роль.
232
4. Проверьте, что owner может приглашать и исключать участников.
233
5. Проверьте, что moderator может управлять обычными участниками, но не
234
   владельцем или другим модератором.
235 6 Redmine Admin
6. Исключите обычного участника: канал должен сразу исчезнуть у него из
236
   интерфейса, а новые сообщения не должны быть доступны.
237 5 Redmine Admin
7. Повторно пригласите участника и убедитесь, что устаревшее событие удаления
238 1 Redmine Admin
   не убирает канал снова.
239 5 Redmine Admin
8. Обычным участником публичного канала пригласите нового пользователя через
240
   **Add member**. Приглашённый должен получить канал без доступа к сообщениям,
241
   отправленным до его вступления.
242
243 1 Redmine Admin
Дополнительно можно проверить выход из канала:
244
245
- обычный участник и модератор могут выйти самостоятельно;
246 8 Redmine Admin
- в **приватном** канале owner с другими участниками должен сначала назначить
247
  модератора, и при выходе владение переходит именно ему;
248
- в **публичном** канале (изменено в 0.2.4) owner выходит без назначения:
249
  владение переходит самому раннему активному участнику;
250 1 Redmine Admin
- из DM выйти нельзя, но его можно скрыть через **Remove for me**;
251
- в публичный канал может приглашать любой участник, но исключение участника
252
  недоступно, поскольку он может вступить обратно самостоятельно.
253 5 Redmine Admin
254
### 4. Профили (новое в 0.2.0)
255 1 Redmine Admin
256 5 Redmine Admin
- Заполните аватар, должность, описание и рабочий телефон.
257 1 Redmine Admin
- Откройте карточку профиля из сообщения и панели участников.
258 5 Redmine Admin
- Проверьте копирование email и телефона.
259
- Измените аватар или данные профиля на одном устройстве и убедитесь, что
260
  изменения появились у другого пользователя без перезапуска приложения.
261
262
Поля профиля видны всем пользователям организации — это справочная информация,
263
а не приватная часть переписки.
264
265
### 5. Поиск и действия с сообщениями
266 1 Redmine Admin
267 5 Redmine Admin
- Найдите старое сообщение через поиск и перейдите к нему.
268
- Убедитесь, что чат прокрутился к правильному сообщению и выделил его.
269 1 Redmine Admin
- Проверьте доступные контекстные действия: ответ, редактирование, сохранение,
270 5 Redmine Admin
  закрепление и удаление там, где они разрешены.
271 1 Redmine Admin
- Отредактируйте длинное сообщение и ответ в треде: поле ввода должно
272
  увеличиваться вместе с текстом.
273 5 Redmine Admin
- Попробуйте превысить допустимую длину сообщения. Клиент должен показать
274
  понятное ограничение, а не зависнуть или молча потерять текст.
275
276
Поиск работает по локально доступной истории устройства. Отсутствие сообщения,
277 1 Redmine Admin
которого никогда не было на этом устройстве, само по себе не является багом.
278
279 8 Redmine Admin
### 6. Файлы, изображения и GIF (расширено в 0.2.0, изменено в 0.2.4)
280 5 Redmine Admin
281
- выберите файл через кнопку вложения и убедитесь, что он сначала появился в
282 6 Redmine Admin
  области подготовки к отправке;
283
- удалите подготовленный файл, не отправляя сообщение;
284 5 Redmine Admin
- перетащите файлы в основной чат и отдельно в открытый тред;
285 3 Redmine Admin
- вставьте изображение из буфера обмена;
286 5 Redmine Admin
- отправьте несколько файлов и проверьте, что они остались в исходном чате,
287
  даже если во время загрузки переключиться на другой канал;
288
- откройте изображение во встроенном просмотрщике;
289
- проверьте воспроизведение GIF и отсутствие чрезмерной нагрузки интерфейса;
290
- удалите собственное сообщение с вложением и убедитесь, что файл больше не
291
  доступен из чата;
292
- скачайте файл и проверьте его содержимое после расшифровки.
293
- на Android выберите документ или изображение системным picker и отправьте
294 1 Redmine Admin
  его сначала в чат, затем в открытый тред.
295 8 Redmine Admin
- **новое в 0.2.4, Android:** сохраните **присланный** файл через системный
296
  диалог выбора папки и откройте его штатным приложением. Раньше это
297
  заканчивалось ошибкой `save path: …`;
298
- **новое в 0.2.4, Android:** снимите фото кнопкой 📷 в поле ввода и отправьте
299
  его. Снимок не должен появиться в галерее телефона, а отмена съёмки не должна
300
  оставлять пустое вложение;
301
- **новое в 0.2.4, Windows:** после выхода компьютера из сна откройте
302
  изображение во встроенном просмотрщике. Раздвоенная картинка или мигающие
303
  полосы прокрутки — баг.
304 1 Redmine Admin
305
Ошибки загрузки, повреждённый скачанный файл, вложение в неправильном канале
306 5 Redmine Admin
или зависшая подготовка файла считаются багами.
307 1 Redmine Admin
308
### 7. Сохранённые сообщения и загрузки (новое в 0.2.0)
309 5 Redmine Admin
310
- Сохраните сообщения из разных каналов через контекстное меню.
311
- Откройте раздел **Saved**, перейдите из него к исходному сообщению и удалите
312
  закладку.
313
- При наличии второго устройства проверьте, что список сохранённых сообщений
314
  синхронизировался.
315
- Скачайте несколько файлов и откройте раздел **Downloads**.
316
- Проверьте действия **Open file**, **Show in folder** и
317
  **Remove from history**.
318
319 1 Redmine Admin
Сохранённые сообщения синхронизируются между устройствами и видны только
320
владельцу аккаунта. История загрузок хранится только на конкретном устройстве.
321
Удаление записи из Downloads не удаляет сам файл с диска. Файлы, скачанные до
322
установки 0.2.0, в историю автоматически не добавляются.
323
324 8 Redmine Admin
### 8. Уведомления и звук (изменено в 0.2.2, 0.2.3 и 0.2.4)
325 1 Redmine Admin
326
- Перед проверкой убедитесь, что в **Settings → Notifications** выключен
327 5 Redmine Admin
  **Pause all notifications**: включённый тумблер намеренно отключает попапы
328 1 Redmine Admin
  и звук, при этом сообщения и счётчики продолжают приходить. Кнопка
329 5 Redmine Admin
  **Send test** проверяет только доставку до операционной системы и работает
330
  даже при включённой паузе.
331
- В **Settings → Notifications** нажмите **Send test**.
332 1 Redmine Admin
- Оставьте окно приложения без фокуса и попросите другого тестера отправить
333
  DM — должен появиться системный попап и прозвучать звук.
334 5 Redmine Admin
- Полностью сверните окно или скройте его в tray и попросите отправить ещё
335 1 Redmine Admin
  один DM: попап и звук должны прийти, не открывая окно, а после открытия
336
  счётчики и сами сообщения должны уже быть на месте без ручного обновления.
337
- Проверьте `@mention` в канале. Обычное сообщение без упоминания по умолчанию
338
  не показывает попап.
339
- Отключите звук в настройках и убедитесь, что новые сообщения приходят без
340
  звукового сигнала.
341
- Проверьте DND, mute канала и quiet hours.
342
- Полностью закройте приложение через tray → **Quit**, отправьте на аккаунт
343
  DM и проверьте email-уведомление, если SMTP включён на сервере.
344
345
Попапы показывает запущенное приложение. После полного выхода через **Quit**
346
desktop-клиент не может показать системное уведомление; в этом случае для DM
347
может прийти только email.
348
349
На Android 13+ разрешите уведомления при первом запуске. Сверните приложение,
350
отправьте DM с другого аккаунта и проверьте push, догрузку сообщения и переход
351 5 Redmine Admin
по тапу. Push требует Google Play services и не приходит после принудительной
352
остановки приложения через системные настройки.
353 4 Redmine Admin
354 8 Redmine Admin
На macOS в 0.2.4 уведомления перешли на системный механизм: попап должен
355
приходить от имени **Green Chat** с правильной иконкой, а само приложение —
356
появиться в списке «Системные настройки → Уведомления». Попап от имени
357
**Script Editor**, отсутствие приложения в этом списке или молчание при
358
разрешённых уведомлениях ОС — баг.
359 1 Redmine Admin
360 8 Redmine Admin
### 9. Несколько устройств (изменено в 0.2.4)
361
362 5 Redmine Admin
- Войдите на второе устройство по паролю или привяжите его по QR-коду.
363 1 Redmine Admin
- Создайте приватный канал и пригласите пользователя с несколькими активными
364
  устройствами.
365
- Убедитесь, что канал, его название и новые сообщения появились на всех
366
  устройствах приглашённого.
367
- Проверьте синхронизацию прочитанности, черновиков, сохранённых сообщений и
368 5 Redmine Admin
  скрытых чатов.
369 1 Redmine Admin
- Измените аватар и убедитесь, что он обновился на других клиентах.
370
- Закройте одно устройство, продолжите работу на втором, затем верните первое
371
  в сеть и проверьте восстановление состояния.
372 8 Redmine Admin
- **Новое в 0.2.4 — статусы на свежепривязанном устройстве.** Сразу после
373
  привязки второго устройства, не дожидаясь пока оно «прогреется», посмотрите
374
  на точки присутствия собеседников и попросите кого-нибудь отключить и
375
  включить сеть. Раньше новое устройство не получало обновлений присутствия,
376
  пока восстановление членства не дойдёт до каждого общего канала: сообщения
377
  приходили, а точка оставалась серой сколь угодно долго. Серый статус у
378
  человека, от которого прямо сейчас приходят сообщения, — баг.
379 1 Redmine Admin
380 8 Redmine Admin
### 10. Android 0.2.4
381 1 Redmine Admin
382
- Установите universal APK на Android 7 или новее и проверьте, что приложение
383 8 Redmine Admin
  называется **Green Chat** и показывает новую иконку.
384 1 Redmine Admin
- Проверьте вход по паролю, привязку по QR и ручной ввод кода.
385
- Откройте клавиатуру в чате и треде: поле ввода и нижние кнопки должны
386
  оставаться видимыми.
387
- На устройстве с вырезом или жестовой навигацией проверьте верхнюю навигацию,
388 8 Redmine Admin
  боковые панели, Threads и Devices. Список чатов должен занимать всю ширину
389
  экрана — серой полосы справа быть не должно.
390 1 Redmine Admin
- Выберите документ и изображение системным picker, отправьте их в чат и тред,
391
  затем скачайте и откройте на втором устройстве.
392 8 Redmine Admin
- **Новое в 0.2.4:** сохраните присланный файл через системный диалог выбора
393
  папки. Ошибка `save path: …` — баг. В истории загрузок на Android действия
394
  **Open file** и **Show in folder** намеренно скрыты: система не даёт клиенту
395
  пути к сохранённому документу.
396
- **Новое в 0.2.4:** снимите фото кнопкой 📷 в поле ввода и отправьте его.
397
  Проверьте отдельно отмену съёмки и отказ в разрешении на камеру — оба случая
398
  должны давать понятное сообщение, а не пустое вложение или зависание. На
399
  устройстве без камеры кнопки быть не должно.
400 1 Redmine Admin
- Сверните приложение, получите push и откройте сообщение по тапу без ручного
401
  обновления.
402 8 Redmine Admin
- Заблокируйте экран телефона и попросите собеседника посмотреть ваш статус:
403
  через некоторое время вы должны стать «отошёл», затем «офлайн», а не
404
  оставаться «онлайн».
405 1 Redmine Admin
406 6 Redmine Admin
Удаление Android-приложения удаляет локальную историю и ключи этого устройства.
407
Не переустанавливайте его во время сценария, если на аккаунте нет другого
408
активного устройства.
409
410
### 11. Выход со всех устройств (новое в 0.2.0)
411
412
Этот сценарий выполняйте только на специально созданном тестовом аккаунте.
413
Перед выходом убедитесь, что клиент подключён к серверу.
414
415
1. Выйдите из аккаунта на последнем активном устройстве и подтвердите
416
   предупреждение об удалении истории.
417 1 Redmine Admin
2. У другого пользователя аккаунт должен получить отметку **Logged out** в
418
   списке DM, профиле, панели участников и выборе пользователя.
419
3. В существующем DM история должна остаться читаемой, но поле отправки должно
420
   замениться предупреждением.
421 8 Redmine Admin
4. Создание нового DM с вышедшим пользователем должно быть заблокировано. Это
422
   **не** то же самое, что новый коллега, который ещё ни разу не заходил (§12):
423
   вышедший потерял ключи безвозвратно и писать ему действительно нельзя, а
424
   новому — можно всегда.
425 6 Redmine Admin
5. Отправьте в канал сообщение с его персональным `@mention`: сообщение
426
   должно отправиться остальным участникам, а автор должен увидеть
427
   предупреждение о недоставке упомянутому пользователю.
428
6. Снова войдите этим аккаунтом. Отметка Logged out должна исчезнуть у других
429 5 Redmine Admin
   пользователей.
430 4 Redmine Admin
431 5 Redmine Admin
Повторный вход создаёт новое активное устройство, но не возвращает историю,
432
уничтоженную при logout.
433 1 Redmine Admin
434 8 Redmine Admin
### 12. Письмо коллеге, который ещё не заходил (новое в 0.2.4)
435
436
Главное изменение выпуска. До 0.2.4 попытка написать новому сотруднику
437
заканчивалась красной ошибкой `404 no key_packages` — диалог не открывался
438
вообще, и написать было нельзя, пока коллега не напишет первым.
439
440
Для проверки нужен аккаунт, **в который ещё ни разу не входили** ни на одном
441
устройстве. Попросите администратора завести его и не открывайте.
442
443
1. Найдите этого человека в списке пользователей и откройте с ним DM. Диалог
444
   должен открыться, поле ввода — быть доступным.
445
2. Над полем ввода должна появиться плашка «*Имя* hasn't joined this
446
   conversation yet — your messages will be sent automatically once they sign
447
   in».
448
3. Отправьте несколько сообщений. Они должны приниматься, а отметка доставки
449
   рядом с ними — оставаться честной: `✓✓` в этом состоянии не ставится.
450
4. Войдите этим аккаунтом на любом устройстве.
451
5. Отправленные ранее сообщения должны дойти **сами**, без повторной отправки с
452
   вашей стороны, а плашка — исчезнуть.
453
454
Дополнительно стоит проверить сценарий «человек в отпуске»: аккаунт, который
455
давно не выходил в сеть, но раньше работал. Написать ему тоже должно быть
456
можно.
457
458
Любая техническая ошибка вместо диалога, навсегда застрявшая плашка после входа
459
собеседника или потерянные сообщения из очереди — важный баг с приоритетом
460
**High**.
461
462 5 Redmine Admin
## Что обязательно считать багом
463
464 4 Redmine Admin
- Падение, зависание или бесконечная загрузка приложения.
465 5 Redmine Admin
- Потеря уже отправленного сообщения или его появление в неправильном чате.
466
- Ошибка расшифровки, нечитаемый текст или повреждённый файл.
467
- Получение доступа к чужому каналу, профилю или данным без разрешения.
468
- Возможность обычного участника выполнить действие owner/moderator.
469 1 Redmine Admin
- Доступ исключённого участника к новым сообщениям приватного канала.
470
- Расхождение каналов, ролей, сохранённых сообщений или прочитанности между
471
  устройствами, которое не исправляется после переподключения.
472
- Отсутствие DM или `@mention`-уведомления при выполненных условиях доставки.
473
- Неправильный адресат, канал или тред у вложения.
474 8 Redmine Admin
- **Тихо прекратившаяся доставка**: сообщения перестали приходить, при этом
475
  приложение выглядит рабочим, ошибок нет, а счётчик непрочитанных показывает
476
  ноль. Обнаруживается обычно постфактум — «оказалось, мне писали».
477
- Группа, надолго застрявшая на баннере «Restoring secure access…».
478
- Техническая ошибка вместо открытого диалога при попытке написать коллеге.
479 1 Redmine Admin
- Неработающая кнопка, обрезанный интерфейс или нечитаемый текст, особенно в
480
  тёмной теме.
481
482
Проблемы безопасности, потерю данных и воспроизводимые падения отмечайте
483
приоритетом **High**.
484
485
## Известные ограничения беты
486
487
- Вход обычно доступен только по приглашению; вкладки создания свободного
488
  аккаунта может не быть.
489
- Автоматического обновления нет — новую версию нужно устанавливать вручную.
490
- Windows может показать SmartScreen с предупреждением о неизвестном
491
  издателе.
492 8 Redmine Admin
- Начиная с 0.2.4 релизные macOS-сборки подписаны Developer ID — Gatekeeper
493
  не должен их блокировать. Если вам досталась неподписанная сборка и она
494
  заблокирована, после переноса приложения в `/Applications` выполните:
495 1 Redmine Admin
496
  ```sh
497
  xattr -cr "/Applications/Green Chat.app"
498
  ```
499
500 8 Redmine Admin
- Атрибуция попапов от имени **Script Editor** на macOS исправлена в 0.2.4 для
501
  собранного приложения. Она остаётся только при запуске из исходников через
502
  `pnpm tauri dev` — этому режиму нечего предъявить системе как приложение.
503 1 Redmine Admin
- На части серверов отправка файлов и email-уведомления могут быть отключены.
504
- Числовой бейдж учитывает DM и упоминания; обычное непрочитанное сообщение в
505
  канале отображается точкой.
506
- Сообщение `SPKI pin mismatch` после плановой смены серверного ключа требует
507
  повторного входа. Клиент намеренно не принимает новый ключ молча.
508 8 Redmine Admin
- Android APK 0.2.4 остаётся debug-сборкой: релизного ключа подписи у беты нет,
509
  в Play она не публикуется, ставится вручную и может вызвать предупреждение
510
  Play Protect о неизвестном разработчике.
511 1 Redmine Admin
- Фоновые Android-уведомления требуют Google Play services и настроенный push
512
  relay. На HMS/чистом AOSP и после Force stop сообщения появятся только после
513
  ручного открытия приложения.
514 8 Redmine Admin
- Сообщения, ждущие в очереди коллеге, который ещё не вошёл (§12), хранятся
515
  **на отправляющем устройстве**. Logout на нём до входа получателя эту очередь
516
  уничтожает.
517
- Резервный ключ приглашения, который делает DM доступными всегда, немного
518
  ослабляет forward secrecy **первого** приглашающего конверта — до первого
519
  изменения в группе. Содержимое сообщений это не затрагивает; разбор принятой
520
  цены — в [ADR-0028](ADR-0028-dm-availability-last-resort-keypackages.md).
521
- iOS-сборка распространяется отдельно и требует приглашения в TestFlight;
522
  минимальная версия — iOS 15.0.
523 1 Redmine Admin
524
Если поведение не перечислено здесь и выглядит неправильным, лучше отправить
525
репорт.
526
527
## Полный changelog всех версий 0.2.x
528
529
Ниже release notes приведены полностью, от текущей версии к самой ранней.
530
Отдельные файлы по ссылкам в начале памятки содержат тот же текст.
531
532 8 Redmine Admin
### Green Chat 0.2.4 — Beta Update
533
534
Дата сборки: **17 августа 2026 года**.
535
536
Предыдущая сборка, которую получали тестировщики, — **0.2.3 от 4 августа 2026
537
года**. В 0.2.4 вошли не только работы по iOS от 16–17 августа, но и две недели
538
исправлений по бета-репортам (5–14 августа), которые до сих пор ни в одну
539
сборку не попадали.
540
541
#### Личные сообщения: «коллеге всегда можно написать»
542
543
Бета-репорт 5 августа: новый пользователь открывал DM с коллегой и вместо
544
диалога получал красный текст `404 no key_packages` — написать было нельзя
545
вообще. Работало только в обратную сторону, если коллега писал первым.
546
547
- **Экран с этой ошибкой больше не существует.** DM открывается всегда, поле
548
  ввода доступно всегда.
549
- Если устройство собеседника ещё ни разу не подключалось, над полем ввода
550
  появляется плашка «hasn't joined this conversation yet», а сообщения ждут в
551
  локальной очереди и уходят сами, как только собеседник войдёт. Отметка `✓✓`
552
  в этом состоянии не ставится.
553
- Устройство заливает ключи для приглашений сразу при регистрации, привязке по
554
  QR и входе по паролю, а пополняет их при каждом подключении и раз в 10 минут
555
  вместо часа.
556
- У каждого устройства появился постоянный резервный ключ приглашения, поэтому
557
  «пул закончился» перестаёт быть тупиком даже у человека в отпуске.
558
- Неудачные попытки приглашения больше не сжигают ключи навсегда.
559
560
Подробности — [ADR-0028](ADR-0028-dm-availability-last-resort-keypackages.md).
561
Требуются миграции `025_last_resort_keypackages.sql` и `026_dm_peer_pending.sql`.
562
563
#### Роли, состав каналов и создание группы
564
565
- **Модераторов в публичных каналах больше нет** — роль там ничего не давала.
566
  Уже выданные роли снимает миграция `027_public_channel_no_moderators.sql`.
567
- Owner публичного канала может выйти, не назначая преемника: владение
568
  переходит самому раннему активному участнику.
569
- **Список участников обновляется сразу**, без перезапуска приложения.
570
- Создание приватной группы не срывается целиком из-за одного участника,
571
  которого не удалось добавить.
572
- Метки «logged out» и «hasn't signed in yet» разведены.
573
574
#### Статус присутствия
575
576
- Телефон с заблокированным экраном больше не показывается как «онлайн»:
577
  в фоне — «отошёл», через 45 секунд — «офлайн». Побочный эффект — экономия
578
  батареи.
579
- Статус собеседника перестаёт «залипать» серым после потери связи или фона.
580
- Свой статус при пропаже сети больше не остаётся «онлайн»; ручной статус при
581
  этом не сбрасывается.
582
- **Статусы наконец сходятся на втором устройстве**: свежепривязанный телефон
583
  раньше не получал обновлений присутствия вообще, пока восстановление членства
584
  не дойдёт до каждого общего канала.
585
586
#### Восстановление MLS и расхождение эпох
587
588
- Форк эпох обнаруживается после расхождения номеров эпох и на историческом
589
  пути чтения — устройство само запрашивает замену листа вместо вечного
590
  «Failed to load / Retry».
591
- Нерасшифровываемый коммит следующей эпохи и сообщение из эпохи впереди
592
  локальной теперь тоже считаются доказательством форка. Это закрывает
593
  сценарий, при котором устройство молча не получало сообщения, а счётчик
594
  непрочитанных честно показывал ноль.
595
- Устройство выбирается из ситуации, когда замена листа построена на ключе,
596
  которого у него уже нет.
597
- После замены листа устройство не зацикливается на сообщениях, отправленных
598
  до его переприглашения: они помечаются недоступными по дизайну.
599
- Ремонтирующее устройство пересылает имя приватной группы и после
600
  замены-ремонта.
601
- Группа в состоянии восстановления показывает баннер «Restoring secure
602
  access…» вместо красной крипто-ошибки; отправка на это время блокируется.
603
604
#### Desktop и Android — по бета-репортам
605
606
- **Открытая переписка обновляется сама**: раньше фоновая сверка поднимала
607
  сообщение и показывала попап, а в самом открытом чате его не было до
608
  переключения канала.
609
- **Автопрокрутка в треде** (репорт №48): свой отправленный ответ больше не
610
  уходит под нижний край, чтение истории при этом не прерывается.
611
- **Понятные ошибки без сети** (репорт №49) вместо сырых технических строк.
612
- **Сохранение присланного файла на Android** (репорт №57): ошибки
613
  `save path: …` больше нет.
614
- **Просмотрщик изображений после выхода из сна** на Windows больше не мигает
615
  двумя раскладками.
616
- Убрана серая полоса справа от списка чатов (№46), обновлена иконка
617
  приложения на Android (№45).
618
619
#### Камера на Android
620
621
Кнопка 📷 в поле ввода снимает фото и сразу прикладывает его к сообщению
622
(пожелание №56). Снимок **не попадает в галерею телефона**. Кнопка появляется
623
только на устройствах с камерой.
624
625
#### iOS-клиент (новое)
626
627
- Первая сборка на устройство и симулятор: вход, каналы, DM, треды, реакции,
628
  файлы — весь функционал десктопа в мобильной оболочке.
629
- Секреты в Keychain, данные в App-Group-контейнере.
630
- Камера и системный пикер фотографий.
631
- Push-уведомления с **расшифрованным текстом**: Notification Service Extension
632
  поднимает MLS-состояние в память, подписанно забирает новые сообщения с
633
  вашего сервера и показывает «отправитель / канал / текст» плюс точный бейдж;
634
  ничего не сохраняет. Центральный push relay по-прежнему не видит ни
635
  идентификаторов беседы, ни шифртекста. При любой неудаче баннер остаётся
636
  generic «New message» — это штатный fallback.
637
- Устранена причина падений у всех TestFlight-тестировщиков при сворачивании
638
  приложения; размер пакета уменьшен с 186 МБ до 18,6 МБ; минимальная версия —
639
  iOS 15.0.
640
641
#### macOS
642
643
- Системные уведомления перешли на штатный механизм: правильные имя и иконка,
644
  приложение появляется в «Системные настройки → Уведомления», отказ и ошибки
645
  доставки видны в диагностике **Send test**. Атрибуция от имени
646
  **Script Editor** осталась только для запуска из исходников.
647
- Релизные сборки подписываются Developer ID с hardened runtime.
648
- Иконка приложения приведена к нативной форме macOS.
649
650
#### Мобильный интерфейс
651
652
- Список чатов занимает всю ширину экрана.
653
- Просмотрщик изображений и попапы не наезжают на статус-бар и home-индикатор.
654
- Реакция на сообщение с картинкой не «мигает» превью.
655
- Корень треда, отправленный до подключения устройства, помечается «Sent before
656
  this device joined» вместо сырой строки.
657
658
#### Деплой
659
660
- **Сервер и push relay обязательны к обновлению.** Протокол relay получил поле
661
  `kind` (ADR-0027 §1); агрегатный snapshot присутствия `GET /v1/presence`
662
  чинит зависшие статусы.
663
- **Порядок строгий: сначала `glchat-push`, потом `glchat-server`.** Старый
664
  relay отклоняет запросы нового сервера — пока relay не обновлён, пуши не
665
  работают ни на одной платформе.
666
- **Новые миграции: `025_last_resort_keypackages.sql`,
667
  `026_dm_peer_pending.sql`, `027_public_channel_no_moderators.sql`.**
668
- Клиенты обновить везде: исправления MLS работают между устройствами только
669
  при обновлении всех участников.
670
671
Границы приватности не менялись.
672
673
---
674
675 6 Redmine Admin
### Green Chat 0.2.3 — Beta Update
676
677 8 Redmine Admin
Дата первой Android-сборки: **30 июля 2026 года**. Последняя выпущенная сборка
678
0.2.3: **4 августа 2026 года**.
679 6 Redmine Admin
680
Версия 0.2.3 добавляет **мобильную сборку (Android)** и уведомления на телефон.
681
В актуальную сборку также вошли исправления Android, защиты от расхождения
682
MLS-эпох, управления публичными каналами, desktop-композера и push relay.
683
684
Android-сборка **экспериментальная**: это debug-APK, он не подписан релизным
685
ключом, не публикуется в Play и ставится вручную.
686
687
#### Изменения актуальной сборки от 4 августа
688
689
##### Надёжность шифрования и доставки
690
691
- Клиент больше не применяет локальный MLS Commit до подтверждения сервера.
692
  Это предотвращает расхождение криптографических веток при одновременных
693
  изменениях состава группы.
694
- Добавлено автоматическое восстановление устройства, уже попавшего в такую
695
  ветку: при ошибке расшифровки текущей эпохи здоровый участник заменяет его
696
  MLS-листину, а клиент принимает replacement Welcome и продолжает доставку.
697
- Расшифрованная локальная история при восстановлении сохраняется. Pending
698
  MLS-состояние и исходящий запрос сохраняются атомарно, поэтому потерянный
699
  HTTP-ответ или перезапуск не создают второй отличный Commit.
700
- Серверу требуется миграция `024_membership_recovery.sql`.
701
702
##### Android
703
704
- Интерфейс учитывает вырезы экрана, status bar, навигационную панель и
705
  виртуальную клавиатуру.
706
- Выбор файла использует нативный Android picker; документы и изображения
707
  можно прикреплять к обычным сообщениям и ответам в тредах.
708
- В launcher и системных настройках отображается имя **Green Chat**, системные
709
  push-строки приведены к английской локализации.
710
- Перед упаковкой удаляется старый universal APK/AAB, чтобы прерванная
711
  инкрементальная сборка не раздувала новый пакет.
712
713
##### Каналы и интерфейс
714
715
- Любой активный участник публичного канала может пригласить нового
716
  пользователя через **Add member**. Исключение участников публичного канала
717
  по-прежнему запрещено.
718
- Иконки действий в desktop-композере приведены к единому стилю.
719
- Emoji picker больше не обрезается границами поля ввода.
720
721
##### Push relay и эксплуатация
722
723
- Relay корректно распознаёт реальный ответ FCM `UNREGISTERED` и удаляет
724
  недействительные Firebase installation IDs.
725
- Bootstrap dev push-конфигурации останавливается при расхождении секрета в
726
  `tenants.json` и переменной окружения.
727
- Локальный chat server больше не зависит по healthcheck от push relay и может
728
  работать без фоновых мобильных уведомлений.
729
730
#### Android-клиент
731
732
- Приложение собрано из **того же кода**, что и desktop (Tauri 2 mobile): те же
733
  MLS-шифрование, те же экраны, та же логика доставки. Отдельного мобильного
734
  клиента с собственной криптографией не появилось.
735
- Приватный ключ устройства и ключ локальной базы хранятся в **AndroidKeyStore**
736
  (аппаратно, если устройство поддерживает); удаление приложения удаляет и их.
737
- Линковка устройства сканированием QR-кода. Если камера недоступна — работает
738
  ручной ввод кода.
739
- Интерфейс перестроен под телефон: список чатов и переписка — один стек с
740
  кнопкой «назад», панели тредов, участников и сохранённых открываются на весь
741
  экран, учитываются вырезы экрана и виртуальная клавиатура.
742
743
#### Уведомления на телефон
744
745
- Приходят через Firebase Cloud Messaging. **Содержимое сообщения в push не
746
  передаётся** — приходит только сигнал «есть новое», текст «New message»
747
  формирует само приложение на устройстве.
748
- Push будит приложение и запускает догрузку, поэтому при открытии всё уже на
749
  месте.
750
- Уведомление приходит **только на устройства без активного соединения** — если
751
  телефон онлайн, сообщение и так придёт по WebSocket.
752
- На Android 13+ при первом запуске приложение спросит разрешение на
753
  уведомления. Отказ отключает попапы, сообщения продолжают приходить.
754
- Требуются **Google Play services**. На устройствах без них (HMS, чистый AOSP)
755
  фоновых уведомлений не будет — ограничение транспорта, не клиента.
756
- Push не приходит, если приложение принудительно остановлено через
757
  «Настройки → Приложения → Остановить»: система блокирует доставку до
758
  следующего запуска вручную.
759
760
Уведомления **не заменяют** доставку: если push потерялся, сообщения всё равно
761
догружаются при открытии приложения.
762
763
#### Сервер
764
765
Требуется **обновление сервера** и миграции `023_push_installations.sql` и
766
`024_membership_recovery.sql`.
767
Дополнительно администратору нужно настроить push relay — без него мобильный
768
клиент работает полностью, но фоновых уведомлений не будет
769
(см. [docs/push-relay-deployment.md](push-relay-deployment.md) и шаг 4b
770
[бета-чеклиста](beta-checklist.md)).
771
772
Границы приватности не изменились: сервер по-прежнему не видит текст
773
сообщений и ключи. Появился один новый элемент — центральный push relay
774
получает идентификатор установки приложения (не аккаунт и не сообщение) и
775
время отправки; подробности и принятые риски описаны в
776
[ADR-0026](ADR-0026-central-push-relay.md).
777
778
#### Обновление
779
780
1. Администратор обновляет сервер и применяет миграции 023 и 024.
781
2. Desktop: установите **0.2.3** на все устройства.
782
3. Android: установите APK, войдите или привяжите устройство по QR.
783
784
Что особенно важно проверить на телефоне:
785
786
1. приходит ли уведомление, когда приложение **свёрнуто**, а не открыто;
787
2. открываются ли после тапа именно новые сообщения — без ручного обновления;
788
3. работает ли одновременно телефон и десктоп на одном аккаунте (счётчики
789
   непрочитанных не должны расходиться);
790
4. привязка устройства по QR-коду;
791
5. отправка и открытие вложений с телефона.
792
793
---
794
795
### Green Chat Desktop 0.2.2 — Beta Update
796
797
Дата выпуска: **23 июля 2026 года**.
798
799
Версия 0.2.2 закрывает бета-репорт «клиент в фоне на Windows молчит и не
800
обновляется»: свёрнутое или скрытое в tray окно не получало ни системного
801
уведомления, ни счётчика непрочитанных, а интерфейс показывал новые сообщения
802
только после ручного обновления страницы (Ctrl+R).
803
804
Обновляется **только desktop-клиент** — серверных изменений в этом выпуске
805
нет (см. раздел «Сервер»).
806
807
#### Доставка и уведомления при свёрнутом окне
808
809
- Фоновая сверка с сервером перенесена из интерфейсного слоя в нативный
810
  Rust-процесс и выполняется каждые 10 секунд. Windows может приостанавливать
811
  таймеры и сам JS-контекст WebView2 у скрытого окна — теперь это не
812
  останавливает ни доставку сообщений, ни уведомления.
813
- Системное уведомление для сообщения, пришедшего в свёрнутое/фоновое окно,
814
  создаётся непосредственно нативным процессом, до и независимо от
815
  интерфейсного слоя. Открывать окно, чтобы получить попап, не требуется.
816
  Настройки Pause all notifications, DND, mute, quiet hours и режим
817
  уведомлений канала учитываются так же, как раньше.
818
- Возврат окна из фона, minimize или tray запускает немедленную сверку —
819
  счётчики и новые сообщения появляются сами, ручной Reload больше не нужен.
820
- Потерянный единичный WebSocket-кадр или half-open соединение больше не
821
  оставляют клиент без счётчика, звука и попапа: любое расхождение с сервером
822
  устраняется ближайшей 10-секундной сверкой.
823
- После выхода компьютера из сна клиент больше не ждёт до 90 секунд, считая
824
  старый WebSocket подключённым: resume-watchdog обнаруживает паузу системных
825
  часов и переподключается за несколько секунд, сразу забирая пропущенные
826
  сообщения и восстанавливая presence.
827
- Сводное уведомление «N new messages» о сообщениях, восстановленных фоновой
828
  сверкой, показывается даже если окно уже получило фокус (например, сразу
829
  после открытия крышки ноутбука) и не дублируется при открытии окна после
830
  нативного уведомления.
831
- Если звук сообщений включён, уведомления сопровождаются нативным системным
832
  звуком; серия подряд идущих сообщений даёт один звук, а не очередь сигналов.
833
- Определение «окно в фокусе» для подавления попапов использует состояние
834
  самого интерфейса, а не системный сигнал окна — на Windows системный сигнал
835
  недостоверен и мог как показывать попапы поверх активного окна, так и
836
  глушить их у скрытого.
837
838
#### Личные сообщения
839
840
- Если KeyPackage нового устройства ещё загружается, повторная попытка
841
  восстановления membership выполняется через несколько секунд с постепенным
842
  увеличением интервала. Чат больше не зависает в состоянии `re-syncing`
843
  из-за двухминутного ожидания, которое при каждом перезапуске начиналось
844
  заново.
845
- Исправлена ложная блокировка отправки после password login или привязки
846
  устройства: старые клиенты создавали пустую MLS BasicCredential, поэтому
847
  два реальных листа ошибочно считались одним пользователем. Готовность
848
  личного чата теперь проверяется по фактическому MLS roster, а новые
849
  устройства сохраняют credential с серверным username.
850
851
#### Сервер
852
853
Серверный код в 0.2.2 не менялся. Требования совпадают с 0.2.1: сервер должен
854
быть обновлён до серверной версии выпуска 0.2.1 (endpoints состояния
855
синхронизации и миграция `022_membership_repair_claims.sql`). Со старым
856
сервером клиент продолжает работать в режиме прежней полной догрузки, но
857
10-секундная сверка и восстановление membership недоступны.
858
859
Как и раньше, содержимое сообщений, ключи и настройки уведомлений не
860
передаются серверу в открытом виде; текст системных уведомлений формируется
861
локально и никогда не покидает устройство.
862
863
#### Обновление
864
865
Установите **Green Chat Desktop 0.2.2 на все свои устройства**.
866
867
Особенно важно повторно проверить:
868
869
1. сообщения и `@mention` в **свёрнутое или скрытое в tray** окно: системный
870
   попап и звук должны прийти без открытия окна, а после открытия счётчики и
871
   сообщения должны быть уже на месте — без Ctrl+R;
872
2. перед проверкой уведомлений убедитесь, что в **Settings → Notifications**
873
   выключен **Pause all notifications** — включённый тумблер отключает попапы
874
   и звук намеренно, при этом сообщения и счётчики продолжают приходить;
875
3. получение сообщений после сна/пробуждения компьютера;
876
4. личный чат после logout и повторного входа одного из участников;
877
5. одновременную работу двух устройств одного аккаунта.
878
879
---
880
881
### Green Chat Desktop 0.2.1 — Beta Update
882
883
Дата выпуска: **22 июля 2026 года**.
884
885
Версия 0.2.1 исправляет проблемы доставки сообщений и уведомлений,
886
обнаруженные во время бета-тестирования 0.2.0.
887
888
#### Главное
889
890
- Доставка больше не зависит только от WebSocket-событий. Клиент сверяет
891
  локальное состояние с сервером после подключения, при ошибке live-доставки
892
  и каждые две минуты, пока соединение активно.
893
- Пропущенные во время офлайна сообщения автоматически догружаются в
894
  правильном порядке вместе с необходимыми MLS-коммитами.
895
- Счётчики непрочитанных, список тредов и сохранённые сообщения обновляются
896
  после каждой сверки с сервером.
897
- Для сообщений, полученных через фоновую сверку, показывается одно сводное
898
  уведомление вместо серии попапов. Настройки DND, mute, quiet hours и режим
899
  уведомлений канала продолжают учитываться.
900
901
#### Исправление личных сообщений после повторного входа
902
903
- Исправлена ситуация, когда после logout и повторного входа личный чат
904
  оставался доступен, но новые сообщения фактически шифровались без устройства
905
  собеседника.
906
- Клиент автоматически обнаруживает отсутствующее устройство участника и
907
  повторно добавляет его в MLS-группу личного чата.
908
- Одновременное восстановление несколькими устройствами защищено коротким
909
  серверным lease: проигравший клиент останавливается до изменения локальной
910
  MLS-эпохи.
911
- Пока устройство собеседника ещё не восстановлено в личном чате, поле ввода
912
  заменяется сообщением о синхронизации, а отправка временно блокируется.
913
  Отметка `✓✓` в этом состоянии заменяется честным предупреждением
914
  `not delivered`.
915
- После успешного восстановления чат разблокируется по долговременному
916
  состоянию клиента, даже если соответствующее WebSocket-событие потерялось.
917
918
#### Надёжность и диагностика
919
920
- Ошибка обработки live-сообщения теперь запускает ускоренную сверку с
921
  сервером вместо ожидания следующего переподключения.
922
- Исправлена потеря полной проверки групп, если переподключение совпало по
923
  времени с уже выполняющейся фоновой сверкой.
924
- Отложенные reconcile-задачи корректно отменяются при logout.
925
- Desktop-клиент пишет диагностический лог в `glchat.log` в каталоге данных
926
  приложения.
927
- Добавлена ротация лога при достижении 5 MiB с сохранением одной предыдущей
928
  копии `glchat.log.old`, включая повторную ротацию на Windows.
929
930
#### Сервер
931
932
- Добавлены авторизованные endpoints состояния синхронизации: хвосты сообщений
933
  по группам и отсутствующие membership-листы.
934
- Добавлен одноразовый lease-token для безопасного восстановления membership.
935
- Добавлена метрика Prometheus для количества обнаруженных membership gaps.
936
- Добавлена миграция `022_membership_repair_claims.sql`.
937
938
Содержимое сообщений, ключи и настройки уведомлений по-прежнему не передаются
939
серверу в открытом виде. Новые endpoints работают только с уже известными
940
серверу метаданными групп, устройств и последовательностей сообщений.
941
942
#### Обновление
943
944
Для проверки исправлений установите **Green Chat Desktop 0.2.1 на все свои
945
устройства**. Сервер также должен быть обновлён и иметь применённую миграцию
946
`022_membership_repair_claims.sql`.
947
948
Особенно важно повторно проверить:
949
950
1. получение сообщений после временного отключения сети;
951
2. непрочитанные, звук и системный попап после фоновой догрузки;
952
3. личный чат после logout и повторного входа одного из участников;
953
4. одновременную работу двух устройств одного аккаунта;
954
5. наличие `glchat.log` после перезапуска desktop-приложения.
955
956
---
957
958
### glchat Desktop 0.2.0 — Beta Update
959
960 1 Redmine Admin
Изменения с 9 по 20 июля 2026 года.
961 6 Redmine Admin
962
#### Новые возможности
963
964
- Добавлены роли владельца и модератора канала, управление участниками, выход из канала и локальное скрытие чатов.
965
- Появились карточки профилей с аватаром, должностью, описанием и контактами.
966
- Добавлен единый раздел «Треды» со всеми обсуждениями и фильтром непрочитанных.
967
- Сообщения теперь можно сохранять в личные закладки с синхронизацией между устройствами.
968
- Добавлена локальная история загрузок: файл можно открыть, показать в папке или убрать из списка.
969
- Изображения открываются во встроенном просмотрщике, добавлена безопасная анимация GIF.
970
- Изображения из буфера обмена можно вставлять прямо в сообщение.
971
- Добавлены звуковые уведомления о новых сообщениях и настройка звука.
972
- Пользователи, вышедшие со всех устройств, теперь отмечаются в интерфейсе. Перед отправкой им личного сообщения или упоминания показывается предупреждение.
973
974
#### Улучшения интерфейса
975
976
- Добавлены контекстные действия для сообщений.
977
- Улучшены редакторы сообщений и ответов в тредах.
978
- Добавлены упоминания пользователей в ответах треда.
979
- Улучшена работа с вложениями: предварительная подготовка, drag-and-drop в треды и удаление отправленных файлов.
980
- Поиск теперь прокручивает чат до найденного сообщения и ограничивает слишком тяжёлые запросы.
981
- Улучшены индикаторы присутствия, подсчёт участников и расположение боковых панелей.
982
- После отправки сообщения чат автоматически прокручивается к нему.
983
- Исправлено восстановление окна приложения из системного трея.
984
985
#### Исправления и стабильность
986
987
- Исправлена синхронизация каналов, участников и метаданных между несколькими устройствами.
988
- Восстановлена доставка уведомлений после длительного офлайна.
989
- Статус пользователя обновляется сразу после подключения.
990
- Исправлен учёт непрочитанных сообщений при переключении фокуса окна.
991
- Исключённые каналы сразу удаляются из интерфейса, а устаревшие события больше не удаляют канал после повторного вступления.
992
- Исправлены отображение закреплённых файлов и привязка вложений к исходному чату.
993
- Добавлена корректная обработка максимальной длины сообщений.
994
- Аватары профилей теперь обновляются в реальном времени.
995 5 Redmine Admin
- Улучшено восстановление личных чатов после выхода всех участников со всех устройств.
996
- При выходе устройство отзывается на сервере, чтобы не оставлять неактивные устройства и ключи.
997
998
#### Сервер и эксплуатация
999
1000
- Добавлены Prometheus-метрики для HTTP, WebSocket, PostgreSQL, Redis и Go runtime.
1001
- Подготовлены базовые правила мониторинга и алертов.
1002
- Улучшена конфигурация TLS для файлового хранилища.
1003
1004
Итого: **40 коммитов и 178 изменённых файлов** в ветке `main`.
1005 1 Redmine Admin
1006 5 Redmine Admin
## Как оставить баг-репорт
1007
1008
Трекер:
1009
<https://bug.green-lab.space/projects/greenchat/issues/new>. Регистрация не
1010
нужна, репорт можно отправить анонимно.
1011
1012
### Что указать
1013
1014
```text
1015 6 Redmine Admin
Краткое название: что сломалось и где
1016 5 Redmine Admin
1017
Шаги:
1018
1. …
1019
2. …
1020
3. …
1021
1022
Ожидал: …
1023
Получил: …
1024
1025
Окружение:
1026 8 Redmine Admin
- Green Chat 0.2.4 (или версия из Settings → Profile)
1027 5 Redmine Admin
- ОС и версия
1028
- один или несколько аккаунтов/устройств
1029
- название канала или DM
1030
- точное время события и часовой пояс
1031
1032
Воспроизводится: всегда / иногда / один раз
1033
Дополнительно: скриншот или короткое видео
1034
```
1035
1036
Для проблем синхронизации укажите ОС и версию клиента **на каждой стороне**,
1037
а также какое устройство было офлайн.
1038
1039
Трекер публичный. Не прикладывайте пароли, invite-коды, ключи, приватные
1040
логи или скриншоты с конфиденциальной перепиской. Перед отправкой замажьте
1041
лишние данные.
1042
1043
### Приоритет
1044
1045
| Приоритет | Когда использовать |
1046
|---|---|
1047
| `Normal` | Большинство ошибок интерфейса и поведения |
1048
| `High` | Падение, потеря данных, недоставка сообщений, нарушение прав или безопасности |
1049
| `Urgent` / `Immediate` | Не выбирайте без отдельной просьбы команды |
1050
1051
## Быстрая диагностика уведомлений
1052 1 Redmine Admin
1053
1. Нажмите **Settings → Notifications → Send test**.
1054
2. Если тест пришёл, проверьте **Pause all notifications**, DND, mute,
1055
   quiet hours и фокус окна: Send test обходит эти настройки, а обычные
1056
   уведомления — нет.
1057
3. Для канала используйте персональный `@mention`; обычное сообщение может не
1058
   создавать попап.
1059
4. Если приложение было закрыто через tray → Quit, системного попапа быть не
1060
   должно.
1061
5. Если Send test не работает при разрешённых уведомлениях ОС, создайте
1062
   баг-репорт и обязательно укажите операционную систему.