Skip to content

Исправления оплаты, бота, подписок и кабинета / Payment, bot, subscription and cabinet fixes - #4

Open
reelsmaker2026 wants to merge 11 commits into
STEALTHNET-APP:mainfrom
reelsmaker2026:fix/verified-payment-return-and-app-links
Open

reelsmaker2026 wants to merge 11 commits into
STEALTHNET-APP:mainfrom
reelsmaker2026:fix/verified-payment-return-and-app-links

Conversation

@reelsmaker2026

@reelsmaker2026 reelsmaker2026 commented Oct 10, 2026 •

Copy link
Copy Markdown

Русский · English

Проверенный коммит / Verified commit: aa006670a1f06014c7f43bcf70725d995dd7cdd3.

Русский

Итог передачи — 10.10.2026

Готовые исправления и регрессионные тесты опубликованы в этом PR и переданы для ревью. Этап подготовки и передачи текущего пакета завершён; проверенный кандидат остаётся aa006670a1f06014c7f43bcf70725d995dd7cdd3. Результаты bot/worker/node и восстановления прежнего QA-бота сохранены ниже с границами проверки.

Остальные работы сохранены отдельным списком «На потом» в форке: 22 пожелания, незавершённые части багов, решения о правилах и внешняя приёмка. Они не входят в объём этой передачи; новая разработка не начинается. Ограничения ниже остаются открытыми, а не объявляются исправленными.

PR открыт для рассмотрения разработчиком. Слияние и выпуск — отдельные действия; production не изменялся.

Проблема

На исходной базе STEALTHNET 747c9da358264cb912f3ea49cd632978f7762ded некоторые состояния оплаты, бота, подписки и кабинета показывают пользователю неверную информацию или теряют выбранное действие. Например: возврат после веб-оплаты ведёт в настроенную Mini App вместо кабинета; точная сумма 19.99000000 отклоняется; у завершённого счёта остаются действия оплаты; текст обращения, изменённый во время отправки первого сообщения, может потеряться.

Предложение содержит полный проверенный кандидат: 27 файлов исходников и тестов. Первые шесть коммитов сохранены; добавлены пять коммитов по компонентам. Исправления относятся к upstream. Специфичные для PAVLINK изменения HWID, настройки SSH/umask и исправления тестовой обвязки сюда не входят.

Что изменилось

  • Оформление и возврат оплаты: приоритет имеет адрес возврата конкретного счёта, а для бота/Mini App сохраняется настроенный резервный адрес. При возврате без сессии предлагается вход, история платежей сохраняется. В дробной части суммы допускаются только лишние конечные нули, без округления ненулевых долей меньше копейки. Нулевая итоговая сумма отображается как бесплатная активация с сохранением серверной проверки.
  • Бот: кнопки приложений ведут на HTTPS-инструкции; callback подтверждается один раз до длительной операции; устаревшие действия и недоступные тарифы обрабатываются с переходом в меню или поддержку. Различаются ожидающие, оплаченные, истёкшие и отменённые счета; корректно показывается состояние подписки и доступа. Подтверждения оплаты используют нейтральный текст, в том числе Stars-квитанции для отключённых клиентов.
  • Выдача подписок: вложенные HTTPS-адреса в ссылках Happ сохраняются буквально; браузер получает локализованную страницу ошибки, а программный клиент — прежний машинный ответ. Объявления соответствуют неактивному или ограниченному доступу и очищаются для блокирующих правил ответа.
  • Кабинет: при неопределённом результате оформления оплаты показывается понятное сообщение с дальнейшим действием. Сохраняются черновик и подтверждённый ID обращения при асинхронной отправке. Добавлена навигация к документам; действия оплаты доступны только ожидающим счетам; даты содержат год. Улучшена русская и английская вёрстка на узких экранах и при увеличенном тексте.
  • Администрирование и мониторинг: копируются только поля ключей Reality, без замены существующих destination/server names/xver. Тревога нагрузки сохраняется при отсутствующей или устаревшей телеметрии. Исправлены подписи нормализованной нагрузки; напоминания используют точное время окончания UTC и фактическое число оставшихся дней.

В кандидате есть исправления 19 зарегистрированных багов и ограниченные изменения ещё для двух. Независимость напоминаний и их дедупликация остаются нерешёнными: исправлен только текст даты и оставшихся дней. Отдельная метрика CPU utilization и её проверка при CPU/I/O-нагрузке Linux остаются открытыми: уточнены только подписи существующей нормализованной нагрузки. Правила периода, валюты и согласия для регулярных платежей, а также длительность подтверждения тревог и хранение их промежуточного состояния не изменялись. Проверка RollyPay sandbox отложена. Отдельный список пожеланий не входит в этот PR.

Связанные предложения в upstream

Прежние предложения автора форка остаются отдельными: upstream PR #2 и upstream PR #3. При сравнении их полных патчей на коммитах 9901a9ccc9901a8c908941842e246cfdbaad3ad9 и 7cb82a0c792f5e41213d2f3b65096f122d98ca85 с этим кандидатом не найдено дублирующих исправлений, которые нужно исключить.

  • PR fix(payments,sub,api): webhook deduplication, HWID race guard, panic elimination, Hysteria2/Trojan/SS/gRPC/HTTPUpgrade/XHTTP support, Remnawave directives #2: обработка CryptoBot/обычных HTTP webhook, регистрация HWID, изменения API/node/протоколов, очистка ограничений авторизации и интерфейс ручных счетов/отсутствующего тарифа отличаются от обработки сумм и возвратов Hosted, ошибок и объявлений подписки, напоминаний и регрессий кабинета в этом PR. Общими являются семь файлов. Пробное объединение без изменения рабочих деревьев выявило конфликты в web/app/app.js, web/app/customer-en.js и web/app/customer-ui.js. При интеграции необходимо сохранить и бесплатную активацию, и текст кнопки ручного счёта; оба набора переводов; отображение даты/года и поведение при отсутствии тарифа/переходе в помощь. Изменения общих файлов подписки, worker и справки находятся в разных участках.
  • PR feat(node,api,web): native kernel-level anti-scanner and advanced network protection #3: настройка и статус антисканера в web/p-nodes.js отличаются от уточнения подписей нагрузки в другом участке того же файла. Пробное объединение прошло без текстовых конфликтов; это не проверка совместной работы.

Этот PR не включает, не заменяет и не объединяет эти предложения и не объявляет их проверенными. Опубликованный коммит кандидата и проверенные хеши исходников сохраняются; любая совместная интеграция требует отдельного ревью и тестирования.

Проверки

Финальный кандидат проверен в изолированных облачных окружениях 10 октября 2026 года. Это результаты отдельных запусков, а не утверждение о зелёном GitHub CI. Перед публикацией каждый изменённый файл побайтно сопоставлен с проверенным upstream-кандидатом; в копии для публикации повторно успешно выполнены 70 Node-тестов и 20 проверок Reality на синтетических данных. Отдельный стенд Reality остался локальным; в diff включены регрессионные тесты Rust и Node.

Проверялись указанная upstream-база и, отдельно для совместимости, PAVLINK 5c7e93e6d3593bfd2ed242a909b64c2bad6678dd:

  • На каждой базе Rust workspace: 303 успешно, 0 ошибок, 0 пропусков при настроенном запуске --include-ignored --test-threads=1; все 17 тестовых целей, требующих явного включения, действительно выполнены.
  • На каждой базе Node devtools/tests/*.test.cjs: 70 успешно, 0 пропусков. make test-release также прошёл 72 Python-проверки, включая настоящее восстановление кабинета; его 16 Node-тестов профилей уже входят в 70 и повторно не суммируются.
  • На обеих базах прошли сборка рабочего пространства разработки и release-сборка в Ubuntu 24.04 с закреплёнными зависимостями и без сети. Проверены документация и соответствие отдаваемых файлов исходникам. Существующие предупреждения Rust сохранены.
  • Настоящий локальный API и отдельная PostgreSQL 17.11 использовались для подписанных платёжных уведомлений, точных сумм, отклонения неверной подписи/суммы, конкурентных повторов, жизненного цикла дополнений и сессий. Составная регрессия Hosted использует синтетический ожидающий счёт, локальную имитацию транспорта провайдера и настоящий HTTP webhook. Бесплатное оформление дополнительно проверено через настоящий checkout API, без повторного продления.
  • Firefox, суммарно для двух баз: 36 состояний скидок, 16 состояний мобильной вёрстки RU/EN для активной/истёкшей подписки с увеличенным текстом и четыре сценария поддержки с настоящим backend.
  • Финальные release-проверки Chromium: 108 проверок суммарно для двух баз, профили desktop/Pixel 7/iPhone 13, вход, reload, выход и возврат после оплаты. Сохранились тот же счёт и тот же срок подписки; переход обратно не отправлял новых запросов pay/quote/check.

В этих финальных облачных тестах транспорт провайдера и Telegram имитировался на loopback: настоящих оплат и сообщений не было. Браузерные профили устройств не являются нативными iOS/Android WebView. Внешний checkout RollyPay, нативные VPN-клиенты и реальный VPN-трафик остаются отдельной приёмкой. PAVLINK использован только для проверки совместимости, не как база этого PR или источник дополнительных изменений.

Дополнительные проверки после установки

Те же финальные release-артефакты установлены в отдельный QA-слот с синтетическими данными на Ubuntu 24.04/PostgreSQL 16.15 после резервирования и фактического пробного восстановления. После установки прошли readiness и авторизованный доступ; подписанные локальные уведомления продлили доступ один раз, а три одновременных повтора не продлили его снова; 54 проверки Chromium подтвердили вход/сессию/возврат с сохранением исходного счёта; восемь состояний узкой вёрстки Firefox RU/EN и два сценария гонки отправки обращения с настоящим backend прошли успешно. Отдаваемые файлы кабинета совпадают с финальными исходниками. Один запрос с инструкциями приложений, соответствующий неизменённой финальной реализации show_apps, принят Telegram для явно разрешённого тестового аккаунта; в том первоначальном проходе новый poller бота не запускался. Это не доказывает нативное VPN-подключение, внешний checkout провайдера или совместимость с другими ожидающими upstream-предложениями.

Полный цикл bot/worker/node и восстановление QA-бота — 10.10.2026

Отдельный облачный QA-проход с синтетической БД закрыл семь ранее заблокированных сценариев с настоящим финальным ботом и действиями разрешённого тестового аккаунта в Telegram Web. Проверен кандидат aa006670a1f06014c7f43bcf70725d995dd7cdd3: хеши фактически запущенных API/bot/worker/node соответствовали финальным release-артефактам и повторно сверены после перезапуска. Код и 27 опубликованных файлов не менялись.

  • /start обработан финальным ботом. Бесплатный тариф активирован настоящей кнопкой: один успешный счёт с нулевой суммой, один срок подписки и синтетический пользователь в конфигурации настоящего node, полученной через API.
  • Старая кнопка отключённого тарифа отклонена; повторная бесплатная активация не создала второй счёт и не изменила срок. После отказа работают /sub и переход в поддержку.
  • Для двух наблюдавшихся реальных нажатий зарегистрированы два answerCallbackQuery и два editMessageText. Это подтверждение только этих двух callback, а не общая гарантия exactly-once.
  • Финальный бот создал ручной счёт и показал pending. Состояния expired/canceled/failed/refunded/success задавались в синтетической БД, затем проверялись настоящим обработчиком по тестовым кнопкам. Различающиеся сообщения, поддержка и осторожный текст success проверены; повторная проверка success не создала счёт и не продлила подписку. Это проверка отображения и повторного чтения состояния, а не реальный платёж или расчёт с провайдером.
  • После искусственного истечения подписки worker записал один переход active → expired, node исключил пользователя из конфигурации, бот показал истечение. Совместный перезапуск лабораторных API/bot/worker/node сохранил число счетов, срок и expired; повторного события синхронизации не было. Подтверждены API health, авторизованный bootstrap node (HTTP 200) и свежий heartbeat.

Итог нового прохода: 9 PASS / 0 FAIL / 2 BLOCKED, включая семь функциональных сценариев, передачу polling и восстановление. Отдельно выполнены 22/22 проверки доказательств. В совокупной функциональной матрице — 28 PASS и 2 BLOCKED: 21 прежний PASS сохранён как исторический результат, добавлены семь новых. Полный Rust/Node-набор и release-сборка в этом проходе заново не выполнялись; эти результаты не являются статусом GitHub CI.

Старый QA-бот восстановлен и проверен. Защитный таймер восстановления был включён до временной остановки. Старый poller остановлен до запуска финального; очередь не очищалась. После проверки финальный poller остановлен, обработанный offset передан обратно, прежний бот запущен с исходными executable, окружением и командами. Новый /start получил живой ответ; подтверждены свежий polling heartbeat и ровно один процесс бота с этим токеном. Защитный таймер отключён только после успешного возврата. Остальные прежние QA-службы не останавливались; проверки готовности кабинета и подписок вернули HTTP 200. Временные процессы API/bot/worker/node остановлены, тестовая сессия закрыта. Production не подключался и не изменялся.

Что остаётся непроверенным:

  • QUEUE-SUCCESS-AMBIGUOUS: успешная/неопределённая доставка групповых уведомлений, включая потерю ответа после возможной доставки. Нужны отдельно разрешённая тестовая группа и управляемый транспорт; гарантия exactly-once не заявляется. Прежние проверки ошибок очереди и перезапуска не выдаются за повторённые.
  • NATIVE-VPN: VPN-движок был локальным mock. Настоящий node/API подтверждает управление доступом и конфигурацией, но не реальный VPN-трафик, Xray или нативные мобильные/VPN-клиенты.
  • RollyPay, внешний checkout и реальные платежи остаются отложенными. Сохранение pay_url не проверялось заново ручным счётом; для него остаются только прежние регрессионные доказательства.
  • Возврат polling прежнему QA-боту фактически выполнен и проверен. Полный откат постоянного QA-слота всё ещё не выполнялся: его скрипт проверен синтаксически. Пробное восстановление БД относится к прежнему проходу, не к новому.
  • Совместимость с другими ожидающими upstream PR, частичные исправления и несогласованные правила, перечисленные выше, этим проходом не закрываются.

Повторение опубликованных регрессий

node --test devtools/tests/*.test.cjs
cargo test --locked -p sn-payments --lib invoice_return_url
cargo test --locked -p sn-payments --lib sn_b05
cargo test --locked -p sn-sub --bin sn-sub sn_b07

Полный набор opt-in требует явно настроенных изолированных фикстур; обычный cargo test пропускает ignored-тесты. SN_TEST_DATABASE_URL должен указывать на отдельную БД sn_audit_* с применёнными миграциями и синтетическими записями. Составному тесту Hosted также нужен SN_COMBINED_FIXTURE с локальными адресами API/кабинета и синтетическими ID аккаунта/тарифа в БД sn_audit_r3_web_*. Перед запуском проверьте защитные условия фикстур в каждом тесте. Не направляйте их в рабочую БД или к настоящему провайдеру. Обычная release-цель не запускает автоматически все добавленные Node-тесты; используйте явную маску файлов выше.

Действия при обновлении

Миграции, Cargo.lock, установка и настройки не меняются. После ревью обновляйте затронутые бинарники и веб-ресурсы вместе штатным процессом выпуска. Этот PR не разворачивает изменения в production. Частичные исправления и перечисленные ограничения внешней приёмки остаются открытыми.

Скриншоты и состав публикации

Скриншоты приватных сессий и сырые журналы исключены. PR содержит только исходники и регрессионные тесты с синтетическими данными: без бинарников, архивов, баз данных, учётных данных, env-файлов, сессий, приватных аудитов и внутренних реестров.


English

Delivery status — 2026-10-10

The completed fixes and regression tests are published in this PR for maintainer review. Preparation and handoff of this package are complete; the verified candidate remains aa006670a1f06014c7f43bcf70725d995dd7cdd3. The bot/worker/node results and restoration of the previous QA bot are preserved below with their verification boundaries.

Further work is saved in the separate deferred backlog in the fork: 22 feature requests, incomplete bug work, behavior decisions and external acceptance. These are outside this handoff; no new implementation is being started. The limitations below remain open and are not being reported as fixed.

The PR remains open for maintainer review. Merging and releasing are separate actions; production was not changed.

Problem

On upstream 747c9da358264cb912f3ea49cd632978f7762ded, several payment, bot, subscription and cabinet states produce misleading messages or lose the user's intended next action. Examples include returning a web payment to the configured Mini App instead of the account, rejecting the exact amount 19.99000000, offering payment actions for finished invoices, and losing a support draft edited while its first message is being sent.

This updates the existing proposal to the complete tested candidate: 27 source/test files. The original six commits are retained, with five additional commits grouped by component. These are upstream fixes; PAVLINK-only HWID changes, SSH/umask configuration and test-harness fixes are not included.

Resulting behavior

  • Checkout and payment return: prefer the invoice return URL with the configured fallback for bot/Mini App; prompt for login and retain payment history on return; accept only trailing fractional zeros without rounding nonzero sub-cent amounts; label zero-total quoted checkout as free activation while retaining server validation.
  • Bot: use HTTPS application instructions in inline buttons; acknowledge callbacks once before slow work; recover from stale actions and unavailable tariffs with menu/support navigation; distinguish pending, paid, expired and canceled invoices; show subscription/access state accurately; use neutral payment receipts, including Stars receipts for disabled clients.
  • Subscription delivery: preserve literal nested HTTPS URLs for Happ; provide localized browser error pages while retaining machine error responses; use state-specific announcements for inactive/limited access and clear announcements for blocked response rules.
  • Cabinet: show a neutral, actionable message when checkout outcome is unknown; retain drafts and the confirmed ticket identity during asynchronous support requests; provide document navigation, pending-only invoice actions and year-bearing dates; improve RU/EN account layouts at narrow widths and larger text.
  • Administration and monitoring: copy only Reality key fields so existing destination/server names/xver remain intact; preserve load incidents when telemetry is missing or stale; label normalized load accurately; use exact UTC expiration times and actual remaining days in reminders.

This candidate contains code fixes for 19 reported bugs and limited changes for two others. Reminder independence/deduplication remains unresolved (only date/day wording is fixed). A separate CPU-utilization metric and Linux CPU/I/O acceptance remain unresolved (only labels for existing normalized load are corrected). Recurring-payment period/currency/consent policy and alert confirmation-duration/state policy are not changed. RollyPay sandbox validation is deferred. The separate wishlist is outside this PR.

Related upstream proposals

Existing proposals by this fork author remain separate: upstream PR #2 and upstream PR #3. Comparing their complete file patches at 9901a9ccc9901a8c908941842e246cfdbaad3ad9 and 7cb82a0c792f5e41213d2f3b65096f122d98ca85 against this candidate found no duplicate fix to remove.

Neither proposal is included, superseded, merged or declared tested by this PR. The candidate's published commit and verified source hashes remain unchanged; any combined integration needs its own review and tests.

Validation

Final candidate checks completed in isolated cloud environments on 10 October 2026. These are local verification results, not a claim about GitHub CI. Before publication, every changed file was checked byte-for-byte against the tested upstream candidate; the publication copy also reran all 70 Node tests and 20 synthetic Reality assertions successfully. The standalone Reality harness remains local; committed regression tests are the Rust and Node tests in this diff.

On each tested base (upstream above, plus compatibility-only PAVLINK 5c7e93e6d3593bfd2ed242a909b64c2bad6678dd):

  • Rust workspace: 303 passed, 0 failed, 0 ignored in the configured --include-ignored --test-threads=1 run; all 17 opt-in targets actually executed.
  • Node devtools/tests/*.test.cjs: 70 passed, 0 skipped. make test-release also passed its 72 Python checks, including real cabinet recovery; its 16 Node profile tests are already included in the 70.
  • Development workspace build and locked/offline release workspace build in Ubuntu 24.04 passed; documentation and source/served-asset identity were checked. Existing Rust warnings remain.
  • Real local API and isolated PostgreSQL 17.11 exercised signed payment notifications, exact amounts, invalid signature/amount rejection, concurrent duplicate delivery, addon lifecycle and account sessions. The preserved combined Hosted regression uses a synthetic pending invoice, local provider transport and a real HTTP webhook. Free-total checkout additionally used the actual checkout API and verified no duplicate extension.
  • Firefox: 36 discount states, 16 RU/EN active/expired mobile layout states with enlarged text, and four support scenarios using the actual backend, across both bases.
  • Final release Chromium checks: 108 assertions across both bases, desktop/Pixel 7/iPhone 13 profiles, covering login, reload, logout and payment return. The same invoice and subscription end date remained unchanged; return navigation issued no new pay/quote/check requests.

Provider and Telegram transports were loopback mocks; no real payments or messages were sent by these final checks. Browser device profiles are not native iOS/Android WebViews. RollyPay external checkout, native VPN clients and actual VPN traffic remain separate acceptance work. PAVLINK is compatibility evidence only, not this PR's base or a source of extra changes.

Additional installed-candidate checks

The same final release artifacts were then installed in a separate synthetic QA slot on Ubuntu 24.04/PostgreSQL 16.15 after a verified backup and actual restore test. After installation: readiness and authenticated access passed; signed local notifications extended access once and three concurrent repeats did not extend it again; 54 Chromium login/session/return checks preserved the original invoice; eight Firefox RU/EN narrow-layout states and two real-backend support race scenarios passed. Served cabinet assets match the final source. One app-instruction payload from the unchanged final show_apps implementation was accepted by Telegram for the explicitly authorized test account; no new bot poller was started in that initial pass. This does not establish native VPN connectivity, external provider checkout, or compatibility with the other pending upstream proposals.

bot/worker/node lifecycle and QA bot restoration — 10 October 2026

A separate cloud QA run with a synthetic database closed seven previously blocked scenarios using the actual final bot and actions from the authorized test account in Telegram Web. Candidate aa006670a1f06014c7f43bcf70725d995dd7cdd3 was checked: hashes of the running API/bot/worker/node executables matched the final release artifacts and were rechecked after restart. Source code and the 27 published files were unchanged.

  • The final bot handled /start. A real callback activated the free tariff: one successful zero-amount invoice, one subscription end date, and the synthetic user in the real node configuration fetched through the API.
  • A stale button for a disabled tariff was rejected. Repeating free activation created no second invoice and did not change the end date; /sub and support navigation still worked afterward.
  • For two observed real button clicks, two answerCallbackQuery and two editMessageText calls were recorded. This is evidence for those two callbacks only, not a general exactly-once guarantee.
  • The final bot created a manual invoice and displayed pending. Expired/canceled/failed/refunded/success states were seeded in the synthetic database and checked through the real handler using test buttons. Distinct messages, support and cautious success wording passed; repeating the success-status check neither created an invoice nor extended the subscription. This verifies status presentation and repeated status reads, not a real payment or provider settlement.
  • After synthetic subscription expiry, the worker recorded one active → expired transition, the node excluded the user from its configuration, and the bot displayed expiry. Restarting the laboratory API/bot/worker/node together preserved the invoice count, end date and expired state without a duplicate synchronization event. API health, authenticated node bootstrap (HTTP 200) and a fresh heartbeat were confirmed.

New run: 9 PASS / 0 FAIL / 2 BLOCKED, comprising seven functional scenarios, polling handoff and restoration. Separately, 22/22 evidence assertions passed. The combined functional matrix is 28 PASS and 2 BLOCKED: 21 earlier passes retained as historical evidence plus seven new passes. The full Rust/Node suites and release build were not rerun during this pass; these results are not a GitHub CI status.

The previous QA bot was restored and verified. A recovery timer was armed before the temporary stop. The previous poller stopped before the final poller started; the queue was not cleared. After validation, the final poller stopped, the processed offset was handed back, and the previous bot restarted with its original executable, environment and commands. A fresh /start received a live reply; a fresh polling heartbeat and exactly one bot process for that token were confirmed. The recovery timer was disabled only after successful restoration. Other existing QA services were not stopped; cabinet and subscription readiness returned HTTP 200. Temporary API/bot/worker/node processes were stopped and the test session was closed. Production was neither accessed nor changed.

Still unverified:

  • QUEUE-SUCCESS-AMBIGUOUS: successful/indeterminate group-notification delivery, including a lost response after possible delivery. This needs a separately authorized test group and a controllable transport; no exactly-once guarantee is claimed. Earlier queue-failure/restart checks are not presented as rerun.
  • NATIVE-VPN: the VPN engine was a local mock. The real node/API verifies access and configuration management, not actual VPN traffic, Xray or native mobile/VPN clients.
  • RollyPay, external checkout and real payments remain deferred. The manual-invoice scenario did not recheck preservation of pay_url; that still has only earlier regression evidence.
  • The temporary polling handoff was actually rolled back and verified. A full rollback of the permanent QA slot is still unexecuted; its script was syntax-checked. The database restore drill belongs to the earlier run, not this new pass.
  • Compatibility with other pending upstream PRs, partial fixes and unresolved behavior policies listed above are not closed by this run.

Repeating the committed regressions

node --test devtools/tests/*.test.cjs
cargo test --locked -p sn-payments --lib invoice_return_url
cargo test --locked -p sn-payments --lib sn_b05
cargo test --locked -p sn-sub --bin sn-sub sn_b07

The full opt-in suite needs explicitly configured isolated fixtures; normal cargo test skips ignored tests. SN_TEST_DATABASE_URL must point to a separately migrated sn_audit_* database with synthetic fixture records. The combined Hosted test additionally requires SN_COMBINED_FIXTURE with local API/cabinet URLs and synthetic account/tariff IDs in a sn_audit_r3_web_* database. Consult each test's fixture guards before running. Never target a live database or provider. The ordinary release target does not automatically run all added Node tests; use the explicit glob above.

Upgrade actions

No migrations, Cargo.lock changes or installation/configuration changes. After review, update the affected binaries and web assets together using the normal release process. This PR does not deploy or modify production. The partial fixes and external acceptance limits above remain open.

Screenshots and publication contents

Private session screenshots and raw logs are omitted. The PR contains source and synthetic regression tests only: no binaries, archives, databases, credentials, environment files, session data, private audit reports or internal tracking tables.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant