Files
portal/app/phpstan.neon
T
Дмитрий b6a15c5bbf merge: подтянул общую ветку в клиентские СМС — 227 записей отставания закрыты
Ветка шла отдельно почти неделю и отставала на 227 записей, отставание росло
каждый день. Направление сведения — общая В ветку: перевод main владелец
отклонил, значит вливать в него нечего.

Девять столкновений, каждое разобрано по существу.

Журнал схемы: столкнулись НЕ три номера, как ожидалось, а ВСЕ - обе ветки
независимо заняли v8.96-v9.25 и v9.32 разным содержимым. Обе стороны
настоящие, выбросить нельзя ни одну, поэтому перенумерована ветка, а не
общая: 31 запись уехала в свободный диапазон v9.33-v9.63. Содержание не
тронуто - доказано сверкой с исходной версией через git, посимвольно.
Соответствие старых номеров новым вписано в сам журнал, чтобы старые
документы ветки оставались читаемыми. Прежняя пометка про "запас v9.32"
заменена: запас не спас, v9.32 в общей ветке тоже был занят.

Сборка тестовой базы: взята версия общей ветки. Она позже и доказана
замером - двумя шагами вместо migrate:fresh, который спотыкался на
типе-призраке и оставлял схему неполной.

Список слов орфографии сведён объединением: 2106 наших + 2169 общих дали
2173, ни одно слово ни с одной стороны не потеряно - проверено сравнением.

Расписание работ, маршруты экранов и админский слой: обе стороны добавляли
своё в одно место, оставлены обе.

Витрина рекламных каналов: каждая ветка сделала настоящим СВОЙ канал -
ветка СМС свой, общая Телеграм. После сведения настоящих три, заглушки
исключают все три. Сторож витрины принят вырезанием: убрал СМС из списка
настоящих - покраснел, вернул - позеленел.

СТОЛКНОВЕНИЕ ИМЁН, созданное самим сведением. Оба набора тестов объявляли
глобального помощника pollCampaign - свой в СМС (один довод) и свой в
Телеграме (от двух до четырёх). Две функции с одним именем в одном языке
не живут: пока ветки шли врозь, этого не видел никто. Помощник СМС
переименован в pollSmsCampaign. Проверено, что других таких пар в PHP-тестах
нет ни одной.

Статанализ ветки доведён с 674 замечаний до НУЛЯ, уровень не понижен и в
baseline не заметено ничего.
  - 616 из 674 - ложный класс Pest, закрытый тремя узкими правилами; правила
    перенесены из рабочей ветки, где владелец их уже принял;
  - остальные 42 - свои, в новом коде ветки, и починены по существу:
    задвоенный ключ массива в трёх тестах (след копирования - комментарий
    оторвался от своей строки), врущие описания двух помощников (PHP сам
    делает из ключа-номера число), сужение типа возврата, прятавшее от
    анализатора свойства подставного отправителя, лишний знак вопроса и
    четыре бесполезных перенумерования списка.
  - Приёмка вырезанием: подложил несуществующий метод - анализатор назвал его
    поимённо и покраснел; убрал - ноль.

Шапки 59 моделей обновлены пересборкой подсказчика и ОСТАВЛЕНЫ намеренно
(правка только в комментариях, проверено): без них анализатор не связывает
модель с описанием и не знает, что дата - это дата, а не строка. Откатил их
сперва по привычке - получил 15 замечаний про даты, вернул - ноль.

Орфография: 15 файлов проверено, 0 замечаний (смотрел и на число
проверенных файлов, не только на число ошибок). Добавлены три слова из имён
миграций ветки.

Заодно: алиас ruflo-core в списке имён сторожа реестра - плагин описан в
реестре групповым именем, сторож видел только машинное. Мостится ТОЛЬКО имя;
🔴 содержательный долг остаётся - реестр до сих пор зовёт ruflo изолированным,
хотя его разморозили 28.07. Это чинить отдельно, через claude-md-management.

Проверено: три фронтовых сторожа рекламы 18/18, статанализ 0, разметка 0,
орфография 0, синтаксис PHP чист. Полный прогон тестов ветки - отдельным
шагом, он ещё ни разу не делался.

NB: в журнале схемы есть задвоенные номера v8.26 (пять раз) и v8.64 (два) -
это досталось по наследству из общей ветки, ровно столько же их там и было.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 19:50:41 +03:00

65 lines
4.7 KiB
Plaintext

includes:
- vendor/larastan/larastan/extension.neon
- phpstan-baseline.neon
parameters:
# Sprint 2 Phase A — O-perf-07: result cache в локальной директории
# `.phpstan-cache/` (gitignored). Ускоряет инкрементальные pre-commit
# прогоны: при правке одного файла переанализ только зависящих, не
# всего графа классов.
tmpDir: .phpstan-cache
paths:
- app
- bootstrap
- config
- database
- routes
- tests
scanFiles:
- _ide_helper_models.php
level: 5
checkOctaneCompatibility: true
checkModelProperties: true
# Не краснеть из-за записей списка исключений, которым больше нечего гасить.
#
# Причина — 01.08.2026. `_ide_helper_models.php` собирается НА МЕСТЕ, в git его нет,
# и на разных машинах он получается разным: на этой он знал 52 модели, после
# пересборки — 79. От этого записи baseline про свойства моделей то совпадают,
# то нет: свежий подсказчик узнал про saas_transactions.credit_target, запись
# про «нет такого свойства» перестала совпадать — и статанализ покраснел, хотя
# в коде не изменилось ничего. Тот же механизм, что вчера с привязкой к числу
# повторов: сторож краснеет не от кода, а от своего же списка.
#
# Настоящие замечания это НЕ гасит — проверено вырезанием: подложенные поломки
# ловятся по-прежнему. Гасится ровно жалоба «запись не пригодилась».
reportUnmatchedIgnoredErrors: false
# Ложный класс Pest — 01.08.2026. Pest подставляет в замыкания тестов наш
# Tests\TestCase (tests/Pest.php: `pest()->extend(TestCase::class)->in(...)`),
# но анализатор считает `$this` внутри `it()`/`test()` за Pest\PendingCalls\TestCall
# и не находит ни методов Laravel-теста (actingAs, getJson, postJson), ни свойств,
# заданных в beforeEach. Доказательство ложности прямое: эти же тесты проходят —
# не будь метода, PHP упал бы. Замер 01.08: 722 из 758 замечаний ветки — этот класс.
#
# Upstream-расширения для этого Pest не поставляет: в vendor/pestphp/pest лежит
# только phpstan-pest-extension.neon про цепочки expect(), к `$this` он не относится.
#
# Правило узкое НАМЕРЕННО: ровно две формулировки, ровно про TestCall, ровно в tests/.
# Всё прочее внутри тестов анализатор по-прежнему проверяет — задвоенные ключи
# массива и несуществующие свойства подставных объектов ловятся, проверено вырезанием.
#
# Раньше этот класс лежал в phpstan-baseline.neon — 672 записи из 936, и каждая
# с привязкой к числу повторов (`count:`). От любого нового теста счётчик разъезжался
# и статанализ краснел на ровном месте. Записи убраны, заменены этим правилом.
ignoreErrors:
-
message: '#^Call to an undefined method Pest\\PendingCalls\\TestCall(\|Pest\\Support\\HigherOrderTapProxy)?\:\:#'
path: tests/*
-
message: '#^Access to an undefined property Pest\\PendingCalls\\TestCall(\|Pest\\Support\\HigherOrderTapProxy)?\:\:#'
path: tests/*
# Третья одёжка того же класса: `$this` передают в помощник, который по сигнатуре
# ждёт Tests\TestCase. Ждущий тип назван явно — правило не шире двух предыдущих.
-
message: '#^Parameter \#\d+ \$\w+ of function \w+ expects Tests\\TestCase, Pest\\PendingCalls\\TestCall given\.$#'
path: tests/*