Files
LumaWeb/planning/requirements.json
wt 54bfc0f34f
Foundation checks / foundation (push) Successful in 1m12s
initial commit
2026-10-14 17:47:38 +07:00

1550 lines
99 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[
{
"id": "GEN-001",
"source": "specs/tz_clear.md",
"text": "Одинаковые действия на разных платформах должны иметь одинаковый смысл: «Отправлено», «Доставлено», «Прочитано», локальное удаление и отзыв нельзя интерпретировать по-разному.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "GEN-002",
"source": "specs/tz_clear.md",
"text": "UI, предметная логика, протоколы, хранение и системные интеграции разделяются устойчивыми интерфейсами. UI не владеет криптографической сессией или активным медиасоединением.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "GEN-003",
"source": "specs/tz_clear.md",
"text": "Криптография, обработка больших файлов, индексирование и архивная загрузка не должны монопольно занимать поток отображения интерфейса.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "GEN-004",
"source": "specs/tz_clear.md",
"text": "Все долгие операции имеют состояние выполнения, завершения, ошибки и отмены там, где отмена безопасна. Ошибка не оставляет интерфейс навсегда заблокированным.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "GEN-005",
"source": "specs/tz_clear.md",
"text": "Недоступная возможность сервера отключает соответствующую функцию с объяснением, сохраняя остальные функции. Поддержка, объявленная сервером, не отображается как уже настроенная интеграция приложения.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "GEN-006",
"source": "specs/tz_clear.md",
"text": "Приложение не обещает гарантированную доставку, прочтение, удаление чужих копий, работу закрытого процесса или конфиденциальность метаданных, если механизм этого не обеспечивает.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "GEN-007",
"source": "specs/tz_clear.md",
"text": "Исходные документы, тесты и поставляемая версия приложения должны соответствовать друг другу. Релиз имеет номер версии и журнал изменений.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-001",
"source": "specs/tz_clear.md",
"text": "Входная форма содержит JID, пароль, показать/скрыть пароль и дополнительные настройки. Пустой JID/пароль не принимаются.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-002",
"source": "specs/tz_clear.md",
"text": "JID валидируется по выбранному XMPP address preparation; пробелы по краям ввода обрабатываются, resource не смешивается с bare account identity. Пароль не обрезается молча.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-003",
"source": "specs/tz_clear.md",
"text": "Native-клиенты поддерживают discovery и ручной host/port с STARTTLS/direct TLS. Стандартные порты: 5222 для STARTTLS, 5223 для direct TLS. Порт проверяется как число 1…65535; нечисловой ввод показывает ошибку, а не молча превращается в default.",
"applicability": "out_of_scope",
"reason": "Native host/port TCP configuration; Web uses ACC-004 WSS."
},
{
"id": "ACC-004",
"source": "specs/tz_clear.md",
"text": "Web-клиент использует защищённый WebSocket XMPP endpoint. Форма допускает ввод/выбор WSS endpoint и не обещает прямое использование произвольного TCP host/port браузером. BOSH не обязателен; если включён отдельно, допускается только HTTPS.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-005",
"source": "specs/tz_clear.md",
"text": "Endpoint discovery не должен незаметно отправлять пароль произвольному стороннему шлюзу. Пользователь видит домен выбранного endpoint; для неизвестной конфигурации требуется явный выбор сервера.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-006",
"source": "specs/tz_clear.md",
"text": "На время входа показывается progress и блокируется повторная отправка той же формы. После успешного входа открываются локальная история и основной интерфейс. Ошибка оставляет возможность исправить credentials.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-007",
"source": "specs/tz_clear.md",
"text": "Можно сохранить несколько аккаунтов. Добавление аккаунта делает его активным после успешного входа. Одновременно обязательно только одно активное соединение; неактивные аккаунты не представляются как постоянно online.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-008",
"source": "specs/tz_clear.md",
"text": "Переключение закрывает/отделяет старый контекст и открывает данные нового. Завершившаяся поздно операция прошлого аккаунта не может записать результат в новый аккаунт или отправить сообщение от его имени.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-009",
"source": "specs/tz_clear.md",
"text": "При доступных credentials запуск восстанавливает активный аккаунт и локальную историю, затем соединение. Если secrets недоступны/истекли, приложение запрашивает повторный вход без потери сохранённой истории.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-010",
"source": "specs/tz_clear.md",
"text": "Для каждого устройства создаётся устойчивый уникальный ресурс; одновременный запуск разных устройств одного аккаунта не должен создавать конфликт одинаковых default resources.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-011",
"source": "specs/tz_clear.md",
"text": "«Выйти» прекращает соединение, unregister/disable применимую push-привязку, удаляет сохранённые credentials текущего аккаунта и очищает его чувствительное session state. Локальную историю можно сохранить.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-012",
"source": "specs/tz_clear.md",
"text": "Отдельный вариант «Выйти и удалить локальные данные» удаляет историю, suppression, drafts, медиа cache и данные аккаунта в локальном профиле. Удаление OMEMO identity — явно обозначенный вариант со предупреждением о потере доступа к старым encrypted сообщениям; без согласия identity не уничтожается как побочный эффект обычного выхода.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-013",
"source": "specs/tz_clear.md",
"text": "Удаление локальных данных не называется secure erase и не обещает удаление server archives, exports, backup или чужих копий.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ACC-014",
"source": "specs/tz_clear.md",
"text": "Перед уходом из аккаунта незавершённые записи/загрузки имеют определённое поведение: отмена либо сохранение безопасного локального результата; нет продолжения отправки от случайного другого аккаунта.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NET-001",
"source": "specs/tz_clear.md",
"text": "Подключение защищено TLS; проверяются certificate chain и ожидаемое имя сервиса/endpoint согласно используемому транспорту. Insecure HTTP/WS и обход ошибок сертификата не включены в пользовательский стандарт.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NET-002",
"source": "specs/tz_clear.md",
"text": "Нативный транспорт поддерживает DNS discovery и ручные параметры. В Web используется WSS endpoint, утверждённый для выбранного сервера.",
"applicability": "out_of_scope",
"reason": "Native transport discovery; Web WSS addressed by ACC-004/NET-001."
},
{
"id": "NET-003",
"source": "specs/tz_clear.md",
"text": "Аутентификация выбирает наиболее сильный совместимый объявленный механизм. Приоритет SCRAM-PLUS с доступным channel binding, затем SCRAM-SHA-512/256/1, затем разрешённый защищённым транспортом fallback.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NET-004",
"source": "specs/tz_clear.md",
"text": "PLUS не имитируется при отсутствии данных реального TLS-канала. В частности, реализации, не имеющие доступа к exporter/binding, выбирают совместимый non-PLUS механизм и корректно отражают это в диагностике.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NET-005",
"source": "specs/tz_clear.md",
"text": "Проверяются nonce, server proof/signature, параметры challenge и применимые downgrade-protection данные. Для limits на challenge/iterations определяется защитная конфигурация, предотвращающая блокировку клиента недоверенным вводом.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NET-006",
"source": "specs/tz_clear.md",
"text": "Состояния: отключено, подключение, подключено, восстановление, ошибка/требуется вход. Причина ошибки локализована. Нельзя показывать «Подключено» только по наличию сохранённого аккаунта.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NET-007",
"source": "specs/tz_clear.md",
"text": "Поддерживаются stream management, carbons, ping и client-state indication при поддержке транспорта/сервера.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NET-008",
"source": "specs/tz_clear.md",
"text": "Повторное соединение использует ограниченный backoff с jitter, прекращается при явном logout и не создаёт параллельных конкурирующих клиентов одного контекста. Возврат в foreground инициирует проверку/восстановление.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NET-009",
"source": "specs/tz_clear.md",
"text": "Смена сети, sleep/wake, закрытие вкладки и потеря credentials обрабатываются без повреждения локального состояния. Возобновление stream не должно повторно создавать bubbles уже известных сообщений.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NAV-001",
"source": "specs/tz_clear.md",
"text": "Основные разделы: Контакты, Звонки, Чаты, Настройки. Начальный раздел — Чаты. Compact/wide варианты заданы UI Kit.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NAV-002",
"source": "specs/tz_clear.md",
"text": "Поиск расположен над соответствующим списком. Поиск чатов — по имени/JID/аккаунту, контактов — по имени/JID, звонков — по собеседнику. Это фильтр списков; полнотекстовый поиск истории отдельно не обещается.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NAV-003",
"source": "specs/tz_clear.md",
"text": "Чаты сортируются pinned-first при наличии pinned-функции, затем по последней активности, затем по имени для стабильности. Изменение unread не должно произвольно менять порядок при одинаковой активности.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NAV-004",
"source": "specs/tz_clear.md",
"text": "В списке видны avatar, имя, preview, время, unread и применимый status. Аккаунт отображается при необходимости различать одинаковые JID.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NAV-005",
"source": "specs/tz_clear.md",
"text": "Пустые данные и отсутствие совпадений поиска имеют разные объяснения. Создание чата/комнаты остаётся доступным в empty state.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NAV-006",
"source": "specs/tz_clear.md",
"text": "Back возвращает в предыдущий логический контекст. На широком экране смена selection не должна ломать sidebar; клавиатурная навигация обязательна для Web/Desktop.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CON-001",
"source": "specs/tz_clear.md",
"text": "Контакты синхронизируются через roster: initial state и последующие изменения. Удаление контакта из roster не удаляет историю.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CON-002",
"source": "specs/tz_clear.md",
"text": "Новый direct chat открывается по валидному JID с optional name и выбором добавления в roster. Отсутствие roster membership не запрещает сообщение само по себе.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CON-003",
"source": "specs/tz_clear.md",
"text": "Presence показывает реальное известное состояние; нет объявления online только из-за cached avatar/history.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CON-004",
"source": "specs/tz_clear.md",
"text": "MUC-комнаты показываются отдельно от людей. Список сохранённых комнат не выдаётся за полный серверный список членства.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CON-005",
"source": "specs/tz_clear.md",
"text": "Аватары публикуются/получаются через совместимые XMPP PEP mechanisms; legacy fallback допустим. Новый avatar нормализуется до разумного размера, baseline 512 px по длинной стороне.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CON-006",
"source": "specs/tz_clear.md",
"text": "При отсутствии изображения используется стабильный цвет и инициалы, для группы — group symbol. Обновление cache не требует перезапуска клиента.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CON-007",
"source": "specs/tz_clear.md",
"text": "Пользователю не обещается OMEMO для аватаров; доступ определяется серверными правами.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MSG-001",
"source": "specs/tz_clear.md",
"text": "Пустое после trim сообщение не отправляется. Каждая новая отправка имеет устойчивый уникальный client/origin id и зафиксированный аккаунт/получателя.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MSG-002",
"source": "specs/tz_clear.md",
"text": "До сетевого результата создаётся optimistic запись sending. Success transport send → sent, receipt → delivered, displayed → read. Ошибка → failed с объяснением.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MSG-003",
"source": "specs/tz_clear.md",
"text": "Sent означает передачу по клиентскому протокольному пути, delivered — полученный receipt, read — подтверждённый marker. UI не выводит read только из времени или online собеседника.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MSG-004",
"source": "specs/tz_clear.md",
"text": "Объединение live, Carbons и MAM не создаёт duplicate. Проверяются контекст аккаунта/чата и origin/stanza/client identities; archive UID не используется глобально для разных архивов.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MSG-005",
"source": "specs/tz_clear.md",
"text": "Доставка повышается монотонно sending → sent → delivered → read. Failed не «исправляется» молча архивной копией; явная повторная отправка — отдельное действие с контролем дубликатов.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MSG-006",
"source": "specs/tz_clear.md",
"text": "Порядок ленты — timestamp и устойчивый id при равных датах. Архивная вставка сверху сохраняет viewport.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MSG-007",
"source": "specs/tz_clear.md",
"text": "Служебные receipts, reactions, markers и пустые protocol messages не становятся обычными bubbles. Реальная ошибка дешифрования отображается как отдельное безопасное состояние.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MSG-008",
"source": "specs/tz_clear.md",
"text": "Чат с собой поддерживает текст/медиа и sync. Успешное собственное сообщение допускается помечать read по определённому self-chat правилу.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MSG-009",
"source": "specs/tz_clear.md",
"text": "У исходящего failed text доступно явное «Повторить», если payload сохранён. Повтор не должен незаметно менять encryption policy уже подготовленного сообщения; изменение режима требует нового явного решения.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "READ-001",
"source": "specs/tz_clear.md",
"text": "Новое входящее увеличивает локальный unread, если чат не просматривается активно. Архивный replay не раздувает счётчик повторно.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "READ-002",
"source": "specs/tz_clear.md",
"text": "При активном просмотре last-visible/latest incoming direct message отправляется displayed по протоколу; одно и то же состояние не рассылается без необходимости.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "READ-003",
"source": "specs/tz_clear.md",
"text": "Outgoing direct messages помечаются markable. Для MUC приложение не рассылает direct displayed markers в комнату как универсальный механизм прочтения всеми участниками.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "READ-004",
"source": "specs/tz_clear.md",
"text": "Поддерживается own-device sync read state через совместимое служебное расширение. Маркер, пришедший раньше сообщения, применяется после получения target. Пользователь не видит служебную запись в self-chat.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "READ-005",
"source": "specs/tz_clear.md",
"text": "Read marker — metadata; нельзя заявлять его E2EE только по encrypted body исходного сообщения.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "EDIT-001",
"source": "specs/tz_clear.md",
"text": "Используется совместимая message correction. Оригинал сохраняет свою идентичность и положение; заменяется body, устанавливается editedAt.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "EDIT-002",
"source": "specs/tz_clear.md",
"text": "Применение проверяет чат, автора, допустимый тип, security context и timestamp. Сторонний отправитель не может исправить чужое сообщение.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "EDIT-003",
"source": "specs/tz_clear.md",
"text": "Correction до оригинала удерживается в ограниченной pending очереди. Более старая correction не заменяет новую.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "EDIT-004",
"source": "specs/tz_clear.md",
"text": "Шифрование исправления соответствует исходному сообщению; не допускается plaintext раскрытие исправляемого encrypted body из-за текущего глобального переключателя.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REPLY-001",
"source": "specs/tz_clear.md",
"text": "Поддерживаются стандартная reply reference и fallback для совместимых старых клиентов. Unicode offsets считаются согласно протоколу, без смешения байтов и символов.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REPLY-002",
"source": "specs/tz_clear.md",
"text": "Отображается компактный preview источника, а fallback quote не дублируется в основном body.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REPLY-003",
"source": "specs/tz_clear.md",
"text": "Нажатие открывает источник/ветку, если reference известен. При недоступном оригинале показывается preview и объяснение без crash.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REPLY-004",
"source": "specs/tz_clear.md",
"text": "Legacy `>` quote допускается отображать без ложного target id. MUC replies ссылаются на room-assigned stanza id и корректный occupant identity.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REPLY-005",
"source": "specs/tz_clear.md",
"text": "Reference нельзя применить к другому чату с совпавшим id. Визуальная ветка — группировка reply, не отдельная серверная комната.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FWD-001",
"source": "specs/tz_clear.md",
"text": "Можно выбрать одно/несколько сообщений и переслать в существующий чат либо на валидный JID. Порядок: timestamp, устойчивый id.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FWD-002",
"source": "specs/tz_clear.md",
"text": "Создаются новые сообщения с новой identity и понятной атрибуцией. Пересылка не подделывает исходного sender.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FWD-003",
"source": "specs/tz_clear.md",
"text": "Media скачивается/расшифровывается и заново загружается для нового recipient и его encryption policy. Старый encrypted URI/key не переиспользуется автоматически.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FWD-004",
"source": "specs/tz_clear.md",
"text": "При частичной ошибке показывается количество успешно пересланного; уже доставленные элементы не откатываются и не повторяются молча.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "DEL-001",
"source": "specs/tz_clear.md",
"text": "«Удалить у меня» удаляет local row и сохраняет suppression всех известных identities, чтобы MAM/live echo не восстановили удалённое сообщение.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "DEL-002",
"source": "specs/tz_clear.md",
"text": "«Удалить у всех» отправляет retraction, проверяет авторство при применении и заменяет target на tombstone. Очищаются body/media/reply/reaction sensitive payload и связанные доступные cache.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "DEL-003",
"source": "specs/tz_clear.md",
"text": "Retract до оригинала удерживается pending. Generic fallback не повторяет удаляемое содержимое.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "DEL-004",
"source": "specs/tz_clear.md",
"text": "UI явно сообщает разницу локального удаления и отзыва. Ни одно не обещает стирание screenshots, backups, чужих exports или неподдерживающего клиента.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "DEL-005",
"source": "specs/tz_clear.md",
"text": "Массовое действие фильтрует/объясняет недоступные элементы; подтверждение показывает область действия и число сообщений.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REACT-001",
"source": "specs/tz_clear.md",
"text": "Реакции совместимы с XMPP reactions: target id и полный актуальный набор автора; пустой набор снимает реакцию.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REACT-002",
"source": "specs/tz_clear.md",
"text": "Emoji валидируются, дубликаты удаляются. Один reaction value — один grapheme, ограниченный безопасной длиной; baseline до 64 UTF-8 bytes.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REACT-003",
"source": "specs/tz_clear.md",
"text": "Показываются emoji, count и own state. Повторный tap переключает свой вклад. Более старое событие не отменяет новое.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REACT-004",
"source": "specs/tz_clear.md",
"text": "Direct авторы сравниваются по подготовленному bare JID, group — по корректной occupant identity. Нельзя объединять разных участников из-за неверной нормализации resource.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REACT-005",
"source": "specs/tz_clear.md",
"text": "Реакции не шифруются автоматически только из-за OMEMO текста. Базовая совместимая stanza является видимой серверу metadata; отдельное encrypted extension требует самостоятельного согласования и interoperability tests.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "TYPE-001",
"source": "specs/tz_clear.md",
"text": "Typing имеет active/composing/paused/inactive/gone. Baseline пауза после 5 с, удалённый composing истекает через 8 с без обновления.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "TYPE-002",
"source": "specs/tz_clear.md",
"text": "Настройка typing per-account; выключение прекращает отправку/отображение и очищает pending indicators. Для direct учитывается поддержка peer.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "TYPE-003",
"source": "specs/tz_clear.md",
"text": "В группе показываются имена для одного/двух участников, затем обобщённый статус. Переход между чатами/уход из foreground не оставляет вечное «печатает».",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MUC-001",
"source": "specs/tz_clear.md",
"text": "Пользователь создаёт/открывает room JID, задаёт nickname и optional name; для защищённых комнат предусмотрен запрос password при требовании сервера.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MUC-002",
"source": "specs/tz_clear.md",
"text": "Поддерживаются invitations, accept/join, occupant count, autojoin и информация о комнате. Invitees валидируются; некорректные адреса явно обозначаются.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MUC-003",
"source": "specs/tz_clear.md",
"text": "Новая encrypted-friendly комната конфигурируется persistent, members-only, nonanonymous и с доступными участникам affiliation lists, если сервер даёт эти права.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MUC-004",
"source": "specs/tz_clear.md",
"text": "Для encrypted send проверяются real JID всех необходимых online/offline recipients через occupants и member/admin/owner lists. Недоступный/неполный набор получателей блокирует безопасную отправку.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MUC-005",
"source": "specs/tz_clear.md",
"text": "Скрытые JID, отсутствие устройств или невозможность построить session не вызывают fallback к plaintext. Ошибка объясняет, что может изменить владелец/участник.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MUC-006",
"source": "specs/tz_clear.md",
"text": "Own echo дополняет room stanza identity даже при повторном encrypted payload. Replies/reactions становятся доступны после устойчивой серверной identity.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MUC-007",
"source": "specs/tz_clear.md",
"text": "«Выйти» сохраняет локальный чат/историю и снимает joined. «Удалить чат» удаляет локальную историю/сохранённую комнату после выхода; это не уничтожение комнаты сервера.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MUC-008",
"source": "specs/tz_clear.md",
"text": "После локального удаления поздние события текущей room session не создают чат заново без явного основания. Повторное приглашение/вход имеют определённую семантику.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ENC-001",
"source": "specs/tz_clear.md",
"text": "OMEMO включён по умолчанию для аккаунта. Per-chat override: наследовать / включено / выключено. UI показывает итоговый режим до отправки.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ENC-002",
"source": "specs/tz_clear.md",
"text": "Ошибка encryption никогда не приводит к автоматической plaintext отправке. Plaintext возможен только при явно выбранной политике.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ENC-003",
"source": "specs/tz_clear.md",
"text": "Поддерживаются legacy OMEMO и OMEMO 2 с совместимыми wire formats, device lists/bundles и согласованной lifecycle политикой identity/session.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ENC-004",
"source": "specs/tz_clear.md",
"text": "Для direct предпочтителен OMEMO 2 при готовности и поддержке peer; иначе совместимый legacy. Для group OMEMO 2 используется только при поддержке всех recipients; legacy остаётся encrypted fallback.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ENC-005",
"source": "specs/tz_clear.md",
"text": "Encrypt-to-self охватывает собственные другие устройства, чтобы Carbons/MAM могли быть прочитаны. Active own device не включается как чужой recipient с некорректной обязательной self-session.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ENC-006",
"source": "specs/tz_clear.md",
"text": "Private identity, prekeys и sessions сохраняются устойчиво и раздельно по аккаунтам. Обновление приложения не создаёт новую identity без необходимости.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ENC-007",
"source": "specs/tz_clear.md",
"text": "TOFU и verified различаются. Первое доверие отмечается как автоматическое; changed identity переводится в undecided и требует понятного решения. Compromised key не используется как trusted.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ENC-008",
"source": "specs/tz_clear.md",
"text": "Пользователь видит список устройств, protocol support, fingerprint, active state и trust, может отметить проверенный fingerprint и снять verification.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ENC-009",
"source": "specs/tz_clear.md",
"text": "OMEMO encryption/decryption выполняются в клиентском endpoint. Web gateway может передавать encrypted stanza, но не получает password/crypto state для скрытой серверной расшифровки. Применяются проверенные криптографические реализации и совместимые test vectors. Собственный новый алгоритм, замена примитивов или трактовка общего session storage как доказанной interoperability не допускаются.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ENC-010",
"source": "specs/tz_clear.md",
"text": "Зашифрованный text не означает шифрование JID, времени, stanza ids, replies metadata, reactions, typing, avatars или custom sync. Матрица раскрываемых metadata является частью security документации каждого релиза.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "ENC-011",
"source": "specs/tz_clear.md",
"text": "Криптографический формат OMEMO 2 реализуется по утверждённой совместимой редакции с SCE и необходимыми payload/key/MAC rules; он не заменяется media AES-GCM только из-за удобства библиотеки.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FILE-001",
"source": "specs/tz_clear.md",
"text": "Поддерживаются файл, фото, видео, музыка, voice и videoNote. Тип определяется безопасно по metadata/MIME/доступному анализу; расширение не даёт права автоматически выполнять содержимое.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FILE-002",
"source": "specs/tz_clear.md",
"text": "Можно выбрать до 20 элементов за пакет, просмотреть, удалить отдельные и добавить общую подпись. Перевышение лимита объясняется; элементы не теряются молча.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FILE-003",
"source": "specs/tz_clear.md",
"text": "Источник копируется/удерживается в staged draft с достаточным сроком доступа. Не предполагается, что временный URL picker остаётся доступным после его закрытия.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FILE-004",
"source": "specs/tz_clear.md",
"text": "При encrypted policy blob шифруется до upload случайным file key; ключ передаётся внутри защищённого сообщения, не upload service. Для plaintext это явно обозначено.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FILE-005",
"source": "specs/tz_clear.md",
"text": "Используется HTTP File Upload discovery/slot. Выбирается подходящий component по реально загружаемому размеру. Ограничение сервера и памяти отображается до бессмысленного повторения операции.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FILE-006",
"source": "specs/tz_clear.md",
"text": "Upload/download допускаются по HTTPS. Проверка распространяется на redirect chain; переход к небезопасной схеме не допускается. HTTP headers/credentials slot не отправляются произвольному другому origin после redirect.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FILE-007",
"source": "specs/tz_clear.md",
"text": "Сохраняется исходное безопасное расширение filename. Encrypted media URI использует совместимую aesgcm scheme/key fragment, а не вымышленное обязательное расширение файла.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FILE-008",
"source": "specs/tz_clear.md",
"text": "Body media-сообщения остаётся распознаваемой ссылкой; plaintext дополнительно передаёт совместимый OOB. Подпись пакета — отдельный text/reply к первому подходящему вложению.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FILE-009",
"source": "specs/tz_clear.md",
"text": "Пакет отправляется с контролем порядка. Successful drafts удаляются из pending, failed остаются для retry; caption отправляется после успешных вложений. Ошибка caption не откатывает уже отправленные файлы.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FILE-010",
"source": "specs/tz_clear.md",
"text": "Retry сохраняет account/recipient/message identity и encryption context. Сбой после PUT, но до XMPP send может оставить orphan blob; это не обозначается как гарантированно удалённый файл.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FILE-011",
"source": "specs/tz_clear.md",
"text": "Загрузки поддерживают progress по доступным данным, cancellation и bounded retry. Недостаток диска/памяти обрабатывается как ошибка без повреждения остальных сообщений.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "FILE-012",
"source": "specs/tz_clear.md",
"text": "В Web endpoint обязан поддерживать необходимые browser access/CORS политики. Proxy не получает file key или decrypted blob для обхода ограничений незаметно для пользователя.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MEDIA-001",
"source": "specs/tz_clear.md",
"text": "Photo/video имеют inline preview с сохранением aspect ratio без неожиданного crop. Loading/error/placeholder различаются.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MEDIA-002",
"source": "specs/tz_clear.md",
"text": "Фото открывается в viewer с zoom/pan. Видео имеет play/pause/seek/fullscreen и доступные системные controls. Voice/audio — inline player, duration, seek, progress; voice speeds 1×/1.5×/2×.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MEDIA-003",
"source": "specs/tz_clear.md",
"text": "В пределах приложения активный media playback согласован: начало другого audio/video не создаёт неконтролируемое одновременное звучание. Системный audio focus обрабатывается по платформе.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MEDIA-004",
"source": "specs/tz_clear.md",
"text": "VideoNote показан кругом, воспроизводится inline и увеличивается при playback. Изменение размера не вызывает потерю позиции чтения.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MEDIA-005",
"source": "specs/tz_clear.md",
"text": "Preview cache не скачивает один файл многократно из-за повторного появления row. Decrypted cache ограничивается размером/сроком и очищается согласно privacy/account lifecycle.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MEDIA-006",
"source": "specs/tz_clear.md",
"text": "Экспорт/скачивание/копирование выполняются явно. Пользователь выбирает доступное платформенное место сохранения; отмена не показывает success.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MEDIA-007",
"source": "specs/tz_clear.md",
"text": "Viewer закрывается доступной кнопкой/keyboard action и gesture по UI Kit. Zoomed pan не конфликтует с dismiss.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "MEDIA-008",
"source": "specs/tz_clear.md",
"text": "Неподдерживаемый codec/file открывается безопасным fallback/download с объяснением; не имитируется успешное воспроизведение.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REC-001",
"source": "specs/tz_clear.md",
"text": "Разрешения microphone/camera запрашиваются по действию пользователя. Отказ не ломает текстовый composer.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REC-002",
"source": "specs/tz_clear.md",
"text": "Voice: start, elapsed, cancel, finish; запись короче 0.4 с не отправляется. Длительность голоса не ограничивается автоматически 60 секундами: ограничения файла/сервера действуют отдельно.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REC-003",
"source": "specs/tz_clear.md",
"text": "VideoNote: до 60 с, корректная ориентация, переключение камеры при доступном hardware. Минимальный валидный media asset — 0.8 с; early stop может дождаться достаточного capture, baseline 1.2 с.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REC-004",
"source": "specs/tz_clear.md",
"text": "Отпускание/отмена до асинхронного старта capture не оставляет скрытую запись. Finalization имеет timeout и завершает UI в определённое состояние.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REC-005",
"source": "specs/tz_clear.md",
"text": "При interruption пригодный partial asset может быть предложен для восстановления/предпросмотра, но не отправляется автоматически как подтверждённое действие.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "REC-006",
"source": "specs/tz_clear.md",
"text": "На touch поддерживаются hold/slide cancel/lock. На mouse/keyboard всегда есть явные start/stop/cancel; жест не является единственным способом записи.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "GEO-001",
"source": "specs/tz_clear.md",
"text": "Отправка текущей или выбранной точки доступна через меню вложения. Разрешение location запрашивается только в этом сценарии.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "GEO-002",
"source": "specs/tz_clear.md",
"text": "При denied/отсутствии GPS доступен ручной выбор координат на карте либо ввод точки. Live tracking в scope не входит.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "GEO-003",
"source": "specs/tz_clear.md",
"text": "Передаётся совместимый geo URI: finite latitude −90…90, longitude −180…180, optional nonnegative uncertainty. UI не выдаёт число знаков после запятой за точность датчика.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "GEO-004",
"source": "specs/tz_clear.md",
"text": "Карта/tiles provider и передача ему coordinates отражены в privacy конфигурации решения. OMEMO чата не скрывает запрос карты от её провайдера.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "HIST-001",
"source": "specs/tz_clear.md",
"text": "История хранится локально с изоляцией аккаунтов. Существующие сообщения доступны при временном отсутствии сети, если устройство/профиль допускает persistent storage.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "HIST-002",
"source": "specs/tz_clear.md",
"text": "На первом входе загружается ограниченное недавнее окно, baseline 40 сообщений. Полная многолетняя история не блокирует запуск; старое догружается по запросу/прокрутке.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "HIST-003",
"source": "specs/tz_clear.md",
"text": "Account archive и каждая MUC имеют собственные checkpoint. Cursor непрозрачен, не вычисляется из local id и не переносится между архивами.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "HIST-004",
"source": "specs/tz_clear.md",
"text": "Incremental запрос использует stored cursor. При его истечении допустим однократный timestamp fallback с overlap 60 с. Цикл cursor↔timestamp запрещён.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "HIST-005",
"source": "specs/tz_clear.md",
"text": "Проверяются query id, допустимый источник, порядок завершения и размер страницы. Чужой результат/overflow не считается успешной историей.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "HIST-006",
"source": "specs/tz_clear.md",
"text": "Missing/repeating cursor у incomplete page прекращает проход с recoverable error. Не допускаются вечный spinner и пропуск остатка как якобы complete.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "HIST-007",
"source": "specs/tz_clear.md",
"text": "Архивные mutations применяются согласованными пачками. Durable checkpoint продвигается только после успешной локальной транзакции соответствующих данных. Ошибка диска сохраняет предыдущую точку восстановления.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "HIST-008",
"source": "specs/tz_clear.md",
"text": "Backward pagination берёт следующий before из server RSM first даже если страница содержала только reactions/retractions/дубликаты.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "HIST-009",
"source": "specs/tz_clear.md",
"text": "Pending correction/retraction/reaction/read marker применяются после target. Очереди ограничены и очищаются по политике; overflow не создаёт crash.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "HIST-010",
"source": "specs/tz_clear.md",
"text": "Расшифрование и большие batches уступают время UI. Background/media capture/upload могут временно снижать архивную активность; возобновление не теряет checkpoint.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "HIST-011",
"source": "specs/tz_clear.md",
"text": "Автоматические retries ограничены; после исчерпания показывается recoverable state и доступно повторить. Незавершённый проход не объявляется «История полностью загружена».",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "HIST-012",
"source": "specs/tz_clear.md",
"text": "Локальная миграция выполняется транзакционно; исходный формат удаляется после успешной записи. Upgrade не должен уничтожать единственную durable копию данных.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-001",
"source": "specs/tz_clear.md",
"text": "Поддерживаются аудио-/видеозвонки один на один, один активный звонок на клиентский контекст. Второй входящий/исходящий получает определённый busy/reject сценарий.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-002",
"source": "specs/tz_clear.md",
"text": "До запуска запрашиваются microphone/camera permissions. Есть incoming accept/decline, connecting, connected, elapsed и завершение.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-003",
"source": "specs/tz_clear.md",
"text": "Доступны mute, camera enable/disable, switch camera при нескольких камерах и speaker/audio output выбор в пределах платформенных возможностей.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-004",
"source": "specs/tz_clear.md",
"text": "Используется совместимый Jingle/JMI signaling и WebRTC media с ICE/DTLS-SRTP. Endpoint выбирается как подходящий full JID; последующие сообщения согласованы с тем же ресурсом.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-005",
"source": "specs/tz_clear.md",
"text": "SDP media sections сохраняют порядок offer. ICE candidates удерживаются до готового remote description, затем передаются/применяются без вечного ожидания bare/full JID.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-006",
"source": "specs/tz_clear.md",
"text": "STUN/TURN обнаруживаются через extdisco или утверждённую конфигурацию. Проверяются scheme, host/port, transport, expiration и credentials. Невалидная запись не приводит к crash медиадвижка.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-007",
"source": "specs/tz_clear.md",
"text": "TURN relay необходим для утверждённой тестовой матрицы сложных сетей. Отсутствие relay показывается диагностически; STUN не описывается как гарантия соединения за любым NAT.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-008",
"source": "specs/tz_clear.md",
"text": "Внешний fallback STUN допускается только как задокументированный конфигурационный выбор. Сервис-получатель сетевых адресов отражается в privacy документации.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-009",
"source": "specs/tz_clear.md",
"text": "Смена сети/краткая ICE failure имеют ограниченное recovery окно. После него звонок завершается корректно, освобождает tracks/camera/microphone и снимает active state.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-010",
"source": "specs/tz_clear.md",
"text": "Закрытие экрана звонка не может оставить скрыто включённый microphone/camera вопреки показанному состоянию. Background behavior задаётся интеграцией платформы, не визуальным состоянием окна.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-011",
"source": "specs/tz_clear.md",
"text": "Каждый звонок создаёт одну history card: направление, media type, начало, duration и outcome.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-012",
"source": "specs/tz_clear.md",
"text": "Missed incoming увеличивает unread. Дубликаты completion callbacks не создают несколько карточек.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "CALL-013",
"source": "specs/tz_clear.md",
"text": "Call history синхронизируется с собственными устройствами через совместимое расширение и MAM/Carbons, если сервер хранит такие события. Metadata не выдаётся за OMEMO body.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "PUSH-001",
"source": "specs/tz_clear.md",
"text": "Поддерживаются локальные уведомления для новых событий активного клиента и отдельная push-интеграция для разрешённых платформенных состояний.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "PUSH-002",
"source": "specs/tz_clear.md",
"text": "Notification создаётся для нового incoming, не для outgoing/повторного MAM. В активно просматриваемом чате дублирующий banner подавляется.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "PUSH-003",
"source": "specs/tz_clear.md",
"text": "Уведомление содержит безопасную идентичность account/conversation/event для перехода в правильный контекст. Повторная доставка push и network event дедуплицируется.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "PUSH-004",
"source": "specs/tz_clear.md",
"text": "Default privacy: push payload не содержит plaintext body, file key или credentials. Preview после получения сообщения определяется пользовательской настройкой; при app lock default preview скрыт.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "PUSH-005",
"source": "specs/tz_clear.md",
"text": "Gateway/registration lifecycle включает register/update token, enable по XMPP, disable/logout/revoke и обработку expired token. Наличие server push feature без registration не отображается как «Push работает».",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "PUSH-006",
"source": "specs/tz_clear.md",
"text": "Push — сигнал получения/пробуждения, а не источник истины истории. После него клиент синхронизируется с сервером; утерянный push не должен навсегда потерять сообщение.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "PUSH-007",
"source": "specs/tz_clear.md",
"text": "Базовый single-active-account режим регистрирует доставку для активного аккаунта; переключение согласует старую и новую registration. Уведомления неактивных аккаунтов не обещаются без отдельно реализованного multiaccount background режима. Поздний push сохраняет исходную account identity и не открывает переписку другого аккаунта.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "WEB-001",
"source": "specs/tz_clear.md",
"text": "Для уведомлений вне открытой страницы поставляется поддержанный Web Push/service worker путь и gateway, если браузер/пользователь предоставили возможность. При отсутствии поддержки/permission приложение честно показывает статус «Только при открытом приложении».",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "WEB-002",
"source": "specs/tz_clear.md",
"text": "Закрытая страница не считается постоянно подключённой XMPP-сессией. Service worker notification не гарантирует непрерывный microphone, медиазвонок или автоматический показ полноэкранного incoming UI.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "WEB-003",
"source": "specs/tz_clear.md",
"text": "Incoming push может уведомить о вызове и открыть приложение по действию. После открытия проверяются актуальность и состояние вызова; истёкший вызов не «принимается» из старого notification.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "WEB-004",
"source": "specs/tz_clear.md",
"text": "Несколько вкладок координируют активное соединение/device state либо используют изолированные ресурсы с безопасным доступом к crypto state. Не допускаются конкурентные повреждающие записи ratchet sessions.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "DESK-001",
"source": "specs/tz_clear.md",
"text": "Пользователь понимает разницу «закрыть окно», «скрыть/свернуть» и «выйти из приложения». Работа в tray/фоновой сессии и автозапуск — явно управляемые настройки.",
"applicability": "out_of_scope",
"reason": "Native Android/Desktop lifecycle; excluded from Web-only implementation."
},
{
"id": "DESK-002",
"source": "specs/tz_clear.md",
"text": "При живом фоновом процессе поддерживаются сообщения и incoming calls. Полностью завершённый процесс не получает обещание гарантированного пробуждения без отдельного системного механизма.",
"applicability": "out_of_scope",
"reason": "Native Android/Desktop lifecycle; excluded from Web-only implementation."
},
{
"id": "DESK-003",
"source": "specs/tz_clear.md",
"text": "Sleep/wake, network change и logout восстанавливают/отключают соединение и push registration корректно. Tray icon не показывает active call после завершения.",
"applicability": "out_of_scope",
"reason": "Native Android/Desktop lifecycle; excluded from Web-only implementation."
},
{
"id": "AND-001",
"source": "specs/tz_clear.md",
"text": "Поставляется интеграция системной доставки уведомлений и входящих вызовов для утверждённого режима устройства. Выбор push provider и доступность устройств без соответствующего сервиса фиксируются в паспорте релиза.",
"applicability": "out_of_scope",
"reason": "Native Android/Desktop lifecycle; excluded from Web-only implementation."
},
{
"id": "AND-002",
"source": "specs/tz_clear.md",
"text": "Фоновая работа соответствует lifecycle/permissions ОС. Постоянный socket в обычном скрытом UI не используется как единственная гарантия доставки.",
"applicability": "out_of_scope",
"reason": "Native Android/Desktop lifecycle; excluded from Web-only implementation."
},
{
"id": "AND-003",
"source": "specs/tz_clear.md",
"text": "Для ongoing call используется разрешённый системный foreground/call механизм с видимым статусом; control из notification согласован с app state.",
"applicability": "out_of_scope",
"reason": "Native Android/Desktop lifecycle; excluded from Web-only implementation."
},
{
"id": "AND-004",
"source": "specs/tz_clear.md",
"text": "Force stop, отозванные разрешения, ограничения батареи и отключённая сеть имеют задокументированную деградацию. Приложение не обещает обход пользовательского запрета ОС.",
"applicability": "out_of_scope",
"reason": "Native Android/Desktop lifecycle; excluded from Web-only implementation."
},
{
"id": "STORE-001",
"source": "specs/tz_clear.md",
"text": "История, crypto state и настройки раздельны по accountId; операции сохранения транзакционны либо имеют проверяемый equivalent recovery механизм.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "STORE-002",
"source": "specs/tz_clear.md",
"text": "Native credentials защищены системным secure storage; private key material защищается подходящим устройству key wrapping/access control. Пароль не хранится в открытом preferences файле.",
"applicability": "out_of_scope",
"reason": "Native secure storage; Web addressed by STORE-003/004."
},
{
"id": "STORE-003",
"source": "specs/tz_clear.md",
"text": "В Web пароль не хранится plaintext в localStorage, URLs, analytics или общедоступных configuration objects. Persistent login и разблокировка crypto state используют отдельное задокументированное защищённое решение; отсутствие такого решения означает повторный вход, а не незаметное ослабление.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "STORE-004",
"source": "specs/tz_clear.md",
"text": "Web storage может иметь квоты/очистку. Приложение обрабатывает quota/exhaustion и показывает, когда история не сохранена устойчиво. Browser storage не представляется эквивалентом hardware-backed native vault.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "STORE-005",
"source": "specs/tz_clear.md",
"text": "Media cache имеет лимит и eviction. Draft/failed payload не исчезает без объяснения; при невозможном retry действие отключено с причиной.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "STORE-006",
"source": "specs/tz_clear.md",
"text": "Автосохранение не теряет введённый текст при переходах/обычном восстановлении. Draft принадлежит account + conversation; он не переносится в другой чат из-за reuse UI.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "STORE-007",
"source": "specs/tz_clear.md",
"text": "Миграции versioned и тестируются на старых данных/сбоях. Ошибка открытия persistent store показывает ограниченный режим, а не ложное подтверждение durable записи.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "LOCK-001",
"source": "specs/tz_clear.md",
"text": "App lock скрывает всю sensitive UI: чат, media, call details и previews. Поддерживаются пользовательский passcode и доступная системная биометрия.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "LOCK-002",
"source": "specs/tz_clear.md",
"text": "Минимальная длина passcode 4 символа, предусмотрены ограничение частоты ошибочных попыток и корректное хранение verifier/секрета. App lock не объявляется шифрованием базы без отдельного encryption механизма.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "LOCK-003",
"source": "specs/tz_clear.md",
"text": "После запуска и ухода в background lock применяется по настройке. Краткая потеря focus для системного picker/permission dialog не прерывает незавершённую операцию.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "LOCK-004",
"source": "specs/tz_clear.md",
"text": "Web не обещает native biometric unlock на любом браузере; при отсутствии защищённой интеграции остаётся passcode либо повторная авторизация. Lock settings показывают фактическую возможность.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "SEC-001",
"source": "specs/tz_clear.md",
"text": "Документируется разделение transport TLS, OMEMO payload, file encryption, DTLS-SRTP media, local protection и UI lock. Термины не подменяют друг друга.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "SEC-002",
"source": "specs/tz_clear.md",
"text": "Server/upload/STUN/TURN/maps/push providers получают только необходимые данные. Перечень providers и metadata доступен пользователю.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "SEC-003",
"source": "specs/tz_clear.md",
"text": "Логи исключают passwords, tokens, private/session keys, decrypted bodies и file key fragments. Сетевые трассы по умолчанию обезличены; диагностический экспорт требует явного действия и предупреждения о metadata.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "SEC-004",
"source": "specs/tz_clear.md",
"text": "Полученные text/filenames/URLs/XML не выполняются как HTML/script/команда. Web rendering безопасен для XSS; переход по внешним URL не передаёт секретный контекст.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "SEC-005",
"source": "specs/tz_clear.md",
"text": "У ограничений входных данных есть предельный размер/depth/count. Недоверенные stanza, challenges, media metadata и custom sync parsers не должны создавать бесконечную работу/выделение памяти.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "SEC-006",
"source": "specs/tz_clear.md",
"text": "Copy/export явно выводит plaintext за границы клиента; локальная очистка не обещает удалить clipboard или пользовательский файл.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "SEC-007",
"source": "specs/tz_clear.md",
"text": "«Удалить у всех» — протокольный отзыв; «Удалить локальные данные» — удаление собственного профиля. В UI нет обещания абсолютного стирания всех копий.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "SEC-008",
"source": "specs/tz_clear.md",
"text": "Для push/служебной own-device синхронизации проверяется источник и принадлежность аккаунту. Remote peer не может подделать собственную call/read history только прислав похожий XML element.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NFR-001",
"source": "specs/tz_clear.md",
"text": "UI Kit является обязательным стандартом visual/interaction behavior. Small/wide layout определяется доступной шириной, не строкой User-Agent.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NFR-002",
"source": "specs/tz_clear.md",
"text": "Списки/лента виртуализируются или используют equivalent bounded rendering. Большой архив не создаёт все визуальные rows одновременно.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NFR-003",
"source": "specs/tz_clear.md",
"text": "Проект задаёт измеряемые бюджеты startup, RAM, cache и frame responsiveness для утверждённых reference devices. До утверждения devices не заявляется произвольный универсальный SLA.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NFR-004",
"source": "specs/tz_clear.md",
"text": "Encryption/decoding/uploads уступают ресурсы active input/capture. Scroll и text entry остаются доступными во время catch-up.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NFR-005",
"source": "specs/tz_clear.md",
"text": "Системные permissions запрашиваются по контексту. Denied, hardware missing и revoked during session входят в тестовую матрицу.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NFR-006",
"source": "specs/tz_clear.md",
"text": "Web/Desktop полностью управляются клавиатурой; Android поддерживает системную accessibility. Focus, text scale, reduced motion и contrast проверяются по UI Kit.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NFR-007",
"source": "specs/tz_clear.md",
"text": "Сборки воспроизводимы: pinned/locked dependencies, migrations, build instructions, CI, license notices и release artifacts. Выбор framework не включён в пользовательские требования.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NFR-008",
"source": "specs/tz_clear.md",
"text": "CI запускает unit/integration checks и smoke UI tests для поставляемых targets. Подпись/публикация и secrets отделены от публичного репозитория.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "NFR-009",
"source": "specs/tz_clear.md",
"text": "Crash/error reports не включают sensitive content по умолчанию. Телеметрия имеет утверждённую privacy-конфигурацию.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-001",
"source": "specs/uikit_clear.md",
"text": "Контент и общение находятся на первом плане. Декор не конкурирует с текстом, avatar и основным действием.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-002",
"source": "specs/uikit_clear.md",
"text": "Основной accent — синий. Outgoing сообщения синие, incoming нейтральные. Направление различается также выравниванием, а состояние — иконкой/подписью.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-003",
"source": "specs/uikit_clear.md",
"text": "Элементы округлые, поверхности спокойные, navigation и forms следуют привычкам платформы. Нет обязательного копирования внешнего вида одной ОС на другую.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-004",
"source": "specs/uikit_clear.md",
"text": "Полупрозрачность поддерживает иерархию, но не ухудшает чтение. При отсутствии blur/пониженной прозрачности используется определённый opaque fallback.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-005",
"source": "specs/uikit_clear.md",
"text": "Состояния loading/empty/error/disabled/selected являются частью компонента, а не отдельной импровизацией каждого экрана.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-006",
"source": "specs/uikit_clear.md",
"text": "Жест ускоряет действие, но для значимого действия есть видимый/доступный альтернативный control.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-007",
"source": "specs/uikit_clear.md",
"text": "Пользовательские строки — русские, короткие и точные. «Отправлено», «Доставлено» и «Прочитано» не заменяют друг друга.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-008",
"source": "specs/uikit_clear.md",
"text": "Маленькое окно, клавиатура, увеличение текста и reduced motion поддерживаются системно, а не исправляются после завершения дизайна.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-AVATAR",
"source": "specs/uikit_clear.md",
"text": "Circle, photo fill с crop, fallback — initials/group icon и стабильный фон. Не смешивать photo fit с avatar fill: фотографии сообщений не обрезаются как avatar.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-MESSAGE",
"source": "specs/uikit_clear.md",
"text": "Incoming слева, outgoing справа. Outer horizontal inset 12, row gap 8. Opposite minimum space 54 для текста и 16 для media, с уменьшением в узком viewport. Body wrapping не расширяет страницу горизонтально.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-A11Y-001",
"source": "specs/uikit_clear.md",
"text": "Целевой контраст обычного текста минимум 4.5:1, крупного 3:1; значимых controls/focus минимум 3:1 относительно соседних поверхностей. Проверяются фактические composite colors, не только исходные HEX.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-A11Y-002",
"source": "specs/uikit_clear.md",
"text": "Все действия доступны screen reader и имеют names/states. Icon-only button не называется именем файла icon.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-A11Y-003",
"source": "specs/uikit_clear.md",
"text": "Web/Desktop полностью поддерживают Tab/Shift+Tab, Enter/Space для действий, Escape для закрытия и предсказуемый focus order. Hover-only actions доступны также по focus/tap.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-A11Y-004",
"source": "specs/uikit_clear.md",
"text": "При text scale/zoom до 200% интерфейс reflow без потери основных действий. Fingerprint/URI можно прочитать полностью; text body не скрывается за fixed height.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-A11Y-005",
"source": "specs/uikit_clear.md",
"text": "Touch targets минимум 48×48 u для действий; визуально меньшая icon сохраняет просторный hit region. На pointer target не меньше 44×44 для основных icon actions.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-A11Y-006",
"source": "specs/uikit_clear.md",
"text": "Errors связаны с input, loading не бесконечно повторяется screen reader, live messages объявляются умеренно и не перехватывают focus.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-A11Y-007",
"source": "specs/uikit_clear.md",
"text": "Reduced motion/transparency и high contrast имеют определённые варианты. Цвет не единственный способ различения unread/failed/verified.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
},
{
"id": "UI-A11Y-008",
"source": "specs/uikit_clear.md",
"text": "Record/call/media controls отражают фактическую активность camera/microphone. Для destructive есть явное подтверждение области действия.",
"applicability": "web",
"reason": "Web requirement; cross-platform clauses apply only in Web context."
}
]