diff --git a/composer/Generator/Builder/DrupalCoreRecommendedBuilder.php b/composer/Generator/Builder/DrupalCoreRecommendedBuilder.php
index a9a064435483495e1e2aa031240ec20e486f8a45..216550f05de7a36d41dc8813286ffec4f0d29e17 100644
--- a/composer/Generator/Builder/DrupalCoreRecommendedBuilder.php
+++ b/composer/Generator/Builder/DrupalCoreRecommendedBuilder.php
@@ -41,7 +41,7 @@ public function getPackage() {
       // If there is no 'source' record, then this is a path repository
       // or something else that we do not want to include.
       if (isset($package['source']) && !in_array($package['name'], $remove_list)) {
-        $composer['require'][$package['name']] = $package['version'];
+        $composer['require'][$package['name']] = '~' . $package['version'];
       }
     }
     return $composer;
@@ -56,7 +56,7 @@ protected function initialPackageMetadata() {
     return [
       "name" => "drupal/core-recommended",
       "type" => "metapackage",
-      "description" => "Locked core dependencies; require this project INSTEAD OF drupal/core.",
+      "description" => "Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core.",
       "license" => "GPL-2.0-or-later",
       "conflict" => [
         "webflo/drupal-core-strict" => "*",
diff --git a/composer/Metapackage/CoreRecommended/composer.json b/composer/Metapackage/CoreRecommended/composer.json
index 3182fe1eaec5a99874c42ca451978b126fb24cb2..02e0b988bbe44c82b9c7dd8edd2181fb706245b7 100644
--- a/composer/Metapackage/CoreRecommended/composer.json
+++ b/composer/Metapackage/CoreRecommended/composer.json
@@ -1,67 +1,67 @@
 {
     "name": "drupal/core-recommended",
     "type": "metapackage",
-    "description": "Locked core dependencies; require this project INSTEAD OF drupal/core.",
+    "description": "Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core.",
     "license": "GPL-2.0-or-later",
     "conflict": {
         "webflo/drupal-core-strict": "*"
     },
     "require": {
         "drupal/core": "9.5.x-dev",
-        "asm89/stack-cors": "1.3.0",
-        "composer/semver": "3.3.2",
-        "doctrine/annotations": "1.13.2",
-        "doctrine/lexer": "1.2.3",
-        "doctrine/reflection": "1.2.2",
-        "egulias/email-validator": "3.2",
-        "guzzlehttp/guzzle": "6.5.7",
-        "guzzlehttp/promises": "1.5.1",
-        "guzzlehttp/psr7": "1.8.5",
-        "laminas/laminas-diactoros": "2.11.0",
-        "laminas/laminas-escaper": "2.9.0",
-        "laminas/laminas-feed": "2.17.0",
-        "laminas/laminas-stdlib": "3.7.1",
-        "masterminds/html5": "2.7.5",
-        "pear/archive_tar": "1.4.14",
-        "pear/console_getopt": "v1.4.3",
-        "pear/pear-core-minimal": "v1.10.11",
-        "pear/pear_exception": "v1.0.2",
-        "psr/cache": "1.0.1",
-        "psr/container": "1.1.1",
-        "psr/http-factory": "1.0.1",
-        "psr/http-message": "1.0.1",
-        "psr/log": "1.1.4",
-        "ralouphie/getallheaders": "3.0.3",
-        "stack/builder": "v1.0.6",
-        "symfony-cmf/routing": "2.3.4",
-        "symfony/console": "v4.4.42",
-        "symfony/debug": "v4.4.41",
-        "symfony/dependency-injection": "v4.4.42",
-        "symfony/deprecation-contracts": "v2.5.1",
-        "symfony/error-handler": "v4.4.41",
-        "symfony/event-dispatcher": "v4.4.42",
-        "symfony/event-dispatcher-contracts": "v1.1.12",
-        "symfony/http-client-contracts": "v2.5.1",
-        "symfony/http-foundation": "v4.4.42",
-        "symfony/http-kernel": "v4.4.42",
-        "symfony/mime": "v5.4.9",
-        "symfony/polyfill-ctype": "v1.25.0",
-        "symfony/polyfill-iconv": "v1.25.0",
-        "symfony/polyfill-intl-idn": "v1.25.0",
-        "symfony/polyfill-intl-normalizer": "v1.25.0",
-        "symfony/polyfill-mbstring": "v1.25.0",
-        "symfony/polyfill-php80": "v1.25.0",
-        "symfony/process": "v4.4.41",
-        "symfony/psr-http-message-bridge": "v2.1.2",
-        "symfony/routing": "v4.4.41",
-        "symfony/serializer": "v4.4.42",
-        "symfony/service-contracts": "v2.5.1",
-        "symfony/translation": "v4.4.41",
-        "symfony/translation-contracts": "v2.5.1",
-        "symfony/validator": "v4.4.41",
-        "symfony/var-dumper": "v5.4.9",
-        "symfony/yaml": "v4.4.37",
-        "twig/twig": "v2.15.1",
-        "typo3/phar-stream-wrapper": "v3.1.7"
+        "asm89/stack-cors": "~1.3.0",
+        "composer/semver": "~3.3.2",
+        "doctrine/annotations": "~1.13.2",
+        "doctrine/lexer": "~1.2.3",
+        "doctrine/reflection": "~1.2.2",
+        "egulias/email-validator": "~3.2",
+        "guzzlehttp/guzzle": "~6.5.7",
+        "guzzlehttp/promises": "~1.5.1",
+        "guzzlehttp/psr7": "~1.8.5",
+        "laminas/laminas-diactoros": "~2.11.0",
+        "laminas/laminas-escaper": "~2.9.0",
+        "laminas/laminas-feed": "~2.17.0",
+        "laminas/laminas-stdlib": "~3.7.1",
+        "masterminds/html5": "~2.7.5",
+        "pear/archive_tar": "~1.4.14",
+        "pear/console_getopt": "~v1.4.3",
+        "pear/pear-core-minimal": "~v1.10.11",
+        "pear/pear_exception": "~v1.0.2",
+        "psr/cache": "~1.0.1",
+        "psr/container": "~1.1.1",
+        "psr/http-factory": "~1.0.1",
+        "psr/http-message": "~1.0.1",
+        "psr/log": "~1.1.4",
+        "ralouphie/getallheaders": "~3.0.3",
+        "stack/builder": "~v1.0.6",
+        "symfony-cmf/routing": "~2.3.4",
+        "symfony/console": "~v4.4.42",
+        "symfony/debug": "~v4.4.41",
+        "symfony/dependency-injection": "~v4.4.42",
+        "symfony/deprecation-contracts": "~v2.5.1",
+        "symfony/error-handler": "~v4.4.41",
+        "symfony/event-dispatcher": "~v4.4.42",
+        "symfony/event-dispatcher-contracts": "~v1.1.12",
+        "symfony/http-client-contracts": "~v2.5.1",
+        "symfony/http-foundation": "~v4.4.42",
+        "symfony/http-kernel": "~v4.4.42",
+        "symfony/mime": "~v5.4.9",
+        "symfony/polyfill-ctype": "~v1.25.0",
+        "symfony/polyfill-iconv": "~v1.25.0",
+        "symfony/polyfill-intl-idn": "~v1.25.0",
+        "symfony/polyfill-intl-normalizer": "~v1.25.0",
+        "symfony/polyfill-mbstring": "~v1.25.0",
+        "symfony/polyfill-php80": "~v1.25.0",
+        "symfony/process": "~v4.4.41",
+        "symfony/psr-http-message-bridge": "~v2.1.2",
+        "symfony/routing": "~v4.4.41",
+        "symfony/serializer": "~v4.4.42",
+        "symfony/service-contracts": "~v2.5.1",
+        "symfony/translation": "~v4.4.41",
+        "symfony/translation-contracts": "~v2.5.1",
+        "symfony/validator": "~v4.4.41",
+        "symfony/var-dumper": "~v5.4.9",
+        "symfony/yaml": "~v4.4.37",
+        "twig/twig": "~v2.15.1",
+        "typo3/phar-stream-wrapper": "~v3.1.7"
     }
 }
diff --git a/core/tests/Drupal/Tests/Composer/Generator/BuilderTest.php b/core/tests/Drupal/Tests/Composer/Generator/BuilderTest.php
index 639f8218d789b07faabb42d9a41fa405da75268a..2f19ea8342b094d83ff0e4edcefb01ba5103586b 100644
--- a/core/tests/Drupal/Tests/Composer/Generator/BuilderTest.php
+++ b/core/tests/Drupal/Tests/Composer/Generator/BuilderTest.php
@@ -25,13 +25,13 @@ public function builderTestData() {
         [
           'name' => 'drupal/core-recommended',
           'type' => 'metapackage',
-          'description' => 'Locked core dependencies; require this project INSTEAD OF drupal/core.',
+          'description' => 'Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core.',
           'license' => 'GPL-2.0-or-later',
           'require' =>
           [
             'drupal/core' => Composer::drupalVersionBranch(),
-            'symfony/polyfill-ctype' => 'v1.12.0',
-            'symfony/yaml' => 'v3.4.32',
+            'symfony/polyfill-ctype' => '~v1.12.0',
+            'symfony/yaml' => '~v3.4.32',
           ],
           'conflict' =>
           [
diff --git a/core/tests/Drupal/Tests/ComposerIntegrationTest.php b/core/tests/Drupal/Tests/ComposerIntegrationTest.php
index c50f782f7eb6bb5a9576ea9c9cfceb1f2ee45544..55b87ad8a3ca0db36047d09fc879b3ff1efb5140 100644
--- a/core/tests/Drupal/Tests/ComposerIntegrationTest.php
+++ b/core/tests/Drupal/Tests/ComposerIntegrationTest.php
@@ -53,6 +53,9 @@ public function testComposerLockHash() {
    * @dataProvider providerTestComposerJson
    */
   public function testComposerTilde($path) {
+    if (preg_match('#composer/Metapackage/CoreRecommended/composer.json$#', $path)) {
+      $this->markTestSkipped("$path has tilde");
+    }
     $content = json_decode(file_get_contents($path), TRUE);
     $composer_keys = array_intersect(['require', 'require-dev'], array_keys($content));
     if (empty($composer_keys)) {
@@ -79,7 +82,7 @@ public function providerTestComposerJson() {
     $data = [];
     $composer_json_finder = $this->getComposerJsonFinder(realpath(__DIR__ . '/../../../../'));
     foreach ($composer_json_finder->getIterator() as $composer_json) {
-      $data[] = [$composer_json->getPathname()];
+      $data[$composer_json->getPathname()] = [$composer_json->getPathname()];
     }
     return $data;
   }