944a85dcc8
Сборка БД с нуля (php artisan migrate на пустом PostgreSQL — CI, новый сервер,
пересоздание из бэкапа) падала: 0001_load_initial_schema грузит полный текущий
db/schema.sql (v8.39), затем дельта-миграции пытаются создать уже существующие
объекты. Из 28 дельт 25 уже идемпотентны; ровно 3 не имели гарда:
- 2026_05_24_100000 add_balance_freeze: CREATE POLICY tenant_isolation на
balance_freeze_log (политика уже в schema.sql:3357) → +DROP POLICY IF EXISTS.
- 2026_05_26_120000 add_paused_at: projects.paused_at + projects_paused_at_idx
(уже в schema.sql:815/897) → guard hasColumn + CREATE INDEX IF NOT EXISTS.
- 2026_05_27_120000 project_routing_snapshots: CREATE TABLE + 2 индекса +
политика + 2 партиции (уже в schema.sql v8.39) → IF NOT EXISTS на таблицу/
индексы/партиции, DROP POLICY IF EXISTS, GRANT'ы вынесены в pg_roles-guard.
db/schema.sql НЕ трогается (источник истины, Pravila §4.2). Прод не затрагивается —
эти миграции там уже отмечены выполненными, тела повторно не исполняются.
Также возвращён полный-PostgreSQL прогон Pa11y (PR #49 был сужен до 7 публичных
страниц именно из-за сломанной сборки с нуля):
- .github/workflows/a11y.yml: postgres:16 service, 5 ролей БД (00_create_roles.sql),
.env с DB_SUPPLIER_* + Sanctum stateful localhost:8000, mkdir storage/framework,
migrate → partitions:create-months → db:seed (admin@demo.local). Сохранены уроки
PR #49: Node 22, корневой npm install, app npm ci --legacy-peer-deps.
- pa11y.config.json: +14 авторизованных маршрутов (вход под admin@demo.local) →
7 публичных + 14 авторизованных = 21 проверяемая страница.
Проверка — прогон CI этого workflow (чистый PostgreSQL + migrate с нуля + seed +
все 21 страница). План: docs/superpowers/plans/2026-06-03-from-scratch-migrate-idempotency-and-a11y-full.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>