From ca8eafa1ff8f50385fb5d3783aa52dc8b39ea853 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Thu, 8 Oct 2026 14:22:03 +0700 Subject: [PATCH] =?UTF-8?q?chore(test):=20=D0=BF=D0=BE=D0=B4=D1=82=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=B4=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=D1=81=D1=82=D0=BE=D1=8F=D1=89=D0=B8=D1=85?= =?UTF-8?q?=20JWT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ux-ui-external-acceptance.md | 10 + docs/ux-ui-plan.md | 4 +- docs/ux-ui-progress.md | 12 +- docs/ux-ui-stage-12.md | 12 +- docs/ux-ui-test-server.md | 10 + .../acceptance/outbox-rbac-2026-10-08.json | 171 ++++++++++++++++++ 6 files changed, 215 insertions(+), 4 deletions(-) create mode 100644 docs/ux-ui/acceptance/outbox-rbac-2026-10-08.json diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index 72451815..24602090 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -233,3 +233,13 @@ UI показывает понятные подписи и предупрежд Первый запуск остановлен проверкой маркера БД: Next rewrites закреплены во время сборки, runtime BACKEND_INTERNAL_URL не изменяет их. Для корректной изоляции frontend подключён только к отдельной Docker-сети с alias backend, разрешающим исключительно тестовый backend. Основной backend/БД не менялись. Временные контейнеры и сеть удалены; backend завершился с exitCode=0, журнал очистки подтвердил senderCalls=0/retryPosts=0, независимый SQL подтвердил ноль fixture-строк. Дополнительный SSH-туннель3018 закрыт; основной3000 сохранён. Границы: AUTH_REQUIRED=false на изолированном loopback стенде; реальные Portal SSO, доставка Telegram, физический отказ PG и успешный UI retry не проверены этим блоком. Следующий 12.5.42 — настоящие JWT/RBAC чтения и повтора очереди на PostgreSQL. Локальный коммит без push. + +## 12.5.42 — настоящие JWT/RBAC очереди на PostgreSQL (2026-10-08) + +[Отчёт JWT/RBAC](ux-ui/acceptance/outbox-rbac-2026-10-08.json): production buildApp/handlers/auth из backend8782054, AUTH_REQUIRED=true только внутри изолированного процесса, отдельная БД mmapp_acceptance_20261007. JWT HS256 подписаны серверным ключом в памяти; подпись, issuer и exp проверяет штатный middleware. Fastify inject проходит настоящий путь приложения и SQL, но не является браузерным запросом или удалённым сокетом. + +GET outbox: anonymous, неверные issuer/signature, expired и malformed дают401; отсутствие разрешений, settings:admin без alerts и отсутствие доступа к приложению дают403; alerts:read/write/admin дают200 и реальные counts. Все GET сохраняют строки. Девять отказанных POST дают401/403, не меняют snapshot БД и не вызывают production retry boundary. Неподтверждённый риск даёт400 до boundary; неверная ожидаемая версия даёт409 без изменения. Разрешённые write и admin получают200, две fixture-строки становятся pending/retry_count=0/resolution_version=1. Дублирующий POST со старой версией даёт409 и сохраняет SQL snapshot. Ответы проверены на отсутствие JWT и ключа. + +Первый запуск harness остановился до создания fixture: jose отсутствует в production-образе как тестовая зависимость. Для генерации стандартной HS256 подписи использован встроенный node:crypto, production middleware и настройки не менялись. Dispatcher не запускался, scheduler admission закрыт, сообщений не отправлено. App/pool/container завершены; fixture удалены, отдельный SQL подтвердил ноль тестовых строк; остались только три основные Compose-службы. + +Границы: реальный Portal login/issuer endpoint не вызывался, браузерный RBAC и доставка не заявлены этим тестом. Q-7 подтверждён для API отказа до действия в этих границах. Следующий блок 12.5.43 — успешный UI retry и сохранение checkpoint при потере подтверждения HTTP в отдельной БД, с запретом внешней отправки. Локальный коммит без push. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index dfd2b830..f88db730 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,12 +1,12 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-08: 12.5.41 подтвердил очередь в браузере через реальные HTTP/PG: unknown/processing, подтверждение риска, сохранение снимка при HTTP500, восстановление, reload и 320px. Ошибок JavaScript, retry POST и внешних отправок нет. Временные контейнеры, Docker-сеть, SSH-туннель и fixture удалены. Следующий блок 12.5.42 — реальные JWT/RBAC для чтения и повтора очереди. Runtime backend8782054/frontendf194e72 прежний; 12.5 открыт. +Актуальное продолжение 2026-10-08: 12.5.42 подтвердил production JWT/RBAC очереди на PostgreSQL: 401 для недействительных токенов, 403 без нужных прав; отказанные POST не вызывают retry и не меняют БД. Write/admin получают pending/version1, старый повтор —409. Fixture удалены, реальных сообщений нет. Следующий блок 12.5.43 — успешный UI retry и сохранение checkpoint при потере подтверждения HTTP. Runtime backend8782054/frontendf194e72 прежний; 12.5 открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-08. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. ## Актуальная точка продолжения — 2026-10-08 -Этапы0–11 завершены в описанных локальных границах. Этап12 остаётся открытым. На161.104.46.222 развёрнуты backend/frontend8782054; два CHR подключены. PG backup/restore/rollback, single-instance quiescence, JWT/RBAC и browser restore приняты в границах журнала. PG-8 проверен с настоящими PG/native и введённой после COMMIT ошибкой подтверждения; новый browser UI сохраняет snapshot и сверяет историю. ROS-8/9 API/SQL/native приняты в описанных границах. Browser-смена пары/длительности и удаление во время native-теста приняты в12.5.24. Реальный отказ bandwidth-аутентификации принят в12.5.25. 12.5.26 обнаружил и локально исправил30s timeout Next proxy. Исправленный frontendaa7dbdf развёрнут и проверен в12.5.27; backend8782054 прежний. ROS-3 reverse2→1/native-afterping принят в12.5.28; forward timeout открыт. Форма frontendf194e72 проверена без моков и развёрнута в12.5.29. Read-only диагностика12.5.30 не установила причину. 12.5.31 выявил текущий отказ авторизацииCHR2 вCLI/REST/SSH. В12.5.32 пользователь восстановил доступCHR2; dashboard/native1→2 passed, блокировка снята. TCP receive/both подтверждены после восстановлениядоступа в12.5.33; UDP transmit3s/API/history/UI подтверждены в12.5.34; Q-6productionenqueue/PG race принят в12.5.35; Q-4 realHTTP/PG race принят в12.5.36; Q-1productionclaim/PG/interceptedsender принят в12.5.37; 12.5.38 подтвердил SQL settlement rollback и сохранение sent после ошибки подтверждения COMMIT; 12.5.39 подтвердил unknown/processing без автоматического повтора при неопределённом ответе; 12.5.40 подтвердил задержку повтора и failed после исчерпания попыток при явном отказе; 12.5.41 подтвердил браузерные состояния очереди на HTTP/PG; следующий 12.5.42 — реальные JWT/RBAC очереди. [Протокол](ux-ui-external-acceptance.md) и [журнал](ux-ui-stage-12.md) сохраняют точные доказательства и ограничения. +Этапы0–11 завершены в описанных локальных границах. Этап12 остаётся открытым. На161.104.46.222 развёрнуты backend/frontend8782054; два CHR подключены. PG backup/restore/rollback, single-instance quiescence, JWT/RBAC и browser restore приняты в границах журнала. PG-8 проверен с настоящими PG/native и введённой после COMMIT ошибкой подтверждения; новый browser UI сохраняет snapshot и сверяет историю. ROS-8/9 API/SQL/native приняты в описанных границах. Browser-смена пары/длительности и удаление во время native-теста приняты в12.5.24. Реальный отказ bandwidth-аутентификации принят в12.5.25. 12.5.26 обнаружил и локально исправил30s timeout Next proxy. Исправленный frontendaa7dbdf развёрнут и проверен в12.5.27; backend8782054 прежний. ROS-3 reverse2→1/native-afterping принят в12.5.28; forward timeout открыт. Форма frontendf194e72 проверена без моков и развёрнута в12.5.29. Read-only диагностика12.5.30 не установила причину. 12.5.31 выявил текущий отказ авторизацииCHR2 вCLI/REST/SSH. В12.5.32 пользователь восстановил доступCHR2; dashboard/native1→2 passed, блокировка снята. TCP receive/both подтверждены после восстановлениядоступа в12.5.33; UDP transmit3s/API/history/UI подтверждены в12.5.34; Q-6productionenqueue/PG race принят в12.5.35; Q-4 realHTTP/PG race принят в12.5.36; Q-1productionclaim/PG/interceptedsender принят в12.5.37; 12.5.38 подтвердил SQL settlement rollback и сохранение sent после ошибки подтверждения COMMIT; 12.5.39 подтвердил unknown/processing без автоматического повтора при неопределённом ответе; 12.5.40 подтвердил задержку повтора и failed после исчерпания попыток при явном отказе; 12.5.41 подтвердил браузерные состояния очереди на HTTP/PG; 12.5.42 подтвердил production JWT/RBAC очереди на PostgreSQL; следующий 12.5.43 — браузерный retry и checkpoint при потере подтверждения HTTP. [Протокол](ux-ui-external-acceptance.md) и [журнал](ux-ui-stage-12.md) сохраняют точные доказательства и ограничения. Реальные pg_dump/pg_restore, PG rollback и остановка UDP worker требуют внешней приёмки. Датированные продолжения ниже — история; точный следующий шаг также указан в начале [журнала](ux-ui-progress.md). diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 5b56fda7..b47e978b 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-08: 12.5.41 подтвердил очередь в браузере через реальные HTTP/PG: unknown/processing, подтверждение риска, сохранение снимка при HTTP500, восстановление, reload и 320px. Ошибок JavaScript, retry POST и внешних отправок нет. Временные контейнеры, Docker-сеть, SSH-туннель и fixture удалены. Следующий блок 12.5.42 — реальные JWT/RBAC для чтения и повтора очереди. Runtime backend8782054/frontendf194e72 прежний; 12.5 открыт. +Актуальное продолжение 2026-10-08: 12.5.42 подтвердил production JWT/RBAC очереди на PostgreSQL: 401 для недействительных токенов, 403 без нужных прав; отказанные POST не вызывают retry и не меняют БД. Write/admin получают pending/version1, старый повтор —409. Fixture удалены, реальных сообщений нет. Следующий блок 12.5.43 — успешный UI retry и сохранение checkpoint при потере подтверждения HTTP. Runtime backend8782054/frontendf194e72 прежний; 12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -34,6 +34,16 @@ | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | | 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в описанных границах:12.3.83,main1186/1186,context221/221. Этап остаётся в работе: стенд12.5.1–3 развёрнут,bootstrap/smoke проверены;остальные сценарии12.5 не выполнены. | +## 12.5.42 — настоящие JWT/RBAC очереди на PostgreSQL (2026-10-08) + +[Отчёт JWT/RBAC](ux-ui/acceptance/outbox-rbac-2026-10-08.json): production buildApp/handlers/auth из backend8782054, AUTH_REQUIRED=true только внутри изолированного процесса, отдельная БД mmapp_acceptance_20261007. JWT HS256 подписаны серверным ключом в памяти; подпись, issuer и exp проверяет штатный middleware. Fastify inject проходит настоящий путь приложения и SQL, но не является браузерным запросом или удалённым сокетом. + +GET outbox: anonymous, неверные issuer/signature, expired и malformed дают401; отсутствие разрешений, settings:admin без alerts и отсутствие доступа к приложению дают403; alerts:read/write/admin дают200 и реальные counts. Все GET сохраняют строки. Девять отказанных POST дают401/403, не меняют snapshot БД и не вызывают production retry boundary. Неподтверждённый риск даёт400 до boundary; неверная ожидаемая версия даёт409 без изменения. Разрешённые write и admin получают200, две fixture-строки становятся pending/retry_count=0/resolution_version=1. Дублирующий POST со старой версией даёт409 и сохраняет SQL snapshot. Ответы проверены на отсутствие JWT и ключа. + +Первый запуск harness остановился до создания fixture: jose отсутствует в production-образе как тестовая зависимость. Для генерации стандартной HS256 подписи использован встроенный node:crypto, production middleware и настройки не менялись. Dispatcher не запускался, scheduler admission закрыт, сообщений не отправлено. App/pool/container завершены; fixture удалены, отдельный SQL подтвердил ноль тестовых строк; остались только три основные Compose-службы. + +Границы: реальный Portal login/issuer endpoint не вызывался, браузерный RBAC и доставка не заявлены этим тестом. Q-7 подтверждён для API отказа до действия в этих границах. Следующий блок 12.5.43 — успешный UI retry и сохранение checkpoint при потере подтверждения HTTP в отдельной БД, с запретом внешней отправки. Локальный коммит без push. + ## 12.5.41 — браузерная очередь через реальные HTTP и PostgreSQL (2026-10-08) [Отчёт браузера](ux-ui/acceptance/browser-outbox-2026-10-08.json): production backend8782054/frontendf194e72, отдельная БД mmapp_acceptance_20261007. Пять синтетических SQL-состояний pending/processing/unknown/sent/failed, по одной строке; настоящий GET overview возвращает согласованные counts/items. HTTP-ответы в браузере не подменялись. Dispatcher не запускался, scheduler admission закрыт; внешний Telegram fetch дополнительно запрещён. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 66cff420..72b0dde8 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.41 подтвердил очередь в браузере через реальные HTTP/PG: unknown/processing, подтверждение риска, сохранение снимка при HTTP500, восстановление, reload и 320px. Ошибок JavaScript, retry POST и внешних отправок нет. Временные контейнеры, Docker-сеть, SSH-туннель и fixture удалены. Следующий блок 12.5.42 — реальные JWT/RBAC для чтения и повтора очереди. Runtime backend8782054/frontendf194e72 прежний; 12.5 открыт. +Актуальное продолжение 2026-10-08: 12.5.42 подтвердил production JWT/RBAC очереди на PostgreSQL: 401 для недействительных токенов, 403 без нужных прав; отказанные POST не вызывают retry и не меняют БД. Write/admin получают pending/version1, старый повтор —409. Fixture удалены, реальных сообщений нет. Следующий блок 12.5.43 — успешный UI retry и сохранение checkpoint при потере подтверждения HTTP. Runtime backend8782054/frontendf194e72 прежний; 12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -1398,3 +1398,13 @@ UI показывает понятные подписи и предупрежд Первый запуск остановлен проверкой маркера БД: Next rewrites закреплены во время сборки, runtime BACKEND_INTERNAL_URL не изменяет их. Для корректной изоляции frontend подключён только к отдельной Docker-сети с alias backend, разрешающим исключительно тестовый backend. Основной backend/БД не менялись. Временные контейнеры и сеть удалены; backend завершился с exitCode=0, журнал очистки подтвердил senderCalls=0/retryPosts=0, независимый SQL подтвердил ноль fixture-строк. Дополнительный SSH-туннель3018 закрыт; основной3000 сохранён. Границы: AUTH_REQUIRED=false на изолированном loopback стенде; реальные Portal SSO, доставка Telegram, физический отказ PG и успешный UI retry не проверены этим блоком. Следующий 12.5.42 — настоящие JWT/RBAC чтения и повтора очереди на PostgreSQL. Локальный коммит без push. + +## 12.5.42 — настоящие JWT/RBAC очереди на PostgreSQL (2026-10-08) + +[Отчёт JWT/RBAC](ux-ui/acceptance/outbox-rbac-2026-10-08.json): production buildApp/handlers/auth из backend8782054, AUTH_REQUIRED=true только внутри изолированного процесса, отдельная БД mmapp_acceptance_20261007. JWT HS256 подписаны серверным ключом в памяти; подпись, issuer и exp проверяет штатный middleware. Fastify inject проходит настоящий путь приложения и SQL, но не является браузерным запросом или удалённым сокетом. + +GET outbox: anonymous, неверные issuer/signature, expired и malformed дают401; отсутствие разрешений, settings:admin без alerts и отсутствие доступа к приложению дают403; alerts:read/write/admin дают200 и реальные counts. Все GET сохраняют строки. Девять отказанных POST дают401/403, не меняют snapshot БД и не вызывают production retry boundary. Неподтверждённый риск даёт400 до boundary; неверная ожидаемая версия даёт409 без изменения. Разрешённые write и admin получают200, две fixture-строки становятся pending/retry_count=0/resolution_version=1. Дублирующий POST со старой версией даёт409 и сохраняет SQL snapshot. Ответы проверены на отсутствие JWT и ключа. + +Первый запуск harness остановился до создания fixture: jose отсутствует в production-образе как тестовая зависимость. Для генерации стандартной HS256 подписи использован встроенный node:crypto, production middleware и настройки не менялись. Dispatcher не запускался, scheduler admission закрыт, сообщений не отправлено. App/pool/container завершены; fixture удалены, отдельный SQL подтвердил ноль тестовых строк; остались только три основные Compose-службы. + +Границы: реальный Portal login/issuer endpoint не вызывался, браузерный RBAC и доставка не заявлены этим тестом. Q-7 подтверждён для API отказа до действия в этих границах. Следующий блок 12.5.43 — успешный UI retry и сохранение checkpoint при потере подтверждения HTTP в отдельной БД, с запретом внешней отправки. Локальный коммит без push. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index 85f2bfe7..1aacc063 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -241,3 +241,13 @@ UI показывает понятные подписи и предупрежд Первый запуск остановлен проверкой маркера БД: Next rewrites закреплены во время сборки, runtime BACKEND_INTERNAL_URL не изменяет их. Для корректной изоляции frontend подключён только к отдельной Docker-сети с alias backend, разрешающим исключительно тестовый backend. Основной backend/БД не менялись. Временные контейнеры и сеть удалены; backend завершился с exitCode=0, журнал очистки подтвердил senderCalls=0/retryPosts=0, независимый SQL подтвердил ноль fixture-строк. Дополнительный SSH-туннель3018 закрыт; основной3000 сохранён. Границы: AUTH_REQUIRED=false на изолированном loopback стенде; реальные Portal SSO, доставка Telegram, физический отказ PG и успешный UI retry не проверены этим блоком. Следующий 12.5.42 — настоящие JWT/RBAC чтения и повтора очереди на PostgreSQL. Локальный коммит без push. + +## 12.5.42 — настоящие JWT/RBAC очереди на PostgreSQL (2026-10-08) + +[Отчёт JWT/RBAC](ux-ui/acceptance/outbox-rbac-2026-10-08.json): production buildApp/handlers/auth из backend8782054, AUTH_REQUIRED=true только внутри изолированного процесса, отдельная БД mmapp_acceptance_20261007. JWT HS256 подписаны серверным ключом в памяти; подпись, issuer и exp проверяет штатный middleware. Fastify inject проходит настоящий путь приложения и SQL, но не является браузерным запросом или удалённым сокетом. + +GET outbox: anonymous, неверные issuer/signature, expired и malformed дают401; отсутствие разрешений, settings:admin без alerts и отсутствие доступа к приложению дают403; alerts:read/write/admin дают200 и реальные counts. Все GET сохраняют строки. Девять отказанных POST дают401/403, не меняют snapshot БД и не вызывают production retry boundary. Неподтверждённый риск даёт400 до boundary; неверная ожидаемая версия даёт409 без изменения. Разрешённые write и admin получают200, две fixture-строки становятся pending/retry_count=0/resolution_version=1. Дублирующий POST со старой версией даёт409 и сохраняет SQL snapshot. Ответы проверены на отсутствие JWT и ключа. + +Первый запуск harness остановился до создания fixture: jose отсутствует в production-образе как тестовая зависимость. Для генерации стандартной HS256 подписи использован встроенный node:crypto, production middleware и настройки не менялись. Dispatcher не запускался, scheduler admission закрыт, сообщений не отправлено. App/pool/container завершены; fixture удалены, отдельный SQL подтвердил ноль тестовых строк; остались только три основные Compose-службы. + +Границы: реальный Portal login/issuer endpoint не вызывался, браузерный RBAC и доставка не заявлены этим тестом. Q-7 подтверждён для API отказа до действия в этих границах. Следующий блок 12.5.43 — успешный UI retry и сохранение checkpoint при потере подтверждения HTTP в отдельной БД, с запретом внешней отправки. Локальный коммит без push. diff --git a/docs/ux-ui/acceptance/outbox-rbac-2026-10-08.json b/docs/ux-ui/acceptance/outbox-rbac-2026-10-08.json new file mode 100644 index 00000000..b2073485 --- /dev/null +++ b/docs/ux-ui/acceptance/outbox-rbac-2026-10-08.json @@ -0,0 +1,171 @@ +{ + "date": "2026-10-08", + "backendSource": "8782054", + "database": "mmapp_acceptance_20261007", + "authRequired": true, + "signedJwtVerification": true, + "productionRoutes": true, + "cases": [ + { + "method": "GET", + "role": "anonymous", + "status": 401 + }, + { + "method": "GET", + "role": "none", + "status": 403 + }, + { + "method": "GET", + "role": "settings", + "status": 403 + }, + { + "method": "GET", + "role": "noApp", + "status": 403 + }, + { + "method": "GET", + "role": "issuer", + "status": 401 + }, + { + "method": "GET", + "role": "signature", + "status": 401 + }, + { + "method": "GET", + "role": "expired", + "status": 401 + }, + { + "method": "GET", + "role": "malformed-jwt", + "status": 401 + }, + { + "method": "GET", + "role": "read", + "status": 200 + }, + { + "method": "GET", + "role": "write", + "status": 200 + }, + { + "method": "GET", + "role": "admin", + "status": 200 + }, + { + "method": "POST", + "role": "anonymous", + "status": 401, + "unchanged": true, + "mutationBoundaryCalls": 0 + }, + { + "method": "POST", + "role": "read", + "status": 403, + "unchanged": true, + "mutationBoundaryCalls": 0 + }, + { + "method": "POST", + "role": "none", + "status": 403, + "unchanged": true, + "mutationBoundaryCalls": 0 + }, + { + "method": "POST", + "role": "settings", + "status": 403, + "unchanged": true, + "mutationBoundaryCalls": 0 + }, + { + "method": "POST", + "role": "noApp", + "status": 403, + "unchanged": true, + "mutationBoundaryCalls": 0 + }, + { + "method": "POST", + "role": "issuer", + "status": 401, + "unchanged": true, + "mutationBoundaryCalls": 0 + }, + { + "method": "POST", + "role": "signature", + "status": 401, + "unchanged": true, + "mutationBoundaryCalls": 0 + }, + { + "method": "POST", + "role": "expired", + "status": 401, + "unchanged": true, + "mutationBoundaryCalls": 0 + }, + { + "method": "POST", + "role": "malformed-jwt", + "status": 401, + "unchanged": true, + "mutationBoundaryCalls": 0 + }, + { + "case": "missing-risk-acknowledgement", + "status": 400, + "unchanged": true + }, + { + "case": "stale-version-before-write", + "status": 409, + "unchanged": true + }, + { + "case": "write-and-admin-allowed", + "statuses": [ + 200, + 200 + ], + "saved": [ + { + "id": "acceptance-outbox-rbac-1791444037821-admin", + "status": "pending", + "retry_count": 0, + "resolution_version": 1 + }, + { + "id": "acceptance-outbox-rbac-1791444037821-write", + "status": "pending", + "retry_count": 0, + "resolution_version": 1 + } + ] + }, + { + "case": "duplicate-version-conflict", + "status": 409, + "unchanged": true + } + ], + "mutationBoundaryCalls": 4, + "realExternalMessages": 0, + "limits": [ + "Fastify inject uses real production handlers/auth and PostgreSQL, not a remote socket or browser", + "JWT signed with server key in memory; real Portal issuer/login not contacted", + "Only queue placement receipts verified; dispatcher never started, no delivery claim" + ] +} \ No newline at end of file