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 | баг-репорт и обязательно укажите операционную систему. |