Прежний 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>