diff --git a/core/modules/filter/filter.module b/core/modules/filter/filter.module
index 061933dc96aa56025b39d1773d482fed7a2be632..2ba66da8085e35686628703e882f4220a5f57f50 100644
--- a/core/modules/filter/filter.module
+++ b/core/modules/filter/filter.module
@@ -734,6 +734,27 @@ function _filter_autop($text) {
       }
     }
     elseif (!$ignore) {
+      // Skip if the next chunk starts with Twig theme debug.
+      // @see twig_render_template()
+      if (isset($chunks[$i + 1]) && $chunks[$i + 1] === '<!-- THEME DEBUG -->') {
+        $chunk = rtrim($chunk, "\n");
+        $output .= $chunk;
+        continue;
+      }
+
+      // Skip if the preceding chunk was the end of a Twig theme debug.
+      // @see twig_render_template()
+      if (isset($chunks[$i - 1])) {
+        if (
+          str_starts_with($chunks[$i - 1], '<!-- BEGIN OUTPUT from ')
+          || str_starts_with($chunks[$i - 1], '<!-- 💡 BEGIN CUSTOM TEMPLATE OUTPUT from ')
+        ) {
+          $chunk = ltrim($chunk, "\n");
+          $output .= $chunk;
+          continue;
+        }
+      }
+
       // just to make things a little easier, pad the end
       $chunk = preg_replace('|\n*$|', '', $chunk) . "\n\n";
       $chunk = preg_replace('|<br />\s*<br />|', "\n\n", $chunk);
diff --git a/core/modules/filter/tests/src/Kernel/FilterKernelTest.php b/core/modules/filter/tests/src/Kernel/FilterKernelTest.php
index e17653404f0123f0a0099379c80dd14ac65b37e6..a16c65f37f03622e5672468cd8b50b4bf06d37e6 100644
--- a/core/modules/filter/tests/src/Kernel/FilterKernelTest.php
+++ b/core/modules/filter/tests/src/Kernel/FilterKernelTest.php
@@ -437,6 +437,20 @@ public function testLineBreakFilter() {
         '<!-- comment -->' => TRUE,
         "<!--\nThree.\n-->" => TRUE,
       ],
+      // Do not add paragraph tags around Twig theme debugging.
+      "<p>Text here\n<!-- THEME DEBUG -->\n<!-- THEME HOOK: 'html' -->\n<!-- FILE NAME SUGGESTIONS:\n* html--node.html.twig\nx html.html.twig\n-->\n<!-- BEGIN OUTPUT from 'core/themes/olivero/templates/layout/html.html.twig' -->\n<span>Test</span></p>" => [
+        "<p>Text here" => TRUE,
+        "<p>Text here</p>" => FALSE,
+        "<span>Test</span></p>" => TRUE,
+        "<p><span>Test</span></p>" => FALSE,
+      ],
+      // Do not add paragraph tags around custom template Twig theme debugging.
+      "<p>Text here\n<!-- THEME DEBUG -->\n<!-- THEME HOOK: 'html' -->\n<!-- FILE NAME SUGGESTIONS:\n* html--node.html.twig\nx html.html.twig\n-->\n<!-- 💡 BEGIN CUSTOM TEMPLATE OUTPUT from 'custom/themes/custom-theme/templates/layout/html.html.twig' -->\n<span>Test</span></p>" => [
+        "<p>Text here" => TRUE,
+        "<p>Text here</p>" => FALSE,
+        "<span>Test</span></p>" => TRUE,
+        "<p><span>Test</span></p>" => FALSE,
+      ],
       // Resulting HTML should produce matching paragraph tags.
       '<p><div>  </div></p>' => [
         "<p>\n<div>  </div>\n</p>" => TRUE,
@@ -481,6 +495,44 @@ public function testLineBreakFilter() {
     $this->assertEquals($result, '<p>' . $source . "</p>\n", 'Line break filter can process very long strings.');
   }
 
+  /**
+   * Tests that the line break filter does not apply to twig debug.
+   */
+  public function testLineBreakFilterTwigDebug(): void {
+
+    // Enable twig theme debug to ensure that any
+    // changes to theme debugging format force checking
+    // that the auto paragraph filter continues to be applied
+    // correctly.
+    $twig = \Drupal::service('twig');
+    $twig->enableDebug();
+
+    // Manually render a template in its simplest form.
+    $variables = [
+      'theme_hook_original' => 'container',
+      'directory' => '',
+      'children' => 'Test two',
+    ];
+    include_once $this->root . '/core/themes/engines/twig/twig.engine';
+    $render = twig_render_template('container.html.twig', $variables);
+    $render = trim($render);
+
+    // Render text before applying the auto paragraph filter.
+    $this->assertSame("<!-- THEME DEBUG -->
+<!-- THEME HOOK: 'container' -->
+<!-- 💡 BEGIN CUSTOM TEMPLATE OUTPUT from 'container.html.twig' -->
+<div>Test two</div>
+
+<!-- END CUSTOM TEMPLATE OUTPUT from 'container.html.twig' -->", $render);
+    $result = _filter_autop($render);
+
+    // After auto-p is applied, the theme debug should no longer have
+    // line breaks but the true line breaks should still.
+    $this->assertSame("<!-- THEME DEBUG --><!-- THEME HOOK: 'container' --><!-- 💡 BEGIN CUSTOM TEMPLATE OUTPUT from 'container.html.twig' --><div>Test two</div>
+
+<!-- END CUSTOM TEMPLATE OUTPUT from 'container.html.twig' -->", $result);
+  }
+
   /**
    * Tests filter settings, defaults, access restrictions and similar.
    *