Skip to content

Merge Develop into Master for Core 6 Release - #49

Merged
MagnusPienknyJTL (jtlmagnus) merged 63 commits into
masterfrom
develop
Oct 22, 2026
Merged

MagnusPienknyJTL (jtlmagnus) merged 63 commits into
masterfrom
develop

Conversation

@Patrick-Gugelsberger

@Patrick-Gugelsberger Patrick Gugelsberger (Patrick-Gugelsberger) commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Merges develop into master for the Core 6.0.0 release (58 commits ahead of master). This is a major release: PHP 8.3+, current dependency majors (DBAL 4, PHP-DI 7, Monolog 3, Symfony 7.4) and several security fixes. The full list is in CHANGELOG.md under 6.0.0.

Connectors don't get Core 6 automatically: their jtl/connector constraints stay on 5.x, and each connector moves to ^6.0 in its own ticket. The first one is connector-woocommerce3#85.

Breaking changes for endpoints

  • PHP >=8.3 (was >=8.1); Application::MIN_PHP_VERSION is now 8.3
  • Runtime dependencies: doctrine/dbal ^4.0, doctrine/collections ^2.6, php-di/php-di ^7.0, monolog/monolog ^3.0, jms/serializer ^3.32, symfony/* ^7.4 (symfony/http-foundation ^7.4.19)
  • Removed doctrine/annotations and doctrine/cache
  • Dependency injection reads PHP attributes (#[Inject]); docblock @Inject annotations are no longer read
  • Jtl\Connector\Dbc and the mapping tables use the DBAL 4 API (e.g. executeQuery()/executeStatement() instead of execute())
  • jtl/connector-dbc and jtl/connector-mapping-tables are declared as conflict instead of provide. Endpoints must remove both from their composer.json and use the classes bundled with core; installing them next to core 6 fails at install time
  • CO-3450: Zip::extract() throws FileTooLargeException (a CompressionException) instead of \RuntimeException
  • CO-3671: requests without a valid session get 789 No session before the RPC method is resolved, and an empty jtlauth counts as missing

Fixes and security

  • CO-3671: authenticate the session before resolving the RPC method, so unauthenticated callers can no longer probe which controllers and actions exist
  • CO-3468: constant-time token comparison in TokenValidator
  • CO-3450: oversized-image errors name the image as known in JTL-Wawi
  • CVE-2026-108082: require symfony/http-foundation ^7.4.19 (ReDoS via the Cache-Control request header, reachable on every request before authentication)
  • Schema updates no longer run inside a transaction, which made them fail on MySQL with "There is no active transaction"
  • An empty languageISO value no longer breaks deserialization
  • No more PHP 8.5 deprecation notices from setAccessible()

Upgrading existing installations

Tested 5.3.2 → 6.0.0 on MySQL 8.0.46 and SQLite, with 1000 rows per table (a mapping table, the dbc session table, and every column type core uses):

  • The first schema update after the upgrade only removes DBAL 2's (DC2Type:…) column comments:
    • MySQL: one ALTER TABLE … CHANGE per affected table. It is metadata-only (accepted with ALGORITHM=INSTANT), so large tables are not rebuilt.
    • SQLite: affected tables are rebuilt (copied to a temp table and back). This is not atomic, because schema updates no longer run in a transaction.
  • Row data was identical before and after (checksums), and no further schema updates were pending.

Included PRs

#32, #34, #35, #36, #38, #42, #43, #45, #46, #47, #48

Verification (on develop d811d6ae)

  • composer validate --strict: valid, no warnings
  • composer audit: no advisories
  • composer analyse: phpcs clean, phpstan (level max) no errors
  • composer tests: OK on PHP 8.3.32, 8.4.26 and 8.5.1
  • connector-woocommerce3#85's requirements resolve against develop

After merging

  1. Tag 6.0.0 on master (no v prefix, like 5.3.2).
  2. Update the lock in connector-woocommerce3#85: composer update jtl/connector.
  3. Close CO-3671 in Jira.
  4. Update the changelog page manually; core has no changelog workflow.

🤖 Generated with Claude Code

BREAKING CHANGE: Minimum PHP version raised from 7.4 to 8.2.
Multiple major dependency upgrades require consumers to align.

Dependencies upgraded:
- PHP >=7.4 -> >=8.2
- symfony/* ^5.0|^6.0 -> ^8.0 (console, event-dispatcher, filesystem, finder, http-foundation)
- doctrine/dbal ^3.0 -> ^4.0
- doctrine/collections ^2.2 -> ^3.0
- monolog/monolog ^2.0|^3.0 -> ^3.0
- php-di/php-di ^6.0 -> ^7.0
- phpunit/phpunit ^9.0 -> ^11.0
- phpstan/phpstan ^1.0 -> ^2.0
- squizlabs/php_codesniffer ^3.10 -> ^4.0
- slevomat/coding-standard ^8.15 -> ^8.29
- micheh/phpcs-gitlab ^1.1 -> ^2.0
- jtl/connector-cq * -> ^2.0
- mockery/mockery ^1.3 -> ^1.6

Dependencies removed:
- doctrine/annotations (zero usage)
- doctrine/cache (zero usage)
- jtl/unit-test (helpers inlined into tests/src/dbc/TestCase.php)

DBAL 4 migration:
- Rewrite QueryBuilder to track query type internally (INSERT/UPDATE/DELETE/SELECT)
- Replace execute() with executeQuery()/executeStatement()
- Replace fetch()/fetchAll() with fetchAssociative()/fetchAllAssociative()
- Replace getSchemaManager() with createSchemaManager()
- Replace Schema::getMigrateToSql() with Comparator + Platform::getAlterSchemaSQL()
- Replace Type::getName() with TypeRegistry::lookupName()
- Replace Connection::PARAM_STR_ARRAY with ArrayParameterType::STRING
- Replace DBALException with Exception, SchemaException with ColumnDoesNotExist::new()
- Replace ConversionException::conversionFailedInvalidType() with InvalidType::new()
- Add normalizeIntrospectedSchema() for SQLite type round-trip mismatches
- Update platform class references (MySqlPlatform -> MySQLPlatform, SqlitePlatform -> SQLitePlatform)
- Update connection params (driver key mandatory, pdo key removed)

Symfony 8 migration:
- Replace removed Request::get() with Request::request->get() / Request::query->get()
- Replace Request mock with real Request in tests (typed  property)

Monolog 3 / PHP-DI 7:
- Remove useAnnotations(true) call
- Clean up backward-compat union type hints in logger processors/handlers

PHPUnit 11 migration:
- Convert 69 @dataProvider annotations to #[DataProvider()] attributes across 27 files
- Make all data provider methods static
- Convert @Depends to #[Depends()], @runInSeparateProcess to #[RunInSeparateProcess]
- Replace setMethods() with onlyMethods()
- Remove SebastianBergmann\RecursionContext\InvalidArgumentException (85 occurrences, 45 files)
- Remove invalid PHPUnit MockObject exception imports and @throws (~260 annotations)
- Fix unqualified exception names in @throws to prevent namespace misresolution
- Inline jtl/unit-test reflection helpers into tests/src/dbc/TestCase.php
- Update phpunit.xml.dist schema to 11.5, replace <coverage> with <source>

PHPStan 2 migration:
- Fix ~148 errors across ~47 files at level max
- Narrow mixed types before binary ops, casts, foreach, offset access
- Remove redundant type checks (instanceof, is_int, is_string, is_array, is_object)
- Fix ReflectionClass template covariance (inline instead of property)
- Add @var annotations for superglobals and loosely-typed returns
- Extract typed variables from method chains for static analysis

phpcs 4 / slevomat 8.29:
- Auto-fix 364 @throws annotation ordering violations across 77 files
- Console command: $defaultName property -> #[AsCommand] attribute
Replace the single Mockery usage in IdentityLinkerTest with PHPUnit's
built-in createMock(). Sequential return values are handled via
willReturnCallback() with array queues. This also removes the transitive
hamcrest/hamcrest-php dependency.
…oSubscriber for empty language value"

This reverts commit 85f8adf.
… as success

DBAL 4 executeStatement() returns int; using > 0 would return false on an
idempotent UPDATE (0 rows changed), breaking the previous contract where any
non-exception result was considered success. Reverts to >= 0 to match
delete() and clear() semantics.
- src/dbc/DbManager.php: SchemaManagerFactory no longer used after
  schema diffing was rewritten with Comparator
- tests/src/dbc/TestCase.php: AbstractPlatform and Result were leftover
  from removed jtl/unit-test helpers
- tests/src/dbc/DbManagerStub.php: RuntimeException import not referenced
- RequestParamsTransformSubscriberTest: three docblocks had bare
  "\Exception" lines without the @throws tag prefix
- SqliteSessionHandlerTest: @throws \InvalidArgumentException was
  listed twice in testWriteInsert() and testWriteUpdate()
- DbManagerStub: duplicate @throws DbcRuntimeException on getSchemaTables()
feat!: upgrade all dependencies to current stable versions
CO-3450: the too-large exception referenced the numeric ZipArchive
loop index instead of the affected entry's name, making it impossible
to identify which image exceeded the 20MB limit from the error alone.
…_add_composer_lock

change php min requ to php8.3, fix language bug in LanguageIsoSubscriber for empty language value
BREAKING CHANGE: Minimum PHP version raised from 7.4 to 8.2.
Multiple major dependency upgrades require consumers to align.

Dependencies upgraded:
- PHP >=7.4 -> >=8.2
- symfony/* ^5.0|^6.0 -> ^8.0 (console, event-dispatcher, filesystem, finder, http-foundation)
- doctrine/dbal ^3.0 -> ^4.0
- doctrine/collections ^2.2 -> ^3.0
- monolog/monolog ^2.0|^3.0 -> ^3.0
- php-di/php-di ^6.0 -> ^7.0
- phpunit/phpunit ^9.0 -> ^11.0
- phpstan/phpstan ^1.0 -> ^2.0
- squizlabs/php_codesniffer ^3.10 -> ^4.0
- slevomat/coding-standard ^8.15 -> ^8.29
- micheh/phpcs-gitlab ^1.1 -> ^2.0
- jtl/connector-cq * -> ^2.0
- mockery/mockery ^1.3 -> ^1.6

Dependencies removed:
- doctrine/annotations (zero usage)
- doctrine/cache (zero usage)
- jtl/unit-test (helpers inlined into tests/src/dbc/TestCase.php)

DBAL 4 migration:
- Rewrite QueryBuilder to track query type internally (INSERT/UPDATE/DELETE/SELECT)
- Replace execute() with executeQuery()/executeStatement()
- Replace fetch()/fetchAll() with fetchAssociative()/fetchAllAssociative()
- Replace getSchemaManager() with createSchemaManager()
- Replace Schema::getMigrateToSql() with Comparator + Platform::getAlterSchemaSQL()
- Replace Type::getName() with TypeRegistry::lookupName()
- Replace Connection::PARAM_STR_ARRAY with ArrayParameterType::STRING
- Replace DBALException with Exception, SchemaException with ColumnDoesNotExist::new()
- Replace ConversionException::conversionFailedInvalidType() with InvalidType::new()
- Add normalizeIntrospectedSchema() for SQLite type round-trip mismatches
- Update platform class references (MySqlPlatform -> MySQLPlatform, SqlitePlatform -> SQLitePlatform)
- Update connection params (driver key mandatory, pdo key removed)

Symfony 8 migration:
- Replace removed Request::get() with Request::request->get() / Request::query->get()
- Replace Request mock with real Request in tests (typed  property)

Monolog 3 / PHP-DI 7:
- Remove useAnnotations(true) call
- Clean up backward-compat union type hints in logger processors/handlers

PHPUnit 11 migration:
- Convert 69 @dataProvider annotations to #[DataProvider()] attributes across 27 files
- Make all data provider methods static
- Convert @Depends to #[Depends()], @runInSeparateProcess to #[RunInSeparateProcess]
- Replace setMethods() with onlyMethods()
- Remove SebastianBergmann\RecursionContext\InvalidArgumentException (85 occurrences, 45 files)
- Remove invalid PHPUnit MockObject exception imports and @throws (~260 annotations)
- Fix unqualified exception names in @throws to prevent namespace misresolution
- Inline jtl/unit-test reflection helpers into tests/src/dbc/TestCase.php
- Update phpunit.xml.dist schema to 11.5, replace <coverage> with <source>

PHPStan 2 migration:
- Fix ~148 errors across ~47 files at level max
- Narrow mixed types before binary ops, casts, foreach, offset access
- Remove redundant type checks (instanceof, is_int, is_string, is_array, is_object)
- Fix ReflectionClass template covariance (inline instead of property)
- Add @var annotations for superglobals and loosely-typed returns
- Extract typed variables from method chains for static analysis

phpcs 4 / slevomat 8.29:
- Auto-fix 364 @throws annotation ordering violations across 77 files
- Console command: $defaultName property -> #[AsCommand] attribute
Replace the single Mockery usage in IdentityLinkerTest with PHPUnit's
built-in createMock(). Sequential return values are handled via
willReturnCallback() with array queues. This also removes the transitive
hamcrest/hamcrest-php dependency.
… as success

DBAL 4 executeStatement() returns int; using > 0 would return false on an
idempotent UPDATE (0 rows changed), breaking the previous contract where any
non-exception result was considered success. Reverts to >= 0 to match
delete() and clear() semantics.
- src/dbc/DbManager.php: SchemaManagerFactory no longer used after
  schema diffing was rewritten with Comparator
- tests/src/dbc/TestCase.php: AbstractPlatform and Result were leftover
  from removed jtl/unit-test helpers
- tests/src/dbc/DbManagerStub.php: RuntimeException import not referenced
- RequestParamsTransformSubscriberTest: three docblocks had bare
  "\Exception" lines without the @throws tag prefix
- SqliteSessionHandlerTest: @throws \InvalidArgumentException was
  listed twice in testWriteInsert() and testWriteUpdate()
- DbManagerStub: duplicate @throws DbcRuntimeException on getSchemaTables()
…oSubscriber for empty language value"

This reverts commit 85f8adf.

� Conflicts:
�	composer.json
�	src/Serializer/Subscriber/LanguageIsoSubscriber.php
CO-3450: the too-large exception referenced the numeric ZipArchive
loop index instead of the affected entry's name, making it impossible
to identify which image exceeded the 20MB limit from the error alone.
…nsaction

Don't wrap schema-update DDL in a transaction (DBAL 4 / MySQL)
QA: the error only contained the archive entry name
"{kArtikelBildPlattform}_{relationType}.jpg", which merchants can only
resolve via the Wawi database.

- Zip throws FileTooLargeException (entry name, size, limit) instead of
  a RuntimeException
- handleImagePush maps the entry back to the pushed image and throws
  ApplicationException::imageTooLarge with the Wawi image name (fallback:
  Wawi file name, then entry name), related entity ID (e.g. kArtikel),
  image ID, and size/limit
- archive entry to image matching extracted into isFileOfImage() so the
  extraction loop and the error mapping share it

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…to_too_large_error

fix: CO-3450 name the Wawi image in the image-too-large error
…#46)

Application::run() validated controller and action before startSession(),
so a request without a valid session got "Unknown controller"/"Unknown
action" for invalid methods and "No session" for valid ones. That allowed
unauthenticated callers to probe which methods exist, and made it look as
if authentication had been skipped.

startSession() also treated an empty jtlauth as "start a fresh session"
rather than "no session".

- start the session right after the request packet validity check, before
  the method is resolved
- reject an empty or non-string jtlauth with "No session" for every method
  except core.connector.auth

Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
composer analyse failed on develop with 19 phpstan errors and 5 phpcs
errors, all in this file (introduced by the CO-3583 hotfix):

- `@throws InvalidArgumentException` was never imported and resolved to the
  non-existent `Jtl\Connector\Core\Test\Session\InvalidArgumentException`;
  use `\InvalidArgumentException` like the rest of the suite and drop the
  resulting duplicate tags
- findSessionData() passed a mixed PDO value to base64_decode(); validate it
  is a string first (same guard as SqliteSessionHandler::read())
- mark findSessionData() `@phpstan-impure`: it queries the database, so
  phpstan must not assume a second call returns the same result
- reorder @throws tags (phpcbf)

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
ReflectionProperty/ReflectionMethod::setAccessible() has had no effect since
PHP 8.1 and is deprecated as of PHP 8.5. Core requires PHP >= 8.3, so the
calls can simply go. Application::extendExceptionMessageWithIdentifiers()
ran them at runtime, so endpoints on PHP 8.5 got a deprecation notice there;
the remaining 20 calls were in tests (22 test-run deprecations on PHP 8.5).

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
composer tests passed but reported "OK, but there were issues!":

- ModelTest::testModelsInitialization (106 data sets) was risky: PHPUnit 11
  ignores doc-comment metadata on methods that carry attributes, so its
  `@doesNotPerformAssertions` was dead. Use #[DoesNotPerformAssertions].
- 9 ApplicationTest cases were risky because Application::run() registers
  the core and the Monolog error/exception handlers. tearDown() now pops
  whatever the test added on top of the stack depth recorded in setUp(),
  which also covers tests where run() throws.
- Replace getMockForAbstractClass(), deprecated and removed in PHPUnit 12,
  with anonymous subclasses; AbstractModel/AbstractImage have no abstract
  methods.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
The unreleased section only listed CO-3450, CO-3468 and CO-3671. Add the
breaking changes since 5.3.2 (PHP 8.3, dependency majors, removed
dependencies, PHP-DI attributes instead of annotations, DBAL 4 for Dbc and
mapping tables) plus the LanguageIsoSubscriber fix and the PHP 8.5
deprecation cleanup. Versions are taken from the composer.json diff between
master and develop. The heading stays "unreleased"; the release commit
renames it, as for earlier releases.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
… stack

Counting handlers meant popping the whole stack and pushing it back with
set_error_handler($handler), which resets each handler's error mask to
E_ALL (review feedback on #47). Record the handlers on top of the stack in
setUp() with a push-and-restore probe, which leaves the stack and its masks
untouched, and in tearDown() pop only what the test added on top of them.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
chore: green composer analyse/tests and Core 6 changelog
…CHANGELOG) (#48)

* test: narrow $_SESSION through a local in SessionHelperTest

phpstan 2.3 drops @var-narrowed types of superglobals after method calls,
since those calls may modify them. testSet() and testUnset() read
$_SESSION after $helper->set()/unset() and assertion calls, which became
"offset access on mixed". Copy $_SESSION into a local after the call and
narrow that instead, typed as the string values these tests store.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* fix: require symfony/http-foundation ^7.4.19 and jms/serializer ^3.32

- symfony/http-foundation < 7.4.19 is affected by CVE-2026-108082, a ReDoS
  in HeaderUtils::split() reachable through the Cache-Control request
  header. Core reaches it on every request, unauthenticated: the
  Application constructor calls Request::createFromGlobals(), whose
  HeaderBag parses Cache-Control. Raise the floor so no endpoint can
  resolve a vulnerable version through core.
- Bound jms/serializer from * to ^3.32: the models use PHP 8 attributes
  and were tested with 3.32 (composer validate --strict warned about the
  unbound constraint).
- Refresh composer.lock under PHP 8.3 (lowest supported version) with
  Composer 2.10.3: 24 updates, including symfony/* 7.4.21 and
  squizlabs/php_codesniffer 4.0.4 (dev-only advisory). composer audit
  reports no advisories.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* fix: conflict with jtl/connector-dbc and connector-mapping-tables

Core 5 declared `provide` for jtl/connector-dbc v2.1.13 and
jtl/connector-mapping-tables 4.0.8 because it bundled identical copies.
Core 6 bundles DBAL 4 ports of both, while the standalone packages are
still DBAL 2. With `provide`, an endpoint that still requires e.g.
jtl/connector-dbc ^2.1 resolves against core 6 without any notice and gets
the DBAL 4 API under a 2.1.13 label, so it only fails at runtime
($qb->execute(), fetchAll(), ...).

Declare `conflict` instead: installing either standalone package next to
core 6 now fails at install time ("jtl/connector 6.0.0 conflicts with
jtl/connector-dbc v2.1.14"), telling endpoints to drop the requirement and
use the bundled classes. The standalone packages stay untouched for core 5.

Update the agent guides accordingly: they referenced `provide` and asked
to re-sync from upstream, which would now revert the DBAL 4 migration.
The lock only gets a new content-hash.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* fix: set Application::MIN_PHP_VERSION to 8.3

System\Check::run(), called from ConnectorController, still enforced and
reported PHP 8.2 as the minimum while composer.json requires >=8.3. Add a
test that ties the constant to the composer.json PHP requirement so the
two can't drift apart again.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* docs: release 6.0.0 in CHANGELOG

Rename the unreleased section to 6.0.0 and start a new, empty unreleased
section above it. Mention that Application::MIN_PHP_VERSION is now 8.3.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Runtime compatibility regressions and missing automated quality gates remain unresolved.

3 open issues
What changed in this PR

Prepares the JTL-Connector library for Core 6, updating its platform requirements and bundled database integration.

Changes:

  • Raises PHP and dependency requirements and documents endpoint migration steps.
  • Updates database, logging and serialization code, including security and image-error improvements.
  • Modernizes PHPUnit tests, adds subsystem guides and removes GitLab CI.
File Description
tests/​src/​Utilities/​StrTest.php Migrates data providers to attributes.
tests/​src/​TestCase.php Makes shared provider helper static.
tests/​src/​System/​CheckTest.php Checks PHP requirement consistency.
tests/​src/​Subscriber/​SyncErrorSubscriberTest.php Strengthens the no-errors assertion.
tests/​src/​Subscriber/​RequestParamsTransformSubscriberTest.php Modernizes data providers.
tests/​src/​Subscriber/​FeaturesSubscriberTest.php Updates exception documentation.
tests/​src/​Session/​SessionHelperTest.php Updates typing and reflection usage.
tests/​src/​Serializer/​Subscriber/​ProductAttributeSubscriberTest.php Clarifies serialized-data types.
tests/​src/​Serializer/​Subscriber/​ImageSubscriberTest.php Adds array assertion and updates annotations.
tests/​src/​Serializer/​Subscriber/​CrossSellingSubscriberTest.php Modernizes providers and types.
tests/​src/​Serializer/​Handler/​IdentityHandlerTest.php Migrates data-provider metadata.
tests/​src/​Rpc/​ResponsePacketTest.php Modernizes provider declarations.
tests/​src/​Rpc/​RequestPacketTest.php Updates providers and exception documentation.
tests/​src/​Rpc/​PacketTest.php Reorders exception documentation.
tests/​src/​Rpc/​MethodTest.php Modernizes data providers.
tests/​src/​Rpc/​ErrorTest.php Updates successful-validation assertion accounting.
tests/​src/​Model/​TranslatableAttributeI18nTest.php Modernizes data providers.
tests/​src/​Model/​ModelTest.php Replaces deprecated PHPUnit features.
tests/​src/​Model/​AbstractImageTest.php Updates providers and abstract-class fixtures.
tests/​src/​mapping-tables/​TableStub.php Updates DBAL exception references.
tests/​src/​mapping-tables/​TableDummyTest.php Updates exception documentation.
tests/​src/​mapping-tables/​TableCollectionTest.php Updates dependency exception references.
tests/​src/​Exception/​FileTooLargeExceptionTest.php Tests size formatting and getters.
tests/​src/​Definition/​RpcMethodTest.php Updates providers and case merging.
tests/​src/​Definition/​PaymentTypeTest.php Uses static data providers.
tests/​src/​Definition/​ModelTest.php Updates providers, reflection and types.
tests/​src/​Definition/​IdentityTypeTest.php Uses static data providers.
tests/​src/​Definition/​EventTest.php Modernizes provider metadata.
tests/​src/​Definition/​ControllerTest.php Uses static data providers.
tests/​src/​Definition/​ActionTest.php Modernizes data providers.
tests/​src/​dbc/​TableStub.php Adopts DBAL query and result APIs.
tests/​src/​dbc/​TableCollectionTest.php Updates exception references.
tests/​src/​dbc/​Table2Stub.php Uses DBAL type constants.
tests/​src/​dbc/​Schema/​TableRestrictionTest.php Expects DBAL's specific column exception.
tests/​src/​dbc/​DbManagerTest.php Updates connection parameters and providers.
tests/​src/​dbc/​DbManagerStub.php Normalizes returned array keys.
tests/​src/​dbc/​CoordinatesStub.php Updates DBAL queries and schema defaults.
tests/​src/​Config/​FileConfigTest.php Updates exception documentation.
tests/​src/​Config/​ConfigSchemaTest.php Removes obsolete reflection calls.
tests/​src/​Config/​ConfigParameterTest.php Updates providers and reflection usage.
tests/​src/​Compression/​ZipTest.php Tests extraction and oversized entries.
tests/​src/​Authentication/​TokenValidationTest.php Modernizes token-test providers.
tests/​src/​Application/​ResponseTest.php Modernizes provider metadata.
tests/​src/​Application/​RequestTest.php Updates exception documentation.
tests/​CLAUDE.md Adds test-suite guidance.
tests/​bootstrap.php Removes Doctrine annotation registration.
src/​Utilities/​Validator/​ValidatorInterface.php Reorders exception documentation.
src/​Utilities/​Validator/​Validator.php Safely formats invalid values.
src/​Utilities/​Validator/​Validate.php Reorders exception documentation.
src/​Utilities/​Money.php Types deprecated wrapper parameters.
src/​Utilities/​CLAUDE.md Adds utility guidance.
src/​System/​Check.php Simplifies PHP-version comparison.
src/​SyncError/​SqliteSyncErrorCollector.php Documents query-result type.
src/​SyncError/​CLAUDE.md Adds sync-error guidance.
src/​Subscriber/​RequestParamsTransformSubscriber.php Updates price transformation typing.
src/​Subscriber/​CLAUDE.md Adds subscriber guidance.
src/​Session/​SqliteSessionHandler.php Reorders exception documentation.
src/​Session/​SessionHelper.php Documents session-array types.
src/​Session/​CLAUDE.md Adds session guidance.
src/​Serializer/​Subscriber/​ProductStockLevelSubscriber.php Documents serializer visitor type.
src/​Serializer/​Subscriber/​LanguageIsoSubscriber.php Guards empty language values.
src/​Serializer/​Subscriber/​ImageSubscriber.php Documents serializer visitor type.
src/​Serializer/​Subscriber/​CrossSellingSubscriber.php Updates input typing and guards.
src/​Serializer/​SerializerBuilder.php Reorders exception documentation.
src/​Serializer/​Handler/​IdentityHandler.php Documents serializer path type.
src/​Serializer/​CLAUDE.md Adds serialization guidance.
src/​Rpc/​ResponsePacket.php Changes warning validation.
src/​Rpc/​RequestPacket.php Removes obsolete annotation references.
src/​Rpc/​Packet.php Removes obsolete annotation references.
src/​Rpc/​CLAUDE.md Adds packet guidance.
src/​Model/​TranslatableAttributeI18n.php Reorders exception documentation.
src/​Model/​TranslatableAttribute.php Simplifies attribute-type fallback.
src/​Model/​QueryFilter.php Narrows filter input handling.
src/​Model/​Generator/​TaxRateFactory.php Reorders exception documentation.
src/​Model/​Generator/​ProductVariationFactory.php Corrects generated-array documentation.
src/​Model/​Generator/​ProductPriceFactory.php Updates quantity generation and typing.
src/​Model/​Generator/​ProductFactory.php Reorders exception documentation.
src/​Model/​Generator/​AbstractModelFactory.php Clarifies overrides and model types.
src/​Model/​CLAUDE.md Adds protocol-model guidance.
src/​Model/​AbstractImage.php Creates reflection information on demand.
src/​mapping-tables/​Validator.php Uses current DBAL result type.
src/​mapping-tables/​TableProxy.php Updates parameter and exception documentation.
src/​mapping-tables/​TableManager.php Checks affected-row results numerically.
src/​mapping-tables/​CLAUDE.md Documents bundled DBAL 4 port.
src/​Mapper/​CLAUDE.md Adds mapping-contract guidance.
src/​Logger/​Processor/​WarningProcessor.php Uses Monolog 3 records.
src/​Logger/​Processor/​RequestProcessor.php Uses Monolog 3 records and typed locals.
src/​Logger/​LoggerService.php Adds log-level resolution.
src/​Logger/​Handler/​ChunkedHandler.php Adopts Monolog 3 handler signatures.
src/​Logger/​CLAUDE.md Adds logging guidance.
src/​Linker/​IdentityLinker.php Reorders exception documentation.
src/​Linker/​CLAUDE.md Adds linking guidance.
src/​Linker/​ChecksumLinker.php Refactors checksum linking and typing.
src/​Http/​JsonResponse.php Updates exception documentation.
src/​Exception/​FileTooLargeException.php Adds structured oversized-file errors.
src/​Exception/​CLAUDE.md Adds exception guidance.
src/​Exception/​ApplicationException.php Adds image-specific size errors.
src/​Event/​CLAUDE.md Adds event guidance.
src/​Error/​CLAUDE.md Adds error-handling guidance.
src/​Definition/​PaymentType.php Corrects cached-array documentation.
src/​Definition/​Event.php Reorders exception documentation.
src/​Definition/​CLAUDE.md Adds protocol-definition guidance.
src/​Definition/​Action.php Corrects cached-array documentation.
src/​dbc/​Types/​Uuid4Type.php Migrates UUID conversion APIs.
src/​dbc/​TableCollection.php Simplifies membership checks.
src/​dbc/​Session/​SessionHandler.php Migrates session queries to DBAL 4.
src/​dbc/​Schema/​TableRestriction.php Uses the specific DBAL column exception.
src/​dbc/​Console/​Command/​UpdateDatabaseSchemaCommand.php Registers command through an attribute.
src/​dbc/​Connection.php Adopts DBAL 4 method signatures.
src/​dbc/​CLAUDE.md Documents bundled database port.
src/​Database/​CLAUDE.md Adds persistence guidance.
src/​Controller/​ConnectorController.php Updates typing and runtime guards.
src/​Controller/​CLAUDE.md Adds controller guidance.
src/​Connector/​CLAUDE.md Adds endpoint-contract guidance.
src/​Config/​CoreConfigInterface.php Reorders exception documentation.
src/​Config/​CLAUDE.md Adds configuration guidance.
src/​Compression/​Zip.php Throws structured oversized-entry errors.
src/​CLAUDE.md Adds subsystem map.
src/​Checksum/​CLAUDE.md Adds checksum guidance.
src/​Authentication/​TokenValidator.php Uses constant-time token comparison.
src/​Authentication/​CLAUDE.md Adds authentication guidance.
src/​Application/​CLAUDE.md Adds request-lifecycle guidance.
phpunit.xml.dist Updates PHPUnit schema and pins UTC.
composer.json Updates requirements and package conflicts.
CHANGELOG.md Documents Core 6 changes.
.gitlab-ci.yml Removes GitLab pipeline.
.gitignore Stops ignoring the dependency lockfile.

Review effort: Balanced

Comment thread src/Logger/LoggerService.php Outdated
Comment thread src/dbc/Types/Uuid4Type.php Outdated
Comment thread src/Linker/ChecksumLinker.php Outdated
Co-authored-by: Copilot Autofix powered by AI <[email protected]>
Co-authored-by: Copilot Autofix powered by AI <[email protected]>
Add platform checks for SQL expression conversion.

Co-authored-by: Copilot Autofix powered by AI <[email protected]>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Major dependency and persistence migrations need human validation, and replacement automated quality checks are missing.

No open issues 🎉

1 previously missed issue

In code that hasn't changed since last review

Medium severity Add replacement CI workflow for analysis, tests, and hygiene checks

.gitlab-ci.yml:1

Deleting this pipeline leaves no checked-in workflow running quality checks: .github/workflows/close-issue.yml only performs scheduled issue cleanup. Add a replacement GitHub Actions workflow for pushes and pull requests that runs composer analyse, composer tests on PHP 8.3/8.4, and the repository-hygiene check, with failures failing the workflow. Otherwise this release and subsequent changes have no automated regression checks in the repository.

3 resolved since last review

Review effort: Balanced

Replaces .gitlab-ci.yml: repository hygiene check, composer analyse (PHP 8.3)
and composer tests (PHP 8.3/8.4) on push and pull request.

Co-authored-by: Claude Sonnet 5.5 <[email protected]>
Comment thread .github/workflows/ci.yml Fixed
Comment thread .github/workflows/ci.yml Fixed
Comment thread .github/workflows/ci.yml Fixed
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The breaking dependency and persistence migrations require human sign-off on downstream compatibility.

No open issues 🎉

Review effort: Balanced

@jtlmagnus
MagnusPienknyJTL (jtlmagnus) merged commit 721c394 into master Oct 22, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants