Project

General

Profile

Wiki » History » Version 9

Redmine Admin, 10/22/2026 01:03 AM

1 9 Redmine Admin
# Green Chat 0.2.5 — памятка бета-тестера
2 1 Redmine Admin
3 5 Redmine Admin
Спасибо, что участвуете в тестировании Green Chat. Эта памятка объясняет,
4 9 Redmine Admin
как подготовиться к бете, что особенно важно проверить в версии 0.2.5 и как
5 1 Redmine Admin
составить полезный баг-репорт.
6
7 9 Redmine Admin
**Сообщить об ошибке:**
8
<https://bug.green-lab.space/projects/greenchat/issues/new> — регистрация не
9
нужна. Что указать в репорте — в разделе [«Как оставить
10
баг-репорт»](#как-оставить-баг-репорт).
11
12 1 Redmine Admin
## Версии беты 0.2.x
13
14 9 Redmine Admin
Текущая версия — **0.2.5** (сборка 13 октября 2026, **обновлена 21 октября
15
2026**: сервер и клиенты пересобраны с исправлениями ревью безопасности, номер
16
версии остался 0.2.5; в сборке 21 октября «О программе» может показывать
17
суффикс вида `v0.2.5-2-gceb2eb1`). Памятка покрывает все возможности линейки
18
0.2.x; полные списки изменений по версиям:
19 1 Redmine Admin
20 9 Redmine Admin
- **[0.2.5](beta-changelog-0.2.5.md)** (13 октября 2026, обновление 21 октября:
21
  изоляция служебной группы синхронизации, отзыв устройств, «Стереть историю»,
22
  уведомления на iPhone — см. [раздел обновления](beta-changelog-0.2.5.md#обновление-2026-10-21-исправления-ревью-безопасности)) — сообщения не
23
  теряются при одновременной смене состава группы, очередь вместо ошибки в DM,
24
  «Треды» только по подписке, PIN-блокировка, тише уведомления, имена у
25
  реакций, история только устройству, привязанному с вашего устройства,
26
  отключённый аккаунт удаляется из разговоров, исправления iPhone и Android по
27
  репортам №58–№63. Требует миграции 028–031 и обновления **всех** клиентов.
28 8 Redmine Admin
- **[0.2.4](beta-changelog-0.2.4.md)** (17 августа 2026) — доступность личных
29
  сообщений («коллеге всегда можно написать»), отмена модераторов в публичных
30
  каналах и живое обновление состава, статусы присутствия на втором устройстве,
31
  обнаружение расхождения MLS-эпох, камера на Android, сохранение файлов на
32
  Android, iOS-клиент. Требует миграции 025/026/027 и обновления push relay
33 1 Redmine Admin
  **до** сервера.
34
- **[0.2.3](beta-changelog-0.2.3.md)** (сборка 4 августа 2026) —
35
  Android-клиент и уведомления на телефон, защита от расхождения MLS-эпох,
36
  мобильные вложения и safe areas, приглашения в публичные каналы, исправления
37
  композера и push relay. Требует миграции 023/024 и настроенный relay.
38 8 Redmine Admin
- **[0.2.2](beta-changelog-0.2.2.md)** (23 июля 2026) — уведомления, звук и
39
  счётчики при свёрнутом или скрытом в tray окне; быстрое переподключение
40 1 Redmine Admin
  после сна компьютера; исправления восстановления личных чатов. Серверных
41
  изменений нет.
42
- **[0.2.1](beta-changelog-0.2.1.md)** (22 июля 2026) — надёжная доставка:
43
  клиент сверяет состояние с сервером и догружает пропущенные сообщения;
44
  восстановление личного чата после logout и повторного входа собеседника;
45
  диагностический лог `glchat.log`. Требует обновлённый сервер.
46
- **[0.2.0](beta-changelog-0.2.0.md)** (20 июля 2026) — роли и управление
47
  участниками каналов, раздел «Треды», карточки профилей, сохранённые
48
  сообщения, история загрузок, просмотрщик изображений и GIF, звуковые
49
  уведомления, отметка вышедших со всех устройств пользователей.
50
51
## Что изменилось после вашей прошлой сборки
52
53 9 Redmine Admin
Прошлая сборка, которую получали тестировщики, — **0.2.4 от 17 августа 2026
54
года**. Всё перечисленное ниже для вас новое. Сюда вошли исправления по вашим
55
репортам №58–№63 (18–20 августа) и полное ревью кода от 29 сентября — если вы
56
сообщали о баге в этот период, проверять его нужно именно сейчас.
57 1 Redmine Admin
58 9 Redmine Admin
### Доставка и восстановление
59
60
- Сообщение, отправленное в момент смены состава группы, больше не теряется
61
  молча на части устройств: клиент перешифровывает и отправляет его заново
62
  сам, а если не смог — честно показывает **Failed / Retry**.
63
- Ложные «You were removed from …», качели добавления/удаления участников в
64
  ленте и возврат канала без истории устранены; исключённый участник больше не
65
  возвращается в канал через восстановление.
66
- Пропущенные сообщения догружаются по порядку, а не теряются, если живое
67
  сообщение пришло раньше предыдущих.
68
69 1 Redmine Admin
### Личные сообщения
70
71 9 Redmine Admin
- Ошибки `Direct message is still syncing to this device` и `MLS state recovery
72
  is in progress…` (репорты №60 и №62) больше нет: DM открывается всегда,
73
  сообщения ждут в очереди с отметкой **⏳ queued** и уходят сами.
74 1 Redmine Admin
75 9 Redmine Admin
### Треды, уведомления, реакции
76 1 Redmine Admin
77 9 Redmine Admin
- Раздел «Треды» показывает только треды, на которые вы подписаны; ответы в
78
  тредах больше не делают канал жирным (подробно — §2).
79
- Нет push и email на правку, удаление, реакцию и закрепление; строк
80
  «encryption keys rotated» в ленте больше нет.
81
- Android: звук у каждого push, а не только у первого.
82
- У реакции видно, кто её поставил.
83 1 Redmine Admin
84 9 Redmine Admin
### Безопасность
85 1 Redmine Admin
86 9 Redmine Admin
- **PIN-блокировка** приложения и отдельный **Sign-out PIN** (§13).
87
- **Историю получает только устройство, привязанное через Link device.**
88
  Устройство, вошедшее по паролю, получает только новые сообщения, а остальные
89
  ваши устройства об этом предупреждают (§9).
90
- Отключённый администратором аккаунт удаляется из всех разговоров (§14).
91
- Временный сбой Keystore/keyring больше не уничтожает аккаунт; экран входа при
92
  живом аккаунте (репорт №63) лечится без переустановки.
93 1 Redmine Admin
94 9 Redmine Admin
### Мобильные клиенты
95 8 Redmine Admin
96 9 Redmine Admin
- Ссылки в сообщениях открываются в браузере (репорт №58).
97
- iPhone: меню по долгому нажатию и диалоги подтверждения работают — из канала
98
  наконец можно выйти; статус больше не «отошёл» после шторки уведомлений.
99 8 Redmine Admin
100 9 Redmine Admin
Обновление с 0.2.4 требует серверных миграций `028`–`031` и обновления
101
**всех** клиентов одновременно с сервером.
102 8 Redmine Admin
103 9 Redmine Admin
## Что проверить в первую очередь в 0.2.5
104 8 Redmine Admin
105 9 Redmine Admin
Это короткий список для тех, кто уже тестировал сборку 0.2.4 от 17 августа.
106 8 Redmine Admin
Полный набор сценариев — ниже, в разделе «Что особенно важно проверить».
107
108 9 Redmine Admin
1. **Сообщения во время смены состава.** Вдвоём-втроём пишите в один приватный
109
   канал, пока кто-то добавляет и удаляет участника. Каждое сообщение должно
110
   дойти до **всех** устройств всех участников. Сообщение, которое есть на
111
   одном устройстве человека и отсутствует на другом, — баг **High**.
112
   Кратковременное **Failed** с успешным **Retry** — штатно.
113
2. **Нет ложных исключений.** В том же сценарии на ваших устройствах не должно
114
   появляться «You were removed from …», если вас не исключали, и лента не
115
   должна заполняться строками «A member was added/removed».
116
3. **DM, который «переподключается».** Если увидите баннер о переподключении
117
   разговора, отправьте пару сообщений: они должны встать в очередь (**⏳
118
   queued**) и уйти сами, когда собеседник появится в сети. Красная ошибка
119
   вместо очереди — баг.
120
4. **Треды по подписке.** Убедитесь, что в «Тредах» нет чужих обсуждений, а
121
   **Follow / Unfollow** работают (§2).
122
5. **PIN-блокировка** — на тестовом аккаунте (§13). Особенно: перезапуск
123
   приложения, неверный PIN, **Forgot PIN?** и **Sign-out PIN**.
124
6. **Вход по паролю против Link device** (§9). Войдите на новое устройство по
125
   паролю: истории там быть не должно, а на остальных устройствах должно
126
   появиться предупреждение. Затем привяжите устройство через **Link device**:
127
   история должна прийти.
128
7. **Тихие уведомления.** Попросите собеседника поставить реакцию, отредактировать
129
   и удалить сообщение, пока ваше приложение свёрнуто: push и попапа быть не
130
   должно. Новое сообщение должно уведомить как раньше.
131
8. **Кто поставил реакцию** — наведите мышь (на телефоне долгое нажатие).
132
9. **Телефоны.** Android: ссылка из сообщения открывается в браузере, у каждого
133
   push есть звук. iPhone: долгое нажатие на сообщение и на чат в списке
134
   открывает меню, **Leave the channel** доходит до конца; после шторки
135
   уведомлений собеседники не видят вас «отошёл».
136
10. **Долгая проверка на фоне (важнее всего).** Поработайте день на всех своих
137
    устройствах. Главный класс багов беты по-прежнему — «сообщения тихо
138
    перестали приходить, а приложение выглядит нормально». Если обнаружили
139
    переписку, где явно пропустили сообщения, — репорт с приоритетом **High**,
140
    даже без сценария воспроизведения.
141
11. **Проверки после обновления от 21 октября** (на тестовых аккаунтах):
142
    - **Отзыв устройства.** Войдите вторым устройством, скройте один DM
143
      («Remove for me»), затем отзовите второе устройство (**Settings →
144
      Devices**). Во всех чатах, включая скрытый, обычные сообщения должны
145
      идти как раньше, без ошибок и «восстановления». Администратору — то же
146
      при отзыве единственного устройства пользователя.
147
    - **«Стереть историю» после реакции.** В DM попросите собеседника
148
      поставить реакцию на последнее сообщение, затем **Hide and erase** и
149
      откройте чат: «восстановления» и блокировки отправки быть не должно,
150
      удалённые сообщения не возвращаются, в том числе после привязки нового
151
      устройства.
152
    - **Регистрация по инвайту и сразу DM.** Новый пользователь регистрируется
153
      по инвайту, и первым же действием вы пишете ему в DM или добавляете его
154
      в канал — это должно сработать без ожидания.
155
    - **Push на iPhone.** Сообщение, отправленное вами с десктопа, не должно
156
      показываться баннером на iPhone и увеличивать счётчик; сообщение от
157
      собеседника — должно.
158
    - **Все должны обновить клиент** на всех устройствах: сервер и клиенты
159
      этого обновления собраны из одного коммита и проверены только вместе.
160 1 Redmine Admin
161
## Перед началом тестирования
162
163 9 Redmine Admin
1. Установите версию **0.2.5 на все свои устройства** — **сборку от 21
164
   октября** (сервер уже обновлён). Старые сборки 0.2.4 и 0.2.5 от 13 октября
165
   работают с новым сервером, но без новых защит; 0.2.4 к тому же в гонке со
166
   сменой состава будет видеть свои сообщения неотправленными.
167
2. Проверьте номер версии в **Settings → Profile**. Актуальные установщики
168
   (Linux `.deb` / `.rpm` / AppImage, Android APK) и контрольные суммы
169
   выдаёт команда проекта; Windows, macOS и iPhone-сборки появятся отдельно —
170
   пока их не получили, оставайтесь на текущей версии и не пишите об этом баг.
171
   После установки сверьте SHA-256 файла с `SHA256SUMS`.
172 1 Redmine Admin
3. По возможности подготовьте два тестовых аккаунта и два устройства для
173
   одного из аккаунтов. Это позволит проверить доставку, роли и
174
   мультиустройство.
175
4. Не используйте единственный рабочий аккаунт для сценариев с выходом из
176 9 Redmine Admin
   системы и с PIN: logout, **Forgot PIN?** и **Sign-out PIN** безвозвратно
177
   удаляют историю на текущем устройстве.
178
5. Новое устройство, которое должно получить историю, привязывайте через
179
   **Link device** с уже работающего, а не входом по паролю.
180
6. Бета-версия может содержать ошибки. Не отправляйте через неё данные,
181 1 Redmine Admin
   потеря которых будет критичной.
182 5 Redmine Admin
183 1 Redmine Admin
## Как устроено хранение сообщений
184 5 Redmine Admin
185
Green Chat — корпоративный мессенджер со сквозным шифрованием MLS. Сервер
186
хранит сообщения и файлы в зашифрованном виде и не располагает ключами для
187
их чтения.
188
189
Из этого следуют важные ограничения:
190 1 Redmine Admin
191
- история расшифровывается и хранится на устройствах пользователя;
192
- сервер и служба поддержки не могут прочитать переписку или восстановить
193
  уничтоженные ключи;
194
- выход из аккаунта очищает локальную историю и ключи на этом устройстве;
195 5 Redmine Admin
- если выйти со всех устройств, прежнюю историю восстановить будет нельзя;
196 1 Redmine Admin
- для поиска ошибки особенно важны точное время события, участники, канал и
197 8 Redmine Admin
  последовательность действий.
198 5 Redmine Admin
199 1 Redmine Admin
## Что особенно важно проверить в бете 0.2.x
200 6 Redmine Admin
201 9 Redmine Admin
### 1. Обычные сообщения и восстановление соединения (изменено в 0.2.1–0.2.5)
202 1 Redmine Admin
203
- Отправьте сообщения в канал и личный чат.
204
- Проверьте доставку текста, эмодзи, форматирования и ответов в треде.
205
- Полностью отключите сеть на одном из устройств на несколько минут, затем
206
  включите её обратно.
207
- Убедитесь, что клиент подключился самостоятельно и получил сообщения,
208
  отправленные во время офлайна.
209
- Проверьте, что статус online/offline обновляется без повторного открытия
210
  канала.
211
212
Сообщение со статусом `sent`, которое после восстановления соединения так и
213
не появилось у получателя, считается важным багом.
214
215
Для проверки защиты 0.2.3 одновременно отправляйте сообщения и меняйте состав
216 8 Redmine Admin
одного канала с двух устройств. Постоянная ошибка расшифровки, бесконечная
217
синхронизация или невозможность продолжить отправку после переподключения —
218
важный баг.
219
220
Отдельно проверьте новое в 0.2.4: держите чат **открытым**, пока сообщение
221
догружается фоновой сверкой (например, оборвав и вернув сеть у отправителя).
222
Сообщение должно появиться в самом открытом чате и в открытой панели треда, а
223
не только в счётчике и всплывающем уведомлении.
224
225 9 Redmine Admin
**Новое в 0.2.5 — гонка со сменой состава.** Пишите в приватный канал с
226
нескольких устройств, пока кто-то добавляет или удаляет участника. Раньше
227
сообщение, зашифрованное ровно в момент смены состава, могло молча пропасть на
228
одном из устройств получателя (репорт от 18.08). Теперь сервер такое сообщение
229
отклоняет, а клиент перешифровывает и отправляет его заново сам; рядом с ним
230
может на секунду мелькнуть **Failed**, а если повтор не удался — останется
231
**Retry**. Сообщение, которого нет на одном устройстве человека, но есть на
232
другом, — баг **High**. Также не должно быть ложных «You were removed from …»
233
и строк «A member was added/removed» десятками подряд.
234
235
Самый опасный класс багов беты — **тихая остановка доставки**:
236 5 Redmine Admin
приложение выглядит рабочим, ошибок нет, счётчик непрочитанных показывает ноль,
237 8 Redmine Admin
а сообщения при этом не приходят. Если вы заметили, что пропустили сообщения в
238
какой-то переписке, заводите репорт с приоритетом **High** даже без сценария
239
воспроизведения — укажите канал, обе стороны и примерное время, когда доставка
240
ещё работала. Группа, надолго застрявшая на баннере «Restoring secure
241 5 Redmine Admin
access…», — тот же класс проблемы.
242
243 9 Redmine Admin
### 2. Треды (новое в 0.2.0, семантика изменена в 0.2.5)
244 8 Redmine Admin
245 9 Redmine Admin
> **Важно: раздел «Треды» теперь показывает только ваши треды.** Раньше туда
246
> попадали все обсуждения из всех ваших чатов, включая те, где вы не
247
> участвовали (репорт от 19.08). Теперь работает правило Mattermost:
248
>
249
> - вы подписаны на тред, если написали его исходное сообщение, ответили в
250
>   нём или вас в нём упомянули через `@`;
251
> - подписку можно поставить и снять вручную — кнопка **Follow / Following**
252
>   в шапке панели треда, пункт **Follow thread** в контекстном меню
253
>   сообщения и кнопка **Unfollow** в строке списка;
254
> - отписка не отменяется чужими ответами, но новое `@`-упоминание вернёт
255
>   тред в список;
256
> - **ответы в тредах больше не подсвечивают канал в сайдбаре.** Непрочитанные
257
>   ответы живут только в разделе «Треды» и только для подписанных тредов —
258
>   это не потеря сообщений, а перенос сигнала. Канал жирнеет от новых
259
>   сообщений основной ленты.
260
>
261
> Известное расхождение: на телефон push может прийти на ответ в треде, на
262
> который вы не подписаны — сервер по определению не знает про треды, а
263
> расширение уведомлений iOS не может отменить уже доставленный баннер.
264
> В приложении такой ответ не даст ни бейджа, ни попапа.
265
266 8 Redmine Admin
- Создайте несколько тредов в разных каналах.
267
- Откройте раздел **Threads** и проверьте сортировку по последней активности.
268 9 Redmine Admin
- Убедитесь, что чужого треда (вы не автор, не отвечали, не упомянуты) в
269
  списке **нет**, а после вашего ответа он там появляется.
270
- Нажмите **Follow** в панели чужого треда — он должен появиться в списке;
271
  **Unfollow** на своём — исчезнуть, но вернуться после `@`-упоминания.
272
- Переключите фильтры **All your threads** и **Unreads**.
273 6 Redmine Admin
- Нажмите на тред в списке и убедитесь, что открылись правильный канал и
274
  исходное сообщение.
275 5 Redmine Admin
- Ответьте с `@mention`, добавьте вложение или перетащите файл в область
276 1 Redmine Admin
  ответа.
277 5 Redmine Admin
- **Новое в 0.2.4:** отправьте ответ в открытом треде — он должен сразу
278
  оказаться в поле зрения, без ручной прокрутки вниз. Затем прокрутите тред
279
  к старым ответам и попросите другого тестера ответить: чужой ответ **не
280
  должен** перебивать чтение и утаскивать вас вниз.
281 1 Redmine Admin
- При наличии второго устройства проверьте синхронизацию прочитанности
282
  тредов.
283
284 8 Redmine Admin
### 3. Роли и участники каналов (новое в 0.2.0, изменено в 0.2.4)
285
286
Для полноценной проверки нужны минимум три аккаунта: владелец, модератор и
287 1 Redmine Admin
обычный участник.
288
289
**Важное изменение 0.2.4: модераторов в публичных каналах больше нет.** Роль
290 5 Redmine Admin
там ничего не давала — исключать участников в публичном канале запрещено, а
291
приглашать может любой. Проверьте отдельно:
292 1 Redmine Admin
293 5 Redmine Admin
- в публичном канале бейджа MODERATOR нет ни у кого, даже если роль выдавалась
294 1 Redmine Admin
  раньше, и выдать её заново нельзя;
295 5 Redmine Admin
- owner публичного канала может выйти, **не назначая** преемника: владение
296
  переходит самому раннему участнику автоматически;
297
- в приватном канале роль moderator работает как прежде.
298
299
Ещё одно изменение 0.2.4 — **живое обновление**: выдача роли или добавление
300
участника с одного устройства должны быть видны остальным сразу, без
301
перезапуска приложения. Список участников, который сходится только после
302
релоада, — баг.
303 1 Redmine Admin
304 5 Redmine Admin
1. Создайте приватный канал и пригласите двух участников.
305
2. Убедитесь, что создатель отмечен как owner.
306 1 Redmine Admin
3. Назначьте одного участника модератором и затем снимите роль.
307 5 Redmine Admin
4. Проверьте, что owner может приглашать и исключать участников.
308 1 Redmine Admin
5. Проверьте, что moderator может управлять обычными участниками, но не
309
   владельцем или другим модератором.
310 5 Redmine Admin
6. Исключите обычного участника: канал должен сразу исчезнуть у него из
311
   интерфейса, а новые сообщения не должны быть доступны.
312
7. Повторно пригласите участника и убедитесь, что устаревшее событие удаления
313 1 Redmine Admin
   не убирает канал снова.
314 5 Redmine Admin
8. Обычным участником публичного канала пригласите нового пользователя через
315 1 Redmine Admin
   **Add member**. Приглашённый должен получить канал без доступа к сообщениям,
316
   отправленным до его вступления.
317
318
Дополнительно можно проверить выход из канала:
319
320
- обычный участник и модератор могут выйти самостоятельно;
321
- в **приватном** канале owner с другими участниками должен сначала назначить
322
  модератора, и при выходе владение переходит именно ему;
323
- в **публичном** канале (изменено в 0.2.4) owner выходит без назначения:
324 8 Redmine Admin
  владение переходит самому раннему активному участнику;
325 5 Redmine Admin
- из DM выйти нельзя, но его можно скрыть через **Remove for me**;
326
- в публичный канал может приглашать любой участник, но исключение участника
327 6 Redmine Admin
  недоступно, поскольку он может вступить обратно самостоятельно.
328
329 5 Redmine Admin
### 4. Профили (новое в 0.2.0)
330 3 Redmine Admin
331 5 Redmine Admin
- Заполните аватар, должность, описание и рабочий телефон.
332
- Откройте карточку профиля из сообщения и панели участников.
333
- Проверьте копирование email и телефона.
334
- Измените аватар или данные профиля на одном устройстве и убедитесь, что
335
  изменения появились у другого пользователя без перезапуска приложения.
336
337
Поля профиля видны всем пользователям организации — это справочная информация,
338
а не приватная часть переписки.
339 1 Redmine Admin
340 8 Redmine Admin
### 5. Поиск и действия с сообщениями
341
342
- Найдите старое сообщение через поиск и перейдите к нему.
343
- Убедитесь, что чат прокрутился к правильному сообщению и выделил его.
344
- Проверьте доступные контекстные действия: ответ, редактирование, сохранение,
345
  закрепление и удаление там, где они разрешены.
346
- Отредактируйте длинное сообщение и ответ в треде: поле ввода должно
347 1 Redmine Admin
  увеличиваться вместе с текстом.
348
- Попробуйте превысить допустимую длину сообщения. Клиент должен показать
349
  понятное ограничение, а не зависнуть или молча потерять текст.
350 9 Redmine Admin
- **Новое в 0.2.5:** наведите мышь на реакцию (на телефоне — долгое нажатие):
351
  должен появиться список тех, кто её поставил.
352
- **Новое в 0.2.5:** начните править сообщение в одном чате и переключитесь в
353
  другой — правка не должна «переехать» туда. Неотправленное или упавшее
354
  сообщение должно остаться на месте после переключения чатов.
355
- **Новое в 0.2.5:** в меню сообщения есть **Copy text**.
356 1 Redmine Admin
357 5 Redmine Admin
Поиск работает по локально доступной истории устройства. Отсутствие сообщения,
358 1 Redmine Admin
которого никогда не было на этом устройстве, само по себе не является багом.
359
360
### 6. Файлы, изображения и GIF (расширено в 0.2.0, изменено в 0.2.4)
361
362
- выберите файл через кнопку вложения и убедитесь, что он сначала появился в
363
  области подготовки к отправке;
364
- удалите подготовленный файл, не отправляя сообщение;
365
- перетащите файлы в основной чат и отдельно в открытый тред;
366
- вставьте изображение из буфера обмена;
367
- отправьте несколько файлов и проверьте, что они остались в исходном чате,
368
  даже если во время загрузки переключиться на другой канал;
369
- откройте изображение во встроенном просмотрщике;
370
- проверьте воспроизведение GIF и отсутствие чрезмерной нагрузки интерфейса;
371
- удалите собственное сообщение с вложением и убедитесь, что файл больше не
372
  доступен из чата;
373
- скачайте файл и проверьте его содержимое после расшифровки.
374
- на Android выберите документ или изображение системным picker и отправьте
375
  его сначала в чат, затем в открытый тред.
376
- **новое в 0.2.4, Android:** сохраните **присланный** файл через системный
377 5 Redmine Admin
  диалог выбора папки и откройте его штатным приложением. Раньше это
378
  заканчивалось ошибкой `save path: …`;
379
- **новое в 0.2.4, Android:** снимите фото кнопкой 📷 в поле ввода и отправьте
380
  его. Снимок не должен появиться в галерее телефона, а отмена съёмки не должна
381
  оставлять пустое вложение;
382
- **новое в 0.2.4, Windows:** после выхода компьютера из сна откройте
383
  изображение во встроенном просмотрщике. Раздвоенная картинка или мигающие
384
  полосы прокрутки — баг.
385
386
Ошибки загрузки, повреждённый скачанный файл, вложение в неправильном канале
387 1 Redmine Admin
или зависшая подготовка файла считаются багами.
388
389
### 7. Сохранённые сообщения и загрузки (новое в 0.2.0)
390
391
- Сохраните сообщения из разных каналов через контекстное меню.
392
- Откройте раздел **Saved**, перейдите из него к исходному сообщению и удалите
393 8 Redmine Admin
  закладку.
394 1 Redmine Admin
- При наличии второго устройства проверьте, что список сохранённых сообщений
395
  синхронизировался.
396
- Скачайте несколько файлов и откройте раздел **Downloads**.
397
- Проверьте действия **Open file**, **Show in folder** и
398
  **Remove from history**.
399
400
Сохранённые сообщения синхронизируются между устройствами и видны только
401
владельцу аккаунта. История загрузок хранится только на конкретном устройстве.
402
Удаление записи из Downloads не удаляет сам файл с диска. Файлы, скачанные до
403
установки 0.2.0, в историю автоматически не добавляются.
404
405 9 Redmine Admin
### 8. Уведомления и звук (изменено в 0.2.2–0.2.5)
406 1 Redmine Admin
407 9 Redmine Admin
**Изменено в 0.2.5 — служебные события больше не будят.** Правка, удаление,
408
реакция и закрепление сообщения, а также смена названия группы приходят без
409
push, попапа и email. Проверьте: пока ваше приложение свёрнуто, собеседник
410
ставит реакцию, правит и удаляет сообщение — уведомлений быть не должно; новое
411
сообщение — уведомляет как раньше. Строк «encryption keys rotated» в ленте
412
больше нет.
413
414 1 Redmine Admin
- Перед проверкой убедитесь, что в **Settings → Notifications** выключен
415 5 Redmine Admin
  **Pause all notifications**: включённый тумблер намеренно отключает попапы
416 1 Redmine Admin
  и звук, при этом сообщения и счётчики продолжают приходить. Кнопка
417 5 Redmine Admin
  **Send test** проверяет только доставку до операционной системы и работает
418
  даже при включённой паузе.
419
- В **Settings → Notifications** нажмите **Send test**.
420 1 Redmine Admin
- Оставьте окно приложения без фокуса и попросите другого тестера отправить
421
  DM — должен появиться системный попап и прозвучать звук.
422 5 Redmine Admin
- Полностью сверните окно или скройте его в tray и попросите отправить ещё
423 1 Redmine Admin
  один DM: попап и звук должны прийти, не открывая окно, а после открытия
424
  счётчики и сами сообщения должны уже быть на месте без ручного обновления.
425
- Проверьте `@mention` в канале. Обычное сообщение без упоминания по умолчанию
426
  не показывает попап.
427
- Отключите звук в настройках и убедитесь, что новые сообщения приходят без
428
  звукового сигнала.
429
- Проверьте DND, mute канала и quiet hours.
430
- Полностью закройте приложение через tray → **Quit**, отправьте на аккаунт
431
  DM и проверьте email-уведомление, если SMTP включён на сервере.
432
433
Попапы показывает запущенное приложение. После полного выхода через **Quit**
434
desktop-клиент не может показать системное уведомление; в этом случае для DM
435
может прийти только email.
436
437
На Android 13+ разрешите уведомления при первом запуске. Сверните приложение,
438
отправьте DM с другого аккаунта и проверьте push, догрузку сообщения и переход
439 5 Redmine Admin
по тапу. Push требует Google Play services и не приходит после принудительной
440 9 Redmine Admin
остановки приложения через системные настройки. **Новое в 0.2.5:** звук должен
441
быть у каждого push, а не только у первого (подряд в пределах 30 секунд —
442
намеренно без звука).
443 8 Redmine Admin
444 9 Redmine Admin
Письма о пропущенном DM и о смене пароля с 0.2.5 приходят без кнопки «Open
445
glchat» — это намеренно.
446
447 1 Redmine Admin
На macOS в 0.2.4 уведомления перешли на системный механизм: попап должен
448 8 Redmine Admin
приходить от имени **Green Chat** с правильной иконкой, а само приложение —
449
появиться в списке «Системные настройки → Уведомления». Попап от имени
450 5 Redmine Admin
**Script Editor**, отсутствие приложения в этом списке или молчание при
451 1 Redmine Admin
разрешённых уведомлениях ОС — баг.
452
453 9 Redmine Admin
### 9. Несколько устройств (изменено в 0.2.4 и 0.2.5)
454 1 Redmine Admin
455 9 Redmine Admin
> **Важно с 0.2.5: историю получает только устройство, привязанное через
456
> Link device.** Новое устройство, привязанное QR-кодом или кодом с уже
457
> работающего, получает историю за последние 30 дней, как раньше. Устройство,
458
> вошедшее по **паролю** (вкладка **Sign in**), получает **только новые
459
> сообщения** — так пароль, сброшенный администратором, больше не открывает
460
> прошлую переписку. Это не баг, а новое правило.
461
462
- **Новое в 0.2.5:** войдите на новое устройство по паролю. Истории там быть
463
  не должно, а на остальных ваших устройствах должно появиться предупреждение
464
  «New device “…” signed in with your password…». В **Settings → Devices**
465
  у этого устройства — пометка «Signed in with password».
466
- **Новое в 0.2.5:** привяжите ещё одно устройство через **Link device**:
467
  история должна прийти, пометка в Devices — «Linked from another device».
468
- **Новое в 0.2.5:** смените пароль на одном устройстве — остальные должны
469
  сообщить «Your password was changed on another device.»
470
- Привяжите второе устройство по QR-коду или войдите по паролю.
471 8 Redmine Admin
- Создайте приватный канал и пригласите пользователя с несколькими активными
472 1 Redmine Admin
  устройствами.
473
- Убедитесь, что канал, его название и новые сообщения появились на всех
474
  устройствах приглашённого.
475
- Проверьте синхронизацию прочитанности, черновиков, сохранённых сообщений и
476 8 Redmine Admin
  скрытых чатов.
477
- Измените аватар и убедитесь, что он обновился на других клиентах.
478 1 Redmine Admin
- Закройте одно устройство, продолжите работу на втором, затем верните первое
479
  в сеть и проверьте восстановление состояния.
480 8 Redmine Admin
- **Новое в 0.2.4 — статусы на свежепривязанном устройстве.** Сразу после
481
  привязки второго устройства, не дожидаясь пока оно «прогреется», посмотрите
482
  на точки присутствия собеседников и попросите кого-нибудь отключить и
483
  включить сеть. Раньше новое устройство не получало обновлений присутствия,
484
  пока восстановление членства не дойдёт до каждого общего канала: сообщения
485
  приходили, а точка оставалась серой сколь угодно долго. Серый статус у
486
  человека, от которого прямо сейчас приходят сообщения, — баг.
487
488 9 Redmine Admin
### 10. Android и iPhone (изменено в 0.2.5)
489 1 Redmine Admin
490 9 Redmine Admin
Новое в 0.2.5:
491
492
- Тапните ссылку в сообщении — она должна открыться в системном браузере
493
  (раньше на Android ничего не происходило, репорт №58).
494
- **iPhone:** долгое нажатие на сообщение открывает меню действий, долгое
495
  нажатие на чат в списке — меню **Leave the channel / Remove for me**.
496
  Выход из канала и исключение участника должны доходить до конца после
497
  подтверждения (раньше диалог молча отвечал «нет»).
498
- **iPhone:** потяните Центр уведомлений или Пункт управления и верните
499
  приложение — собеседники не должны видеть вас «отошёл».
500
- Если приложение открылось на форме входа, хотя аккаунт на телефоне был
501
  (репорт №63), — это по-прежнему баг, но теперь лечится без переустановки:
502
  приложение предложит **Sign out this device**. Сообщите о таком случае,
503
  даже если помог повтор.
504
- Данные приложения больше не попадают в облачную резервную копию телефона.
505
  После переустановки или восстановления телефона из бэкапа аккаунт и история
506
  не вернутся — привяжите устройство заново через **Link device**.
507
508
Android, сценарии прошлых версий:
509
510 1 Redmine Admin
- Установите universal APK на Android 7 или новее и проверьте, что приложение
511
  называется **Green Chat** и показывает новую иконку.
512
- Проверьте вход по паролю, привязку по QR и ручной ввод кода.
513
- Откройте клавиатуру в чате и треде: поле ввода и нижние кнопки должны
514
  оставаться видимыми.
515
- На устройстве с вырезом или жестовой навигацией проверьте верхнюю навигацию,
516
  боковые панели, Threads и Devices. Список чатов должен занимать всю ширину
517
  экрана — серой полосы справа быть не должно.
518
- Выберите документ и изображение системным picker, отправьте их в чат и тред,
519
  затем скачайте и откройте на втором устройстве.
520
- **Новое в 0.2.4:** сохраните присланный файл через системный диалог выбора
521
  папки. Ошибка `save path: …` — баг. В истории загрузок на Android действия
522
  **Open file** и **Show in folder** намеренно скрыты: система не даёт клиенту
523
  пути к сохранённому документу.
524
- **Новое в 0.2.4:** снимите фото кнопкой 📷 в поле ввода и отправьте его.
525
  Проверьте отдельно отмену съёмки и отказ в разрешении на камеру — оба случая
526
  должны давать понятное сообщение, а не пустое вложение или зависание. На
527
  устройстве без камеры кнопки быть не должно.
528
- Сверните приложение, получите push и откройте сообщение по тапу без ручного
529
  обновления.
530
- Заблокируйте экран телефона и попросите собеседника посмотреть ваш статус:
531
  через некоторое время вы должны стать «отошёл», затем «офлайн», а не
532
  оставаться «онлайн».
533
534
Удаление Android-приложения удаляет локальную историю и ключи этого устройства.
535
Не переустанавливайте его во время сценария, если на аккаунте нет другого
536
активного устройства.
537
538
### 11. Выход со всех устройств (новое в 0.2.0)
539
540
Этот сценарий выполняйте только на специально созданном тестовом аккаунте.
541
Перед выходом убедитесь, что клиент подключён к серверу.
542
543
1. Выйдите из аккаунта на последнем активном устройстве и подтвердите
544
   предупреждение об удалении истории.
545
2. У другого пользователя аккаунт должен получить отметку **Logged out** в
546 6 Redmine Admin
   списке DM, профиле, панели участников и выборе пользователя.
547
3. В существующем DM история должна остаться читаемой, но поле отправки должно
548
   замениться предупреждением.
549
4. Создание нового DM с вышедшим пользователем должно быть заблокировано. Это
550
   **не** то же самое, что новый коллега, который ещё ни разу не заходил (§12):
551
   вышедший потерял ключи безвозвратно и писать ему действительно нельзя, а
552
   новому — можно всегда.
553
5. Отправьте в канал сообщение с его персональным `@mention`: сообщение
554
   должно отправиться остальным участникам, а автор должен увидеть
555
   предупреждение о недоставке упомянутому пользователю.
556
6. Снова войдите этим аккаунтом. Отметка Logged out должна исчезнуть у других
557 1 Redmine Admin
   пользователей.
558
559
Повторный вход создаёт новое активное устройство, но не возвращает историю,
560
уничтоженную при logout.
561 8 Redmine Admin
562
### 12. Письмо коллеге, который ещё не заходил (новое в 0.2.4)
563 1 Redmine Admin
564
Главное изменение выпуска. До 0.2.4 попытка написать новому сотруднику
565
заканчивалась красной ошибкой `404 no key_packages` — диалог не открывался
566
вообще, и написать было нельзя, пока коллега не напишет первым.
567
568
Для проверки нужен аккаунт, **в который ещё ни разу не входили** ни на одном
569
устройстве. Попросите администратора завести его и не открывайте.
570
571
1. Найдите этого человека в списке пользователей и откройте с ним DM. Диалог
572 8 Redmine Admin
   должен открыться, поле ввода — быть доступным.
573
2. Над полем ввода должна появиться плашка «*Имя* hasn't joined this
574 6 Redmine Admin
   conversation yet — your messages will be sent automatically once they sign
575
   in».
576
3. Отправьте несколько сообщений. Они должны приниматься, а отметка доставки
577
   рядом с ними — оставаться честной: `✓✓` в этом состоянии не ставится.
578 5 Redmine Admin
4. Войдите этим аккаунтом на любом устройстве.
579 4 Redmine Admin
5. Отправленные ранее сообщения должны дойти **сами**, без повторной отправки с
580 5 Redmine Admin
   вашей стороны, а плашка — исчезнуть.
581
582 1 Redmine Admin
Дополнительно стоит проверить сценарий «человек в отпуске»: аккаунт, который
583 8 Redmine Admin
давно не выходил в сеть, но раньше работал. Написать ему тоже должно быть
584
можно.
585
586
Любая техническая ошибка вместо диалога, навсегда застрявшая плашка после входа
587
собеседника или потерянные сообщения из очереди — важный баг с приоритетом
588
**High**.
589
590 9 Redmine Admin
С 0.2.5 то же касается DM, из которого выпало **ваше** устройство (репорты №60
591
и №62): вместо красной ошибки в шапке появляется баннер о переподключении
592
разговора, а сообщения ждут в очереди с отметкой **⏳ queued** и уходят сами,
593
когда собеседник появится в сети.
594
595
### 13. PIN-блокировка (новое в 0.2.5)
596
597
Выполняйте на тестовом аккаунте: **Forgot PIN?** и **Sign-out PIN** стирают
598
историю на устройстве безвозвратно.
599
600
1. Откройте **Profile → App lock** и включите PIN из 4–12 цифр. Должна
601
   появиться строка «App lock is on. The PIN will be asked the next time the
602
   app starts.»
603
2. Полностью закройте приложение (на десктопе — tray → **Quit**) и запустите
604
   снова. До ввода PIN не должно быть видно ни чатов, ни сообщений, ни их
605
   текста в уведомлениях.
606
3. Сверните и разверните приложение, не закрывая его: PIN **не** должен
607
   спрашиваться — он нужен только при запуске.
608
4. Введите неверный PIN несколько раз: пауза перед следующей попыткой должна
609
   расти, а данные — не стираться.
610
5. Пока приложение заблокировано, попросите собеседника написать вам: на
611
   десктопе уведомление должно прийти без отправителя и текста («New message —
612
   Unlock the app to read it»). После ввода PIN сообщение уже в ленте.
613
6. Задайте **Sign-out PIN** (он должен отличаться от основного), перезапустите
614
   приложение и введите его: устройство выходит из аккаунта, история
615
   стирается. Отдельно проверьте **Forgot PIN?** — то же самое, с
616
   подтверждением.
617
7. Смените и выключите PIN: это возможно только с вводом текущего PIN.
618
619
PIN — защита от человека, взявшего ваш разблокированный компьютер или телефон,
620
а не шифрование данных. Он хранится только на этом устройстве и удаляется при
621
выходе из аккаунта. На iPhone при включённом PIN текст в уведомлениях не
622
показывается никогда.
623
624
Способ увидеть переписку до ввода PIN, PIN, переживший выход из аккаунта, или
625
стирание истории без явного действия — баг **High**.
626
627
### 14. Отключение аккаунта администратором (новое в 0.2.5)
628
629
Нужен администратор сервера: попросите команду или проверьте вместе с ней.
630
631
1. Администратор отключает тестовый аккаунт B, с которым у вас есть DM и общий
632
   приватный канал.
633
2. У вас в DM с B должна появиться пометка «This account is deactivated by an
634
   administrator». Напишите B — сообщение должно встать в очередь
635
   (**⏳ queued**), а не упасть с ошибкой.
636
3. Напишите в общий канал: B не должен получить это сообщение ни на одном
637
   своём устройстве, даже если устройство осталось у него в руках.
638
4. Администратор включает B обратно. B должен сам вернуться в свои каналы, а
639
   ваше сообщение из очереди DM — дойти. Сообщения канала, написанные пока B
640
   был отключён, ему недоступны — так задумано.
641
642 1 Redmine Admin
## Что обязательно считать багом
643
644
- Падение, зависание или бесконечная загрузка приложения.
645
- Потеря уже отправленного сообщения или его появление в неправильном чате.
646
- Ошибка расшифровки, нечитаемый текст или повреждённый файл.
647
- Получение доступа к чужому каналу, профилю или данным без разрешения.
648
- Возможность обычного участника выполнить действие owner/moderator.
649
- Доступ исключённого участника к новым сообщениям приватного канала.
650
- Расхождение каналов, ролей, сохранённых сообщений или прочитанности между
651
  устройствами, которое не исправляется после переподключения.
652
- Отсутствие DM или `@mention`-уведомления при выполненных условиях доставки.
653
- Неправильный адресат, канал или тред у вложения.
654
- **Тихо прекратившаяся доставка**: сообщения перестали приходить, при этом
655
  приложение выглядит рабочим, ошибок нет, а счётчик непрочитанных показывает
656
  ноль. Обнаруживается обычно постфактум — «оказалось, мне писали».
657
- Группа, надолго застрявшая на баннере «Restoring secure access…».
658
- Техническая ошибка вместо открытого диалога при попытке написать коллеге.
659 9 Redmine Admin
- Сообщение, которое есть на одном устройстве человека и отсутствует на
660
  другом.
661
- «You were removed from …», когда вас никто не исключал.
662
- Переписка, видимая до ввода PIN, или история, стёртая без вашего явного
663
  действия.
664
- История, пришедшая на устройство, вошедшее по паролю, или отсутствие
665
  предупреждения о таком входе на ваших остальных устройствах.
666
- Отключённый пользователь, получивший новое сообщение канала.
667
- Push или попап на реакцию, правку или удаление сообщения.
668 1 Redmine Admin
- Неработающая кнопка, обрезанный интерфейс или нечитаемый текст, особенно в
669
  тёмной теме.
670
671
Проблемы безопасности, потерю данных и воспроизводимые падения отмечайте
672
приоритетом **High**.
673
674
## Известные ограничения беты
675
676
- Вход обычно доступен только по приглашению; вкладки создания свободного
677
  аккаунта может не быть.
678
- Автоматического обновления нет — новую версию нужно устанавливать вручную.
679
- Windows может показать SmartScreen с предупреждением о неизвестном
680
  издателе.
681
- Начиная с 0.2.4 релизные macOS-сборки подписаны Developer ID — Gatekeeper
682
  не должен их блокировать. Если вам досталась неподписанная сборка и она
683
  заблокирована, после переноса приложения в `/Applications` выполните:
684
685
  ```sh
686
  xattr -cr "/Applications/Green Chat.app"
687
  ```
688
689
- Атрибуция попапов от имени **Script Editor** на macOS исправлена в 0.2.4 для
690
  собранного приложения. Она остаётся только при запуске из исходников через
691
  `pnpm tauri dev` — этому режиму нечего предъявить системе как приложение.
692
- На части серверов отправка файлов и email-уведомления могут быть отключены.
693
- Числовой бейдж учитывает DM и упоминания; обычное непрочитанное сообщение в
694
  канале отображается точкой.
695
- Сообщение `SPKI pin mismatch` после плановой смены серверного ключа требует
696
  повторного входа. Клиент намеренно не принимает новый ключ молча.
697 9 Redmine Admin
- Android APK 0.2.5 остаётся debug-сборкой: релизного ключа подписи у беты нет,
698 1 Redmine Admin
  в Play она не публикуется, ставится вручную и может вызвать предупреждение
699
  Play Protect о неизвестном разработчике.
700
- Фоновые Android-уведомления требуют Google Play services и настроенный push
701
  relay. На HMS/чистом AOSP и после Force stop сообщения появятся только после
702
  ручного открытия приложения.
703
- Сообщения, ждущие в очереди коллеге, который ещё не вошёл (§12), хранятся
704
  **на отправляющем устройстве**. Logout на нём до входа получателя эту очередь
705
  уничтожает.
706
- Резервный ключ приглашения, который делает DM доступными всегда, немного
707
  ослабляет forward secrecy **первого** приглашающего конверта — до первого
708
  изменения в группе. Содержимое сообщений это не затрагивает; разбор принятой
709
  цены — в [ADR-0028](ADR-0028-dm-availability-last-resort-keypackages.md).
710 9 Redmine Admin
- Устройство, вошедшее по паролю, не получает историю (с 0.2.5, §9). Чтобы
711
  перенести историю на новое устройство, привязывайте его через **Link
712
  device**.
713
- PIN-блокировка — только экран при запуске приложения, а не шифрование
714
  данных; PIN не синхронизируется между устройствами (§13).
715
- Push на телефон может прийти на ответ в треде, на который вы не подписаны:
716
  сервер не знает про треды. В приложении такой ответ не даёт ни попапа, ни
717
  бейджа.
718
- Данные приложения не попадают в облачные бэкапы телефона: восстановление
719
  телефона из бэкапа не вернёт аккаунт и историю.
720 1 Redmine Admin
- iOS-сборка распространяется отдельно и требует приглашения в TestFlight;
721
  минимальная версия — iOS 15.0.
722
723
Если поведение не перечислено здесь и выглядит неправильным, лучше отправить
724
репорт.
725
726
## Полный changelog всех версий 0.2.x
727
728
Ниже release notes приведены полностью, от текущей версии к самой ранней.
729
Отдельные файлы по ссылкам в начале памятки содержат тот же текст.
730
731 9 Redmine Admin
### Green Chat 0.2.5 — Beta Update
732
733
Дата сборки: **13 октября 2026 года**.
734
735
Предыдущая сборка, которую получали тестировщики, — **0.2.4 от 17 августа
736
2026 года**. Всё перечисленное ниже для них новое: исправления по бета-репортам
737
18–20 августа (№58–№63), полное ревью кода всех слоёв от 29 сентября (около 70
738
находок, исправлены все) и запрос на более тихие уведомления и блокировку
739
приложения PIN-кодом.
740
741
Главное в 0.2.5 — сообщения больше не теряются молча при одновременной смене
742
состава группы, раздел «Треды» показывает только ваши треды, появилась
743
PIN-блокировка, а история переписки больше не передаётся устройству, которое
744
вошло по одному лишь паролю.
745
746
**Обновите все устройства.** Сервер 0.2.5 строже проверяет порядок сообщений и
747
смен состава: клиент 0.2.4 в такой гонке увидит своё сообщение неотправленным.
748
749
#### Сообщения больше не теряются молча
750
751
Бета-репорт 18 августа: ссылка, отправленная в приватный канал, не дошла до
752
iPhone одного из участников, хотя на его же Mac и у всех остальных она была.
753
Сообщение было зашифровано в момент, когда в группе одновременно менялся состав;
754
устройство получило смену состава раньше сообщения, не смогло его расшифровать,
755
приняло это за повреждение группы и молча пропустило сообщение навсегда.
756
757
- **Сервер следит за порядком.** Сообщение, зашифрованное до смены состава,
758
  которую сервер уже принял, отклоняется. Клиент перешифровывает его и
759
  отправляет заново сам; если повтор не удался — сообщение помечается
760
  **Failed** с кнопкой **Retry**, а не считается доставленным, когда часть
761
  получателей его не видит
762
  ([ADR-0029](ADR-0029-stale-epoch-gate.md)).
763
- **Ложное «You were removed from …» и качели добавления/удаления.** Плановое
764
  восстановление устройства больше не выглядит для клиента как исключение:
765
  канал не исчезает и не возвращается без истории, лента не заполняется
766
  десятками строк «A member was added/removed». Исключённый участник больше не
767
  возвращается в канал через механизм восстановления
768
  ([ADR-0030](ADR-0030-membership-loss-proof.md)).
769
- **Дыра в синхронизации.** Если живое сообщение приходило раньше
770
  предшествующих, клиент мог перескочить через пропущенные — и они терялись
771
  без следа. Теперь пропуск догружается по порядку.
772
- Повторное получение уже расшифрованного сообщения больше не считается
773
  признаком повреждения группы — меньше ложных восстановлений «Restoring secure
774
  access…».
775
- Испорченное сообщение пропускается с отметкой, а не останавливает приём
776
  всего, что идёт за ним.
777
778
#### Личные сообщения: очередь вместо ошибки
779
780
Репорты №60 и №62 от 20 августа: попытка написать коллеге заканчивалась красной
781
строкой `Direct message is still syncing to this device` или `MLS state recovery
782
is in progress; sending is blocked until a fresh Welcome arrives` — и только с
783
одним конкретным человеком. Это одна и та же ситуация с двух сторон: ваше
784
устройство выпало из своего же DM, а вернуть его может только собеседник,
785
который в этот момент офлайн.
786
787
- **DM открывается всегда, поле ввода работает.** Пока устройство ждёт
788
  возвращения в разговор, в шапке висит спокойный баннер, а сообщения ждут в
789
  очереди и уходят сами сразу после возвращения — без ожидания фоновой сверки.
790
- Красная строка под полем ввода теперь означает только проблемы сети.
791
- Сообщения в очереди помечены **⏳ queued**; подсказка при наведении
792
  объясняет, чего они ждут, и что отправятся сами.
793
- «Ещё ни разу не заходил» и «вышел со всех устройств» больше не путаются:
794
  первому писать можно всегда, второму — нельзя, и интерфейс говорит об этом
795
  правильно.
796
797
Подробности — [ADR-0032](ADR-0032-dm-rejoin-queue.md).
798
799
#### Треды — только ваши
800
801
Репорт №59 от 19 августа: в разделе «Треды» появилось обсуждение, в котором
802
тестер не участвовала. Раздел работает теперь по правилу Mattermost
803
([ADR-0031](ADR-0031-followed-threads.md)):
804
805
- вы подписаны на тред, если написали исходное сообщение, ответили в нём или
806
  вас упомянули через `@`;
807
- подписку можно поставить и снять вручную: **Follow / Following** в шапке
808
  панели треда, **Follow thread** в меню сообщения, **Unfollow** в списке;
809
- отписку не отменяют чужие ответы, но новое `@`-упоминание вернёт тред;
810
- **ответы в тредах больше не делают канал жирным в сайдбаре.** Непрочитанные
811
  ответы живут в разделе «Треды» и учитываются в бейдже приложения. Это не
812
  потеря сообщений, а перенос сигнала.
813
814
Push на телефон может прийти и на ответ в неподписанном треде: сервер про треды
815
не знает. В самом приложении такой ответ не даст ни попапа, ни бейджа.
816
817
#### Новое: блокировка приложения PIN-кодом
818
819
В **Profile → App lock** можно включить PIN из 4–12 цифр
820
([ADR-0035](ADR-0035-app-lock-pin.md)). По умолчанию выключено.
821
822
- PIN спрашивается **при запуске приложения** — не по таймеру и не при каждом
823
  возврате из фона.
824
- Неверный PIN — нарастающая пауза перед следующей попыткой. Автоматического
825
  стирания нет.
826
- **Forgot PIN?** на экране блокировки выводит это устройство из аккаунта и
827
  удаляет его локальную историю.
828
- Дополнительно можно задать **Sign-out PIN** — отдельный код, который,
829
  введённый на экране блокировки, выводит устройство из аккаунта и стирает
830
  историю. Он обязан отличаться от основного.
831
- Под экраном блокировки приложение продолжает принимать сообщения, поэтому
832
  после ввода PIN лента уже свежая. Пока приложение заблокировано, уведомления
833
  на десктопе приходят **без отправителя и текста** («New message — Unlock the
834
  app to read it»). На iPhone при включённом PIN уведомления всегда generic
835
  «New message»: расширение уведомлений не знает, разблокировано ли
836
  приложение. На Android уведомления и так generic.
837
- PIN — защита от человека, взявшего в руки разблокированный компьютер или
838
  телефон, а не шифрование данных. PIN хранится только на этом устройстве и
839
  удаляется при выходе из аккаунта.
840
841
#### Тише уведомления
842
843
- **Нет push и email на служебные события:** правку, удаление, реакцию,
844
  закрепление сообщения, смену названия группы и синхронизацию между своими
845
  устройствами ([ADR-0034](ADR-0034-silent-service-envelopes.md)).
846
- Строки «encryption keys rotated» больше не появляются в ленте; уже
847
  сохранённые удаляются при первом запуске.
848
- **Android:** звук был только у первого push — все следующие приходили
849
  беззвучно, пока не смахнёшь уведомление. Теперь звучит каждый, с паузой
850
  тишины 30 секунд, чтобы серия сообщений не превращалась в трель.
851
- Письма о пропущенном личном сообщении и о смене пароля больше не содержат
852
  кнопки «Open glchat» — веб-версии нет, ссылка вела в никуда.
853
854
#### Кто поставил реакцию
855
856
Наведите мышь на реакцию (на телефоне — долгое нажатие), и появится список
857
поставивших её людей.
858
859
#### Безопасность аккаунта
860
861
- **История — только устройству, привязанному с вашего устройства**
862
  ([ADR-0036](ADR-0036-history-by-enrollment.md)). Раньше любое новое
863
  устройство, вошедшее по паролю, получало от ваших устройств историю за 30
864
  дней — включая вход по паролю, сброшенному администратором. Теперь историю
865
  получает только устройство, привязанное через **Link device** (QR или код с
866
  уже доверенного устройства). Вошедшее по паролю получает только новые
867
  сообщения, а остальные ваши устройства показывают предупреждение: «New
868
  device “…” signed in with your password. It gets new messages only — not
869
  your history. If this wasn't you, revoke it in Settings → Devices and change
870
  your password.» На странице **Devices** видно, как вошло каждое устройство:
871
  «Linked from another device» или «Signed in with password».
872
- **Смена пароля видна.** Ваши устройства сообщают, что пароль изменён — вами
873
  на другом устройстве или администратором.
874
- **Отключённый аккаунт удаляется из всех разговоров**
875
  ([ADR-0037](ADR-0037-disabled-account-offboarding.md)). Раньше отключение
876
  было только запретом входа: сообщения продолжали шифроваться и на устройства
877
  уволенного сотрудника. Теперь его устройства исключаются из групп со сменой
878
  ключей. В DM с ним видно «This account is deactivated by an administrator»,
879
  а написанное ждёт в очереди. После повторного включения аккаунт
880
  возвращается в свои каналы сам, но сообщения за время отключения ему
881
  недоступны.
882
- **Имена пользователей не различаются по регистру:** завести «Alice» рядом с
883
  «alice» больше нельзя.
884
- Сборка для тестеров подключается к серверу только по **https** (исключение —
885
  локальный адрес).
886
- **Временный сбой хранилища ключей больше не уничтожает аккаунт.** Раньше
887
  кратковременная недоступность Android Keystore или системного keyring могла
888
  привести к созданию нового ключа базы и потере аккаунта на устройстве.
889
  Теперь показывается экран с объяснением и повтором, а стирание остаётся
890
  только явным действием пользователя.
891
- **Экран входа при живом аккаунте** (репорт №63, Android). Приложение
892
  открывалось на форме входа, хотя аккаунт оставался на устройстве, и каждая
893
  попытка войти отвечала `already has an account on this machine`; помогала
894
  только переустановка. Теперь клиент повторяет чтение аккаунта, при
895
  настоящей ошибке показывает отдельный экран с повтором, а на
896
  `already has an account` предлагает **Sign out this device**.
897
- Данные приложения на Android и iOS исключены из облачных резервных копий
898
  телефона: копия зашифрованной базы без ключа из Keystore/Keychain всё равно
899
  нечитаема, а вот утечь могла.
900
- Смена пароля администратора завершает его сессии в админке.
901
902
#### Мобильные клиенты
903
904
- **Ссылки открываются** (репорт №58). Тап по ссылке в сообщении на Android
905
  ничего не делал — теперь она открывается в системном браузере.
906
- **iPhone больше не «отходит» от шторки уведомлений.** Достаточно было
907
  потянуть Центр уведомлений или Пункт управления, получить входящий звонок
908
  или пройти Face ID — телефон терял соединение, и собеседники видели вас
909
  «отошёл», пока приложение не свернуть и не открыть снова.
910
- **Меню по долгому нажатию на iPhone.** Действия над сообщением и меню чата
911
  («Leave the channel», «Remove for me») не открывались вовсе, а диалоги
912
  подтверждения выхода и исключения участника молча отвечали «нет». Теперь
913
  жест и диалоги собственные и одинаково работают на iOS, Android и
914
  десктопе. В меню сообщения добавлен **Copy text**.
915
- Уведомление на iOS показывается ровно один раз.
916
917
#### Интерфейс
918
919
- Начатая правка сообщения больше не «переезжает» в другой чат при
920
  переключении.
921
- Неотправленные и упавшие сообщения не пропадают при смене чата или треда.
922
- После подгрузки старой истории сообщения не дублируются.
923
- Сообщения, догруженные фоновой сверкой в открытый чат, сразу считаются
924
  прочитанными.
925
- Ошибки выхода из аккаунта и отзыва устройства видны, а не теряются.
926
- На сенсорных экранах доступно **Unpin**.
927
- Поиск и открытые диалоги подтверждения очищаются при выходе из аккаунта.
928
929
#### Обновление 2026-10-21: исправления ревью безопасности
930
931
Версия остаётся **0.2.5**, но сборки и сервер, выложенные после 21 октября,
932
содержат ещё один пакет исправлений: независимое ревью безопасности от
933
20 октября нашло несколько реальных проблем (подробности и оценки —
934
[консенсус ревью](SECURITY-REVIEW-2026-10-21-CONSENSUS.md), решение —
935
[ADR-0039](ADR-0039-sync-isolation-and-revoked-leaf-removal.md)). Сборки
936
этого пакета в версии показывают суффикс вида `v0.2.5-N-g<sha>`.
937
938
- **Служебная группа синхронизации (`__sync`) — только для вашего аккаунта.**
939
  Раньше сервер позволял добавить в неё устройство другого пользователя, а
940
  удалить его потом было нечем: оно получало бы ваши черновики, позиции
941
  прочтения и копии сохранённых сообщений. Теперь сервер принимает в `__sync`
942
  только устройства владельца, а клиент дополнительно игнорирует служебные
943
  события не от вашего аккаунта. Группы, куда чужое устройство уже попало,
944
  очищаются автоматически. Группы без канала больше не принимают новых
945
  пользователей без разрешения.
946
- **Отозванное устройство действительно пропадает из чатов.** Если устройство
947
  отозвано (вами, выходом из аккаунта или администратором) — в том числе
948
  **единственное** устройство пользователя, — остальные участники сами убирают
949
  его из шифрования каждой общей группы, и теперь это относится и к
950
  **скрытым** чатам («Remove for me»). После этого отозванное устройство не
951
  сможет расшифровать новые сообщения, даже если получит их в обход сервера.
952
  Раньше скрытые чаты пропускались, а отзыв единственного устройства не
953
  убирал его вообще.
954
- **«Стереть историю» больше не ломает чат.** Если после последнего
955
  сообщения в чате были реакция, правка или закреплённое, то после **Hide and
956
  erase** чат мог перейти в «восстановление» и временно не отправлял
957
  сообщения. Теперь стёртое не расшифровывается повторно, а синхронизация с
958
  другого устройства не возвращает стёртые сообщения.
959
- **Подмена сообщения по чужому id.** Участник мог отправить файл с тем же
960
  идентификатором, что у чужого текстового сообщения (и наоборот), и «вклиниться»
961
  в его реакции и тред. Теперь такое повторение считается дублем.
962
- **Сразу после регистрации по инвайту** новому аккаунту публикуются
963
  KeyPackages: добавить его в канал или написать ему можно без ожидания
964
  фонового цикла.
965
- **Список DM** снова корректно сообщает, есть ли у собеседника активные
966
  устройства (поле `has_devices` в `GET /v1/dms` раньше всегда было `false`).
967
- **Сервер не «зависает» от неверного кода привязки устройства.** Запросы с
968
  недействительным кодом привязки или повторным входом могли занять все
969
  соединения с базой и задержать работу сервера на несколько секунд. Теперь
970
  соединения освобождаются сразу.
971
- **iPhone: уведомления.** Фоновая загрузка превью уведомления проверяет
972
  закреплённый сертификат сервера так же, как приложение, а ваши собственные
973
  сообщения, отправленные с другого устройства, больше не показываются как
974
  входящие и не увеличивают счётчик. Эта часть ещё не собиралась на Mac.
975
976
#### Деплой
977
978
- **Сервер и все клиенты обновляются вместе.** Сервер теперь отклоняет
979
  сообщение, зашифрованное до уже принятой смены состава (ADR-0029). Клиент
980
  0.2.5 перешифровывает его сам, клиент 0.2.4 покажет сообщение
981
  неотправленным.
982
- **Миграции `028`–`031`** (`make migrate-up` от `glchat_admin`).
983
  **`031` остановится**, если в базе есть имена, различающиеся только
984
  регистром, и выведет их список; схема при этом не меняется. Переименуйте
985
  лишние аккаунты и запустите миграцию снова. Проверить заранее:
986
987
  ```sql
988
  SELECT lower(username), array_agg(username)
989
    FROM users GROUP BY lower(username) HAVING count(*) > 1;
990
  ```
991
992
- **Сервер строже проверяет конфиг и не стартует**, если:
993
  - `KEYPACKAGE_TTL` 84 дня или больше (новое значение по умолчанию — 80 дней;
994
    старое явное `2160h` в `server.env` теперь ошибка — уберите строку);
995
  - `ENV=prod` вместе с `RATE_LIMIT_DISABLED=true`, `OPEN_REGISTRATION=true`
996
    или `TLS_DISABLED=true`;
997
  - `AUTH_NONCE_TTL` меньше удвоенного `AUTH_CLOCK_SKEW`.
998
- Новая необязательная переменная `ADMIN_COOKIE_SECURE=true` — для админки за
999
  TLS-прокси; при `https` в `PUBLIC_URL` включается сама.
1000
- **Push relay** обновлять желательно (повторы OAuth с паузой, `/readyz` не
1001
  зависает), но не обязательно: протокол не менялся, порядок выкатки любой.
1002
- **iOS:** перед сборкой `xcodegen generate` — в проекте новые Swift-файлы.
1003
  Swift-часть этого выпуска ещё не собиралась: первая сборка на Mac и смоук на
1004
  живом iPhone обязательны до раздачи.
1005
- **Сервер и клиенты — строго из одного коммита.** Клиент применяет
1006
  служебные события синхронизации только от своего аккаунта по имени
1007
  отправителя, которое отдаёт сервер; сервер и клиенты, собранные до и после
1008
  этого пакета, друг с другом не проверены.
1009
- **Push relay с тега `v0.2.5` не менялся**: если он уже обновлён до 0.2.5,
1010
  трогать его не нужно.
1011
- **iOS NSE** (расширение уведомлений) в этом пакете изменилось и **ещё ни разу
1012
  не собиралось на Mac** — первая сборка и смоук-тест уведомлений на живом
1013
  iPhone обязательны до раздачи.
1014
1015
Границы приватности почти не менялись: сервер по-прежнему не видит текст
1016
сообщений и ключи. Одно осознанное изменение — у каждого сообщения теперь есть
1017
открытый для сервера признак «служебное, без уведомления» (правка, удаление,
1018
реакция и т. п.). Он не хранится и используется только чтобы не будить
1019
получателя; различать такие сообщения по длине шифротекста сервер мог и раньше
1020
([ADR-0034](ADR-0034-silent-service-envelopes.md)). В обратную сторону граница
1021
стала строже: сброс пароля администратором больше не открывает прошлую
1022
переписку.
1023
1024
---
1025
1026 8 Redmine Admin
### Green Chat 0.2.4 — Beta Update
1027
1028
Дата сборки: **17 августа 2026 года**.
1029
1030
Предыдущая сборка, которую получали тестировщики, — **0.2.3 от 4 августа 2026
1031
года**. В 0.2.4 вошли не только работы по iOS от 16–17 августа, но и две недели
1032
исправлений по бета-репортам (5–14 августа), которые до сих пор ни в одну
1033
сборку не попадали.
1034
1035
#### Личные сообщения: «коллеге всегда можно написать»
1036
1037
Бета-репорт 5 августа: новый пользователь открывал DM с коллегой и вместо
1038
диалога получал красный текст `404 no key_packages` — написать было нельзя
1039
вообще. Работало только в обратную сторону, если коллега писал первым.
1040
1041
- **Экран с этой ошибкой больше не существует.** DM открывается всегда, поле
1042
  ввода доступно всегда.
1043
- Если устройство собеседника ещё ни разу не подключалось, над полем ввода
1044
  появляется плашка «hasn't joined this conversation yet», а сообщения ждут в
1045
  локальной очереди и уходят сами, как только собеседник войдёт. Отметка `✓✓`
1046
  в этом состоянии не ставится.
1047
- Устройство заливает ключи для приглашений сразу при регистрации, привязке по
1048
  QR и входе по паролю, а пополняет их при каждом подключении и раз в 10 минут
1049
  вместо часа.
1050
- У каждого устройства появился постоянный резервный ключ приглашения, поэтому
1051
  «пул закончился» перестаёт быть тупиком даже у человека в отпуске.
1052
- Неудачные попытки приглашения больше не сжигают ключи навсегда.
1053
1054
Подробности — [ADR-0028](ADR-0028-dm-availability-last-resort-keypackages.md).
1055
Требуются миграции `025_last_resort_keypackages.sql` и `026_dm_peer_pending.sql`.
1056
1057
#### Роли, состав каналов и создание группы
1058
1059
- **Модераторов в публичных каналах больше нет** — роль там ничего не давала.
1060
  Уже выданные роли снимает миграция `027_public_channel_no_moderators.sql`.
1061
- Owner публичного канала может выйти, не назначая преемника: владение
1062
  переходит самому раннему активному участнику.
1063
- **Список участников обновляется сразу**, без перезапуска приложения.
1064
- Создание приватной группы не срывается целиком из-за одного участника,
1065
  которого не удалось добавить.
1066
- Метки «logged out» и «hasn't signed in yet» разведены.
1067
1068
#### Статус присутствия
1069
1070
- Телефон с заблокированным экраном больше не показывается как «онлайн»:
1071
  в фоне — «отошёл», через 45 секунд — «офлайн». Побочный эффект — экономия
1072
  батареи.
1073
- Статус собеседника перестаёт «залипать» серым после потери связи или фона.
1074
- Свой статус при пропаже сети больше не остаётся «онлайн»; ручной статус при
1075
  этом не сбрасывается.
1076
- **Статусы наконец сходятся на втором устройстве**: свежепривязанный телефон
1077
  раньше не получал обновлений присутствия вообще, пока восстановление членства
1078
  не дойдёт до каждого общего канала.
1079
1080
#### Восстановление MLS и расхождение эпох
1081
1082
- Форк эпох обнаруживается после расхождения номеров эпох и на историческом
1083
  пути чтения — устройство само запрашивает замену листа вместо вечного
1084
  «Failed to load / Retry».
1085
- Нерасшифровываемый коммит следующей эпохи и сообщение из эпохи впереди
1086
  локальной теперь тоже считаются доказательством форка. Это закрывает
1087
  сценарий, при котором устройство молча не получало сообщения, а счётчик
1088
  непрочитанных честно показывал ноль.
1089
- Устройство выбирается из ситуации, когда замена листа построена на ключе,
1090
  которого у него уже нет.
1091
- После замены листа устройство не зацикливается на сообщениях, отправленных
1092
  до его переприглашения: они помечаются недоступными по дизайну.
1093
- Ремонтирующее устройство пересылает имя приватной группы и после
1094
  замены-ремонта.
1095
- Группа в состоянии восстановления показывает баннер «Restoring secure
1096
  access…» вместо красной крипто-ошибки; отправка на это время блокируется.
1097
1098
#### Desktop и Android — по бета-репортам
1099
1100
- **Открытая переписка обновляется сама**: раньше фоновая сверка поднимала
1101
  сообщение и показывала попап, а в самом открытом чате его не было до
1102
  переключения канала.
1103
- **Автопрокрутка в треде** (репорт №48): свой отправленный ответ больше не
1104
  уходит под нижний край, чтение истории при этом не прерывается.
1105
- **Понятные ошибки без сети** (репорт №49) вместо сырых технических строк.
1106
- **Сохранение присланного файла на Android** (репорт №57): ошибки
1107
  `save path: …` больше нет.
1108
- **Просмотрщик изображений после выхода из сна** на Windows больше не мигает
1109
  двумя раскладками.
1110
- Убрана серая полоса справа от списка чатов (№46), обновлена иконка
1111
  приложения на Android (№45).
1112
1113
#### Камера на Android
1114
1115
Кнопка 📷 в поле ввода снимает фото и сразу прикладывает его к сообщению
1116
(пожелание №56). Снимок **не попадает в галерею телефона**. Кнопка появляется
1117
только на устройствах с камерой.
1118
1119
#### iOS-клиент (новое)
1120
1121
- Первая сборка на устройство и симулятор: вход, каналы, DM, треды, реакции,
1122
  файлы — весь функционал десктопа в мобильной оболочке.
1123
- Секреты в Keychain, данные в App-Group-контейнере.
1124
- Камера и системный пикер фотографий.
1125
- Push-уведомления с **расшифрованным текстом**: Notification Service Extension
1126
  поднимает MLS-состояние в память, подписанно забирает новые сообщения с
1127
  вашего сервера и показывает «отправитель / канал / текст» плюс точный бейдж;
1128
  ничего не сохраняет. Центральный push relay по-прежнему не видит ни
1129 6 Redmine Admin
  идентификаторов беседы, ни шифртекста. При любой неудаче баннер остаётся
1130
  generic «New message» — это штатный fallback.
1131 8 Redmine Admin
- Устранена причина падений у всех TestFlight-тестировщиков при сворачивании
1132
  приложения; размер пакета уменьшен с 186 МБ до 18,6 МБ; минимальная версия —
1133 6 Redmine Admin
  iOS 15.0.
1134
1135
#### macOS
1136
1137
- Системные уведомления перешли на штатный механизм: правильные имя и иконка,
1138
  приложение появляется в «Системные настройки → Уведомления», отказ и ошибки
1139
  доставки видны в диагностике **Send test**. Атрибуция от имени
1140
  **Script Editor** осталась только для запуска из исходников.
1141
- Релизные сборки подписываются Developer ID с hardened runtime.
1142
- Иконка приложения приведена к нативной форме macOS.
1143
1144
#### Мобильный интерфейс
1145
1146
- Список чатов занимает всю ширину экрана.
1147
- Просмотрщик изображений и попапы не наезжают на статус-бар и home-индикатор.
1148
- Реакция на сообщение с картинкой не «мигает» превью.
1149
- Корень треда, отправленный до подключения устройства, помечается «Sent before
1150
  this device joined» вместо сырой строки.
1151
1152
#### Деплой
1153
1154
- **Сервер и push relay обязательны к обновлению.** Протокол relay получил поле
1155
  `kind` (ADR-0027 §1); агрегатный snapshot присутствия `GET /v1/presence`
1156
  чинит зависшие статусы.
1157
- **Порядок строгий: сначала `glchat-push`, потом `glchat-server`.** Старый
1158
  relay отклоняет запросы нового сервера — пока relay не обновлён, пуши не
1159
  работают ни на одной платформе.
1160
- **Новые миграции: `025_last_resort_keypackages.sql`,
1161
  `026_dm_peer_pending.sql`, `027_public_channel_no_moderators.sql`.**
1162
- Клиенты обновить везде: исправления MLS работают между устройствами только
1163
  при обновлении всех участников.
1164
1165
Границы приватности не менялись.
1166
1167
---
1168
1169
### Green Chat 0.2.3 — Beta Update
1170
1171
Дата первой Android-сборки: **30 июля 2026 года**. Последняя выпущенная сборка
1172
0.2.3: **4 августа 2026 года**.
1173
1174
Версия 0.2.3 добавляет **мобильную сборку (Android)** и уведомления на телефон.
1175
В актуальную сборку также вошли исправления Android, защиты от расхождения
1176
MLS-эпох, управления публичными каналами, desktop-композера и push relay.
1177
1178
Android-сборка **экспериментальная**: это debug-APK, он не подписан релизным
1179
ключом, не публикуется в Play и ставится вручную.
1180
1181
#### Изменения актуальной сборки от 4 августа
1182
1183
##### Надёжность шифрования и доставки
1184
1185
- Клиент больше не применяет локальный MLS Commit до подтверждения сервера.
1186
  Это предотвращает расхождение криптографических веток при одновременных
1187
  изменениях состава группы.
1188
- Добавлено автоматическое восстановление устройства, уже попавшего в такую
1189
  ветку: при ошибке расшифровки текущей эпохи здоровый участник заменяет его
1190
  MLS-листину, а клиент принимает replacement Welcome и продолжает доставку.
1191
- Расшифрованная локальная история при восстановлении сохраняется. Pending
1192
  MLS-состояние и исходящий запрос сохраняются атомарно, поэтому потерянный
1193
  HTTP-ответ или перезапуск не создают второй отличный Commit.
1194
- Серверу требуется миграция `024_membership_recovery.sql`.
1195
1196
##### Android
1197
1198
- Интерфейс учитывает вырезы экрана, status bar, навигационную панель и
1199
  виртуальную клавиатуру.
1200
- Выбор файла использует нативный Android picker; документы и изображения
1201
  можно прикреплять к обычным сообщениям и ответам в тредах.
1202
- В launcher и системных настройках отображается имя **Green Chat**, системные
1203
  push-строки приведены к английской локализации.
1204
- Перед упаковкой удаляется старый universal APK/AAB, чтобы прерванная
1205
  инкрементальная сборка не раздувала новый пакет.
1206
1207
##### Каналы и интерфейс
1208
1209
- Любой активный участник публичного канала может пригласить нового
1210
  пользователя через **Add member**. Исключение участников публичного канала
1211
  по-прежнему запрещено.
1212
- Иконки действий в desktop-композере приведены к единому стилю.
1213
- Emoji picker больше не обрезается границами поля ввода.
1214
1215
##### Push relay и эксплуатация
1216
1217
- Relay корректно распознаёт реальный ответ FCM `UNREGISTERED` и удаляет
1218
  недействительные Firebase installation IDs.
1219
- Bootstrap dev push-конфигурации останавливается при расхождении секрета в
1220
  `tenants.json` и переменной окружения.
1221
- Локальный chat server больше не зависит по healthcheck от push relay и может
1222
  работать без фоновых мобильных уведомлений.
1223
1224
#### Android-клиент
1225
1226
- Приложение собрано из **того же кода**, что и desktop (Tauri 2 mobile): те же
1227
  MLS-шифрование, те же экраны, та же логика доставки. Отдельного мобильного
1228
  клиента с собственной криптографией не появилось.
1229
- Приватный ключ устройства и ключ локальной базы хранятся в **AndroidKeyStore**
1230
  (аппаратно, если устройство поддерживает); удаление приложения удаляет и их.
1231
- Линковка устройства сканированием QR-кода. Если камера недоступна — работает
1232
  ручной ввод кода.
1233
- Интерфейс перестроен под телефон: список чатов и переписка — один стек с
1234
  кнопкой «назад», панели тредов, участников и сохранённых открываются на весь
1235
  экран, учитываются вырезы экрана и виртуальная клавиатура.
1236
1237
#### Уведомления на телефон
1238
1239
- Приходят через Firebase Cloud Messaging. **Содержимое сообщения в push не
1240
  передаётся** — приходит только сигнал «есть новое», текст «New message»
1241
  формирует само приложение на устройстве.
1242
- Push будит приложение и запускает догрузку, поэтому при открытии всё уже на
1243
  месте.
1244
- Уведомление приходит **только на устройства без активного соединения** — если
1245
  телефон онлайн, сообщение и так придёт по WebSocket.
1246
- На Android 13+ при первом запуске приложение спросит разрешение на
1247
  уведомления. Отказ отключает попапы, сообщения продолжают приходить.
1248
- Требуются **Google Play services**. На устройствах без них (HMS, чистый AOSP)
1249
  фоновых уведомлений не будет — ограничение транспорта, не клиента.
1250
- Push не приходит, если приложение принудительно остановлено через
1251
  «Настройки → Приложения → Остановить»: система блокирует доставку до
1252
  следующего запуска вручную.
1253
1254
Уведомления **не заменяют** доставку: если push потерялся, сообщения всё равно
1255
догружаются при открытии приложения.
1256
1257
#### Сервер
1258
1259
Требуется **обновление сервера** и миграции `023_push_installations.sql` и
1260
`024_membership_recovery.sql`.
1261
Дополнительно администратору нужно настроить push relay — без него мобильный
1262
клиент работает полностью, но фоновых уведомлений не будет
1263
(см. [docs/push-relay-deployment.md](push-relay-deployment.md) и шаг 4b
1264
[бета-чеклиста](beta-checklist.md)).
1265
1266
Границы приватности не изменились: сервер по-прежнему не видит текст
1267
сообщений и ключи. Появился один новый элемент — центральный push relay
1268
получает идентификатор установки приложения (не аккаунт и не сообщение) и
1269
время отправки; подробности и принятые риски описаны в
1270
[ADR-0026](ADR-0026-central-push-relay.md).
1271
1272
#### Обновление
1273
1274
1. Администратор обновляет сервер и применяет миграции 023 и 024.
1275
2. Desktop: установите **0.2.3** на все устройства.
1276
3. Android: установите APK, войдите или привяжите устройство по QR.
1277
1278
Что особенно важно проверить на телефоне:
1279
1280
1. приходит ли уведомление, когда приложение **свёрнуто**, а не открыто;
1281
2. открываются ли после тапа именно новые сообщения — без ручного обновления;
1282
3. работает ли одновременно телефон и десктоп на одном аккаунте (счётчики
1283
   непрочитанных не должны расходиться);
1284
4. привязка устройства по QR-коду;
1285
5. отправка и открытие вложений с телефона.
1286
1287
---
1288
1289
### Green Chat Desktop 0.2.2 — Beta Update
1290
1291
Дата выпуска: **23 июля 2026 года**.
1292
1293
Версия 0.2.2 закрывает бета-репорт «клиент в фоне на Windows молчит и не
1294
обновляется»: свёрнутое или скрытое в tray окно не получало ни системного
1295
уведомления, ни счётчика непрочитанных, а интерфейс показывал новые сообщения
1296
только после ручного обновления страницы (Ctrl+R).
1297
1298
Обновляется **только desktop-клиент** — серверных изменений в этом выпуске
1299
нет (см. раздел «Сервер»).
1300
1301
#### Доставка и уведомления при свёрнутом окне
1302
1303
- Фоновая сверка с сервером перенесена из интерфейсного слоя в нативный
1304
  Rust-процесс и выполняется каждые 10 секунд. Windows может приостанавливать
1305
  таймеры и сам JS-контекст WebView2 у скрытого окна — теперь это не
1306
  останавливает ни доставку сообщений, ни уведомления.
1307
- Системное уведомление для сообщения, пришедшего в свёрнутое/фоновое окно,
1308
  создаётся непосредственно нативным процессом, до и независимо от
1309
  интерфейсного слоя. Открывать окно, чтобы получить попап, не требуется.
1310
  Настройки Pause all notifications, DND, mute, quiet hours и режим
1311
  уведомлений канала учитываются так же, как раньше.
1312
- Возврат окна из фона, minimize или tray запускает немедленную сверку —
1313
  счётчики и новые сообщения появляются сами, ручной Reload больше не нужен.
1314
- Потерянный единичный WebSocket-кадр или half-open соединение больше не
1315
  оставляют клиент без счётчика, звука и попапа: любое расхождение с сервером
1316
  устраняется ближайшей 10-секундной сверкой.
1317
- После выхода компьютера из сна клиент больше не ждёт до 90 секунд, считая
1318
  старый WebSocket подключённым: resume-watchdog обнаруживает паузу системных
1319
  часов и переподключается за несколько секунд, сразу забирая пропущенные
1320
  сообщения и восстанавливая presence.
1321
- Сводное уведомление «N new messages» о сообщениях, восстановленных фоновой
1322
  сверкой, показывается даже если окно уже получило фокус (например, сразу
1323
  после открытия крышки ноутбука) и не дублируется при открытии окна после
1324
  нативного уведомления.
1325
- Если звук сообщений включён, уведомления сопровождаются нативным системным
1326
  звуком; серия подряд идущих сообщений даёт один звук, а не очередь сигналов.
1327
- Определение «окно в фокусе» для подавления попапов использует состояние
1328
  самого интерфейса, а не системный сигнал окна — на Windows системный сигнал
1329
  недостоверен и мог как показывать попапы поверх активного окна, так и
1330
  глушить их у скрытого.
1331
1332
#### Личные сообщения
1333
1334
- Если KeyPackage нового устройства ещё загружается, повторная попытка
1335
  восстановления membership выполняется через несколько секунд с постепенным
1336
  увеличением интервала. Чат больше не зависает в состоянии `re-syncing`
1337
  из-за двухминутного ожидания, которое при каждом перезапуске начиналось
1338
  заново.
1339
- Исправлена ложная блокировка отправки после password login или привязки
1340
  устройства: старые клиенты создавали пустую MLS BasicCredential, поэтому
1341
  два реальных листа ошибочно считались одним пользователем. Готовность
1342
  личного чата теперь проверяется по фактическому MLS roster, а новые
1343
  устройства сохраняют credential с серверным username.
1344
1345
#### Сервер
1346
1347
Серверный код в 0.2.2 не менялся. Требования совпадают с 0.2.1: сервер должен
1348
быть обновлён до серверной версии выпуска 0.2.1 (endpoints состояния
1349
синхронизации и миграция `022_membership_repair_claims.sql`). Со старым
1350
сервером клиент продолжает работать в режиме прежней полной догрузки, но
1351
10-секундная сверка и восстановление membership недоступны.
1352
1353
Как и раньше, содержимое сообщений, ключи и настройки уведомлений не
1354
передаются серверу в открытом виде; текст системных уведомлений формируется
1355
локально и никогда не покидает устройство.
1356
1357
#### Обновление
1358
1359
Установите **Green Chat Desktop 0.2.2 на все свои устройства**.
1360
1361
Особенно важно повторно проверить:
1362
1363
1. сообщения и `@mention` в **свёрнутое или скрытое в tray** окно: системный
1364
   попап и звук должны прийти без открытия окна, а после открытия счётчики и
1365
   сообщения должны быть уже на месте — без Ctrl+R;
1366
2. перед проверкой уведомлений убедитесь, что в **Settings → Notifications**
1367
   выключен **Pause all notifications** — включённый тумблер отключает попапы
1368
   и звук намеренно, при этом сообщения и счётчики продолжают приходить;
1369
3. получение сообщений после сна/пробуждения компьютера;
1370
4. личный чат после logout и повторного входа одного из участников;
1371
5. одновременную работу двух устройств одного аккаунта.
1372
1373
---
1374
1375
### Green Chat Desktop 0.2.1 — Beta Update
1376
1377
Дата выпуска: **22 июля 2026 года**.
1378
1379
Версия 0.2.1 исправляет проблемы доставки сообщений и уведомлений,
1380
обнаруженные во время бета-тестирования 0.2.0.
1381
1382
#### Главное
1383
1384
- Доставка больше не зависит только от WebSocket-событий. Клиент сверяет
1385
  локальное состояние с сервером после подключения, при ошибке live-доставки
1386
  и каждые две минуты, пока соединение активно.
1387
- Пропущенные во время офлайна сообщения автоматически догружаются в
1388
  правильном порядке вместе с необходимыми MLS-коммитами.
1389
- Счётчики непрочитанных, список тредов и сохранённые сообщения обновляются
1390
  после каждой сверки с сервером.
1391
- Для сообщений, полученных через фоновую сверку, показывается одно сводное
1392
  уведомление вместо серии попапов. Настройки DND, mute, quiet hours и режим
1393
  уведомлений канала продолжают учитываться.
1394
1395
#### Исправление личных сообщений после повторного входа
1396
1397
- Исправлена ситуация, когда после logout и повторного входа личный чат
1398
  оставался доступен, но новые сообщения фактически шифровались без устройства
1399
  собеседника.
1400
- Клиент автоматически обнаруживает отсутствующее устройство участника и
1401
  повторно добавляет его в MLS-группу личного чата.
1402
- Одновременное восстановление несколькими устройствами защищено коротким
1403
  серверным lease: проигравший клиент останавливается до изменения локальной
1404
  MLS-эпохи.
1405
- Пока устройство собеседника ещё не восстановлено в личном чате, поле ввода
1406
  заменяется сообщением о синхронизации, а отправка временно блокируется.
1407
  Отметка `✓✓` в этом состоянии заменяется честным предупреждением
1408
  `not delivered`.
1409
- После успешного восстановления чат разблокируется по долговременному
1410
  состоянию клиента, даже если соответствующее WebSocket-событие потерялось.
1411
1412
#### Надёжность и диагностика
1413
1414 1 Redmine Admin
- Ошибка обработки live-сообщения теперь запускает ускоренную сверку с
1415 6 Redmine Admin
  сервером вместо ожидания следующего переподключения.
1416
- Исправлена потеря полной проверки групп, если переподключение совпало по
1417
  времени с уже выполняющейся фоновой сверкой.
1418
- Отложенные reconcile-задачи корректно отменяются при logout.
1419
- Desktop-клиент пишет диагностический лог в `glchat.log` в каталоге данных
1420
  приложения.
1421
- Добавлена ротация лога при достижении 5 MiB с сохранением одной предыдущей
1422 1 Redmine Admin
  копии `glchat.log.old`, включая повторную ротацию на Windows.
1423 6 Redmine Admin
1424
#### Сервер
1425
1426
- Добавлены авторизованные endpoints состояния синхронизации: хвосты сообщений
1427
  по группам и отсутствующие membership-листы.
1428
- Добавлен одноразовый lease-token для безопасного восстановления membership.
1429
- Добавлена метрика Prometheus для количества обнаруженных membership gaps.
1430
- Добавлена миграция `022_membership_repair_claims.sql`.
1431
1432
Содержимое сообщений, ключи и настройки уведомлений по-прежнему не передаются
1433
серверу в открытом виде. Новые endpoints работают только с уже известными
1434
серверу метаданными групп, устройств и последовательностей сообщений.
1435
1436
#### Обновление
1437
1438
Для проверки исправлений установите **Green Chat Desktop 0.2.1 на все свои
1439
устройства**. Сервер также должен быть обновлён и иметь применённую миграцию
1440
`022_membership_repair_claims.sql`.
1441
1442
Особенно важно повторно проверить:
1443
1444
1. получение сообщений после временного отключения сети;
1445
2. непрочитанные, звук и системный попап после фоновой догрузки;
1446
3. личный чат после logout и повторного входа одного из участников;
1447
4. одновременную работу двух устройств одного аккаунта;
1448
5. наличие `glchat.log` после перезапуска desktop-приложения.
1449
1450 5 Redmine Admin
---
1451
1452
### glchat Desktop 0.2.0 — Beta Update
1453
1454
Изменения с 9 по 20 июля 2026 года.
1455
1456
#### Новые возможности
1457
1458
- Добавлены роли владельца и модератора канала, управление участниками, выход из канала и локальное скрытие чатов.
1459
- Появились карточки профилей с аватаром, должностью, описанием и контактами.
1460 1 Redmine Admin
- Добавлен единый раздел «Треды» со всеми обсуждениями и фильтром непрочитанных.
1461 5 Redmine Admin
- Сообщения теперь можно сохранять в личные закладки с синхронизацией между устройствами.
1462
- Добавлена локальная история загрузок: файл можно открыть, показать в папке или убрать из списка.
1463
- Изображения открываются во встроенном просмотрщике, добавлена безопасная анимация GIF.
1464
- Изображения из буфера обмена можно вставлять прямо в сообщение.
1465
- Добавлены звуковые уведомления о новых сообщениях и настройка звука.
1466
- Пользователи, вышедшие со всех устройств, теперь отмечаются в интерфейсе. Перед отправкой им личного сообщения или упоминания показывается предупреждение.
1467
1468
#### Улучшения интерфейса
1469
1470 6 Redmine Admin
- Добавлены контекстные действия для сообщений.
1471 5 Redmine Admin
- Улучшены редакторы сообщений и ответов в тредах.
1472
- Добавлены упоминания пользователей в ответах треда.
1473
- Улучшена работа с вложениями: предварительная подготовка, drag-and-drop в треды и удаление отправленных файлов.
1474
- Поиск теперь прокручивает чат до найденного сообщения и ограничивает слишком тяжёлые запросы.
1475
- Улучшены индикаторы присутствия, подсчёт участников и расположение боковых панелей.
1476
- После отправки сообщения чат автоматически прокручивается к нему.
1477
- Исправлено восстановление окна приложения из системного трея.
1478
1479
#### Исправления и стабильность
1480
1481 8 Redmine Admin
- Исправлена синхронизация каналов, участников и метаданных между несколькими устройствами.
1482 5 Redmine Admin
- Восстановлена доставка уведомлений после длительного офлайна.
1483
- Статус пользователя обновляется сразу после подключения.
1484
- Исправлен учёт непрочитанных сообщений при переключении фокуса окна.
1485
- Исключённые каналы сразу удаляются из интерфейса, а устаревшие события больше не удаляют канал после повторного вступления.
1486
- Исправлены отображение закреплённых файлов и привязка вложений к исходному чату.
1487
- Добавлена корректная обработка максимальной длины сообщений.
1488
- Аватары профилей теперь обновляются в реальном времени.
1489
- Улучшено восстановление личных чатов после выхода всех участников со всех устройств.
1490
- При выходе устройство отзывается на сервере, чтобы не оставлять неактивные устройства и ключи.
1491
1492
#### Сервер и эксплуатация
1493
1494
- Добавлены Prometheus-метрики для HTTP, WebSocket, PostgreSQL, Redis и Go runtime.
1495
- Подготовлены базовые правила мониторинга и алертов.
1496
- Улучшена конфигурация TLS для файлового хранилища.
1497
1498
Итого: **40 коммитов и 178 изменённых файлов** в ветке `main`.
1499
1500
## Как оставить баг-репорт
1501
1502
Трекер:
1503
<https://bug.green-lab.space/projects/greenchat/issues/new>. Регистрация не
1504
нужна, репорт можно отправить анонимно.
1505
1506
### Что указать
1507 1 Redmine Admin
1508
```text
1509
Краткое название: что сломалось и где
1510
1511
Шаги:
1512
1. …
1513
2. …
1514
3. …
1515
1516
Ожидал: …
1517
Получил: …
1518
1519
Окружение:
1520 9 Redmine Admin
- Green Chat 0.2.5 (или версия из Settings → Profile)
1521 1 Redmine Admin
- ОС и версия
1522
- один или несколько аккаунтов/устройств
1523
- название канала или DM
1524
- точное время события и часовой пояс
1525
1526
Воспроизводится: всегда / иногда / один раз
1527
Дополнительно: скриншот или короткое видео
1528
```
1529
1530
Для проблем синхронизации укажите ОС и версию клиента **на каждой стороне**,
1531
а также какое устройство было офлайн.
1532
1533
Трекер публичный. Не прикладывайте пароли, invite-коды, ключи, приватные
1534
логи или скриншоты с конфиденциальной перепиской. Перед отправкой замажьте
1535
лишние данные.
1536
1537
### Приоритет
1538
1539
| Приоритет | Когда использовать |
1540
|---|---|
1541
| `Normal` | Большинство ошибок интерфейса и поведения |
1542
| `High` | Падение, потеря данных, недоставка сообщений, нарушение прав или безопасности |
1543
| `Urgent` / `Immediate` | Не выбирайте без отдельной просьбы команды |
1544
1545
## Быстрая диагностика уведомлений
1546
1547
1. Нажмите **Settings → Notifications → Send test**.
1548
2. Если тест пришёл, проверьте **Pause all notifications**, DND, mute,
1549
   quiet hours и фокус окна: Send test обходит эти настройки, а обычные
1550
   уведомления — нет.
1551
3. Для канала используйте персональный `@mention`; обычное сообщение может не
1552
   создавать попап.
1553
4. Если приложение было закрыто через tray → Quit, системного попапа быть не
1554
   должно.
1555
5. Если Send test не работает при разрешённых уведомлениях ОС, создайте
1556
   баг-репорт и обязательно укажите операционную систему.