diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index 255eba36..a97858f1 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -293,3 +293,13 @@ Reader получает очередь и видит disabled retry. Прямо [Поздний receipt](ux-ui/screens/outbox-source-receipt-real-320-2026-10-08.png) просмотрен; [поздняя ошибка](ux-ui/screens/outbox-source-error-real-320-2026-10-08.png) сохранена. Навигация штатно abort-ит старый клиентский запрос; управляемая задержка producer не является физическим разрывом сети или доказательством доставки сообщения. Scheduler admission закрыт, dispatcher не запускался, внешний Telegram fetch дополнительно запрещён. AUTH_REQUIRED=false на изолированных процессах; реальные Portal login и чат не проверены. Оба backend завершились exitCode0, cleanup подтвердил A retry2/B retry0 и sender0. Независимые SQL-запросы подтвердили ноль fixture-записей в обеих БД. Контейнеры, локальный Next3101 и туннели8018/8019 удалены. Новая БД B удалена после проверки точного имени, владельца mmapp и отсутствия соединений; PostgreSQL подтвердил отсутствие БД. Основной стенд и БД не менялись. Следующий12.5.48 — профильная доступность очереди/диалога на production frontend. Локальный коммит без push. + +## 12.5.48 — доступность production очереди и диалога (2026-10-08) + +[Отчёт доступности](ux-ui/acceptance/browser-outbox-a11y-2026-10-08.json): production frontendb55588f/backend8782054, отдельная PostgreSQL БД, browser HTTP-ответы не подменялись. Axe4.11.3 с WCAG2A/AA,2.1A/AA,2.2AA tags: тёмная/светлая темы ×1280/320px, по четыре области/состояния — очередь, диалог без согласия, диалог с согласием, очередь при ошибке GET. Все16 scoped audits: violations0/incomplete0, passed rules14 для очереди и16 для диалога. + +Клавиатура открывает диалог через Enter, Space переключает подтверждение риска и доступность submit. По шесть Tab/Shift+Tab проверок в каждом сочетании подтверждают завершённый перенос фокуса внутри modal; Escape закрывает и возвращает фокус trigger. Асинхронные состояния имеют role=status, ошибка GET — role=alert; после восстановления ошибка исчезает. Панель/диалог помещаются в320px. [Светлая тема](ux-ui/screens/outbox-a11y-light-real-320-2026-10-08.png) и [тёмная тема](ux-ui/screens/outbox-a11y-dark-real-320-2026-10-08.png) сохранены и просмотрены. + +Уточнены ожидания harness: сначала готовность доступной кнопки после основной загрузки, затем завершение CSS-анимации перед контрастным аудитом и завершение переноса фокуса через Base UI focus guards. Первый аудит поймал промежуточную прозрачность входной анимации; после её завершения контраст прошёл без изменения продукта. Это аудит устойчивых состояний, не проверка всех кадров перехода. HTTP500 создан управляемым backend overview exception; физический отказ БД не моделировался. Реальная screen reader сессия не проводилась, scoped axe/клавиатура не означают полную WCAG сертификацию приложения. + +Retry POST0, Telegram calls0, JS errors0, SQL fixture counts сохранялись во всех сценариях. Dispatcher не запускался, scheduler admission закрыт. Временные контейнеры/сеть/туннель3018 удалены, backend exitCode0, отдельный SQL подтвердил ноль fixture-строк. Основной стенд и данные не менялись. Следующий12.5.49 — сводка Q-матрицы и точные оставшиеся условия реальной внешней приёмки. Локальный коммит без push. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 81234a42..792cb347 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,12 +1,12 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-08: 12.5.47 подтвердил смену A→B→A во время retry на двух настоящих HTTP backend и разных PostgreSQL БД. B не получает checkpoint/результат A и не меняется; возврат A сохраняет блокировку после позднего receipt или ошибки, включая reload. JS errors0/Telegram calls0. Временные процессы, fixture и БД B удалены. Production backend8782054/frontendb55588f прежний. Следующий12.5.48 — профильная доступность очереди и диалога на production frontend; Portal/Telegram delivery открыты. +Актуальное продолжение 2026-10-08: 12.5.48 подтвердил доступность production очереди/диалога: dark/light ×1280/320,16 scoped axe WCAG аудитов без violations/incomplete; клавиатура, focus trap, checkbox, Escape/возврат фокуса и alert/status passed. Retry POST0/Telegram0/JS errors0, fixture и временный стенд очищены. Runtime backend8782054/frontendb55588f прежний. Следующий12.5.49 — сводка Q-матрицы и оставшихся условий реальной внешней приёмки. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-08. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. ## Актуальная точка продолжения — 2026-10-08 -Этапы0–11 завершены в описанных локальных границах. Этап12 открыт. На тестовом сервере161.104.46.222 работают backend8782054/frontendb55588f и два CHR. Внешние проверки подтвердили PG backup/restore/rollback, остановку фоновой работы для одного экземпляра, API JWT/RBAC и браузерные состояния восстановления. Native TCP/UDP speed, история и UI проверены в границах журнала; доступ ко второму CHR восстановлен пользователем. Очередь Telegram проверена на реальном PG: dedupe, конкурентный claim, retry/version, ошибки сохранения и неопределённый исход; ответы отправителя подменялись, реальной доставки это не доказывает. Блоки12.5.43–45 подтвердили browser retry/checkpoint и развернули понятное пояснение HTTP500. 12.5.46 подтвердил browser JWT/RBAC очереди на реальном HTTP/PG; 12.5.47 подтвердил изоляцию checkpoint при смене двух реальных HTTP/PG источников в конфигурации local; следующий12.5.48 — профильная доступность production очереди/диалога. Реальная Telegram доставка, Portal SSO, физический TCP disconnect, multi-instance и остальные профильные сетевые сценарии остаются открытыми. [Протокол](ux-ui-external-acceptance.md) и [журнал](ux-ui-stage-12.md) содержат доказательства и ограничения. +Этапы0–11 завершены в описанных локальных границах. Этап12 открыт. На тестовом сервере161.104.46.222 работают backend8782054/frontendb55588f и два CHR. Внешние проверки подтвердили PG backup/restore/rollback, остановку фоновой работы для одного экземпляра, API JWT/RBAC и браузерные состояния восстановления. Native TCP/UDP speed, история и UI проверены в границах журнала; доступ ко второму CHR восстановлен пользователем. Очередь Telegram проверена на реальном PG: dedupe, конкурентный claim, retry/version, ошибки сохранения и неопределённый исход; ответы отправителя подменялись, реальной доставки это не доказывает. Блоки12.5.43–45 подтвердили browser retry/checkpoint и развернули понятное пояснение HTTP500. 12.5.46 подтвердил browser JWT/RBAC очереди на реальном HTTP/PG; 12.5.47 подтвердил изоляцию checkpoint при смене двух реальных HTTP/PG источников в конфигурации local; 12.5.48 подтвердил scoped axe/клавиатуру в обеих темах и320px; следующий12.5.49 — сводка Q-матрицы и открытых условий приёмки. Реальная Telegram доставка, Portal SSO, физический TCP disconnect, multi-instance и остальные профильные сетевые сценарии остаются открытыми. [Протокол](ux-ui-external-acceptance.md) и [журнал](ux-ui-stage-12.md) содержат доказательства и ограничения. Выполненные внешние сценарии не заменяют приёмку оставшихся интеграций и условий эксплуатации. Датированные продолжения ниже — история; точный следующий шаг указан в начале [журнала](ux-ui-progress.md). diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index ebf4c312..524b3e49 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-08: 12.5.47 подтвердил смену A→B→A во время retry на двух настоящих HTTP backend и разных PostgreSQL БД. B не получает checkpoint/результат A и не меняется; возврат A сохраняет блокировку после позднего receipt или ошибки, включая reload. JS errors0/Telegram calls0. Временные процессы, fixture и БД B удалены. Production backend8782054/frontendb55588f прежний. Следующий12.5.48 — профильная доступность очереди и диалога на production frontend; Portal/Telegram delivery открыты. +Актуальное продолжение 2026-10-08: 12.5.48 подтвердил доступность production очереди/диалога: dark/light ×1280/320,16 scoped axe WCAG аудитов без violations/incomplete; клавиатура, focus trap, checkbox, Escape/возврат фокуса и alert/status passed. Retry POST0/Telegram0/JS errors0, fixture и временный стенд очищены. Runtime backend8782054/frontendb55588f прежний. Следующий12.5.49 — сводка Q-матрицы и оставшихся условий реальной внешней приёмки. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -32,7 +32,17 @@ | 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 | | 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 | | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | -| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–47 и ограничения ниже. Runtime backend8782054/frontendb55588f. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–48 и ограничения ниже. Runtime backend8782054/frontendb55588f. | + +## 12.5.48 — доступность production очереди и диалога (2026-10-08) + +[Отчёт доступности](ux-ui/acceptance/browser-outbox-a11y-2026-10-08.json): production frontendb55588f/backend8782054, отдельная PostgreSQL БД, browser HTTP-ответы не подменялись. Axe4.11.3 с WCAG2A/AA,2.1A/AA,2.2AA tags: тёмная/светлая темы ×1280/320px, по четыре области/состояния — очередь, диалог без согласия, диалог с согласием, очередь при ошибке GET. Все16 scoped audits: violations0/incomplete0, passed rules14 для очереди и16 для диалога. + +Клавиатура открывает диалог через Enter, Space переключает подтверждение риска и доступность submit. По шесть Tab/Shift+Tab проверок в каждом сочетании подтверждают завершённый перенос фокуса внутри modal; Escape закрывает и возвращает фокус trigger. Асинхронные состояния имеют role=status, ошибка GET — role=alert; после восстановления ошибка исчезает. Панель/диалог помещаются в320px. [Светлая тема](ux-ui/screens/outbox-a11y-light-real-320-2026-10-08.png) и [тёмная тема](ux-ui/screens/outbox-a11y-dark-real-320-2026-10-08.png) сохранены и просмотрены. + +Уточнены ожидания harness: сначала готовность доступной кнопки после основной загрузки, затем завершение CSS-анимации перед контрастным аудитом и завершение переноса фокуса через Base UI focus guards. Первый аудит поймал промежуточную прозрачность входной анимации; после её завершения контраст прошёл без изменения продукта. Это аудит устойчивых состояний, не проверка всех кадров перехода. HTTP500 создан управляемым backend overview exception; физический отказ БД не моделировался. Реальная screen reader сессия не проводилась, scoped axe/клавиатура не означают полную WCAG сертификацию приложения. + +Retry POST0, Telegram calls0, JS errors0, SQL fixture counts сохранялись во всех сценариях. Dispatcher не запускался, scheduler admission закрыт. Временные контейнеры/сеть/туннель3018 удалены, backend exitCode0, отдельный SQL подтвердил ноль fixture-строк. Основной стенд и данные не менялись. Следующий12.5.49 — сводка Q-матрицы и точные оставшиеся условия реальной внешней приёмки. Локальный коммит без push. ## 12.5.47 — изоляция checkpoint при смене источника во время повтора (2026-10-08) diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 59896c0f..a671b9d7 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-08: 12.5.47 подтвердил смену A→B→A во время retry на двух настоящих HTTP backend и разных PostgreSQL БД. B не получает checkpoint/результат A и не меняется; возврат A сохраняет блокировку после позднего receipt или ошибки, включая reload. JS errors0/Telegram calls0. Временные процессы, fixture и БД B удалены. Production backend8782054/frontendb55588f прежний. Следующий12.5.48 — профильная доступность очереди и диалога на production frontend; Portal/Telegram delivery открыты. +Актуальное продолжение 2026-10-08: 12.5.48 подтвердил доступность production очереди/диалога: dark/light ×1280/320,16 scoped axe WCAG аудитов без violations/incomplete; клавиатура, focus trap, checkbox, Escape/возврат фокуса и alert/status passed. Retry POST0/Telegram0/JS errors0, fixture и временный стенд очищены. Runtime backend8782054/frontendb55588f прежний. Следующий12.5.49 — сводка Q-матрицы и оставшихся условий реальной внешней приёмки. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -1458,3 +1458,13 @@ Reader получает очередь и видит disabled retry. Прямо [Поздний receipt](ux-ui/screens/outbox-source-receipt-real-320-2026-10-08.png) просмотрен; [поздняя ошибка](ux-ui/screens/outbox-source-error-real-320-2026-10-08.png) сохранена. Навигация штатно abort-ит старый клиентский запрос; управляемая задержка producer не является физическим разрывом сети или доказательством доставки сообщения. Scheduler admission закрыт, dispatcher не запускался, внешний Telegram fetch дополнительно запрещён. AUTH_REQUIRED=false на изолированных процессах; реальные Portal login и чат не проверены. Оба backend завершились exitCode0, cleanup подтвердил A retry2/B retry0 и sender0. Независимые SQL-запросы подтвердили ноль fixture-записей в обеих БД. Контейнеры, локальный Next3101 и туннели8018/8019 удалены. Новая БД B удалена после проверки точного имени, владельца mmapp и отсутствия соединений; PostgreSQL подтвердил отсутствие БД. Основной стенд и БД не менялись. Следующий12.5.48 — профильная доступность очереди/диалога на production frontend. Локальный коммит без push. + +## 12.5.48 — доступность production очереди и диалога (2026-10-08) + +[Отчёт доступности](ux-ui/acceptance/browser-outbox-a11y-2026-10-08.json): production frontendb55588f/backend8782054, отдельная PostgreSQL БД, browser HTTP-ответы не подменялись. Axe4.11.3 с WCAG2A/AA,2.1A/AA,2.2AA tags: тёмная/светлая темы ×1280/320px, по четыре области/состояния — очередь, диалог без согласия, диалог с согласием, очередь при ошибке GET. Все16 scoped audits: violations0/incomplete0, passed rules14 для очереди и16 для диалога. + +Клавиатура открывает диалог через Enter, Space переключает подтверждение риска и доступность submit. По шесть Tab/Shift+Tab проверок в каждом сочетании подтверждают завершённый перенос фокуса внутри modal; Escape закрывает и возвращает фокус trigger. Асинхронные состояния имеют role=status, ошибка GET — role=alert; после восстановления ошибка исчезает. Панель/диалог помещаются в320px. [Светлая тема](ux-ui/screens/outbox-a11y-light-real-320-2026-10-08.png) и [тёмная тема](ux-ui/screens/outbox-a11y-dark-real-320-2026-10-08.png) сохранены и просмотрены. + +Уточнены ожидания harness: сначала готовность доступной кнопки после основной загрузки, затем завершение CSS-анимации перед контрастным аудитом и завершение переноса фокуса через Base UI focus guards. Первый аудит поймал промежуточную прозрачность входной анимации; после её завершения контраст прошёл без изменения продукта. Это аудит устойчивых состояний, не проверка всех кадров перехода. HTTP500 создан управляемым backend overview exception; физический отказ БД не моделировался. Реальная screen reader сессия не проводилась, scoped axe/клавиатура не означают полную WCAG сертификацию приложения. + +Retry POST0, Telegram calls0, JS errors0, SQL fixture counts сохранялись во всех сценариях. Dispatcher не запускался, scheduler admission закрыт. Временные контейнеры/сеть/туннель3018 удалены, backend exitCode0, отдельный SQL подтвердил ноль fixture-строк. Основной стенд и данные не менялись. Следующий12.5.49 — сводка Q-матрицы и точные оставшиеся условия реальной внешней приёмки. Локальный коммит без push. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index d78b1bca..5bf7baa3 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -301,3 +301,13 @@ Reader получает очередь и видит disabled retry. Прямо [Поздний receipt](ux-ui/screens/outbox-source-receipt-real-320-2026-10-08.png) просмотрен; [поздняя ошибка](ux-ui/screens/outbox-source-error-real-320-2026-10-08.png) сохранена. Навигация штатно abort-ит старый клиентский запрос; управляемая задержка producer не является физическим разрывом сети или доказательством доставки сообщения. Scheduler admission закрыт, dispatcher не запускался, внешний Telegram fetch дополнительно запрещён. AUTH_REQUIRED=false на изолированных процессах; реальные Portal login и чат не проверены. Оба backend завершились exitCode0, cleanup подтвердил A retry2/B retry0 и sender0. Независимые SQL-запросы подтвердили ноль fixture-записей в обеих БД. Контейнеры, локальный Next3101 и туннели8018/8019 удалены. Новая БД B удалена после проверки точного имени, владельца mmapp и отсутствия соединений; PostgreSQL подтвердил отсутствие БД. Основной стенд и БД не менялись. Следующий12.5.48 — профильная доступность очереди/диалога на production frontend. Локальный коммит без push. + +## 12.5.48 — доступность production очереди и диалога (2026-10-08) + +[Отчёт доступности](ux-ui/acceptance/browser-outbox-a11y-2026-10-08.json): production frontendb55588f/backend8782054, отдельная PostgreSQL БД, browser HTTP-ответы не подменялись. Axe4.11.3 с WCAG2A/AA,2.1A/AA,2.2AA tags: тёмная/светлая темы ×1280/320px, по четыре области/состояния — очередь, диалог без согласия, диалог с согласием, очередь при ошибке GET. Все16 scoped audits: violations0/incomplete0, passed rules14 для очереди и16 для диалога. + +Клавиатура открывает диалог через Enter, Space переключает подтверждение риска и доступность submit. По шесть Tab/Shift+Tab проверок в каждом сочетании подтверждают завершённый перенос фокуса внутри modal; Escape закрывает и возвращает фокус trigger. Асинхронные состояния имеют role=status, ошибка GET — role=alert; после восстановления ошибка исчезает. Панель/диалог помещаются в320px. [Светлая тема](ux-ui/screens/outbox-a11y-light-real-320-2026-10-08.png) и [тёмная тема](ux-ui/screens/outbox-a11y-dark-real-320-2026-10-08.png) сохранены и просмотрены. + +Уточнены ожидания harness: сначала готовность доступной кнопки после основной загрузки, затем завершение CSS-анимации перед контрастным аудитом и завершение переноса фокуса через Base UI focus guards. Первый аудит поймал промежуточную прозрачность входной анимации; после её завершения контраст прошёл без изменения продукта. Это аудит устойчивых состояний, не проверка всех кадров перехода. HTTP500 создан управляемым backend overview exception; физический отказ БД не моделировался. Реальная screen reader сессия не проводилась, scoped axe/клавиатура не означают полную WCAG сертификацию приложения. + +Retry POST0, Telegram calls0, JS errors0, SQL fixture counts сохранялись во всех сценариях. Dispatcher не запускался, scheduler admission закрыт. Временные контейнеры/сеть/туннель3018 удалены, backend exitCode0, отдельный SQL подтвердил ноль fixture-строк. Основной стенд и данные не менялись. Следующий12.5.49 — сводка Q-матрицы и точные оставшиеся условия реальной внешней приёмки. Локальный коммит без push. diff --git a/docs/ux-ui/acceptance/browser-outbox-a11y-2026-10-08.json b/docs/ux-ui/acceptance/browser-outbox-a11y-2026-10-08.json new file mode 100644 index 00000000..fcc8385c --- /dev/null +++ b/docs/ux-ui/acceptance/browser-outbox-a11y-2026-10-08.json @@ -0,0 +1,146 @@ +{ + "date": "2026-10-08", + "frontendSource": "b55588f", + "backendSource": "8782054", + "axeVersion": "4.11.3", + "browserHttpMocks": false, + "cases": [ + { + "theme": "dark", + "width": 1280, + "panelAudit": { + "violations": [], + "incomplete": [], + "passedRules": 14 + }, + "dialogAudit": { + "violations": [], + "incomplete": [], + "passedRules": 16 + }, + "acknowledgedAudit": { + "violations": [], + "incomplete": [], + "passedRules": 16 + }, + "errorAudit": { + "violations": [], + "incomplete": [], + "passedRules": 14 + }, + "focusTrapSteps": 6, + "keyboardOpenAndCheckbox": true, + "escapeRestoresFocus": true, + "errorUsesAlert": true, + "statusUsesStatus": true, + "mobileFits": true, + "retryPosts": 0, + "externalSenderCalls": 0, + "pageErrors": [] + }, + { + "theme": "dark", + "width": 320, + "panelAudit": { + "violations": [], + "incomplete": [], + "passedRules": 14 + }, + "dialogAudit": { + "violations": [], + "incomplete": [], + "passedRules": 16 + }, + "acknowledgedAudit": { + "violations": [], + "incomplete": [], + "passedRules": 16 + }, + "errorAudit": { + "violations": [], + "incomplete": [], + "passedRules": 14 + }, + "focusTrapSteps": 6, + "keyboardOpenAndCheckbox": true, + "escapeRestoresFocus": true, + "errorUsesAlert": true, + "statusUsesStatus": true, + "mobileFits": true, + "retryPosts": 0, + "externalSenderCalls": 0, + "pageErrors": [] + }, + { + "theme": "light", + "width": 1280, + "panelAudit": { + "violations": [], + "incomplete": [], + "passedRules": 14 + }, + "dialogAudit": { + "violations": [], + "incomplete": [], + "passedRules": 16 + }, + "acknowledgedAudit": { + "violations": [], + "incomplete": [], + "passedRules": 16 + }, + "errorAudit": { + "violations": [], + "incomplete": [], + "passedRules": 14 + }, + "focusTrapSteps": 6, + "keyboardOpenAndCheckbox": true, + "escapeRestoresFocus": true, + "errorUsesAlert": true, + "statusUsesStatus": true, + "mobileFits": true, + "retryPosts": 0, + "externalSenderCalls": 0, + "pageErrors": [] + }, + { + "theme": "light", + "width": 320, + "panelAudit": { + "violations": [], + "incomplete": [], + "passedRules": 14 + }, + "dialogAudit": { + "violations": [], + "incomplete": [], + "passedRules": 16 + }, + "acknowledgedAudit": { + "violations": [], + "incomplete": [], + "passedRules": 16 + }, + "errorAudit": { + "violations": [], + "incomplete": [], + "passedRules": 14 + }, + "focusTrapSteps": 6, + "keyboardOpenAndCheckbox": true, + "escapeRestoresFocus": true, + "errorUsesAlert": true, + "statusUsesStatus": true, + "mobileFits": true, + "retryPosts": 0, + "externalSenderCalls": 0, + "pageErrors": [] + } + ], + "limits": [ + "Scoped axe audits of queue and alertdialog; not a full WCAG conformance certification", + "Synthetic PostgreSQL states; controlled backend GET error, no actual database outage", + "Auth false; no screen reader session, actual Telegram delivery or Portal login tested" + ] +} diff --git a/docs/ux-ui/screens/outbox-a11y-dark-real-320-2026-10-08.png b/docs/ux-ui/screens/outbox-a11y-dark-real-320-2026-10-08.png new file mode 100644 index 00000000..c7532c1e Binary files /dev/null and b/docs/ux-ui/screens/outbox-a11y-dark-real-320-2026-10-08.png differ diff --git a/docs/ux-ui/screens/outbox-a11y-light-real-320-2026-10-08.png b/docs/ux-ui/screens/outbox-a11y-light-real-320-2026-10-08.png new file mode 100644 index 00000000..3aceb6f9 Binary files /dev/null and b/docs/ux-ui/screens/outbox-a11y-light-real-320-2026-10-08.png differ