fix(ptica): скраб ПДн перестаёт утекать то, что защищает + проводка проверяется поведением (#2753) #2787

Merged
bot-backend merged 2 commits from fix/2753-pii-scrub into main 2026-08-07 10:11:37 +00:00

2 commits

Author SHA1 Message Date
3e4a5c769e fix(ptica/concept): подписи НДС во фронте перестают отрицать коммерцию (#2753)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 11s
CI / changes (pull_request) Successful in 11s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 1m43s
CI / openapi-codegen-check (pull_request) Successful in 3m16s
CI / backend-tests (pull_request) Successful in 16m40s
Хвост #2457: бэкенд считает НДС на нежилой value-added ОБОИХ частей — паркинг
и коммерция/офисы 1-го этажа (financial.py:747), экспортёры так и подписывают
(«НДС (паркинг + коммерция)»), а карточка концепции утверждала обратное.

Три места, не два: сноска говорила «НДС начисляется только на паркинг»,
строка каскада — «НДС (паркинг)», и та же сноска добивала «Коммерческие и
офисные площади не учитываются» — при том что двумя десятками строк выше сам
компонент рисует строку «Выручка — нежилое (1-й этаж)» из revenue_office_rub.
Третье утверждение сильнее двух первых и без него правка была бы
самопротиворечивой в пределах одного абзаца.
2026-08-07 14:45:17 +05:00
fb7e94ee65 fix(ptica/observability): страховка скраба перестаёт утекать то, что защищает (#2753)
Три дыры в скрабе ПДн перед отправкой в мониторинг, и все три проверялись
поиском подстроки в исходнике — гейтом, который зелен на сломанной проводке.

1. include_local_variables=False в обеих точках входа (main.py, celery_app.py).
   Дефолт SDK — True, Птица его нигде не переопределяла: при ЛЮБОМ исключении
   кадр стека нёс значения аргументов (телефон заявки, адрес, токен) под
   произвольными именами. Скраб сверяет ИМЕНА ключей — такое он не ловит по
   построению, то есть это не дополнительная мера, а условие его полноты.
   У МЕРЫ флаг стоит с #2737.

2. Сбой самого скраба больше не уходит в мониторинг: ignore_logger на модуль +
   логирование без трассировки и без str(exc). До этого logger.exception внутри
   before_send создавал НОВОЕ событие, в локальных переменных которого лежал
   неочищенный event целиком, и это событие снова падало в тот же обработчик.
   Проверено исполнением: рекурсия не завершается, 1000+ вложенных трассировок
   за минуту. Диагностика осталась в stdout — текст трассировки значений
   переменных не печатает.

3. Проводка проверяется ПОВЕДЕНИЕМ, а не текстом файла. tests/_sentry_wiring_
   probe.py поднимает настоящий sentry_sdk.init() в подпроцессе, подменяет
   транспорт и смотрит, что до него доехало: тело запроса, транзакция, кадр
   стека, повторный вход при сбое скраба. Наружу не уходит ничего — DSN на
   несуществующий хост, capture_envelope подменён до первого события, маркеры
   случайные.

Старый гейт зелен на разорванной проводке: удалить before_send=scrub_event и
переформулировать соседний комментарий, назвав в нём тот же аргумент, — 2 passed.
Новый на том же коде — 2 failed. На коде до этого коммита новые проверки красные
(локальные переменные ушли в транспорт; сбой скраба вошёл в обработчик 4 раза).
2026-08-07 14:45:00 +05:00