Экран «Реклама на кандидатов» заменён тремя страницами прогрева
(SalesWarmingView, /sales/warming/{platform}). Старый маркер «Где греем»
в новой сборке отсутствует намеренно — обновляю guard deploy-build.sh,
иначе защита откажет в выкате фронта. Новый маркер warming/yandex
попадает в бандл через пункт меню /sales/warming/yandex.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Скрипт deploy-build.sh не даёт затереть живые фичи: если строка есть в
боевой сборке, а в новой её нет — выкат отклоняется. Добавил маркер
фичи выбора площадки прогрева, чтобы её тоже нельзя было снести
случайным выкатом из отставшей ветки.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ветка разошлась с боевым 28.06 (334 коммита в main / 215 у нас). Влито ВСЁ боевое:
автоподбор конкурентов, мобильный адаптив портала, свой учёт посетителей, мониторинг
внешних сервисов, фиксы поставщика/биллинга/бота/разборов.
ПОБАЙТОВАЯ СВЕРКА: из 1008 файлов, изменённых боевым, 989 совпадают точно;
19 отличаются — все с нашей законной работой (обе стороны внутри). Затёртых — 0.
24 конфликта разобраны вручную. Ключевое:
- VerifySupplierOrderJob — взята БОЕВАЯ версия (фикс инцидента 11-12.07: площадка
берётся из src, а не из имени; наша была старой и вернула бы баг, терявший заявки).
- SyncSupplierProjectsJobTest — 15 боевых тестов + наш уникальный (limit-1 → только B1).
- routes/web, router/index, config/services, bootstrap/app — обе стороны сложены.
- NewProjectDialog — зелёные дни недели (наше) + мобильная раскладка (боевое).
- CHANGELOG схемы — номера версий столкнулись, наши перенумерованы в v8.67-v8.70.
- composer — обе зависимости (laravel-dompdf наш + geoip2 боевой).
Гейты: бэкенд 2907/2911 (0 падений), Larastan 0, фронт 1333/1333, сборка OK.
Baseline статанализа принял пре-существующий долг боевого кода (автоподбор/чат).
@mixin в 26 моделях — требование статанализа, dev-докблок, на рантайм не влияет.
Откат: git reset --hard pre-merge-main-20260714
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Вторая живая деплой-инструкция с той же миной (после 06-18 runbook): §миграций
велела sudo -u postgres на VM = мёртвая копия. Исправлено на crm_migrator/Managed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Портал выкатывается полной заменой public/build; сборка из устаревшей ветки
молча сносила чужую работу (инцидент 08.07: Метрика снесла колонки «Сделок»).
deploy-build.sh перед подменой сверяет маркеры критичных фич (по активным
чанкам manifest.json, не по orphan-осколкам) — теряет живую фичу → ОТКАЗ.
Осознанный откат — FORCE=1, только проверка — DRY_RUN=1. Установлен на боевом.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Прежний reorder (optimize последним) владельца НЕ менял: optimize перезаписывает
существующий config.php in-place (file_put_contents не трогает владельца) → оставался
ubuntu:www-data 775 (читаемо, портал работал, но комментарий врал про www-data).
Теперь rm config/routes/events перед optimize → www-data создаёт свежие как
www-data:www-data 664. Синкнут на прод (sha совпал). Главное по квирку 107 —
читаемость (валидатор П1 test -r), владелец вторичен.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Проверено на боевом 25.06: config.php = ubuntu:www-data mode 775, www-data ЧИТАЕТ его
через группу, портал HTTP 200 — реального дефекта НЕТ. Квирк «лечили» несколько раз,
гонясь за строгой проверкой «владелец == www-data», тогда как важна читаемость.
Две первопричины повтора закрыты:
1. deploy/redeploy.sh: optimize перенесён в КОНЕЦ (после chown -R ubuntu:www-data
bootstrap/cache). Раньше optimize шёл ДО chown'а → chown переписывал владельца
свежего config.php обратно на ubuntu. Теперь кэши пишутся после chown и остаются
www-data:www-data.
2. .claude/agents/prod-deploy-validator.md П1: критерий сменён на ЧИТАЕМОСТЬ www-data
(sudo -u www-data test -r config.php) вместо строгого владельца. Владелец ubuntu при
группе www-data+775 больше НЕ даёт ложный NO-GO. Свежесть (mtime ≥ .env, квирк 104)
сохранена. Описание квирка 107 и формат рапорта обновлены.
Прод не трогали — он здоров. После следующего redeploy config.php станет www-data-owned.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Канон рецепта server-side деплоя, который раньше жил только в /var/www/liderra/redeploy.sh.
- deploy/redeploy.sh — копия 1:1 текущей версии с боевого (квирк 107 фикс встроен:
sudo -u www-data php artisan optimize).
- deploy/README.md — workflow деплоя (git archive + scp + bash redeploy.sh)
и пояснение, что боевой остаётся source of truth для исполнения,
репо — source of truth для рецепта.
При следующей правке скрипта на боевом — синкать обратно (sha-сверка).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>