- deploy.yml: добавлен auth/** в path-триггеры. app.core.auth кэширует
roles.yaml на весь lifetime процесса (@lru_cache) — без триггера правка
ролей молча не применялась до случайного чужого деплоя.
- ci-tradein.yml: добавлен блокирующий шаг `ruff check` — гейт для tradein
backend его не гонял вообще. Заодно почищены 3 срабатывания RUF059
(unused unpacked vars) в test_estimator_pure_units.py:381 — версия ruff,
зафиксированная в uv.lock (0.15.20), новее той, на которой аудит проверял
"чистое дерево" (0.7.4, как в .pre-commit-config.yaml); лок не трогаем —
правим 3 места по established convention (`_` уже используется в 3 других
тестах того же файла).
- Удалён мёртвый .github/workflows/ci.yml (Forgejo его не исполняет; GitHub
mirror отстал на 500+ коммитов). Блок postgis-service перенесён как
закомментированный образец в .forgejo/workflows/ci.yml (тестов против
живой БД пока нет ни одного).
- README.md: убрана ложная привязка mypy к живому CI-гейту (его там нет,
только ruff+pytest+coverage); убран stale-блок про .github/workflows/
(deploy-obsidian.yml там больше не лежит).
Две связанные вещи, обе — по решению владельца продукта.
1. auth/** в paths-фильтры обоих CI (ci.yml, ci-tradein.yml).
auth/roles.yaml — общий RBAC-конфиг двух стеков, но лежит в корне репы и не
попадал НИ В ОДИН фильтр: правка ролей/пользователей не запускала ни backend-,
ни tradein-сьют. Так 2026-07-30 в main уехал красный test_get_role_known_users
(user2 переведён в expired, тест ждал pilot) — обнаружен только вручную и
починен в PR #2587. Теперь правка roles.yaml гоняет оба гейта.
2. «Поиск домов» (/trade-in/sale-share) — ТЕСТОВЫЙ продукт, доступ только у
админа. Раньше он был закрыт от клиентских ролей (employee/manager/pilot), но
оставался открыт внутренней роли analyst. «Только у админа» включает и
внутренние роли → analyst добавлен в deny по sale-share.
Асимметрия с «Кэшем» намеренная и запиннена тестом: Кэш — не продукт, а
диагностика кэшей/скраперов, т.е. ровно тот инструмент, ради которого роль
analyst заведена; ему он оставлен.
Замеры после правки (реальный is_path_allowed поверх roles.yaml):
роль | Поиск домов | Кэш | ядро продукта
admin | True | True | True
analyst | False | True | True
pilot | False | False| True
Тест test_yaml_roles_deliberately_outside_client_deny переписан: пиннит ОБЕ
стороны асимметрии, а не только «analyst видит всё». Набор внутренних путей
разрезан на _SALE_SHARE_PATHS / _CACHE_TOOL_PATHS с assert'ом, что разрез
покрывает исходный набор целиком — иначе новый путь добавят и забудут отнести
к продукту, оставив analyst непроверенным.
Заодно поправлены устаревшие комментарии «Доступ: pilot + admin» в Caddyfile
(vanity-редирект gendsgn.ru/sale-share) и в докстринге самой страницы.
Тесты: 77 passed (tradein rbac/auth_session/auth_api) + 24 passed (site-finder).
tsc --noEmit + next build — зелёные. YAML обоих workflow провалидирован.