Три дыры в скрабе ПДн перед отправкой в мониторинг, и все три проверялись
поиском подстроки в исходнике — гейтом, который зелен на сломанной проводке.
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 раза).
PII scrub wired to BOTH channels (before_send AND before_send_transaction) in app/main.py and app/workers/celery_app.py.
Before: Celery had no before_send at all, and before_send_transaction was URL-only while glitchtip_traces_sample_rate defaults to 0.05 - the Starlette integration puts request.data on transaction scope exactly as on error scope, so lead bodies leaked through the transaction channel.
Keys: full MERA set (client_name/client_phone/client_email/phone/email/name) plus company/message from PilotRequestInput.
VAT label: 'NDS (parking)' -> 'NDS (parking + commercial)' in DOCX/HTML exporters - financial.py computes VAT over parking AND non-residential.