diff -pruN 3.5.2-5/CHANGELOG.md 3.6.0-2/CHANGELOG.md
--- 3.5.2-5/CHANGELOG.md	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/CHANGELOG.md	2025-05-01 12:12:53.000000000 +0000
@@ -1,6 +1,12 @@
 CHANGELOG
 =========
 
+3.6
+---
+
+ * Make `HttpClientTestCase` and `TranslatorTest` compatible with PHPUnit 10+
+ * Add `NamespacedPoolInterface` to support namespace-based invalidation
+
 3.5
 ---
 
diff -pruN 3.5.2-5/Cache/CacheTrait.php 3.6.0-2/Cache/CacheTrait.php
--- 3.5.2-5/Cache/CacheTrait.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Cache/CacheTrait.php	2025-05-01 12:12:53.000000000 +0000
@@ -38,7 +38,7 @@ trait CacheTrait
     private function doGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, ?array &$metadata = null, ?LoggerInterface $logger = null): mixed
     {
         if (0 > $beta ??= 1.0) {
-            throw new class(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)) extends \InvalidArgumentException implements InvalidArgumentException {};
+            throw new class(\sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)) extends \InvalidArgumentException implements InvalidArgumentException {};
         }
 
         $item = $pool->getItem($key);
@@ -54,7 +54,7 @@ trait CacheTrait
                 $item->expiresAt(null);
                 $logger?->info('Item "{key}" elected for early recomputation {delta}s before its expiration', [
                     'key' => $key,
-                    'delta' => sprintf('%.1f', $expiry - $now),
+                    'delta' => \sprintf('%.1f', $expiry - $now),
                 ]);
             }
         }
diff -pruN 3.5.2-5/Cache/NamespacedPoolInterface.php 3.6.0-2/Cache/NamespacedPoolInterface.php
--- 3.5.2-5/Cache/NamespacedPoolInterface.php	1970-01-01 00:00:00.000000000 +0000
+++ 3.6.0-2/Cache/NamespacedPoolInterface.php	2025-05-01 12:12:53.000000000 +0000
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Cache;
+
+use Psr\Cache\InvalidArgumentException;
+
+/**
+ * Enables namespace-based invalidation by prefixing keys with backend-native namespace separators.
+ *
+ * Note that calling `withSubNamespace()` MUST NOT mutate the pool, but return a new instance instead.
+ *
+ * When tags are used, they MUST ignore sub-namespaces.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+interface NamespacedPoolInterface
+{
+    /**
+     * @throws InvalidArgumentException If the namespace contains characters found in ItemInterface's RESERVED_CHARACTERS
+     */
+    public function withSubNamespace(string $namespace): static;
+}
diff -pruN 3.5.2-5/Cache/composer.json 3.6.0-2/Cache/composer.json
--- 3.5.2-5/Cache/composer.json	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Cache/composer.json	2025-05-01 12:12:53.000000000 +0000
@@ -25,7 +25,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-main": "3.5-dev"
+            "dev-main": "3.6-dev"
         },
         "thanks": {
             "name": "symfony/contracts",
diff -pruN 3.5.2-5/Deprecation/composer.json 3.6.0-2/Deprecation/composer.json
--- 3.5.2-5/Deprecation/composer.json	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Deprecation/composer.json	2025-05-01 12:12:53.000000000 +0000
@@ -25,7 +25,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-main": "3.5-dev"
+            "dev-main": "3.6-dev"
         },
         "thanks": {
             "name": "symfony/contracts",
diff -pruN 3.5.2-5/EventDispatcher/composer.json 3.6.0-2/EventDispatcher/composer.json
--- 3.5.2-5/EventDispatcher/composer.json	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/EventDispatcher/composer.json	2025-05-01 12:12:53.000000000 +0000
@@ -25,7 +25,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-main": "3.5-dev"
+            "dev-main": "3.6-dev"
         },
         "thanks": {
             "name": "symfony/contracts",
diff -pruN 3.5.2-5/HttpClient/ResponseInterface.php 3.6.0-2/HttpClient/ResponseInterface.php
--- 3.5.2-5/HttpClient/ResponseInterface.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/HttpClient/ResponseInterface.php	2025-05-01 12:12:53.000000000 +0000
@@ -13,7 +13,6 @@ namespace Symfony\Contracts\HttpClient;
 
 use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
 use Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface;
-use Symfony\Contracts\HttpClient\Exception\ExceptionInterface;
 use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
 use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
 use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
@@ -37,7 +36,7 @@ interface ResponseInterface
      *
      * @param bool $throw Whether an exception should be thrown on 3/4/5xx status codes
      *
-     * @return string[][] The headers of the response keyed by header names in lowercase
+     * @return array<string, list<string>> The headers of the response keyed by header names in lowercase
      *
      * @throws TransportExceptionInterface   When a network error occurs
      * @throws RedirectionExceptionInterface On a 3xx when $throw is true and the "max_redirects" option has been reached
diff -pruN 3.5.2-5/HttpClient/Test/Fixtures/web/index.php 3.6.0-2/HttpClient/Test/Fixtures/web/index.php
--- 3.5.2-5/HttpClient/Test/Fixtures/web/index.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/HttpClient/Test/Fixtures/web/index.php	2025-05-01 12:12:53.000000000 +0000
@@ -199,6 +199,16 @@ switch (parse_url($vars['REQUEST_URI'],
         ]);
 
         exit;
+
+    case '/custom':
+        if (isset($_GET['status'])) {
+            http_response_code((int) $_GET['status']);
+        }
+        if (isset($_GET['headers']) && is_array($_GET['headers'])) {
+            foreach ($_GET['headers'] as $header) {
+                header($header);
+            }
+        }
 }
 
 header('Content-Type: application/json', true);
diff -pruN 3.5.2-5/HttpClient/Test/HttpClientTestCase.php 3.6.0-2/HttpClient/Test/HttpClientTestCase.php
--- 3.5.2-5/HttpClient/Test/HttpClientTestCase.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/HttpClient/Test/HttpClientTestCase.php	2025-05-01 12:12:53.000000000 +0000
@@ -11,6 +11,7 @@
 
 namespace Symfony\Contracts\HttpClient\Test;
 
+use PHPUnit\Framework\Attributes\RequiresPhpExtension;
 use PHPUnit\Framework\TestCase;
 use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
 use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
@@ -25,7 +26,7 @@ abstract class HttpClientTestCase extend
 {
     public static function setUpBeforeClass(): void
     {
-        if (!function_exists('ob_gzhandler')) {
+        if (!\function_exists('ob_gzhandler')) {
             static::markTestSkipped('The "ob_gzhandler" function is not available.');
         }
 
@@ -1025,6 +1026,7 @@ abstract class HttpClientTestCase extend
     /**
      * @requires extension zlib
      */
+    #[RequiresPhpExtension('zlib')]
     public function testAutoEncodingRequest()
     {
         $client = $this->getHttpClient(__FUNCTION__);
@@ -1098,6 +1100,7 @@ abstract class HttpClientTestCase extend
     /**
      * @requires extension zlib
      */
+    #[RequiresPhpExtension('zlib')]
     public function testUserlandEncodingRequest()
     {
         $client = $this->getHttpClient(__FUNCTION__);
@@ -1120,6 +1123,7 @@ abstract class HttpClientTestCase extend
     /**
      * @requires extension zlib
      */
+    #[RequiresPhpExtension('zlib')]
     public function testGzipBroken()
     {
         $client = $this->getHttpClient(__FUNCTION__);
diff -pruN 3.5.2-5/HttpClient/composer.json 3.6.0-2/HttpClient/composer.json
--- 3.5.2-5/HttpClient/composer.json	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/HttpClient/composer.json	2025-05-01 12:12:53.000000000 +0000
@@ -27,7 +27,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-main": "3.5-dev"
+            "dev-main": "3.6-dev"
         },
         "thanks": {
             "name": "symfony/contracts",
diff -pruN 3.5.2-5/Service/ServiceLocatorTrait.php 3.6.0-2/Service/ServiceLocatorTrait.php
--- 3.5.2-5/Service/ServiceLocatorTrait.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Service/ServiceLocatorTrait.php	2025-05-01 12:12:53.000000000 +0000
@@ -26,16 +26,15 @@ class_exists(NotFoundExceptionInterface:
  */
 trait ServiceLocatorTrait
 {
-    private array $factories;
     private array $loading = [];
     private array $providedTypes;
 
     /**
      * @param array<string, callable> $factories
      */
-    public function __construct(array $factories)
-    {
-        $this->factories = $factories;
+    public function __construct(
+        private array $factories,
+    ) {
     }
 
     public function has(string $id): bool
@@ -91,16 +90,16 @@ trait ServiceLocatorTrait
         } else {
             $last = array_pop($alternatives);
             if ($alternatives) {
-                $message = sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last);
+                $message = \sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last);
             } else {
-                $message = sprintf('only knows about the "%s" service.', $last);
+                $message = \sprintf('only knows about the "%s" service.', $last);
             }
         }
 
         if ($this->loading) {
-            $message = sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message);
+            $message = \sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message);
         } else {
-            $message = sprintf('Service "%s" not found: the current service locator %s', $id, $message);
+            $message = \sprintf('Service "%s" not found: the current service locator %s', $id, $message);
         }
 
         return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface {
@@ -109,7 +108,7 @@ trait ServiceLocatorTrait
 
     private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface
     {
-        return new class(sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface {
+        return new class(\sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface {
         };
     }
 }
diff -pruN 3.5.2-5/Service/ServiceMethodsSubscriberTrait.php 3.6.0-2/Service/ServiceMethodsSubscriberTrait.php
--- 3.5.2-5/Service/ServiceMethodsSubscriberTrait.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Service/ServiceMethodsSubscriberTrait.php	2025-05-01 12:12:53.000000000 +0000
@@ -42,18 +42,18 @@ trait ServiceMethodsSubscriberTrait
             }
 
             if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) {
-                throw new \LogicException(sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name));
+                throw new \LogicException(\sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name));
             }
 
             if (!$returnType = $method->getReturnType()) {
-                throw new \LogicException(sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class));
+                throw new \LogicException(\sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class));
             }
 
             /* @var SubscribedService $attribute */
             $attribute = $attribute->newInstance();
             $attribute->key ??= self::class.'::'.$method->name;
             $attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType;
-            $attribute->nullable = $returnType->allowsNull();
+            $attribute->nullable = $attribute->nullable ?: $returnType->allowsNull();
 
             if ($attribute->attributes) {
                 $services[] = $attribute;
diff -pruN 3.5.2-5/Service/ServiceSubscriberTrait.php 3.6.0-2/Service/ServiceSubscriberTrait.php
--- 3.5.2-5/Service/ServiceSubscriberTrait.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Service/ServiceSubscriberTrait.php	2025-05-01 12:12:53.000000000 +0000
@@ -46,18 +46,18 @@ trait ServiceSubscriberTrait
             }
 
             if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) {
-                throw new \LogicException(sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name));
+                throw new \LogicException(\sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name));
             }
 
             if (!$returnType = $method->getReturnType()) {
-                throw new \LogicException(sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class));
+                throw new \LogicException(\sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class));
             }
 
             /* @var SubscribedService $attribute */
             $attribute = $attribute->newInstance();
             $attribute->key ??= self::class.'::'.$method->name;
             $attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType;
-            $attribute->nullable = $returnType->allowsNull();
+            $attribute->nullable = $attribute->nullable ?: $returnType->allowsNull();
 
             if ($attribute->attributes) {
                 $services[] = $attribute;
diff -pruN 3.5.2-5/Service/Test/ServiceLocatorTestCase.php 3.6.0-2/Service/Test/ServiceLocatorTestCase.php
--- 3.5.2-5/Service/Test/ServiceLocatorTestCase.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Service/Test/ServiceLocatorTestCase.php	2025-05-01 12:12:53.000000000 +0000
@@ -19,6 +19,9 @@ use Symfony\Contracts\Service\ServiceLoc
 
 abstract class ServiceLocatorTestCase extends TestCase
 {
+    /**
+     * @param array<string, callable> $factories
+     */
     protected function getServiceLocator(array $factories): ContainerInterface
     {
         return new class($factories) implements ContainerInterface {
@@ -72,10 +75,8 @@ abstract class ServiceLocatorTestCase ex
             'foo' => function () use (&$locator) { return $locator->get('bar'); },
         ]);
 
-        if (!$this->getExpectedException()) {
-            $this->expectException(NotFoundExceptionInterface::class);
-            $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.');
-        }
+        $this->expectException(NotFoundExceptionInterface::class);
+        $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.');
 
         $locator->get('foo');
     }
diff -pruN 3.5.2-5/Service/composer.json 3.6.0-2/Service/composer.json
--- 3.5.2-5/Service/composer.json	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Service/composer.json	2025-05-01 12:12:53.000000000 +0000
@@ -32,7 +32,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-main": "3.5-dev"
+            "dev-main": "3.6-dev"
         },
         "thanks": {
             "name": "symfony/contracts",
diff -pruN 3.5.2-5/Tests/Cache/CacheTraitTest.php 3.6.0-2/Tests/Cache/CacheTraitTest.php
--- 3.5.2-5/Tests/Cache/CacheTraitTest.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Tests/Cache/CacheTraitTest.php	2025-05-01 12:12:53.000000000 +0000
@@ -43,9 +43,7 @@ class CacheTraitTest extends TestCase
         $cache->expects($this->once())
             ->method('save');
 
-        $callback = function (CacheItemInterface $item) {
-            return 'computed data';
-        };
+        $callback = fn (CacheItemInterface $item) => 'computed data';
 
         $cache->get('key', $callback);
     }
@@ -71,7 +69,7 @@ class CacheTraitTest extends TestCase
             ->method('save');
 
         $callback = function (CacheItemInterface $item) {
-            $this->assertTrue(false, 'This code should never be reached');
+            $this->fail('This code should never be reached');
         };
 
         $cache->get('key', $callback);
@@ -101,9 +99,7 @@ class CacheTraitTest extends TestCase
         $cache->expects($this->once())
             ->method('save');
 
-        $callback = function (CacheItemInterface $item) {
-            return 'computed data';
-        };
+        $callback = fn (CacheItemInterface $item) => 'computed data';
 
         $cache->get('key', $callback, \INF);
     }
@@ -114,9 +110,7 @@ class CacheTraitTest extends TestCase
             ->onlyMethods(['getItem', 'save'])
             ->getMock();
 
-        $callback = function (CacheItemInterface $item) {
-            return 'computed data';
-        };
+        $callback = fn (CacheItemInterface $item) => 'computed data';
 
         $this->expectException(\InvalidArgumentException::class);
         $cache->get('key', $callback, -2);
diff -pruN 3.5.2-5/Tests/Service/LegacyTestService.php 3.6.0-2/Tests/Service/LegacyTestService.php
--- 3.5.2-5/Tests/Service/LegacyTestService.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Tests/Service/LegacyTestService.php	2025-05-01 12:12:53.000000000 +0000
@@ -41,8 +41,18 @@ class LegacyTestService extends LegacyPa
         return $this->container->get(__METHOD__);
     }
 
+    #[SubscribedService(nullable: true)]
+    public function nullableInAttribute(): Service2
+    {
+        if (!$this->container->has(__METHOD__)) {
+            throw new \LogicException();
+        }
+
+        return $this->container->get(__METHOD__);
+    }
+
     #[SubscribedService]
-    public function nullableService(): ?Service2
+    public function nullableReturnType(): ?Service2
     {
         return $this->container->get(__METHOD__);
     }
@@ -56,7 +66,7 @@ class LegacyTestService extends LegacyPa
 
 class LegacyChildTestService extends LegacyTestService
 {
-    #[SubscribedService()]
+    #[SubscribedService]
     public function aChildService(): LegacyService3
     {
         return $this->container->get(__METHOD__);
diff -pruN 3.5.2-5/Tests/Service/ServiceMethodsSubscriberTraitTest.php 3.6.0-2/Tests/Service/ServiceMethodsSubscriberTraitTest.php
--- 3.5.2-5/Tests/Service/ServiceMethodsSubscriberTraitTest.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Tests/Service/ServiceMethodsSubscriberTraitTest.php	2025-05-01 12:12:53.000000000 +0000
@@ -25,7 +25,8 @@ class ServiceMethodsSubscriberTraitTest
     {
         $expected = [
             TestService::class.'::aService' => Service2::class,
-            TestService::class.'::nullableService' => '?'.Service2::class,
+            TestService::class.'::nullableInAttribute' => '?'.Service2::class,
+            TestService::class.'::nullableReturnType' => '?'.Service2::class,
             new SubscribedService(TestService::class.'::withAttribute', Service2::class, true, new Required()),
         ];
 
@@ -46,7 +47,7 @@ class ServiceMethodsSubscriberTraitTest
         $container = new class([]) implements ContainerInterface {
             use ServiceLocatorTrait;
         };
-        $service = new class() extends ParentWithMagicCall {
+        $service = new class extends ParentWithMagicCall {
             use ServiceMethodsSubscriberTrait;
         };
 
@@ -59,7 +60,7 @@ class ServiceMethodsSubscriberTraitTest
         $container = new class([]) implements ContainerInterface {
             use ServiceLocatorTrait;
         };
-        $service = new class() {
+        $service = new class {
             use ServiceMethodsSubscriberTrait;
         };
 
@@ -104,8 +105,18 @@ class TestService extends ParentTestServ
         return $this->container->get(__METHOD__);
     }
 
+    #[SubscribedService(nullable: true)]
+    public function nullableInAttribute(): Service2
+    {
+        if (!$this->container->has(__METHOD__)) {
+            throw new \LogicException();
+        }
+
+        return $this->container->get(__METHOD__);
+    }
+
     #[SubscribedService]
-    public function nullableService(): ?Service2
+    public function nullableReturnType(): ?Service2
     {
         return $this->container->get(__METHOD__);
     }
diff -pruN 3.5.2-5/Tests/Service/ServiceSubscriberTraitTest.php 3.6.0-2/Tests/Service/ServiceSubscriberTraitTest.php
--- 3.5.2-5/Tests/Service/ServiceSubscriberTraitTest.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Tests/Service/ServiceSubscriberTraitTest.php	2025-05-01 12:12:53.000000000 +0000
@@ -33,7 +33,8 @@ class ServiceSubscriberTraitTest extends
     {
         $expected = [
             LegacyTestService::class.'::aService' => Service2::class,
-            LegacyTestService::class.'::nullableService' => '?'.Service2::class,
+            LegacyTestService::class.'::nullableInAttribute' => '?'.Service2::class,
+            LegacyTestService::class.'::nullableReturnType' => '?'.Service2::class,
             new SubscribedService(LegacyTestService::class.'::withAttribute', Service2::class, true, new Required()),
         ];
 
@@ -54,7 +55,7 @@ class ServiceSubscriberTraitTest extends
         $container = new class([]) implements ContainerInterface {
             use ServiceLocatorTrait;
         };
-        $service = new class() extends ParentWithMagicCall {
+        $service = new class extends LegacyParentWithMagicCall {
             use ServiceSubscriberTrait;
 
             private $container;
@@ -69,7 +70,7 @@ class ServiceSubscriberTraitTest extends
         $container = new class([]) implements ContainerInterface {
             use ServiceLocatorTrait;
         };
-        $service = new class() {
+        $service = new class {
             use ServiceSubscriberTrait;
 
             private $container;
@@ -86,7 +87,7 @@ class ServiceSubscriberTraitTest extends
         };
         $container2 = clone $container1;
 
-        $testService = new class() extends LegacyParentTestService2 implements ServiceSubscriberInterface {
+        $testService = new class extends LegacyParentTestService2 implements ServiceSubscriberInterface {
             use ServiceSubscriberTrait;
         };
         $this->assertNull($testService->setContainer($container1));
diff -pruN 3.5.2-5/Translation/Test/TranslatorTest.php 3.6.0-2/Translation/Test/TranslatorTest.php
--- 3.5.2-5/Translation/Test/TranslatorTest.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Translation/Test/TranslatorTest.php	2025-05-01 12:12:53.000000000 +0000
@@ -11,6 +11,8 @@
 
 namespace Symfony\Contracts\Translation\Test;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\RequiresPhpExtension;
 use PHPUnit\Framework\TestCase;
 use Symfony\Contracts\Translation\TranslatorInterface;
 use Symfony\Contracts\Translation\TranslatorTrait;
@@ -45,7 +47,7 @@ class TranslatorTest extends TestCase
 
     public function getTranslator(): TranslatorInterface
     {
-        return new class() implements TranslatorInterface {
+        return new class implements TranslatorInterface {
             use TranslatorTrait;
         };
     }
@@ -53,6 +55,7 @@ class TranslatorTest extends TestCase
     /**
      * @dataProvider getTransTests
      */
+    #[DataProvider('getTransTests')]
     public function testTrans($expected, $id, $parameters)
     {
         $translator = $this->getTranslator();
@@ -63,6 +66,7 @@ class TranslatorTest extends TestCase
     /**
      * @dataProvider getTransChoiceTests
      */
+    #[DataProvider('getTransChoiceTests')]
     public function testTransChoiceWithExplicitLocale($expected, $id, $number)
     {
         $translator = $this->getTranslator();
@@ -75,6 +79,8 @@ class TranslatorTest extends TestCase
      *
      * @dataProvider getTransChoiceTests
      */
+    #[DataProvider('getTransChoiceTests')]
+    #[RequiresPhpExtension('intl')]
     public function testTransChoiceWithDefaultLocale($expected, $id, $number)
     {
         $translator = $this->getTranslator();
@@ -85,6 +91,7 @@ class TranslatorTest extends TestCase
     /**
      * @dataProvider getTransChoiceTests
      */
+    #[DataProvider('getTransChoiceTests')]
     public function testTransChoiceWithEnUsPosix($expected, $id, $number)
     {
         $translator = $this->getTranslator();
@@ -103,6 +110,7 @@ class TranslatorTest extends TestCase
     /**
      * @requires extension intl
      */
+    #[RequiresPhpExtension('intl')]
     public function testGetLocaleReturnsDefaultLocaleIfNotSet()
     {
         $translator = $this->getTranslator();
@@ -139,6 +147,7 @@ class TranslatorTest extends TestCase
     /**
      * @dataProvider getInterval
      */
+    #[DataProvider('getInterval')]
     public function testInterval($expected, $number, $interval)
     {
         $translator = $this->getTranslator();
@@ -164,6 +173,7 @@ class TranslatorTest extends TestCase
     /**
      * @dataProvider getChooseTests
      */
+    #[DataProvider('getChooseTests')]
     public function testChoose($expected, $id, $number, $locale = null)
     {
         $translator = $this->getTranslator();
@@ -181,6 +191,7 @@ class TranslatorTest extends TestCase
     /**
      * @dataProvider getNonMatchingMessages
      */
+    #[DataProvider('getNonMatchingMessages')]
     public function testThrowExceptionIfMatchingMessageCannotBeFound($id, $number)
     {
         $translator = $this->getTranslator();
@@ -296,6 +307,7 @@ class TranslatorTest extends TestCase
     /**
      * @dataProvider failingLangcodes
      */
+    #[DataProvider('failingLangcodes')]
     public function testFailedLangcodes($nplural, $langCodes)
     {
         $matrix = $this->generateTestData($langCodes);
@@ -305,6 +317,7 @@ class TranslatorTest extends TestCase
     /**
      * @dataProvider successLangcodes
      */
+    #[DataProvider('successLangcodes')]
     public function testLangcodes($nplural, $langCodes)
     {
         $matrix = $this->generateTestData($langCodes);
@@ -359,14 +372,14 @@ class TranslatorTest extends TestCase
             if ($expectSuccess) {
                 $this->assertCount($nplural, $indexes, "Langcode '$langCode' has '$nplural' plural forms.");
             } else {
-                $this->assertNotEquals((int) $nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms.");
+                $this->assertNotCount($nplural, $indexes, "Langcode '$langCode' has '$nplural' plural forms.");
             }
         }
     }
 
     protected function generateTestData($langCodes)
     {
-        $translator = new class() {
+        $translator = new class {
             use TranslatorTrait {
                 getPluralizationRule as public;
             }
diff -pruN 3.5.2-5/Translation/TranslatorTrait.php 3.6.0-2/Translation/TranslatorTrait.php
--- 3.5.2-5/Translation/TranslatorTrait.php	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Translation/TranslatorTrait.php	2025-05-01 12:12:53.000000000 +0000
@@ -111,7 +111,7 @@ EOF;
                 return strtr($standardRules[0], $parameters);
             }
 
-            $message = sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $id, $locale, $number);
+            $message = \sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $id, $locale, $number);
 
             if (class_exists(InvalidArgumentException::class)) {
                 throw new InvalidArgumentException($message);
diff -pruN 3.5.2-5/Translation/composer.json 3.6.0-2/Translation/composer.json
--- 3.5.2-5/Translation/composer.json	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/Translation/composer.json	2025-05-01 12:12:53.000000000 +0000
@@ -27,7 +27,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-main": "3.5-dev"
+            "dev-main": "3.6-dev"
         },
         "thanks": {
             "name": "symfony/contracts",
diff -pruN 3.5.2-5/composer.json 3.6.0-2/composer.json
--- 3.5.2-5/composer.json	2024-12-07 08:49:48.000000000 +0000
+++ 3.6.0-2/composer.json	2025-05-01 12:12:53.000000000 +0000
@@ -45,7 +45,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-main": "3.5-dev"
+            "dev-main": "3.6-dev"
         }
     }
 }
diff -pruN 3.5.2-5/debian/changelog 3.6.0-2/debian/changelog
--- 3.5.2-5/debian/changelog	2025-02-17 11:14:31.000000000 +0000
+++ 3.6.0-2/debian/changelog	2025-10-21 12:02:48.000000000 +0000
@@ -1,3 +1,34 @@
+php-symfony-contracts (3.6.0-2) unstable; urgency=medium
+
+  * Upload to unstable now that Trixie has been released
+  * Remove Rules-Requires-Root
+  * debian/control: Document nocheck flags
+
+ -- David Prévot <taffit@debian.org>  Tue, 21 Oct 2025 14:02:48 +0200
+
+php-symfony-contracts (3.6.0-1) experimental; urgency=medium
+
+  * New upstream release
+
+ -- David Prévot <taffit@debian.org>  Wed, 28 May 2025 12:51:07 +0200
+
+php-symfony-contracts (3.6.0~beta1-1) experimental; urgency=medium
+
+  * Upload beta to experimental
+
+  [ Christian Flothmann ]
+  * make test case classes compatible with PHPUnit 10+
+
+  [ Nicolas Grekas ]
+  * [Cache] Enable namespace-based invalidation by prefixing keys with
+    backend-native namespace separators
+
+  [ David Prévot ]
+  * Drop patches not needed anymore
+  * Update Standards-Version to 4.7.2
+
+ -- David Prévot <taffit@debian.org>  Sat, 03 May 2025 21:10:52 +0200
+
 php-symfony-contracts (3.5.2-5) unstable; urgency=medium
 
   * Modernize PHPUnit syntax
diff -pruN 3.5.2-5/debian/control 3.6.0-2/debian/control
--- 3.5.2-5/debian/control	2024-05-21 06:27:58.000000000 +0000
+++ 3.6.0-2/debian/control	2025-10-21 11:58:51.000000000 +0000
@@ -6,17 +6,16 @@ Uploaders: David Prévot <taffit@debian.
 Build-Depends: debhelper-compat (= 13),
                dh-sequence-phpcomposer,
                jq,
-               php-intl,
-               php-psr-cache (>> 3),
-               php-psr-container,
-               php-psr-event-dispatcher,
+               php-intl <!nocheck>,
+               php-psr-cache <!nocheck>,
+               php-psr-container <!nocheck>,
+               php-psr-event-dispatcher <!nocheck>,
                phpab,
-               phpunit
-Standards-Version: 4.7.0
+               phpunit <!nocheck>
+Standards-Version: 4.7.2
 Homepage: https://symfony.com/components/Contracts
 Vcs-Git: https://salsa.debian.org/php-team/pear/php-symfony-contracts.git
 Vcs-Browser: https://salsa.debian.org/php-team/pear/php-symfony-contracts
-Rules-Requires-Root: no
 
 Package: php-symfony-contracts
 Architecture: all
diff -pruN 3.5.2-5/debian/patches/0002-Remove-calls-to-getExpectedException.patch 3.6.0-2/debian/patches/0002-Remove-calls-to-getExpectedException.patch
--- 3.5.2-5/debian/patches/0002-Remove-calls-to-getExpectedException.patch	2025-02-17 11:14:08.000000000 +0000
+++ 3.6.0-2/debian/patches/0002-Remove-calls-to-getExpectedException.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,25 +0,0 @@
-From: "Alexander M. Turek" <me@derrabus.de>
-Date: Mon, 23 Sep 2024 12:42:15 +0200
-Subject: Remove calls to getExpectedException()
-
-Origin: upstream, https://github.com/symfony/symfony/commit/c1b6da6947b14422320ee5128a643ae26e6cc916
----
- Service/Test/ServiceLocatorTestCase.php | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
-
-diff --git a/Service/Test/ServiceLocatorTestCase.php b/Service/Test/ServiceLocatorTestCase.php
-index 65a3fe3..00f8602 100644
---- a/Service/Test/ServiceLocatorTestCase.php
-+++ b/Service/Test/ServiceLocatorTestCase.php
-@@ -72,9 +72,8 @@ abstract class ServiceLocatorTestCase extends TestCase
-             'foo' => function () use (&$locator) { return $locator->get('bar'); },
-         ]);
- 
--        if (!$this->getExpectedException()) {
--            $this->expectException(NotFoundExceptionInterface::class);
--            $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.');
-+        $this->expectException(NotFoundExceptionInterface::class);
-+        $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.');
-         }
- 
-         $locator->get('foo');
diff -pruN 3.5.2-5/debian/patches/0003-Drop-test-failing-with-PHPUnit-11.patch 3.6.0-2/debian/patches/0003-Drop-test-failing-with-PHPUnit-11.patch
--- 3.5.2-5/debian/patches/0003-Drop-test-failing-with-PHPUnit-11.patch	2025-02-17 11:14:08.000000000 +0000
+++ 3.6.0-2/debian/patches/0003-Drop-test-failing-with-PHPUnit-11.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,32 +0,0 @@
-From: =?utf-8?q?David_Pr=C3=A9vot?= <david@tilapin.org>
-Date: Sat, 11 Jan 2025 14:40:29 +0100
-Subject: Drop test failing with PHPUnit 11
-
----
- Service/Test/ServiceLocatorTestCase.php | 13 -------------
- 1 file changed, 13 deletions(-)
-
-diff --git a/Service/Test/ServiceLocatorTestCase.php b/Service/Test/ServiceLocatorTestCase.php
-index 00f8602..f8d1956 100644
---- a/Service/Test/ServiceLocatorTestCase.php
-+++ b/Service/Test/ServiceLocatorTestCase.php
-@@ -66,19 +66,6 @@ abstract class ServiceLocatorTestCase extends TestCase
-         $this->assertSame(2, $i);
-     }
- 
--    public function testThrowsOnUndefinedInternalService()
--    {
--        $locator = $this->getServiceLocator([
--            'foo' => function () use (&$locator) { return $locator->get('bar'); },
--        ]);
--
--        $this->expectException(NotFoundExceptionInterface::class);
--        $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.');
--        }
--
--        $locator->get('foo');
--    }
--
-     public function testThrowsOnCircularReference()
-     {
-         $locator = $this->getServiceLocator([
diff -pruN 3.5.2-5/debian/patches/0004-Modernize-PHPUnit-syntax.patch 3.6.0-2/debian/patches/0004-Modernize-PHPUnit-syntax.patch
--- 3.5.2-5/debian/patches/0004-Modernize-PHPUnit-syntax.patch	2025-02-17 11:14:08.000000000 +0000
+++ 3.6.0-2/debian/patches/0004-Modernize-PHPUnit-syntax.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,92 +0,0 @@
-From: =?utf-8?q?David_Pr=C3=A9vot?= <david@tilapin.org>
-Date: Mon, 17 Feb 2025 12:14:06 +0100
-Subject: Modernize PHPUnit syntax
-
----
- Translation/Test/TranslatorTest.php | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-diff --git a/Translation/Test/TranslatorTest.php b/Translation/Test/TranslatorTest.php
-index 756228a..573869c 100644
---- a/Translation/Test/TranslatorTest.php
-+++ b/Translation/Test/TranslatorTest.php
-@@ -11,6 +11,7 @@
- 
- namespace Symfony\Contracts\Translation\Test;
- 
-+use PHPUnit\Framework\Attributes\DataProvider;
- use PHPUnit\Framework\TestCase;
- use Symfony\Contracts\Translation\TranslatorInterface;
- use Symfony\Contracts\Translation\TranslatorTrait;
-@@ -53,6 +54,7 @@ class TranslatorTest extends TestCase
-     /**
-      * @dataProvider getTransTests
-      */
-+    #[DataProvider('getTransTests')]
-     public function testTrans($expected, $id, $parameters)
-     {
-         $translator = $this->getTranslator();
-@@ -63,6 +65,7 @@ class TranslatorTest extends TestCase
-     /**
-      * @dataProvider getTransChoiceTests
-      */
-+    #[DataProvider('getTransChoiceTests')]
-     public function testTransChoiceWithExplicitLocale($expected, $id, $number)
-     {
-         $translator = $this->getTranslator();
-@@ -75,6 +78,7 @@ class TranslatorTest extends TestCase
-      *
-      * @dataProvider getTransChoiceTests
-      */
-+    #[DataProvider('getTransChoiceTests')]
-     public function testTransChoiceWithDefaultLocale($expected, $id, $number)
-     {
-         $translator = $this->getTranslator();
-@@ -85,6 +89,7 @@ class TranslatorTest extends TestCase
-     /**
-      * @dataProvider getTransChoiceTests
-      */
-+    #[DataProvider('getTransChoiceTests')]
-     public function testTransChoiceWithEnUsPosix($expected, $id, $number)
-     {
-         $translator = $this->getTranslator();
-@@ -139,6 +144,7 @@ class TranslatorTest extends TestCase
-     /**
-      * @dataProvider getInterval
-      */
-+    #[DataProvider('getInterval')]
-     public function testInterval($expected, $number, $interval)
-     {
-         $translator = $this->getTranslator();
-@@ -164,6 +170,7 @@ class TranslatorTest extends TestCase
-     /**
-      * @dataProvider getChooseTests
-      */
-+    #[DataProvider('getChooseTests')]
-     public function testChoose($expected, $id, $number, $locale = null)
-     {
-         $translator = $this->getTranslator();
-@@ -181,6 +188,7 @@ class TranslatorTest extends TestCase
-     /**
-      * @dataProvider getNonMatchingMessages
-      */
-+    #[DataProvider('getNonMatchingMessages')]
-     public function testThrowExceptionIfMatchingMessageCannotBeFound($id, $number)
-     {
-         $translator = $this->getTranslator();
-@@ -296,6 +304,7 @@ class TranslatorTest extends TestCase
-     /**
-      * @dataProvider failingLangcodes
-      */
-+    #[DataProvider('failingLangcodes')]
-     public function testFailedLangcodes($nplural, $langCodes)
-     {
-         $matrix = $this->generateTestData($langCodes);
-@@ -305,6 +314,7 @@ class TranslatorTest extends TestCase
-     /**
-      * @dataProvider successLangcodes
-      */
-+    #[DataProvider('successLangcodes')]
-     public function testLangcodes($nplural, $langCodes)
-     {
-         $matrix = $this->generateTestData($langCodes);
diff -pruN 3.5.2-5/debian/patches/series 3.6.0-2/debian/patches/series
--- 3.5.2-5/debian/patches/series	2025-02-17 11:14:08.000000000 +0000
+++ 3.6.0-2/debian/patches/series	2025-05-28 10:48:55.000000000 +0000
@@ -1,4 +1 @@
 0001-Drop-file-making-PHPUnit-11-fail.patch
-0002-Remove-calls-to-getExpectedException.patch
-0003-Drop-test-failing-with-PHPUnit-11.patch
-0004-Modernize-PHPUnit-syntax.patch
diff -pruN 3.5.2-5/debian/tests/control 3.6.0-2/debian/tests/control
--- 3.5.2-5/debian/tests/control	2024-05-21 06:27:58.000000000 +0000
+++ 3.6.0-2/debian/tests/control	2025-10-21 11:56:35.000000000 +0000
@@ -1,3 +1,3 @@
 Test-Command: mkdir --parents vendor && phpab --output vendor/autoload.php --template debian/autoload.tests.php.tpl Tests && phpunit
-Restrictions: rw-build-tree, allow-stderr
+Restrictions: allow-stderr, rw-build-tree
 Depends: php-intl, phpab, phpunit, @
