Sync deployment-скрипта с прод-DB-состоянием после 23.05.2026 partition fix:
ALTER TABLE OWNER → crm_migrator на 7 audit-таблицах (выравнивает дрейф;
prod уже в этом состоянии) + GRANT crm_migrator TO crm_supplier_worker
WITH INHERIT TRUE — даёт maintenance-роли права создавать/дропать партиции
через MonthlyPartitionManager::DDL_CONNECTION = pgsql_supplier (commit
fd660da4). Web-роль crm_app_user остаётся least-privilege — членства не
получает.
Идемпотентно: повторный запуск 02_grants.sql безопасен.
Связано: fd660da4 (код-фикс).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Code-review Task 1: явный per-table GRANT-блок для import_unknown_statuses
использовал несуществующие роли (crm_app_admin / crm_readonly). Реальные роли —
crm_app_user / crm_admin_user / crm_migrator / crm_audit_writer /
crm_supplier_worker (db/00_create_roles.sql). Блок удалён целиком из
db/02_grants.sql и db/schema.sql: import_unknown_statuses — обычная
tenant-scoped таблица, покрыта umbrella GRANT ... ON ALL TABLES +
ALTER DEFAULT PRIVILEGES (как import_log), явный per-table grant не нужен.
ImportSchemaTest: UNIQUE-тест усилен — проверяет состав колонок
(status_ru, tenant_id), а не только наличие constraint'а типа 'u'.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Закрывает CV.11 audit WARN minor #2 + #3 (LeadRouter + ResetDeliveredTodayCommand
под crm_app_user → RLS-policy tenant_isolation отвергает cross-tenant SELECT/UPDATE).
Архитектурное решение (Plan 2.6 brainstorm 10.05.2026 поздняя ночь, вариант C из 3
опций): новая PG-роль crm_supplier_worker с BYPASSRLS — privilege-boundary by design.
Queue worker = backend system process для cross-tenant операций (sharing-webhook
routing, global crons); web worker остаётся под crm_app_user (RLS-enforce).
WHERE(tenant_id=) фильтры в коде сохраняются как defense-in-depth.
Deploy:
- Роль создаётся через db/00_create_roles.sql при первом deploy
(psql -v crm_supplier_worker_password='<from-secrets>' ...).
- GRANT'ы в db/02_grants.sql секция 5.
- Queue worker .env: DB_USERNAME=crm_supplier_worker (отдельно от web .env).
Inline-warnings обновлены в LeadRouter.php + ResetDeliveredTodayCommand.php
(ссылка на crm_supplier_worker BYPASSRLS на prod, db/00_create_roles.sql).
00_create_roles.sql header bump v1.0 → v1.1 (4 → 5 ролей).
Без TDD-теста на роль (integration-тест требует CREATE ROLE в test DB +
смены connection — overhead не оправдан); smoke-grep verify пройден.
Pest 558/556 (+9 от Plan 2.5 baseline 549/547), Larastan + Pint + squawk green.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>