diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index df2c7278..5c0093a1 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -213,3 +213,13 @@ BGP-prefix evaluator, отдельное live GRE расписание и recove Тестовые записи и объекты БД удалены, исходные настройки Telegram восстановлены из памяти с сохранением точного updated_at, fetch восстановлен, pool и контейнер закрыты. Отдельный SQL-запрос подтвердил ноль fixture-записей, ноль тестовых триггеров и функций для блоков 38–39. Основной стенд не затрагивался. Q-3 принят только на границе поведения production sender/PG; реальный чат, UI этого состояния и многопроцессное восстановление отдельно не проверены. Следующий блок 12.5.40 — явный отказ отправителя, задержка повтора и исчерпание попыток, без реальных сообщений. Документы синхронизированы; локальный коммит без push. + +## 12.5.40 — подтверждённый отказ и исчерпание попыток отправки (2026-10-08) + +[Отчёт PostgreSQL](ux-ui/acceptance/outbox-rejection-2026-10-08.json): production dispatchPendingOutbox из backend8782054, отдельная БД mmapp_acceptance_20261007. Внешний fetch возвращал явный Telegram отказ ok=false/error_code=400; реального запроса и сообщений не было. + +Первая отклонённая попытка сохранила pending/retry_count=1, историю не создала и назначила next_attempt_at через 15 секунд. SQL timestamp проверен относительно времени до и после вызова; немедленный dispatcher не отправил повторный запрос. Чтобы не ждать таймер, только в fixture срок следующей попытки затем перенесён на now(). Вторая отклонённая попытка исчерпала maxRetries=2: failed/retry_count=2, одна история с sent_ok=false; последующий dispatcher больше не отправлял. Синтетический токен в description скрыт как [TOKEN] в сохранённой ошибке и ответе dispatcher. + +Fixture outbox/history удалены, исходные настройки Telegram восстановлены из памяти с точным updated_at, fetch восстановлен, pool и контейнер завершены. Основной стенд не затрагивался. Это приёмка реального SQL и production-кода с перехваченным отказом; реальный Telegram отказ, нагрузка и многопроцессная работа не заявлены. + +Следующий блок 12.5.41 — браузерная проверка unknown/processing через реальные HTTP и PostgreSQL, без отправки сообщений. Документы синхронизированы; локальный коммит без push. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 0d35b42a..2c54fe8d 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,12 +1,12 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-08: 12.5.39 подтвердил отсутствие автоматического повтора при неопределённом ответе отправителя: unknown при успешном hold, processing при отказе его записи. Production dispatcher и SQL проверены на отдельной PostgreSQL БД; внешний fetch подменён, реальных сообщений нет. Следующий блок 12.5.40 — явный отказ отправителя, задержка повтора и исчерпание попыток. Runtime backend8782054/frontendf194e72 прежний; внешняя приёмка 12.5 открыта. +Актуальное продолжение 2026-10-08: 12.5.40 проверил явный отказ отправителя: pending/retry_count=1 с задержкой 15 секунд, ранний dispatcher не отправляет; после второй отклонённой попытки failed/retry_count=2 и одна история sent_ok=false. Токен скрыт в ошибках. Реальных сообщений нет. Следующий блок 12.5.41 — браузерная проверка удержанных состояний через реальные HTTP/PG. 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 — явный отказ и исчерпание попыток без реальных сообщений. [Протокол](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. [Протокол](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 7f0a49b3..e5856e2b 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-08: 12.5.39 подтвердил отсутствие автоматического повтора при неопределённом ответе отправителя: unknown при успешном hold, processing при отказе его записи. Production dispatcher и SQL проверены на отдельной PostgreSQL БД; внешний fetch подменён, реальных сообщений нет. Следующий блок 12.5.40 — явный отказ отправителя, задержка повтора и исчерпание попыток. Runtime backend8782054/frontendf194e72 прежний; внешняя приёмка 12.5 открыта. +Актуальное продолжение 2026-10-08: 12.5.40 проверил явный отказ отправителя: pending/retry_count=1 с задержкой 15 секунд, ранний dispatcher не отправляет; после второй отклонённой попытки failed/retry_count=2 и одна история sent_ok=false. Токен скрыт в ошибках. Реальных сообщений нет. Следующий блок 12.5.41 — браузерная проверка удержанных состояний через реальные HTTP/PG. 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.40 — подтверждённый отказ и исчерпание попыток отправки (2026-10-08) + +[Отчёт PostgreSQL](ux-ui/acceptance/outbox-rejection-2026-10-08.json): production dispatchPendingOutbox из backend8782054, отдельная БД mmapp_acceptance_20261007. Внешний fetch возвращал явный Telegram отказ ok=false/error_code=400; реального запроса и сообщений не было. + +Первая отклонённая попытка сохранила pending/retry_count=1, историю не создала и назначила next_attempt_at через 15 секунд. SQL timestamp проверен относительно времени до и после вызова; немедленный dispatcher не отправил повторный запрос. Чтобы не ждать таймер, только в fixture срок следующей попытки затем перенесён на now(). Вторая отклонённая попытка исчерпала maxRetries=2: failed/retry_count=2, одна история с sent_ok=false; последующий dispatcher больше не отправлял. Синтетический токен в description скрыт как [TOKEN] в сохранённой ошибке и ответе dispatcher. + +Fixture outbox/history удалены, исходные настройки Telegram восстановлены из памяти с точным updated_at, fetch восстановлен, pool и контейнер завершены. Основной стенд не затрагивался. Это приёмка реального SQL и production-кода с перехваченным отказом; реальный Telegram отказ, нагрузка и многопроцессная работа не заявлены. + +Следующий блок 12.5.41 — браузерная проверка unknown/processing через реальные HTTP и PostgreSQL, без отправки сообщений. Документы синхронизированы; локальный коммит без push. + ## 12.5.39 — неопределённый ответ отправителя и отказ записи unknown (2026-10-08) [Отчёт PostgreSQL](ux-ui/acceptance/outbox-unknown-2026-10-08.json): production dispatchPendingOutbox из backend8782054, отдельная БД mmapp_acceptance_20261007. Fetch вместо внешнего запроса бросает исключение: это управляемая проверка отсутствия ответа, а не физический сетевой timeout и не доказательство доставки в Telegram. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index d1f5ca4d..9157af85 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.39 подтвердил отсутствие автоматического повтора при неопределённом ответе отправителя: unknown при успешном hold, processing при отказе его записи. Production dispatcher и SQL проверены на отдельной PostgreSQL БД; внешний fetch подменён, реальных сообщений нет. Следующий блок 12.5.40 — явный отказ отправителя, задержка повтора и исчерпание попыток. Runtime backend8782054/frontendf194e72 прежний; внешняя приёмка 12.5 открыта. +Актуальное продолжение 2026-10-08: 12.5.40 проверил явный отказ отправителя: pending/retry_count=1 с задержкой 15 секунд, ранний dispatcher не отправляет; после второй отклонённой попытки failed/retry_count=2 и одна история sent_ok=false. Токен скрыт в ошибках. Реальных сообщений нет. Следующий блок 12.5.41 — браузерная проверка удержанных состояний через реальные HTTP/PG. Runtime backend8782054/frontendf194e72 прежний; 12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -1378,3 +1378,13 @@ Fixtureoutbox/historyудалены, countoutbox восстановленкbasel Тестовые записи и объекты БД удалены, исходные настройки Telegram восстановлены из памяти с сохранением точного updated_at, fetch восстановлен, pool и контейнер закрыты. Отдельный SQL-запрос подтвердил ноль fixture-записей, ноль тестовых триггеров и функций для блоков 38–39. Основной стенд не затрагивался. Q-3 принят только на границе поведения production sender/PG; реальный чат, UI этого состояния и многопроцессное восстановление отдельно не проверены. Следующий блок 12.5.40 — явный отказ отправителя, задержка повтора и исчерпание попыток, без реальных сообщений. Документы синхронизированы; локальный коммит без push. + +## 12.5.40 — подтверждённый отказ и исчерпание попыток отправки (2026-10-08) + +[Отчёт PostgreSQL](ux-ui/acceptance/outbox-rejection-2026-10-08.json): production dispatchPendingOutbox из backend8782054, отдельная БД mmapp_acceptance_20261007. Внешний fetch возвращал явный Telegram отказ ok=false/error_code=400; реального запроса и сообщений не было. + +Первая отклонённая попытка сохранила pending/retry_count=1, историю не создала и назначила next_attempt_at через 15 секунд. SQL timestamp проверен относительно времени до и после вызова; немедленный dispatcher не отправил повторный запрос. Чтобы не ждать таймер, только в fixture срок следующей попытки затем перенесён на now(). Вторая отклонённая попытка исчерпала maxRetries=2: failed/retry_count=2, одна история с sent_ok=false; последующий dispatcher больше не отправлял. Синтетический токен в description скрыт как [TOKEN] в сохранённой ошибке и ответе dispatcher. + +Fixture outbox/history удалены, исходные настройки Telegram восстановлены из памяти с точным updated_at, fetch восстановлен, pool и контейнер завершены. Основной стенд не затрагивался. Это приёмка реального SQL и production-кода с перехваченным отказом; реальный Telegram отказ, нагрузка и многопроцессная работа не заявлены. + +Следующий блок 12.5.41 — браузерная проверка unknown/processing через реальные HTTP и PostgreSQL, без отправки сообщений. Документы синхронизированы; локальный коммит без push. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index c343508c..09618fba 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -221,3 +221,13 @@ ssh -N -L 3000:127.0.0.1:3000 -L 8000:127.0.0.1:8000 root@161.104.46.222 Тестовые записи и объекты БД удалены, исходные настройки Telegram восстановлены из памяти с сохранением точного updated_at, fetch восстановлен, pool и контейнер закрыты. Отдельный SQL-запрос подтвердил ноль fixture-записей, ноль тестовых триггеров и функций для блоков 38–39. Основной стенд не затрагивался. Q-3 принят только на границе поведения production sender/PG; реальный чат, UI этого состояния и многопроцессное восстановление отдельно не проверены. Следующий блок 12.5.40 — явный отказ отправителя, задержка повтора и исчерпание попыток, без реальных сообщений. Документы синхронизированы; локальный коммит без push. + +## 12.5.40 — подтверждённый отказ и исчерпание попыток отправки (2026-10-08) + +[Отчёт PostgreSQL](ux-ui/acceptance/outbox-rejection-2026-10-08.json): production dispatchPendingOutbox из backend8782054, отдельная БД mmapp_acceptance_20261007. Внешний fetch возвращал явный Telegram отказ ok=false/error_code=400; реального запроса и сообщений не было. + +Первая отклонённая попытка сохранила pending/retry_count=1, историю не создала и назначила next_attempt_at через 15 секунд. SQL timestamp проверен относительно времени до и после вызова; немедленный dispatcher не отправил повторный запрос. Чтобы не ждать таймер, только в fixture срок следующей попытки затем перенесён на now(). Вторая отклонённая попытка исчерпала maxRetries=2: failed/retry_count=2, одна история с sent_ok=false; последующий dispatcher больше не отправлял. Синтетический токен в description скрыт как [TOKEN] в сохранённой ошибке и ответе dispatcher. + +Fixture outbox/history удалены, исходные настройки Telegram восстановлены из памяти с точным updated_at, fetch восстановлен, pool и контейнер завершены. Основной стенд не затрагивался. Это приёмка реального SQL и production-кода с перехваченным отказом; реальный Telegram отказ, нагрузка и многопроцессная работа не заявлены. + +Следующий блок 12.5.41 — браузерная проверка unknown/processing через реальные HTTP и PostgreSQL, без отправки сообщений. Документы синхронизированы; локальный коммит без push. diff --git a/docs/ux-ui/acceptance/outbox-rejection-2026-10-08.json b/docs/ux-ui/acceptance/outbox-rejection-2026-10-08.json new file mode 100644 index 00000000..e1307815 --- /dev/null +++ b/docs/ux-ui/acceptance/outbox-rejection-2026-10-08.json @@ -0,0 +1,61 @@ +{ + "date": "2026-10-08", + "backendSource": "8782054", + "database": "mmapp_acceptance_20261007", + "cases": [ + { + "case": "explicit-rejection-schedules-retry", + "result": { + "sent": 0, + "failed": 0, + "held": 0, + "errors": [ + "outbox acceptance-rejection-1791443422491: Acceptance rejected [TOKEN]" + ] + }, + "saved": { + "id": "acceptance-rejection-1791443422491", + "status": "pending", + "retry_count": 1, + "resolution_version": 0, + "last_error": "Acceptance rejected [TOKEN]", + "next_attempt_at": "2026-10-08T07:10:37.619Z" + }, + "historyRows": 0, + "noEarlyRetry": true, + "delayMs": 15000 + }, + { + "case": "retry-budget-exhausted", + "result": { + "sent": 0, + "failed": 1, + "held": 0, + "errors": [ + "outbox acceptance-rejection-1791443422491: Acceptance rejected [TOKEN]" + ] + }, + "saved": { + "id": "acceptance-rejection-1791443422491", + "status": "failed", + "retry_count": 2, + "resolution_version": 0, + "last_error": "Acceptance rejected [TOKEN]" + }, + "history": [ + { + "id": "acceptance-rejection-1791443422491-history", + "sent_ok": false + } + ], + "noAutomaticRetry": true + } + ], + "interceptedSenderCalls": 2, + "realExternalMessages": 0, + "limits": [ + "Explicit Telegram HTTP rejection is intercepted in-process; no external request", + "Production dispatcher/real PostgreSQL retry/status/history verified", + "Second retry eligibility advanced deliberately in fixture; 15s delay and early dispatch refusal checked independently" + ] +} \ No newline at end of file