E5: generate phpstan-baseline.neon (the 41 pre-existing errors) and include it, so `phpstan analyse` returns OK and the gate now fails only on NEW errors. The baseline is meant to be burned down over time. E4: add .github/workflows/ci.yml — MariaDB 11.8 + redis services, composer install, JWT keygen, phpstan (baseline-clean), migrate-on-empty-db smoke, and phpunit. Locally verified the substantive checks: a fresh empty DB migrates cleanly to 64 tables (guards the "migrations break on empty DB" bug class), phpstan is green, and the 70-test suite passes. The GitHub Actions service wiring itself is first-run-pending (can't be exercised offline). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
158 lines
6.3 KiB
Plaintext
158 lines
6.3 KiB
Plaintext
parameters:
|
|
ignoreErrors:
|
|
-
|
|
message: '#^Strict comparison using \!\=\= between mixed and null will always evaluate to true\.$#'
|
|
identifier: notIdentical.alwaysTrue
|
|
count: 1
|
|
path: src/Appointment/Service/SlotCalculatorService.php
|
|
|
|
-
|
|
message: '#^Offset ''role'' on array\{type\: ''clinic'', db_uuid\: mixed, name\: non\-falsy\-string, role\: ''secretary'', scope\: ''clinic'', permissions\: mixed\}\|array\{type\: ''clinic'', db_uuid\: string, name\: string, role\: ''clinic''\|''doctor'', scope\: ''clinic''\|null, doctor_uuid\: string\}\|array\{type\: ''clinic'', db_uuid\: string, name\: string, role\: ''clinic''\}\|array\{type\: ''doctor'', db_uuid\: mixed, name\: non\-falsy\-string, role\: ''secretary'', scope\: ''doctor'', permissions\: mixed\}\|array\{type\: ''doctor'', db_uuid\: string, name\: non\-falsy\-string, role\: ''doctor''\} on left side of \?\? always exists and is not nullable\.$#'
|
|
identifier: nullCoalesce.offset
|
|
count: 1
|
|
path: src/Auth/Controller/AuthController.php
|
|
|
|
-
|
|
message: '#^Call to an undefined method Symfony\\Component\\Security\\Core\\User\\UserInterface\:\:getId\(\)\.$#'
|
|
identifier: method.notFound
|
|
count: 2
|
|
path: src/Auth/Security/PasswordAuthenticator.php
|
|
|
|
-
|
|
message: '#^Call to an undefined method Symfony\\Component\\Security\\Core\\User\\UserInterface\:\:isStaff\(\)\.$#'
|
|
identifier: method.notFound
|
|
count: 1
|
|
path: src/Auth/Security/PasswordAuthenticator.php
|
|
|
|
-
|
|
message: '#^Call to an undefined method Symfony\\Contracts\\Cache\\CacheInterface\:\:getItem\(\)\.$#'
|
|
identifier: method.notFound
|
|
count: 1
|
|
path: src/Auth/Security/PasswordAuthenticator.php
|
|
|
|
-
|
|
message: '#^Call to an undefined method Symfony\\Contracts\\Cache\\CacheInterface\:\:save\(\)\.$#'
|
|
identifier: method.notFound
|
|
count: 1
|
|
path: src/Auth/Security/PasswordAuthenticator.php
|
|
|
|
-
|
|
message: '#^Call to an undefined method Symfony\\Contracts\\Cache\\CacheInterface\:\:getItem\(\)\.$#'
|
|
identifier: method.notFound
|
|
count: 4
|
|
path: src/Auth/Service/OtpService.php
|
|
|
|
-
|
|
message: '#^Call to an undefined method Symfony\\Contracts\\Cache\\CacheInterface\:\:save\(\)\.$#'
|
|
identifier: method.notFound
|
|
count: 3
|
|
path: src/Auth/Service/OtpService.php
|
|
|
|
-
|
|
message: '#^Call to an undefined method Symfony\\Contracts\\Cache\\CacheInterface\:\:getItem\(\)\.$#'
|
|
identifier: method.notFound
|
|
count: 2
|
|
path: src/Auth/Service/TokenService.php
|
|
|
|
-
|
|
message: '#^Call to an undefined method Symfony\\Contracts\\Cache\\CacheInterface\:\:save\(\)\.$#'
|
|
identifier: method.notFound
|
|
count: 1
|
|
path: src/Auth/Service/TokenService.php
|
|
|
|
-
|
|
message: '#^Match expression does not handle remaining value\: string$#'
|
|
identifier: match.unhandled
|
|
count: 1
|
|
path: src/Billing/Controller/BillingController.php
|
|
|
|
-
|
|
message: '#^Parameter \#3 \$filters of method App\\Billing\\Repository\\ClaimRepository\:\:findByTenant\(\) expects array\{status\?\: string\|null, insurance_id\?\: int\|null, from\?\: int\|null, to\?\: int\|null, q\?\: string\|null\}, array\{status\: non\-falsy\-string\|null, insurance_id\: non\-falsy\-string\|null, from\: non\-falsy\-string\|null, to\: non\-falsy\-string\|null, q\: non\-falsy\-string\|null\} given\.$#'
|
|
identifier: argument.type
|
|
count: 1
|
|
path: src/Billing/Controller/BillingController.php
|
|
|
|
-
|
|
message: '#^Using nullsafe property access "\?\-\>franchiseRials" on left side of \?\? is unnecessary\. Use \-\> instead\.$#'
|
|
identifier: nullsafe.neverNull
|
|
count: 2
|
|
path: src/Billing/Service/BillingCalculator.php
|
|
|
|
-
|
|
message: '#^Call to protected method getEntityManager\(\) of class Doctrine\\ORM\\EntityRepository\<object\>\.$#'
|
|
identifier: method.protected
|
|
count: 1
|
|
path: src/Billing/Service/ClaimService.php
|
|
|
|
-
|
|
message: '#^Strict comparison using \=\=\= between App\\Auth\\Entity\\User and null will always evaluate to false\.$#'
|
|
identifier: identical.alwaysFalse
|
|
count: 1
|
|
path: src/Blog/Entity/Blog.php
|
|
|
|
-
|
|
message: '#^Call to protected method getEntityManager\(\) of class Doctrine\\ORM\\EntityRepository\<object\>\.$#'
|
|
identifier: method.protected
|
|
count: 1
|
|
path: src/Insurance/Controller/InsuranceController.php
|
|
|
|
-
|
|
message: '#^Strict comparison using \!\=\= between mixed and null will always evaluate to true\.$#'
|
|
identifier: notIdentical.alwaysTrue
|
|
count: 4
|
|
path: src/Insurance/Controller/InsuranceController.php
|
|
|
|
-
|
|
message: '#^Property App\\Patient\\Service\\PatientService\:\:\$userRepo is never read, only written\.$#'
|
|
identifier: property.onlyWritten
|
|
count: 1
|
|
path: src/Patient/Service/PatientService.php
|
|
|
|
-
|
|
message: '#^Offset 0 on non\-empty\-list\<string\> on left side of \?\? always exists and is not nullable\.$#'
|
|
identifier: nullCoalesce.offset
|
|
count: 1
|
|
path: src/Payment/Gateway/MellatGateway.php
|
|
|
|
-
|
|
message: '#^Call to an undefined method Symfony\\Contracts\\Cache\\CacheInterface\:\:deleteItem\(\)\.$#'
|
|
identifier: method.notFound
|
|
count: 2
|
|
path: src/Payment/Service/CircuitBreakerService.php
|
|
|
|
-
|
|
message: '#^Call to an undefined method Symfony\\Contracts\\Cache\\CacheInterface\:\:getItem\(\)\.$#'
|
|
identifier: method.notFound
|
|
count: 3
|
|
path: src/Payment/Service/CircuitBreakerService.php
|
|
|
|
-
|
|
message: '#^Call to an undefined method Symfony\\Contracts\\Cache\\CacheInterface\:\:save\(\)\.$#'
|
|
identifier: method.notFound
|
|
count: 2
|
|
path: src/Payment/Service/CircuitBreakerService.php
|
|
|
|
-
|
|
message: '#^Call to an undefined method Symfony\\Contracts\\Cache\\CacheInterface\:\:getItem\(\)\.$#'
|
|
identifier: method.notFound
|
|
count: 1
|
|
path: src/Shared/Controller/HealthController.php
|
|
|
|
-
|
|
message: '#^Call to protected method getEntityManager\(\) of class Doctrine\\ORM\\EntityRepository\<object\>\.$#'
|
|
identifier: method.protected
|
|
count: 1
|
|
path: src/Sms/Command/SeedSmsMessageTemplatesCommand.php
|
|
|
|
-
|
|
message: '#^Property App\\Payment\\Gateway\\PaymentInitResult\:\:\$errorMessage \(string\) on left side of \?\? is not nullable\.$#'
|
|
identifier: nullCoalesce.property
|
|
count: 1
|
|
path: src/Sms/Controller/SmsWalletController.php
|
|
|
|
-
|
|
message: '#^Property App\\Subscription\\Controller\\SubscriptionController\:\:\$subscriptionRepo is never read, only written\.$#'
|
|
identifier: property.onlyWritten
|
|
count: 1
|
|
path: src/Subscription/Controller/SubscriptionController.php
|