diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 725bc3c373..e28c5eb3df 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -5,68 +5,86 @@ updates:
     directory: /
     schedule:
       interval: weekly
+      day: "friday"
+      time: "08:00"
+      timezone: "Etc/UTC"
     allow:
       - dependency-type: all
-    # The actions in triage-issues.yml are updated in the Homebrew/.github repo
-    ignore:
-      - dependency-name: actions/stale
     groups:
-      artifacts:
+      github-actions:
         patterns:
-          - actions/*-artifact
-    open-pull-requests-limit: 10
+          - "*"
 
   - package-ecosystem: bundler
-    directory: /Library/Homebrew
+    directories:
+      - /
+      - /Library/Homebrew
     schedule:
-      interval: daily
+      interval: weekly
+      day: "friday"
+      time: "08:00"
+      timezone: "Etc/UTC"
     allow:
       - dependency-type: all
     groups:
-      rspec:
+      bundler:
         patterns:
-          - "rspec*"
-      sorbet:
-        patterns:
-          - "sorbet*"
-    open-pull-requests-limit: 10
+          - "*"
 
   - package-ecosystem: npm
     directory: /
     schedule:
-      interval: daily
+      interval: weekly
+      day: "friday"
+      time: "08:00"
+      timezone: "Etc/UTC"
     allow:
       - dependency-type: all
-    open-pull-requests-limit: 10
+    groups:
+      npm:
+        patterns:
+          - "*"
 
   - package-ecosystem: docker
     directory: /
     schedule:
-      interval: daily
+      interval: weekly
+      day: "friday"
+      time: "08:00"
+      timezone: "Etc/UTC"
     allow:
       - dependency-type: all
-    open-pull-requests-limit: 10
+    groups:
+      docker:
+        patterns:
+          - "*"
 
   - package-ecosystem: devcontainers
     directory: /
     schedule:
-      interval: daily
+      interval: weekly
+      day: "friday"
+      time: "08:00"
+      timezone: "Etc/UTC"
     allow:
       - dependency-type: all
-    open-pull-requests-limit: 10
+    groups:
+      devcontainers:
+        patterns:
+          - "*"
 
   - package-ecosystem: pip
-    directory: /
+    directories:
+      - /
+      - /Library/Homebrew/formula-analytics/
     schedule:
-      interval: daily
+      interval: weekly
+      day: "friday"
+      time: "08:00"
+      timezone: "Etc/UTC"
     allow:
       - dependency-type: all
-    open-pull-requests-limit: 10
-
-  - package-ecosystem: pip
-    directory: /Library/Homebrew/formula-analytics/
-    schedule:
-      interval: daily
-    allow:
-      - dependency-type: all
-    open-pull-requests-limit: 10
+    groups:
+      pip:
+        patterns:
+          - "*"
diff --git a/.github/workflows/actionlint.yml b/.github/workflows/actionlint.yml
index d32c3c370a..d35fac7a95 100644
--- a/.github/workflows/actionlint.yml
+++ b/.github/workflows/actionlint.yml
@@ -77,7 +77,7 @@ jobs:
           path: results.sarif
 
       - name: Upload SARIF file
-        uses: github/codeql-action/upload-sarif@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3.28.17
+        uses: github/codeql-action/upload-sarif@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18
         with:
           sarif_file: results.sarif
           category: zizmor
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 44ec339e7c..939da5f9e7 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -28,7 +28,7 @@ jobs:
           persist-credentials: false
 
       - name: Initialize CodeQL
-        uses: github/codeql-action/init@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3.28.17
+        uses: github/codeql-action/init@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18
         with:
           languages: ruby
           config: |
@@ -36,4 +36,4 @@ jobs:
               - Library/Homebrew/vendor
 
       - name: Perform CodeQL Analysis
-        uses: github/codeql-action/analyze@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3.28.17
+        uses: github/codeql-action/analyze@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index 7837eb0675..81c9c7ad86 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -190,7 +190,7 @@ jobs:
           password: ${{ secrets.GITHUB_TOKEN }}
 
       - name: Build Docker image
-        uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0
+        uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
         with:
           context: .
           load: true
@@ -227,7 +227,7 @@ jobs:
       - name: Deploy the Docker image by digest
         id: digest
         if: fromJSON(steps.attributes.outputs.push)
-        uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0
+        uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
         with:
           context: .
           cache-from: type=registry,ref=ghcr.io/homebrew/ubuntu${{ matrix.version }}:cache
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index c737393429..5d88cf7e65 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -52,7 +52,7 @@ jobs:
         run: vale docs/
 
       - name: Install Ruby
-        uses: ruby/setup-ruby@eaecf785f6a34567a6d97f686bbb7bccc1ac1e5c # v1.237.0
+        uses: ruby/setup-ruby@13e7a03dc3ac6c3798f4570bfead2aed4d96abfb # v1.244.0
         with:
           bundler-cache: true
           working-directory: docs
diff --git a/.github/workflows/pkg-installer.yml b/.github/workflows/pkg-installer.yml
index 2b23ea501a..adb7f99c4c 100644
--- a/.github/workflows/pkg-installer.yml
+++ b/.github/workflows/pkg-installer.yml
@@ -230,17 +230,15 @@ jobs:
                                     --password "${PKG_APPLE_ID_APP_SPECIFIC_PASSWORD}"
                                     --wait
 
-      - name: Install gh
-        run: brew install gh
-
       - name: Upload installer to GitHub release
         if: github.event_name == 'release'
         env:
           GH_TOKEN: ${{ github.token }}
           INSTALLER_PATH: ${{ needs.build.outputs.installer_path }}
-        run: gh release upload --repo Homebrew/brew
-                                "${GITHUB_REF//refs\/tags\//}"
-                                "${INSTALLER_PATH}"
+        run: |
+          VERSION="${INSTALLER_PATH#Homebrew-}"
+          VERSION="${VERSION%.pkg}"
+          gh release upload --repo Homebrew/brew "${VERSION}" "${INSTALLER_PATH}"
 
   issue:
     needs: [build, test, upload]
diff --git a/.github/workflows/rubydoc.yml b/.github/workflows/rubydoc.yml
index 026433889f..2c0399ed56 100644
--- a/.github/workflows/rubydoc.yml
+++ b/.github/workflows/rubydoc.yml
@@ -42,7 +42,7 @@ jobs:
           persist-credentials: false
 
       - name: Install Ruby
-        uses: ruby/setup-ruby@eaecf785f6a34567a6d97f686bbb7bccc1ac1e5c # v1.237.0
+        uses: ruby/setup-ruby@13e7a03dc3ac6c3798f4570bfead2aed4d96abfb # v1.244.0
         with:
           bundler-cache: true
           working-directory: rubydoc
diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml
index 608d2e65e9..c4bfc33e0e 100644
--- a/.github/workflows/stale-issues.yml
+++ b/.github/workflows/stale-issues.yml
@@ -38,7 +38,7 @@ jobs:
       pull-requests: write
     steps:
       - name: Mark/Close Stale Issues and Pull Requests
-        uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0
+        uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
         with:
           repo-token: ${{ secrets.GITHUB_TOKEN }}
           days-before-stale: 21
@@ -68,7 +68,7 @@ jobs:
       pull-requests: write
     steps:
       - name: Mark/Close Stale `bump-formula-pr` and `bump-cask-pr` Pull Requests
-        uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0
+        uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
         with:
           repo-token: ${{ secrets.GITHUB_TOKEN }}
           days-before-stale: 2
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index c93da5febf..5742f294cb 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -335,14 +335,14 @@ jobs:
           filenames=$(find Library/Homebrew/test/junit -name 'rspec*.xml' -print | tr '\n' ',')
           echo "filenames=${filenames%,}" >> "$GITHUB_OUTPUT"
 
-      - uses: codecov/test-results-action@f2dba722c67b86c6caa034178c6e4d35335f6706 # v1.1.0
+      - uses: codecov/test-results-action@47f89e9acb64b76debcd5ea40642d25a4adced9f # v1.1.1
         with:
           working-directory: ${{ steps.set-up-homebrew.outputs.repository-path }}
           files: ${{ steps.junit_xml.outputs.filenames }}
           disable_search: true
           token: ${{ secrets.CODECOV_TOKEN }}
 
-      - uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # v5.4.2
+      - uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
         with:
           working-directory: ${{ steps.set-up-homebrew.outputs.repository-path }}
           files: Library/Homebrew/test/coverage/coverage.xml
diff --git a/.gitignore b/.gitignore
index bb824a889e..ca100463a9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -164,6 +164,7 @@
 !/completions
 !/docs
 !/manpages
+!/CODEOWNERS
 
 # Unignore our packaging files
 !/package
@@ -172,6 +173,7 @@
 # Ignore generated documentation site
 /docs/_site
 /docs/.jekyll-metadata
+/docs/tmp/.htmlproofer
 /docs/vendor
 /docs/Gemfile.lock
 
diff --git a/CODEOWNERS b/CODEOWNERS
new file mode 100644
index 0000000000..b76c645caf
--- /dev/null
+++ b/CODEOWNERS
@@ -0,0 +1,11 @@
+# Note that the naming of this file is incorrect for our case: these people do not "own" the provided files but are
+# people with write-access to this repository who wish to approve changes to these files.
+#
+# Their review is required to merge PRs that change these files.
+#
+# To be explicit: we will never accept changes to this file adding people from outside the Homebrew GitHub
+# organisation. If you are not a Homebrew maintainer: you do not personally "own" or "maintain" any files.
+#
+# Note: @Homebrew/plc does not have write-access to this repository, and therefore cannot be listed in this file.
+
+docs/Support-Tiers.md  @Homebrew/tsc @MikeMcQuaid
diff --git a/Library/.rubocop.yml b/Library/.rubocop.yml
index a5362c95d6..a206ed6e33 100644
--- a/Library/.rubocop.yml
+++ b/Library/.rubocop.yml
@@ -26,7 +26,7 @@ AllCops:
   Include:
     - "**/*.rbi"
   Exclude:
-    - "Homebrew/sorbet/rbi/{dsl,gems}/**/*.rbi"
+    - "Homebrew/sorbet/rbi/{annotations,dsl,gems}/**/*.rbi"
     - "Homebrew/sorbet/rbi/parser*.rbi"
     - "Homebrew/bin/*"
     - "Homebrew/vendor/**/*"
diff --git a/Library/Homebrew/.ruby-version b/Library/Homebrew/.ruby-version
index 6cb9d3dd0d..f9892605c7 100644
--- a/Library/Homebrew/.ruby-version
+++ b/Library/Homebrew/.ruby-version
@@ -1 +1 @@
-3.4.3
+3.4.4
diff --git a/Library/Homebrew/Gemfile.lock b/Library/Homebrew/Gemfile.lock
index c5f83d7585..8053d3bb79 100644
--- a/Library/Homebrew/Gemfile.lock
+++ b/Library/Homebrew/Gemfile.lock
@@ -11,13 +11,13 @@ GEM
     coderay (1.1.3)
     concurrent-ruby (1.3.5)
     csv (3.3.4)
-    diff-lcs (1.6.1)
+    diff-lcs (1.6.2)
     docile (1.4.1)
     elftools (1.3.1)
       bindata (~> 2)
     erubi (1.13.1)
     hana (1.3.7)
-    json (2.11.3)
+    json (2.12.0)
     json_schemer (2.4.0)
       bigdecimal
       hana (~> 1.3)
@@ -25,14 +25,14 @@ GEM
       simpleidn (~> 0.2)
     kramdown (2.5.1)
       rexml (>= 3.3.9)
-    language_server-protocol (3.17.0.4)
+    language_server-protocol (3.17.0.5)
     lint_roller (1.1.0)
     logger (1.7.0)
     method_source (1.1.0)
     minitest (5.25.5)
     netrc (0.11.0)
     parallel (1.27.0)
-    parallel_tests (5.1.0)
+    parallel_tests (5.2.0)
       parallel
     parser (3.3.8.0)
       ast (~> 2.4.1)
@@ -48,11 +48,11 @@ GEM
     pycall (1.5.2)
     racc (1.8.1)
     rainbow (3.1.1)
-    rbi (0.3.2)
+    rbi (0.3.3)
       prism (~> 1.0)
       rbs (>= 3.4.4)
       sorbet-runtime (>= 0.5.9204)
-    rbs (3.9.2)
+    rbs (3.9.4)
       logger
     redcarpet (3.6.1)
     regexp_parser (2.10.0)
@@ -78,7 +78,7 @@ GEM
     rspec-support (3.13.3)
     rspec_junit_formatter (0.6.0)
       rspec-core (>= 2, < 4, != 2.12.0)
-    rubocop (1.75.5)
+    rubocop (1.75.6)
       json (~> 2.3)
       language_server-protocol (~> 3.17.0.2)
       lint_roller (~> 1.1.0)
@@ -104,7 +104,7 @@ GEM
       rubocop (~> 1.72, >= 1.72.1)
     rubocop-sorbet (0.10.0)
       rubocop (>= 1)
-    ruby-lsp (0.23.17)
+    ruby-lsp (0.23.21)
       language_server-protocol (~> 3.17.0)
       prism (>= 1.2, < 2.0)
       rbs (>= 3, < 4)
@@ -122,19 +122,20 @@ GEM
     simplecov-html (0.13.1)
     simplecov_json_formatter (0.1.4)
     simpleidn (0.2.3)
-    sorbet (0.5.12067)
-      sorbet-static (= 0.5.12067)
-    sorbet-runtime (0.5.12067)
-    sorbet-static (0.5.12067-aarch64-linux)
-    sorbet-static (0.5.12067-universal-darwin)
-    sorbet-static (0.5.12067-x86_64-linux)
-    sorbet-static-and-runtime (0.5.12067)
-      sorbet (= 0.5.12067)
-      sorbet-runtime (= 0.5.12067)
-    spoom (1.6.1)
+    sorbet (0.5.12117)
+      sorbet-static (= 0.5.12117)
+    sorbet-runtime (0.5.12117)
+    sorbet-static (0.5.12117-aarch64-linux)
+    sorbet-static (0.5.12117-universal-darwin)
+    sorbet-static (0.5.12117-x86_64-linux)
+    sorbet-static-and-runtime (0.5.12117)
+      sorbet (= 0.5.12117)
+      sorbet-runtime (= 0.5.12117)
+    spoom (1.6.3)
       erubi (>= 1.10.0)
       prism (>= 0.28.0)
-      rbi (>= 0.2.3)
+      rbi (>= 0.3.3)
+      rexml (>= 3.2.6)
       sorbet-static-and-runtime (>= 0.5.10187)
       thor (>= 0.19.2)
     stackprof (0.2.27)
@@ -152,7 +153,7 @@ GEM
     unicode-display_width (3.1.4)
       unicode-emoji (~> 4.0, >= 4.0.4)
     unicode-emoji (4.0.4)
-    vernier (1.7.0)
+    vernier (1.7.1)
     warning (1.5.0)
     yard (0.9.37)
     yard-sorbet (0.9.0)
@@ -212,7 +213,7 @@ DEPENDENCIES
   yard-sorbet
 
 RUBY VERSION
-   ruby 3.4.3p32
+   ruby 3.4.4p34
 
 BUNDLED WITH
    2.6.7
diff --git a/Library/Homebrew/autobump_constants.rb b/Library/Homebrew/autobump_constants.rb
index 15f6ed8ea5..6dfab8de22 100644
--- a/Library/Homebrew/autobump_constants.rb
+++ b/Library/Homebrew/autobump_constants.rb
@@ -5,4 +5,7 @@
 NO_AUTOBUMP_REASONS_LIST = T.let({
   incompatible_version_format: "incompatible version format",
   bumped_by_upstream:          "bumped by upstream",
+  extract_plist:               "livecheck uses `:extract_plist` strategy",
+  latest_version:              "`version` is set to `:latest`",
+  requires_manual_review:      "a manual review of this package is required for inclusion in autobump",
 }.freeze, T::Hash[Symbol, String])
diff --git a/Library/Homebrew/bundle/adder.rb b/Library/Homebrew/bundle/adder.rb
index bcb698f98d..6c1599619f 100644
--- a/Library/Homebrew/bundle/adder.rb
+++ b/Library/Homebrew/bundle/adder.rb
@@ -11,6 +11,9 @@ module Homebrew
 
       sig { params(args: String, type: Symbol, global: T::Boolean, file: String).void }
       def add(*args, type:, global:, file:)
+        brewfile_path = Brewfile.path(global:, file:)
+        brewfile_path.write("") unless brewfile_path.exist?
+
         brewfile = Brewfile.read(global:, file:)
         content = brewfile.input
         # TODO: - support `:describe`
diff --git a/Library/Homebrew/bundle/cask_installer.rb b/Library/Homebrew/bundle/cask_installer.rb
index 781bbf57bf..4014666d73 100644
--- a/Library/Homebrew/bundle/cask_installer.rb
+++ b/Library/Homebrew/bundle/cask_installer.rb
@@ -41,7 +41,7 @@ module Homebrew
             case v
             when TrueClass
               "--#{k}"
-            when FalseClass
+            when FalseClass, NilClass
               nil
             else
               "--#{k}=#{v}"
diff --git a/Library/Homebrew/bundle/commands/cleanup.rb b/Library/Homebrew/bundle/commands/cleanup.rb
index a42f07d980..7a6da0c6c3 100644
--- a/Library/Homebrew/bundle/commands/cleanup.rb
+++ b/Library/Homebrew/bundle/commands/cleanup.rb
@@ -25,13 +25,14 @@ module Homebrew
           Homebrew::Bundle::BrewServices.reset!
         end
 
-        def self.run(global: false, file: nil, force: false, zap: false, dsl: nil)
+        def self.run(global: false, file: nil, force: false, zap: false, dsl: nil,
+                     brews: true, casks: true, taps: true, vscode: true)
           @dsl ||= dsl
 
-          casks = casks_to_uninstall(global:, file:)
-          formulae = formulae_to_uninstall(global:, file:)
-          taps = taps_to_untap(global:, file:)
-          vscode_extensions = vscode_extensions_to_uninstall(global:, file:)
+          casks = casks ? casks_to_uninstall(global:, file:) : []
+          formulae = brews ? formulae_to_uninstall(global:, file:) : []
+          taps = taps ? taps_to_untap(global:, file:) : []
+          vscode_extensions = vscode ? vscode_extensions_to_uninstall(global:, file:) : []
           if force
             if casks.any?
               args = zap ? ["--zap"] : []
diff --git a/Library/Homebrew/bundle/commands/exec.rb b/Library/Homebrew/bundle/commands/exec.rb
index 543d84114b..103706dd76 100644
--- a/Library/Homebrew/bundle/commands/exec.rb
+++ b/Library/Homebrew/bundle/commands/exec.rb
@@ -178,7 +178,9 @@ module Homebrew
             exit_code = 0
             run_services(@dsl.entries) do
               Kernel.system(*args)
-              exit_code = $CHILD_STATUS.exitstatus
+              if (system_exit_code = $CHILD_STATUS&.exitstatus)
+                exit_code = system_exit_code
+              end
             end
             exit!(exit_code)
           else
diff --git a/Library/Homebrew/bundle/dsl.rb b/Library/Homebrew/bundle/dsl.rb
index 5196c17499..3431cc01c3 100644
--- a/Library/Homebrew/bundle/dsl.rb
+++ b/Library/Homebrew/bundle/dsl.rb
@@ -42,7 +42,7 @@ module Homebrew
       def cask_args(args)
         raise "cask_args(#{args.inspect}) should be a Hash object" unless args.is_a? Hash
 
-        @cask_arguments = args
+        @cask_arguments.merge!(args)
       end
 
       def brew(name, options = {})
diff --git a/Library/Homebrew/cask/artifact/abstract_uninstall.rb b/Library/Homebrew/cask/artifact/abstract_uninstall.rb
index 4322777fc9..4773dc7982 100644
--- a/Library/Homebrew/cask/artifact/abstract_uninstall.rb
+++ b/Library/Homebrew/cask/artifact/abstract_uninstall.rb
@@ -464,9 +464,9 @@ module Cask
                                  args:         paths,
                                  print_stderr: Homebrew::EnvConfig.developer?
 
-        trashed, = stdout.partition("\n")
-        trashed = trashed.split(":") & paths
-        untrashable = paths - trashed
+        trashed, _, untrashable = stdout.partition("\n")
+        trashed = trashed.split(":")
+        untrashable = untrashable.split(":")
 
         trashed_with_permissions, untrashable = untrashable.partition do |path|
           Utils.gain_permissions(path, ["-R"], SystemCommand) do
diff --git a/Library/Homebrew/cask/artifact/shellcompletion.rb b/Library/Homebrew/cask/artifact/shellcompletion.rb
index d39d1f6913..54bac0ec7d 100644
--- a/Library/Homebrew/cask/artifact/shellcompletion.rb
+++ b/Library/Homebrew/cask/artifact/shellcompletion.rb
@@ -6,11 +6,6 @@ require "cask/artifact/symlinked"
 module Cask
   module Artifact
     class ShellCompletion < Symlinked
-      sig { params(cask: Cask, source: T.any(String, Pathname)).returns(ShellCompletion) }
-      def self.from_args(cask, source)
-        new(cask, source)
-      end
-
       sig { params(_: T.any(String, Pathname)).returns(Pathname) }
       def resolve_target(_)
         raise CaskInvalidError, "Shell completion without shell info"
diff --git a/Library/Homebrew/cask/audit.rb b/Library/Homebrew/cask/audit.rb
index 0dbd453b93..4f8bae5c14 100644
--- a/Library/Homebrew/cask/audit.rb
+++ b/Library/Homebrew/cask/audit.rb
@@ -606,7 +606,10 @@ module Cask
     def audit_rosetta
       return if (url = cask.url).nil?
       return unless online?
+      # Rosetta 2 is only for ARM-capable macOS versions, which are Big Sur (11.x) and later
       return if Homebrew::SimulateSystem.current_arch != :arm
+      return if MacOSVersion::SYMBOLS.fetch(Homebrew::SimulateSystem.current_os, "10") < "11"
+      return if cask.depends_on.macos&.maximum_version.to_s < "11"
 
       odebug "Auditing Rosetta 2 requirement"
 
@@ -640,7 +643,7 @@ module Cask
           # binary stanza can contain shell scripts, so we just continue if lipo fails.
           next unless result.success?
 
-          odebug result.merged_output
+          odebug "Architectures: #{result.merged_output}"
 
           unless /arm64|x86_64/.match?(result.merged_output)
             add_error "Artifacts architecture is no longer supported by macOS!",
@@ -652,7 +655,7 @@ module Cask
           mentions_rosetta = cask.caveats.include?("requires Rosetta 2")
 
           if supports_arm && mentions_rosetta
-            add_error "Artifacts does not require Rosetta 2 but the caveats say otherwise!",
+            add_error "Artifacts do not require Rosetta 2 but the caveats say otherwise!",
                       location: url.location
           elsif !supports_arm && !mentions_rosetta
             add_error "Artifacts require Rosetta 2 but this is not indicated by the caveats!",
diff --git a/Library/Homebrew/cask/dsl.rb b/Library/Homebrew/cask/dsl.rb
index 5363e58237..ca35eebe39 100644
--- a/Library/Homebrew/cask/dsl.rb
+++ b/Library/Homebrew/cask/dsl.rb
@@ -351,6 +351,8 @@ module Cask
           raise CaskInvalidError.new(cask, "invalid 'version' value: #{arg.inspect}")
         end
 
+        no_autobump! because: :latest_version if arg == :latest
+
         DSL::Version.new(arg)
       end
     end
@@ -536,6 +538,8 @@ module Cask
 
       @livecheck_defined = true
       @livecheck.instance_eval(&block)
+      no_autobump! because: :extract_plist if @livecheck.strategy == :extract_plist
+      @livecheck
     end
 
     # Whether the cask contains a `livecheck` block. This is a legacy alias
diff --git a/Library/Homebrew/cask/installer.rb b/Library/Homebrew/cask/installer.rb
index 79ffc3dcc7..de73305989 100644
--- a/Library/Homebrew/cask/installer.rb
+++ b/Library/Homebrew/cask/installer.rb
@@ -11,8 +11,6 @@ require "cask/migrator"
 require "cask/quarantine"
 require "cask/tab"
 
-require "cgi"
-
 module Cask
   # Installer for a {Cask}.
   class Installer
diff --git a/Library/Homebrew/cli/parser.rb b/Library/Homebrew/cli/parser.rb
index cebfba76a3..eda01f6274 100644
--- a/Library/Homebrew/cli/parser.rb
+++ b/Library/Homebrew/cli/parser.rb
@@ -169,7 +169,7 @@ module Homebrew
                               T::Boolean)
           odisabled(
             "`brew #{@command_name}'. This command needs to be refactored, as it is written in a style that",
-            "inherits from `Homebrew::AbstractCommand' ( see https://docs.brew.sh/External-Commands )",
+            "subclassing of `Homebrew::AbstractCommand' ( see https://docs.brew.sh/External-Commands )",
             disable_for_developers: false,
           )
         end
diff --git a/Library/Homebrew/cmd/bundle.rb b/Library/Homebrew/cmd/bundle.rb
index 84e6b3ab23..4dfb7a60f0 100755
--- a/Library/Homebrew/cmd/bundle.rb
+++ b/Library/Homebrew/cmd/bundle.rb
@@ -102,17 +102,17 @@ module Homebrew
         switch "--all",
                description: "`list` all dependencies."
         switch "--formula", "--brews",
-               description: "`list` or `dump` Homebrew formula dependencies."
+               description: "`list`, `dump` or `cleanup` Homebrew formula dependencies."
         switch "--cask", "--casks",
-               description: "`list` or `dump` Homebrew cask dependencies."
+               description: "`list`, `dump` or `cleanup` Homebrew cask dependencies."
         switch "--tap", "--taps",
-               description: "`list` or `dump` Homebrew tap dependencies."
+               description: "`list`, `dump` or `cleanup` Homebrew tap dependencies."
         switch "--mas",
                description: "`list` or `dump` Mac App Store dependencies."
         switch "--whalebrew",
                description: "`list` or `dump` Whalebrew dependencies."
         switch "--vscode",
-               description: "`list` or `dump` VSCode (and forks/variants) extensions."
+               description: "`list`, `dump` or `cleanup` VSCode (and forks/variants) extensions."
         switch "--no-vscode",
                env:         :bundle_dump_no_vscode,
                description: "`dump` without VSCode (and forks/variants) extensions. " \
@@ -226,7 +226,13 @@ module Homebrew
           exec_editor(Homebrew::Bundle::Brewfile.path(global:, file:))
         when "cleanup"
           require "bundle/commands/cleanup"
-          Homebrew::Bundle::Commands::Cleanup.run(global:, file:, force:, zap:)
+          Homebrew::Bundle::Commands::Cleanup.run(
+            global:, file:, force:, zap:,
+            brews:  args.brews? || no_type_args,
+            casks:  args.casks? || no_type_args,
+            taps:   args.taps? || no_type_args,
+            vscode: args.vscode? || no_type_args
+          )
         when "check"
           require "bundle/commands/check"
           Homebrew::Bundle::Commands::Check.run(global:, file:, no_upgrade:, verbose:)
diff --git a/Library/Homebrew/cmd/list.rb b/Library/Homebrew/cmd/list.rb
index 4bfdc6e912..d868a233d9 100644
--- a/Library/Homebrew/cmd/list.rb
+++ b/Library/Homebrew/cmd/list.rb
@@ -215,7 +215,7 @@ module Homebrew
       sig { void }
       def list_casks
         casks = if args.no_named?
-          cask_paths = Cask::Caskroom.path.children.map do |path|
+          cask_paths = Cask::Caskroom.path.children.reject(&:file?).map do |path|
             if path.symlink?
               real_path = path.realpath
               real_path.basename.to_s
diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb
index 7e053982e0..9895706138 100644
--- a/Library/Homebrew/cmd/upgrade.rb
+++ b/Library/Homebrew/cmd/upgrade.rb
@@ -261,7 +261,7 @@ module Homebrew
       def upgrade_outdated_casks(casks)
         return false if args.formula?
 
-        Install.ask_casks casks
+        Install.ask_casks casks if args.ask?
 
         Cask::Upgrade.upgrade_casks(
           *casks,
diff --git a/Library/Homebrew/dev-cmd/bump-cask-pr.rb b/Library/Homebrew/dev-cmd/bump-cask-pr.rb
index bcf3cb866a..72e20c132e 100644
--- a/Library/Homebrew/dev-cmd/bump-cask-pr.rb
+++ b/Library/Homebrew/dev-cmd/bump-cask-pr.rb
@@ -49,7 +49,6 @@ module Homebrew
                description: "Use the specified GitHub organization for forking."
 
         conflicts "--dry-run", "--write"
-        conflicts "--no-audit", "--online"
         conflicts "--version=", "--version-arm="
         conflicts "--version=", "--version-intel="
 
@@ -85,7 +84,9 @@ module Homebrew
           method or 'livecheck' block with 'skip'.)
         EOS
 
-        odie "You have too many PRs open: close or merge some first!" if GitHub.too_many_open_prs?(cask.tap)
+        if !args.write_only? && GitHub.too_many_open_prs?(cask.tap)
+          odie "You have too many PRs open: close or merge some first!"
+        end
 
         new_version = BumpVersionParser.new(
           general: args.version,
@@ -113,7 +114,7 @@ module Homebrew
           raise UsageError, "No `--version`, `--url` or `--sha256` argument specified!"
         end
 
-        check_pull_requests(cask, new_version:)
+        check_pull_requests(cask, new_version:) unless args.write_only?
 
         replacement_pairs ||= []
         branch_name = "bump-#{cask.token}"
@@ -136,7 +137,7 @@ module Homebrew
         end
 
         if new_version.present?
-          # For simplicity, our naming defers to the arm version if we multiple architectures are specified
+          # For simplicity, our naming defers to the arm version if multiple architectures are specified
           branch_version = new_version.arm || new_version.general
           if branch_version.is_a?(Cask::DSL::Version)
             commit_version = shortened_version(branch_version, cask:)
@@ -171,7 +172,7 @@ module Homebrew
           pr_title:    commit_message,
         }
 
-        GitHub.create_bump_pr(pr_info, args:)
+        GitHub.create_bump_pr(pr_info, args:) unless args.write_only?
       end
 
       private
diff --git a/Library/Homebrew/dev-cmd/bump-formula-pr.rb b/Library/Homebrew/dev-cmd/bump-formula-pr.rb
index e585f75d8c..8c417a4f63 100644
--- a/Library/Homebrew/dev-cmd/bump-formula-pr.rb
+++ b/Library/Homebrew/dev-cmd/bump-formula-pr.rb
@@ -121,7 +121,9 @@ module Homebrew
           method or 'livecheck' block with 'skip'.)
         EOS
 
-        odie "You have too many PRs open: close or merge some first!" if GitHub.too_many_open_prs?(tap)
+        if !args.write_only? && GitHub.too_many_open_prs?(tap)
+          odie "You have too many PRs open: close or merge some first!"
+        end
 
         formula_spec = formula.stable
         odie "#{formula}: no stable specification found!" if formula_spec.blank?
@@ -135,7 +137,7 @@ module Homebrew
         remote_branch = tap.git_repository.origin_branch_name
         previous_branch = "-"
 
-        check_pull_requests(formula, tap_remote_repo, state: "open")
+        check_pull_requests(formula, tap_remote_repo, state: "open") unless args.write_only?
 
         all_formulae = []
         if args.bump_synced.present?
@@ -159,6 +161,7 @@ module Homebrew
 
           new_url = args.url
           new_version = args.version
+
           check_new_version(commit_formula, tap_remote_repo, version: new_version) if new_version.present?
 
           opoo "This formula has patches that may be resolved upstream." if commit_formula.patchlist.present?
@@ -174,6 +177,7 @@ module Homebrew
           end
 
           old_hash = commit_formula_spec.checksum&.hexdigest
+
           new_hash = args.sha256
           new_tag = args.tag
           new_revision = args.revision
@@ -213,10 +217,9 @@ module Homebrew
           elsif new_url.blank? && new_version.blank?
             raise UsageError, "#{commit_formula}: no `--url` or `--version` argument specified!"
           else
-            next unless new_version.present?
+            new_url ||= PyPI.update_pypi_url(old_url, new_version) if new_version.present?
 
-            new_url ||= PyPI.update_pypi_url(old_url, new_version)
-            if new_url.blank?
+            if new_url.blank? && new_version.present?
               new_url = update_url(old_url, old_version, new_version)
               if new_mirrors.blank? && old_mirrors.present?
                 new_mirrors = old_mirrors.map do |old_mirror|
@@ -231,6 +234,9 @@ module Homebrew
                   #{new_url}
               EOS
             end
+            if new_url.blank?
+              odie "There was an issue generating the updated url, you may need to create the PR manually"
+            end
             check_new_version(commit_formula, tap_remote_repo, url: new_url) if new_version.blank?
             resource_path, forced_version = fetch_resource_and_forced_version(commit_formula, new_version, new_url)
             Utils::Tar.validate_file(resource_path)
@@ -395,10 +401,14 @@ module Homebrew
 
             if github_release_data.present?
               pre = "pre" if github_release_data["prerelease"].present?
+              # maximum length of PR body is 65,536 characters so let's truncate release notes to half of that.
+              body = Formatter.truncate(github_release_data["body"], max: 32_768)
+
               formula_pr_message += <<~XML
                 
                   #{pre}release notes
-                  #{github_release_data["body"]}
+                  #{body}
+                  View the full release notes at #{github_release_data["html_url"]}.
                  
               XML
             end
@@ -407,7 +417,7 @@ module Homebrew
           {
             sourcefile_path:    commit_formula.path,
             old_contents:,
-            commit_message:     "#{commit_formula.name} #{args.version}",
+            commit_message:     "#{commit_formula.name} #{new_formula_version}",
             additional_files:   alias_rename,
             formula_pr_message:,
             formula_name:       commit_formula.name,
@@ -426,7 +436,7 @@ module Homebrew
           # If `brew audit` fails, revert the changes made to any formula.
           commits.each do |revert|
             revert_formula = Formula[revert[:formula_name]]
-            revert_formula.path.atomic_write(revert[:old_contents]) unless args.dry_run?
+            revert_formula.path.atomic_write(revert[:old_contents]) if !args.dry_run? && !args.write_only?
             revert_alias_rename = revert[:additional_files]
             if revert_alias_rename && (source = revert_alias_rename.first) && (destination = revert_alias_rename.last)
               FileUtils.mv source, destination
@@ -437,6 +447,7 @@ module Homebrew
         end
 
         new_formula_version = T.must(commits.first)[:new_version]
+
         pr_title = if args.bump_synced.nil?
           "#{formula.name} #{new_formula_version}"
         else
@@ -462,7 +473,7 @@ module Homebrew
           tap_remote_repo:,
           pr_message:,
         }
-        GitHub.create_bump_pr(pr_info, args:)
+        GitHub.create_bump_pr(pr_info, args:) unless args.write_only?
       end
 
       private
diff --git a/Library/Homebrew/dev-cmd/create.rb b/Library/Homebrew/dev-cmd/create.rb
index f89b3287a1..e3c4f660f8 100644
--- a/Library/Homebrew/dev-cmd/create.rb
+++ b/Library/Homebrew/dev-cmd/create.rb
@@ -20,6 +20,8 @@ module Homebrew
         EOS
         switch "--autotools",
                description: "Create a basic template for an Autotools-style build."
+        switch "--cabal",
+               description: "Create a basic template for a Cabal build."
         switch "--cask",
                description: "Create a basic template for a cask."
         switch "--cmake",
@@ -59,7 +61,7 @@ module Homebrew
         switch "-f", "--force",
                description: "Ignore errors for disallowed formula names and names that shadow aliases."
 
-        conflicts "--autotools", "--cmake", "--crystal", "--go", "--meson", "--node",
+        conflicts "--autotools", "--cabal", "--cmake", "--crystal", "--go", "--meson", "--node",
                   "--perl", "--python", "--ruby", "--rust", "--zig", "--cask"
         conflicts "--cask", "--HEAD"
         conflicts "--cask", "--set-license"
@@ -163,6 +165,8 @@ module Homebrew
           :crystal
         elsif args.go?
           :go
+        elsif args.cabal?
+          :cabal
         elsif args.meson?
           :meson
         elsif args.node?
diff --git a/Library/Homebrew/dev-cmd/generate-cask-api.rb b/Library/Homebrew/dev-cmd/generate-cask-api.rb
index 6f75828061..40b3a1c7da 100644
--- a/Library/Homebrew/dev-cmd/generate-cask-api.rb
+++ b/Library/Homebrew/dev-cmd/generate-cask-api.rb
@@ -44,22 +44,25 @@ module Homebrew
 
           Cask::Cask.generating_hash!
 
-          tap.cask_files.each do |path|
-            cask = Cask::CaskLoader.load(path)
-            name = cask.token
-            json = JSON.pretty_generate(cask.to_hash_with_variations)
-            cask_source = path.read
-            html_template_name = html_template(name)
+          latest_macos = MacOSVersion.new((HOMEBREW_MACOS_NEWEST_UNSUPPORTED.to_i - 1).to_s).to_sym
+          Homebrew::SimulateSystem.with(os: latest_macos, arch: :arm) do
+            tap.cask_files.each do |path|
+              cask = Cask::CaskLoader.load(path)
+              name = cask.token
+              json = JSON.pretty_generate(cask.to_hash_with_variations)
+              cask_source = path.read
+              html_template_name = html_template(name)
 
-            unless args.dry_run?
-              File.write("_data/cask/#{name.tr("+", "_")}.json", "#{json}\n")
-              File.write("api/cask/#{name}.json", CASK_JSON_TEMPLATE)
-              File.write("api/cask-source/#{name}.rb", cask_source)
-              File.write("cask/#{name}.html", html_template_name)
+              unless args.dry_run?
+                File.write("_data/cask/#{name.tr("+", "_")}.json", "#{json}\n")
+                File.write("api/cask/#{name}.json", CASK_JSON_TEMPLATE)
+                File.write("api/cask-source/#{name}.rb", cask_source)
+                File.write("cask/#{name}.html", html_template_name)
+              end
+            rescue
+              onoe "Error while generating data for cask '#{path.stem}'."
+              raise
             end
-          rescue
-            onoe "Error while generating data for cask '#{path.stem}'."
-            raise
           end
 
           canonical_json = JSON.pretty_generate(tap.cask_renames)
diff --git a/Library/Homebrew/dev-cmd/generate-formula-api.rb b/Library/Homebrew/dev-cmd/generate-formula-api.rb
index c87dc2a798..ac8d5dd63b 100644
--- a/Library/Homebrew/dev-cmd/generate-formula-api.rb
+++ b/Library/Homebrew/dev-cmd/generate-formula-api.rb
@@ -44,20 +44,23 @@ module Homebrew
           Formulary.enable_factory_cache!
           Formula.generating_hash!
 
-          tap.formula_names.each do |name|
-            formula = Formulary.factory(name)
-            name = formula.name
-            json = JSON.pretty_generate(formula.to_hash_with_variations)
-            html_template_name = html_template(name)
+          latest_macos = MacOSVersion.new((HOMEBREW_MACOS_NEWEST_UNSUPPORTED.to_i - 1).to_s).to_sym
+          Homebrew::SimulateSystem.with(os: latest_macos, arch: :arm) do
+            tap.formula_names.each do |name|
+              formula = Formulary.factory(name)
+              name = formula.name
+              json = JSON.pretty_generate(formula.to_hash_with_variations)
+              html_template_name = html_template(name)
 
-            unless args.dry_run?
-              File.write("_data/formula/#{name.tr("+", "_")}.json", "#{json}\n")
-              File.write("api/formula/#{name}.json", FORMULA_JSON_TEMPLATE)
-              File.write("formula/#{name}.html", html_template_name)
+              unless args.dry_run?
+                File.write("_data/formula/#{name.tr("+", "_")}.json", "#{json}\n")
+                File.write("api/formula/#{name}.json", FORMULA_JSON_TEMPLATE)
+                File.write("formula/#{name}.html", html_template_name)
+              end
+            rescue
+              onoe "Error while generating data for formula '#{name}'."
+              raise
             end
-          rescue
-            onoe "Error while generating data for formula '#{name}'."
-            raise
           end
 
           canonical_json = JSON.pretty_generate(tap.formula_renames.merge(tap.alias_table))
diff --git a/Library/Homebrew/dev-cmd/prof.rb b/Library/Homebrew/dev-cmd/prof.rb
index ac16a53b14..b8f485568f 100644
--- a/Library/Homebrew/dev-cmd/prof.rb
+++ b/Library/Homebrew/dev-cmd/prof.rb
@@ -2,6 +2,7 @@
 # frozen_string_literal: true
 
 require "abstract_command"
+require "fileutils"
 
 module Homebrew
   module DevCmd
diff --git a/Library/Homebrew/dev-cmd/tap-new.rb b/Library/Homebrew/dev-cmd/tap-new.rb
index 5d04a15c6c..b1b7e5278f 100644
--- a/Library/Homebrew/dev-cmd/tap-new.rb
+++ b/Library/Homebrew/dev-cmd/tap-new.rb
@@ -126,7 +126,7 @@ module Homebrew
                     echo "::add-mask::${base64_token}"
                     echo "token=${base64_token}" >> "${GITHUB_OUTPUT}"
           <% end -%>
-                - run: brew test-bot --only-formulae<% if root_url %> --root-url='<%= root_url %>'<% end %>
+                - run: brew test-bot --only-formulae#{" --root-url=#{root_url}" if root_url}
                   if: github.event_name == 'pull_request'
           <% if args.github_packages? -%>
                   env:
diff --git a/Library/Homebrew/dev-cmd/typecheck.rb b/Library/Homebrew/dev-cmd/typecheck.rb
index 3f16dae317..9cf201b8bc 100644
--- a/Library/Homebrew/dev-cmd/typecheck.rb
+++ b/Library/Homebrew/dev-cmd/typecheck.rb
@@ -60,6 +60,7 @@ module Homebrew
         HOMEBREW_LIBRARY_PATH.cd do
           if update
             workers = args.debug? ? ["--workers=1"] : []
+            safe_system "bundle", "exec", "tapioca", "annotations"
             safe_system "bundle", "exec", "tapioca", "dsl", *workers
             # Prefer adding args here: Library/Homebrew/sorbet/tapioca/config.yml
             tapioca_args = args.update_all? ? ["--all"] : []
diff --git a/Library/Homebrew/dev-cmd/update-maintainers.rb b/Library/Homebrew/dev-cmd/update-maintainers.rb
index 0b5dd62980..e1ca6a550f 100644
--- a/Library/Homebrew/dev-cmd/update-maintainers.rb
+++ b/Library/Homebrew/dev-cmd/update-maintainers.rb
@@ -21,12 +21,22 @@ module Homebrew
 
       sig { override.void }
       def run
+        # Needed for Manpages.regenerate_man_pages below
+        Homebrew.install_bundler_gems!(groups: ["man"])
+
         # We assume that only public members wish to be included in the README
         public_members = GitHub.public_member_usernames("Homebrew")
         maintainers = GitHub.members_by_team("Homebrew", "maintainers")
 
+        # Not all PLC members are Homebrew GitHub organisation members any more
+        non_maintainer_plc_members = {
+          colindean:   "Colin Dean",
+          mozzadrella: "Vanessa Gennarelli",
+        }.transform_keys(&:to_s)
+        public_members += non_maintainer_plc_members.keys
+
         members = {
-          plc:         GitHub.members_by_team("Homebrew", "plc"),
+          plc:         GitHub.members_by_team("Homebrew", "plc").merge(non_maintainer_plc_members),
           tsc:         GitHub.members_by_team("Homebrew", "tsc"),
           maintainers:,
         }
diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb
index 82cb409a5b..d9a6e86290 100644
--- a/Library/Homebrew/download_strategy.rb
+++ b/Library/Homebrew/download_strategy.rb
@@ -5,7 +5,6 @@ require "json"
 require "time"
 require "unpack_strategy"
 require "lazy_object"
-require "cgi"
 require "lock_file"
 require "system_command"
 
@@ -384,9 +383,12 @@ class AbstractFileDownloadStrategy < AbstractDownloadStrategy
     if url.match?(URI::DEFAULT_PARSER.make_regexp)
       uri = URI(url)
 
-      if uri.query
-        query_params = CGI.parse(uri.query)
-        query_params["response-content-disposition"].each do |param|
+      if (uri_query = uri.query.presence)
+        URI.decode_www_form(uri_query).each do |key, param|
+          components[:query] << param if search_query
+
+          next if key != "response-content-disposition"
+
           query_basename = param[/attachment;\s*filename=(["']?)(.+)\1/i, 2]
           return File.basename(query_basename) if query_basename
         end
@@ -397,10 +399,6 @@ class AbstractFileDownloadStrategy < AbstractDownloadStrategy
           URI::DEFAULT_PARSER.unescape(part).presence
         end
       end
-
-      if search_query && (uri_query = uri.query.presence)
-        components[:query] = URI.decode_www_form(uri_query).map { _2 }
-      end
     else
       components[:path] = [url]
     end
@@ -705,7 +703,12 @@ class CurlGitHubPackagesDownloadStrategy < CurlDownloadStrategy
     meta[:headers] ||= []
     # GitHub Packages authorization header.
     # HOMEBREW_GITHUB_PACKAGES_AUTH set in brew.sh
-    meta[:headers] << "Authorization: #{HOMEBREW_GITHUB_PACKAGES_AUTH}"
+    # If using a private GHCR mirror with no Authentication set then do not add the header. In all other cases add it.
+    if !Homebrew::EnvConfig.artifact_domain.presence ||
+       Homebrew::EnvConfig.docker_registry_basic_auth_token.presence ||
+       Homebrew::EnvConfig.docker_registry_token.presence
+      meta[:headers] << "Authorization: #{HOMEBREW_GITHUB_PACKAGES_AUTH}"
+    end
     super
   end
 
diff --git a/Library/Homebrew/formula-analytics/requirements.txt b/Library/Homebrew/formula-analytics/requirements.txt
index 4932a9d0ce..ea19e51c7e 100644
--- a/Library/Homebrew/formula-analytics/requirements.txt
+++ b/Library/Homebrew/formula-analytics/requirements.txt
@@ -8,9 +8,9 @@ certifi==2025.4.26 \
     --hash=sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6 \
     --hash=sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3
     # via influxdb3-python
-influxdb3-python==0.12.0 \
-    --hash=sha256:991f756528280b376db162e26ad80096168917f294d62f449a70257e65014c03 \
-    --hash=sha256:d82ec4193257e49ba7fee1dee940c951c949a8557d0cf2f7b9f817f940ebcf34
+influxdb3-python==0.13.0 \
+    --hash=sha256:616ee767286a81b6f575ea3de097bc095db724262586231ca8d7567dd2377a30 \
+    --hash=sha256:c039638fcb44dd7c9433ab19e8f05bb782fa13989cb8c74d90e1291ebcc67b3b
     # via -r requirements.in
 pyarrow==20.0.0 \
     --hash=sha256:00138f79ee1b5aca81e2bdedb91e3739b987245e11fa3c826f9e57c5d102fb75 \
@@ -91,7 +91,7 @@ urllib3==2.4.0 \
     # via influxdb3-python
 
 # The following packages are considered to be unsafe in a requirements file:
-setuptools==80.3.1 \
-    --hash=sha256:31e2c58dbb67c99c289f51c16d899afedae292b978f8051efaf6262d8212f927 \
-    --hash=sha256:ea8e00d7992054c4c592aeb892f6ad51fe1b4d90cc6947cc45c45717c40ec537
+setuptools==80.8.0 \
+    --hash=sha256:49f7af965996f26d43c8ae34539c8d99c5042fbff34302ea151eaa9c207cd257 \
+    --hash=sha256:95a60484590d24103af13b686121328cc2736bee85de8936383111e421b9edc0
     # via influxdb3-python
diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb
index f1fc47661e..c07a6f6292 100644
--- a/Library/Homebrew/formula.rb
+++ b/Library/Homebrew/formula.rb
@@ -2126,7 +2126,7 @@ class Formula
       bash: bash_completion/base_name,
       zsh:  zsh_completion/"_#{base_name}",
       fish: fish_completion/"#{base_name}.fish",
-      pwsh: pwsh_completion/"#{base_name}.ps1",
+      pwsh: pwsh_completion/"_#{base_name}.ps1",
     }
 
     shells.each do |shell|
diff --git a/Library/Homebrew/formula_creator.rb b/Library/Homebrew/formula_creator.rb
index 6bd6b0fdde..0d7507938e 100644
--- a/Library/Homebrew/formula_creator.rb
+++ b/Library/Homebrew/formula_creator.rb
@@ -84,7 +84,10 @@ module Homebrew
           r.owner = self
           filepath = r.fetch
           html_doctype_prefix = "
 
-        <% if @mode == :cmake %>
+        <% if @mode == :cabal %>
+          depends_on "cabal-install" => :build
+          depends_on "ghc" => :build
+        <% elsif @mode == :cmake %>
           depends_on "cmake" => :build
         <% elsif @mode == :crystal %>
           depends_on "crystal" => :build
@@ -172,7 +178,10 @@ module Homebrew
 
         <% end %>
           def install
-        <% if @mode == :cmake %>
+        <% if @mode == :cabal %>
+            system "cabal", "v2-update"
+            system "cabal", "v2-install", *std_cabal_v2_args
+        <% elsif @mode == :cmake %>
             system "cmake", "-S", ".", "-B", "build", *std_cmake_args
             system "cmake", "--build", "build"
             system "cmake", "--install", "build"
@@ -216,11 +225,14 @@ module Homebrew
         <% elsif @mode == :python %>
             virtualenv_install_with_resources
         <% elsif @mode == :ruby %>
+            ENV["BUNDLE_VERSION"] = "system" # Avoid installing Bundler into the keg
             ENV["GEM_HOME"] = libexec
 
-            system "bundle", "install", "-without", "development", "test"
+            system "bundle", "config", "set", "without", "development", "test"
+            system "bundle", "install"
             system "gem", "build", "\#{name}.gemspec"
             system "gem", "install", "\#{name}-\#{version}.gem"
+
             bin.install libexec/"bin/\#{name}"
             bin.env_script_all_files(libexec/"bin", GEM_HOME: ENV["GEM_HOME"])
         <% elsif @mode == :rust %>
diff --git a/Library/Homebrew/livecheck/strategy/bitbucket.rb b/Library/Homebrew/livecheck/strategy/bitbucket.rb
index 6624e07490..23ad1f7ec5 100644
--- a/Library/Homebrew/livecheck/strategy/bitbucket.rb
+++ b/Library/Homebrew/livecheck/strategy/bitbucket.rb
@@ -68,14 +68,14 @@ module Homebrew
           # `/get/` archives are Git tag snapshots, so we need to check that tab
           # instead of the main `/downloads/` page
           if match[:dl_type] == "get"
-            values[:url] = "https://bitbucket.org/#{match[:path]}/downloads/?tab=tags"
+            values[:url] = "https://bitbucket.org/#{match[:path]}/downloads/?tab=tags&iframe=true&spa=0"
 
             # Example tag regexes:
             # * `/
]*?class="name"[^>]*?>\s*v?(\d+(?:\.\d+)+)\s*?]*?class="name"[^>]*?>\s*abc-v?(\d+(?:\.\d+)+)\s*?]*?class="name"[^>]*?>\s*#{regex_prefix}v?(\d+(?:\.\d+)+)\s*?=" || !version_specified?
+    return @version.max if @version.respond_to?(:to_ary)
+
+    @version
+  end
+
   def allows?(other)
     return true unless version_specified?
 
diff --git a/Library/Homebrew/rubocops/cask/constants/stanza.rb b/Library/Homebrew/rubocops/cask/constants/stanza.rb
index 7a1f5f803a..400aa7cc17 100644
--- a/Library/Homebrew/rubocops/cask/constants/stanza.rb
+++ b/Library/Homebrew/rubocops/cask/constants/stanza.rb
@@ -40,6 +40,9 @@ module RuboCop
             :installer,
             :binary,
             :manpage,
+            :bash_completion,
+            :fish_completion,
+            :zsh_completion,
             :colorpicker,
             :dictionary,
             :font,
diff --git a/Library/Homebrew/rubocops/patches.rb b/Library/Homebrew/rubocops/patches.rb
index 781117d9f1..4cc7a74066 100644
--- a/Library/Homebrew/rubocops/patches.rb
+++ b/Library/Homebrew/rubocops/patches.rb
@@ -59,6 +59,15 @@ module RuboCop
             problem "GitHub patches should end with .patch, not .diff: #{patch_url}"
           end
 
+          bitbucket_regex = %r{bitbucket\.org/([^/]+)/([^/]+)/commits/([a-f0-9]+)/raw}i
+          if regex_match_group(patch_url_node, bitbucket_regex)
+            owner, repo, commit = patch_url_node.source.match(bitbucket_regex).captures
+            correct_url = "https://api.bitbucket.org/2.0/repositories/#{owner}/#{repo}/diff/#{commit}"
+            problem "Bitbucket patches should use the api url: #{correct_url}" do |corrector|
+              corrector.replace(patch_url_node.source_range, %Q("#{correct_url}"))
+            end
+          end
+
           # Only .diff passes `--full-index` to `git diff` and there is no documented way
           # to get .patch to behave the same for GitLab.
           if regex_match_group(patch_url_node, %r{.*gitlab.*/commit/[a-fA-F0-9]*\.patch})
diff --git a/Library/Homebrew/rubocops/shared/url_helper.rb b/Library/Homebrew/rubocops/shared/url_helper.rb
index 1d5e6a32ff..0a49816f13 100644
--- a/Library/Homebrew/rubocops/shared/url_helper.rb
+++ b/Library/Homebrew/rubocops/shared/url_helper.rb
@@ -35,6 +35,12 @@ module RuboCop
       def audit_url(type, urls, mirrors, livecheck_url: false)
         @type = type
 
+        # URLs must be ASCII; IDNs must be punycode
+        ascii_pattern = /[^\p{ASCII}]+/
+        audit_urls(urls, ascii_pattern) do |_, url|
+          problem "Please use the ASCII (Punycode encoded host, URL-encoded path and query) version of #{url}."
+        end
+
         # GNU URLs; doesn't apply to mirrors
         gnu_pattern = %r{^(?:https?|ftp)://ftpmirror\.gnu\.org/(.*)}
         audit_urls(urls, gnu_pattern) do |match, url|
diff --git a/Library/Homebrew/sorbet/rbi/annotations/.gitattributes b/Library/Homebrew/sorbet/rbi/annotations/.gitattributes
new file mode 100644
index 0000000000..d2eacd2c61
--- /dev/null
+++ b/Library/Homebrew/sorbet/rbi/annotations/.gitattributes
@@ -0,0 +1 @@
+**/*.rbi linguist-vendored=true
diff --git a/Library/Homebrew/sorbet/rbi/annotations/minitest.rbi b/Library/Homebrew/sorbet/rbi/annotations/minitest.rbi
new file mode 100644
index 0000000000..64a89286ee
--- /dev/null
+++ b/Library/Homebrew/sorbet/rbi/annotations/minitest.rbi
@@ -0,0 +1,119 @@
+# typed: true
+
+# DO NOT EDIT MANUALLY
+# This file was pulled from a central RBI files repository.
+# Please run `bin/tapioca annotations` to update it.
+
+module Minitest::Assertions
+  sig { params(test: T.anything, msg: T.anything).returns(TrueClass) }
+  def assert(test, msg = nil); end
+
+  sig { params(obj: T.anything, msg: T.anything).returns(TrueClass) }
+  def assert_empty(obj, msg = nil); end
+
+  sig { params(exp: T.anything, act: T.anything, msg: T.anything).returns(TrueClass) }
+  def assert_equal(exp, act, msg = nil); end
+
+  sig { params(exp: T.anything, act: T.anything, delta: Numeric, msg: T.anything).returns(TrueClass) }
+  def assert_in_delta(exp, act, delta = T.unsafe(nil), msg = nil); end
+
+  sig { params(a: T.anything, b: T.anything, epsilon: Numeric, msg: T.anything).returns(TrueClass) }
+  def assert_in_epsilon(a, b, epsilon = T.unsafe(nil), msg = nil); end
+
+  sig { params(collection: T.anything, obj: T.anything, msg: T.anything).returns(TrueClass) }
+  def assert_includes(collection, obj, msg = nil); end
+
+  sig { params(cls: T.anything, obj: T.anything, msg: T.anything).returns(TrueClass) }
+  def assert_instance_of(cls, obj, msg = nil); end
+
+  sig { params(cls: T.anything, obj: T.anything, msg: T.anything).returns(TrueClass) }
+  def assert_kind_of(cls, obj, msg = nil); end
+
+  sig { params(matcher: T.any(String, Regexp), obj: T.anything, msg: T.anything).returns(MatchData) }
+  def assert_match(matcher, obj, msg = nil); end
+
+  sig { params(obj: T.anything, msg: T.anything).returns(TrueClass) }
+  def assert_nil(obj, msg = nil); end
+
+  sig { params(o1: T.anything, op: T.any(Symbol, String), o2: T.anything, msg: T.anything).returns(TrueClass) }
+  def assert_operator(o1, op, o2 = T.unsafe(nil), msg = nil); end
+
+  sig { params(stdout: T.nilable(T.any(String, Regexp)), stderr: T.nilable(T.any(String, Regexp)), block: T.proc.void).returns(T::Boolean) }
+  def assert_output(stdout = nil, stderr = nil, &block); end
+
+  sig { params(path: T.any(String, Pathname), msg: T.anything).returns(TrueClass) }
+  def assert_path_exists(path, msg = nil); end
+
+  sig { params(block: T.proc.void).returns(TrueClass) }
+  def assert_pattern(&block); end
+
+  sig { params(o1: T.anything, op: T.any(String, Symbol), msg: T.anything).returns(TrueClass) }
+  def assert_predicate(o1, op, msg = nil); end
+
+  sig { params(exp: NilClass, block: T.proc.void).returns(StandardError) }
+  sig { type_parameters(:T).params(exp: T.any(T::Class[T.type_parameter(:T)], Regexp, String), block: T.proc.void).returns(T.type_parameter(:T)) }
+  def assert_raises(*exp, &block); end
+
+  sig { params(obj: T.anything, meth: T.any(String, Symbol), msg: T.anything, include_all: T::Boolean).returns(TrueClass) }
+  def assert_respond_to(obj, meth, msg = nil, include_all: false); end
+
+  sig { params(exp: T.anything, act: T.anything, msg: T.anything).returns(TrueClass) }
+  def assert_same(exp, act, msg = nil); end
+
+  sig { params(send_ary: T::Array[T.anything], m: T.anything).returns(T::Boolean) }
+  def assert_send(send_ary, m = nil); end
+
+  sig { params(block: T.proc.void).returns(T::Boolean) }
+  def assert_silent(&block); end
+
+  sig { params(sym: Symbol, msg: T.anything, block: T.proc.void).returns(T.anything) }
+  def assert_throws(sym, msg = nil, &block); end
+
+  sig { params(test: T.anything, msg: T.anything).returns(TrueClass) }
+  def refute(test, msg = nil); end
+
+  sig { params(obj: T.anything, msg: T.anything).returns(TrueClass) }
+  def refute_empty(obj, msg = nil); end
+
+  sig { params(exp: T.anything, act: T.anything, msg: T.anything).returns(TrueClass) }
+  def refute_equal(exp, act, msg = nil); end
+
+  sig { params(exp: T.anything, act: T.anything, delta: Numeric, msg: T.anything).returns(TrueClass) }
+  def refute_in_delta(exp, act, delta = T.unsafe(nil), msg = nil); end
+
+  sig { params(a: T.anything, b: T.anything, epsilon: Numeric, msg: T.anything).returns(TrueClass) }
+  def refute_in_epsilon(a, b, epsilon = T.unsafe(nil), msg = nil); end
+
+  sig { params(collection: T.anything, obj: T.anything, msg: T.anything).returns(TrueClass) }
+  def refute_includes(collection, obj, msg = nil); end
+
+  sig { params(cls: T.anything, obj: T.anything, msg: T.anything).returns(TrueClass) }
+  def refute_instance_of(cls, obj, msg = nil); end
+
+  sig { params(cls: T.anything, obj: T.anything, msg: T.anything).returns(TrueClass) }
+  def refute_kind_of(cls, obj, msg = nil); end
+
+  sig { params(matcher: T.any(String, Regexp), obj: T.anything, msg: T.anything).returns(TrueClass) }
+  def refute_match(matcher, obj, msg = nil); end
+
+  sig { params(obj: T.anything, msg: T.anything).returns(TrueClass) }
+  def refute_nil(obj, msg = nil); end
+
+  sig { params(block: T.proc.void).returns(TrueClass) }
+  def refute_pattern(&block); end
+
+  sig { params(o1: T.anything, op: T.any(Symbol, String), o2: T.anything, msg: T.anything).returns(TrueClass) }
+  def refute_operator(o1, op, o2 = T.unsafe(nil), msg = nil); end
+
+  sig { params(path: T.any(String, Pathname), msg: T.anything).returns(TrueClass) }
+  def refute_path_exists(path, msg = nil); end
+
+  sig { params(o1: T.anything, op: T.any(String, Symbol), msg: T.anything).returns(TrueClass) }
+  def refute_predicate(o1, op, msg = nil); end
+
+  sig { params(obj: T.anything, meth: T.any(String, Symbol), msg: T.anything, include_all: T::Boolean).returns(TrueClass) }
+  def refute_respond_to(obj, meth, msg = nil, include_all: false); end
+
+  sig { params(exp: T.anything, act: T.anything, msg: T.anything).returns(TrueClass) }
+  def refute_same(exp, act, msg = nil); end
+end
diff --git a/Library/Homebrew/sorbet/rbi/annotations/rainbow.rbi b/Library/Homebrew/sorbet/rbi/annotations/rainbow.rbi
new file mode 100644
index 0000000000..0d2cb4e48a
--- /dev/null
+++ b/Library/Homebrew/sorbet/rbi/annotations/rainbow.rbi
@@ -0,0 +1,269 @@
+# typed: true
+
+# DO NOT EDIT MANUALLY
+# This file was pulled from a central RBI files repository.
+# Please run `bin/tapioca annotations` to update it.
+
+module Rainbow
+  # @shim: https://github.com/sickill/rainbow/blob/master/lib/rainbow.rb#L10-L12
+  sig { returns(T::Boolean) }
+  attr_accessor :enabled
+
+  class Color
+    sig { returns(Symbol) }
+    attr_reader :ground
+
+    sig { params(ground: Symbol, values: T.any([Integer], [Integer, Integer, Integer])).returns(Color) }
+    def self.build(ground, values); end
+
+    sig { params(hex: String).returns([Integer, Integer, Integer]) }
+    def self.parse_hex_color(hex); end
+
+    class Indexed < Rainbow::Color
+      sig { returns(Integer) }
+      attr_reader :num
+
+      sig { params(ground: Symbol, num: Integer).void }
+      def initialize(ground, num); end
+
+      sig { returns(T::Array[Integer]) }
+      def codes; end
+    end
+
+    class Named < Rainbow::Color::Indexed
+      NAMES = T.let(nil, T::Hash[Symbol, Integer])
+
+      sig { params(ground: Symbol, name: Symbol).void }
+      def initialize(ground, name); end
+
+      sig { returns(T::Array[Symbol]) }
+      def self.color_names; end
+
+      sig { returns(String) }
+      def self.valid_names; end
+    end
+
+    class RGB < Rainbow::Color::Indexed
+      sig { returns(Integer) }
+      attr_reader :r, :g, :b
+
+      sig { params(ground: Symbol, values: Integer).void }
+      def initialize(ground, *values); end
+
+      sig { returns(T::Array[Integer]) }
+      def codes; end
+
+      sig { params(value: Numeric).returns(Integer) }
+      def self.to_ansi_domain(value); end
+    end
+
+    class X11Named < Rainbow::Color::RGB
+      include Rainbow::X11ColorNames
+
+      sig { params(ground: Symbol, name: Symbol).void }
+      def initialize(ground, name); end
+
+      sig { returns(T::Array[Symbol]) }
+      def self.color_names; end
+
+      sig { returns(String) }
+      def self.valid_names; end
+    end
+  end
+
+  sig { returns(Wrapper) }
+  def self.global; end
+
+  sig { returns(T::Boolean) }
+  def self.enabled; end
+
+  sig { params(value: T::Boolean).returns(T::Boolean) }
+  def self.enabled=(value); end
+
+  sig { params(string: String).returns(String) }
+  def self.uncolor(string); end
+
+  class NullPresenter < String
+    sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
+    def color(*values); end
+
+    sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
+    def foreground(*values); end
+
+    sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
+    def fg(*values); end
+
+    sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
+    def background(*values); end
+
+    sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
+    def bg(*values); end
+
+    sig { returns(NullPresenter) }
+    def reset; end
+
+    sig { returns(NullPresenter) }
+    def bright; end
+
+    sig { returns(NullPresenter) }
+    def faint; end
+
+    sig { returns(NullPresenter) }
+    def italic; end
+
+    sig { returns(NullPresenter) }
+    def underline; end
+
+    sig { returns(NullPresenter) }
+    def blink; end
+
+    sig { returns(NullPresenter) }
+    def inverse; end
+
+    sig { returns(NullPresenter) }
+    def hide; end
+
+    sig { returns(NullPresenter) }
+    def cross_out; end
+
+    sig { returns(NullPresenter) }
+    def black; end
+
+    sig { returns(NullPresenter) }
+    def red; end
+
+    sig { returns(NullPresenter) }
+    def green; end
+
+    sig { returns(NullPresenter) }
+    def yellow; end
+
+    sig { returns(NullPresenter) }
+    def blue; end
+
+    sig { returns(NullPresenter) }
+    def magenta; end
+
+    sig { returns(NullPresenter) }
+    def cyan; end
+
+    sig { returns(NullPresenter) }
+    def white; end
+
+    sig { returns(NullPresenter) }
+    def bold; end
+
+    sig { returns(NullPresenter) }
+    def dark; end
+
+    sig { returns(NullPresenter) }
+    def strike; end
+  end
+
+  class Presenter < String
+    TERM_EFFECTS = T.let(nil, T::Hash[Symbol, Integer])
+
+    sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
+    def color(*values); end
+
+    sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
+    def foreground(*values); end
+
+    sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
+    def fg(*values); end
+
+    sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
+    def background(*values); end
+
+    sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
+    def bg(*values); end
+
+    sig { returns(Presenter) }
+    def reset; end
+
+    sig { returns(Presenter) }
+    def bright; end
+
+    sig { returns(Presenter) }
+    def faint; end
+
+    sig { returns(Presenter) }
+    def italic; end
+
+    sig { returns(Presenter) }
+    def underline; end
+
+    sig { returns(Presenter) }
+    def blink; end
+
+    sig { returns(Presenter) }
+    def inverse; end
+
+    sig { returns(Presenter) }
+    def hide; end
+
+    sig { returns(Presenter) }
+    def cross_out; end
+
+    sig { returns(Presenter) }
+    def black; end
+
+    sig { returns(Presenter) }
+    def red; end
+
+    sig { returns(Presenter) }
+    def green; end
+
+    sig { returns(Presenter) }
+    def yellow; end
+
+    sig { returns(Presenter) }
+    def blue; end
+
+    sig { returns(Presenter) }
+    def magenta; end
+
+    sig { returns(Presenter) }
+    def cyan; end
+
+    sig { returns(Presenter) }
+    def white; end
+
+    sig { returns(Presenter) }
+    def bold; end
+
+    sig { returns(Presenter) }
+    def dark; end
+
+    sig { returns(Presenter) }
+    def strike; end
+  end
+
+  class StringUtils
+    sig { params(string: String, codes: T::Array[Integer]).returns(String) }
+    def self.wrap_with_sgr(string, codes); end
+
+    sig { params(string: String).returns(String) }
+    def self.uncolor(string); end
+  end
+
+  VERSION = T.let(nil, String)
+
+  class Wrapper
+    sig { returns(T::Boolean) }
+    attr_accessor :enabled
+
+    sig { params(enabled: T::Boolean).void }
+    def initialize(enabled = true); end
+
+    sig { params(string: String).returns(T.any(Rainbow::Presenter, Rainbow::NullPresenter)) }
+    def wrap(string); end
+  end
+
+  module X11ColorNames
+    NAMES = T.let(nil, T::Hash[Symbol, [Integer, Integer, Integer]])
+  end
+end
+
+sig { params(string: String).returns(Rainbow::Presenter) }
+def Rainbow(string); end
diff --git a/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/create.rbi b/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/create.rbi
index 150ac9e871..2912c9a025 100644
--- a/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/create.rbi
+++ b/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/create.rbi
@@ -17,6 +17,9 @@ class Homebrew::DevCmd::Create::Args < Homebrew::CLI::Args
   sig { returns(T::Boolean) }
   def autotools?; end
 
+  sig { returns(T::Boolean) }
+  def cabal?; end
+
   sig { returns(T::Boolean) }
   def cask?; end
 
diff --git a/Library/Homebrew/sorbet/rbi/dsl/rubo_cop/cask/ast/stanza.rbi b/Library/Homebrew/sorbet/rbi/dsl/rubo_cop/cask/ast/stanza.rbi
index 80511ce997..a8c6e4f8af 100644
--- a/Library/Homebrew/sorbet/rbi/dsl/rubo_cop/cask/ast/stanza.rbi
+++ b/Library/Homebrew/sorbet/rbi/dsl/rubo_cop/cask/ast/stanza.rbi
@@ -27,6 +27,9 @@ class RuboCop::Cask::AST::Stanza
   sig { returns(T::Boolean) }
   def auto_updates?; end
 
+  sig { returns(T::Boolean) }
+  def bash_completion?; end
+
   sig { returns(T::Boolean) }
   def binary?; end
 
@@ -51,6 +54,9 @@ class RuboCop::Cask::AST::Stanza
   sig { returns(T::Boolean) }
   def dictionary?; end
 
+  sig { returns(T::Boolean) }
+  def fish_completion?; end
+
   sig { returns(T::Boolean) }
   def font?; end
 
@@ -191,4 +197,7 @@ class RuboCop::Cask::AST::Stanza
 
   sig { returns(T::Boolean) }
   def zap?; end
+
+  sig { returns(T::Boolean) }
+  def zsh_completion?; end
 end
diff --git a/Library/Homebrew/sorbet/rbi/gems/parallel_tests@5.1.0.rbi b/Library/Homebrew/sorbet/rbi/gems/parallel_tests@5.2.0.rbi
similarity index 83%
rename from Library/Homebrew/sorbet/rbi/gems/parallel_tests@5.1.0.rbi
rename to Library/Homebrew/sorbet/rbi/gems/parallel_tests@5.2.0.rbi
index 1212b5c716..045411b7f9 100644
--- a/Library/Homebrew/sorbet/rbi/gems/parallel_tests@5.1.0.rbi
+++ b/Library/Homebrew/sorbet/rbi/gems/parallel_tests@5.2.0.rbi
@@ -78,36 +78,36 @@ class ParallelTests::CLI
   # source://parallel_tests//lib/parallel_tests/cli.rb#189
   def any_test_failed?(test_results); end
 
-  # source://parallel_tests//lib/parallel_tests/cli.rb#374
+  # source://parallel_tests//lib/parallel_tests/cli.rb#375
   def append_test_options(options, argv); end
 
-  # source://parallel_tests//lib/parallel_tests/cli.rb#415
+  # source://parallel_tests//lib/parallel_tests/cli.rb#416
   def detailed_duration(seconds); end
 
-  # source://parallel_tests//lib/parallel_tests/cli.rb#389
+  # source://parallel_tests//lib/parallel_tests/cli.rb#390
   def execute_command_in_parallel(command, num_processes, options); end
 
   # source://parallel_tests//lib/parallel_tests/cli.rb#56
   def execute_in_parallel(items, num_processes, options); end
 
-  # source://parallel_tests//lib/parallel_tests/cli.rb#363
+  # source://parallel_tests//lib/parallel_tests/cli.rb#364
   def extract_file_paths(argv); end
 
-  # source://parallel_tests//lib/parallel_tests/cli.rb#369
+  # source://parallel_tests//lib/parallel_tests/cli.rb#370
   def extract_test_options(argv); end
 
-  # source://parallel_tests//lib/parallel_tests/cli.rb#422
+  # source://parallel_tests//lib/parallel_tests/cli.rb#423
   def final_fail_message; end
 
   # @return [Boolean]
   #
-  # source://parallel_tests//lib/parallel_tests/cli.rb#432
+  # source://parallel_tests//lib/parallel_tests/cli.rb#433
   def first_is_1?; end
 
   # source://parallel_tests//lib/parallel_tests/cli.rb#31
   def handle_interrupt; end
 
-  # source://parallel_tests//lib/parallel_tests/cli.rb#382
+  # source://parallel_tests//lib/parallel_tests/cli.rb#383
   def load_runner(type); end
 
   # source://parallel_tests//lib/parallel_tests/cli.rb#138
@@ -128,7 +128,7 @@ class ParallelTests::CLI
   # source://parallel_tests//lib/parallel_tests/cli.rb#148
   def report_results(test_results, options); end
 
-  # source://parallel_tests//lib/parallel_tests/cli.rb#410
+  # source://parallel_tests//lib/parallel_tests/cli.rb#411
   def report_time_taken(&block); end
 
   # source://parallel_tests//lib/parallel_tests/cli.rb#130
@@ -142,12 +142,12 @@ class ParallelTests::CLI
 
   # CI systems often fail when there is no output for a long time, so simulate some output
   #
-  # source://parallel_tests//lib/parallel_tests/cli.rb#438
+  # source://parallel_tests//lib/parallel_tests/cli.rb#439
   def simulate_output_for_ci(simulate); end
 
   # @return [Boolean]
   #
-  # source://parallel_tests//lib/parallel_tests/cli.rb#428
+  # source://parallel_tests//lib/parallel_tests/cli.rb#429
   def use_colors?; end
 end
 
@@ -168,31 +168,34 @@ class ParallelTests::Grouper
 
     private
 
-    # source://parallel_tests//lib/parallel_tests/grouper.rb#113
+    # source://parallel_tests//lib/parallel_tests/grouper.rb#120
     def add_to_group(group, item, size); end
 
-    # source://parallel_tests//lib/parallel_tests/grouper.rb#118
+    # source://parallel_tests//lib/parallel_tests/grouper.rb#125
     def group_by_features_with_steps(tests, options); end
 
-    # source://parallel_tests//lib/parallel_tests/grouper.rb#123
+    # source://parallel_tests//lib/parallel_tests/grouper.rb#130
     def group_by_scenarios(tests, options = T.unsafe(nil)); end
 
-    # source://parallel_tests//lib/parallel_tests/grouper.rb#128
+    # source://parallel_tests//lib/parallel_tests/grouper.rb#135
     def group_features_by_size(items, groups_to_fill); end
 
-    # source://parallel_tests//lib/parallel_tests/grouper.rb#95
+    # source://parallel_tests//lib/parallel_tests/grouper.rb#102
     def isolate_count(options); end
 
-    # source://parallel_tests//lib/parallel_tests/grouper.rb#136
+    # source://parallel_tests//lib/parallel_tests/grouper.rb#143
     def items_to_group(items); end
 
-    # source://parallel_tests//lib/parallel_tests/grouper.rb#105
+    # source://parallel_tests//lib/parallel_tests/grouper.rb#112
     def largest_first(files); end
 
-    # source://parallel_tests//lib/parallel_tests/grouper.rb#109
+    # source://parallel_tests//lib/parallel_tests/grouper.rb#116
     def smallest_group(groups); end
 
     # source://parallel_tests//lib/parallel_tests/grouper.rb#51
+    def specified_groups(options); end
+
+    # source://parallel_tests//lib/parallel_tests/grouper.rb#58
     def specify_groups(items, num_groups, options, groups); end
   end
 end
diff --git a/Library/Homebrew/sorbet/rbi/gems/rbi@0.3.2.rbi b/Library/Homebrew/sorbet/rbi/gems/rbi@0.3.3.rbi
similarity index 95%
rename from Library/Homebrew/sorbet/rbi/gems/rbi@0.3.2.rbi
rename to Library/Homebrew/sorbet/rbi/gems/rbi@0.3.3.rbi
index 2952f6c1dc..f60986ffae 100644
--- a/Library/Homebrew/sorbet/rbi/gems/rbi@0.3.2.rbi
+++ b/Library/Homebrew/sorbet/rbi/gems/rbi@0.3.3.rbi
@@ -650,7 +650,7 @@ class RBI::File
 
   # : (?out: (IO | StringIO), ?indent: Integer, ?print_locs: bool, ?max_line_length: Integer?) -> void
   #
-  # source://rbi//lib/rbi/printer.rb#813
+  # source://rbi//lib/rbi/printer.rb#817
   sig do
     params(
       out: T.any(::IO, ::StringIO),
@@ -663,13 +663,13 @@ class RBI::File
 
   # : (?out: (IO | StringIO), ?indent: Integer, ?print_locs: bool) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1112
+  # source://rbi//lib/rbi/rbs_printer.rb#1116
   sig { params(out: T.any(::IO, ::StringIO), indent: ::Integer, print_locs: T::Boolean).void }
   def rbs_print(out: T.unsafe(nil), indent: T.unsafe(nil), print_locs: T.unsafe(nil)); end
 
   # : (?indent: Integer, ?print_locs: bool) -> String
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1118
+  # source://rbi//lib/rbi/rbs_printer.rb#1122
   sig { params(indent: ::Integer, print_locs: T::Boolean).returns(::String) }
   def rbs_string(indent: T.unsafe(nil), print_locs: T.unsafe(nil)); end
 
@@ -699,7 +699,7 @@ class RBI::File
 
   # : (?indent: Integer, ?print_locs: bool, ?max_line_length: Integer?) -> String
   #
-  # source://rbi//lib/rbi/printer.rb#819
+  # source://rbi//lib/rbi/printer.rb#823
   sig { params(indent: ::Integer, print_locs: T::Boolean, max_line_length: T.nilable(::Integer)).returns(::String) }
   def string(indent: T.unsafe(nil), print_locs: T.unsafe(nil), max_line_length: T.unsafe(nil)); end
 end
@@ -796,7 +796,7 @@ class RBI::GroupNodesError < ::RBI::Error; end
 
 # Sorbet's misc.
 #
-# source://rbi//lib/rbi/model.rb#1067
+# source://rbi//lib/rbi/model.rb#1069
 class RBI::Helper < ::RBI::NodeWithComments
   include ::RBI::Indexable
 
@@ -804,7 +804,7 @@ class RBI::Helper < ::RBI::NodeWithComments
   #
   # @return [Helper] a new instance of Helper
   #
-  # source://rbi//lib/rbi/model.rb#1072
+  # source://rbi//lib/rbi/model.rb#1074
   sig do
     params(
       name: ::String,
@@ -831,13 +831,13 @@ class RBI::Helper < ::RBI::NodeWithComments
 
   # : String
   #
-  # source://rbi//lib/rbi/model.rb#1069
+  # source://rbi//lib/rbi/model.rb#1071
   sig { returns(::String) }
   def name; end
 
   # : -> String
   #
-  # source://rbi//lib/rbi/model.rb#1080
+  # source://rbi//lib/rbi/model.rb#1082
   sig { override.returns(::String) }
   def to_s; end
 end
@@ -1355,7 +1355,7 @@ class RBI::Method < ::RBI::NodeWithComments
   def visibility=(_arg0); end
 end
 
-# source://rbi//lib/rbi/model.rb#1111
+# source://rbi//lib/rbi/model.rb#1113
 class RBI::MixesInClassMethods < ::RBI::Mixin
   include ::RBI::Indexable
 
@@ -1363,7 +1363,7 @@ class RBI::MixesInClassMethods < ::RBI::Mixin
   #
   # @return [MixesInClassMethods] a new instance of MixesInClassMethods
   #
-  # source://rbi//lib/rbi/model.rb#1113
+  # source://rbi//lib/rbi/model.rb#1115
   sig do
     params(
       name: ::String,
@@ -1391,7 +1391,7 @@ class RBI::MixesInClassMethods < ::RBI::Mixin
 
   # : -> String
   #
-  # source://rbi//lib/rbi/model.rb#1120
+  # source://rbi//lib/rbi/model.rb#1122
   sig { override.returns(::String) }
   def to_s; end
 end
@@ -1554,7 +1554,7 @@ class RBI::Node
 
   # : (?out: (IO | StringIO), ?indent: Integer, ?print_locs: bool, ?max_line_length: Integer?) -> void
   #
-  # source://rbi//lib/rbi/printer.rb#828
+  # source://rbi//lib/rbi/printer.rb#832
   sig do
     params(
       out: T.any(::IO, ::StringIO),
@@ -1567,7 +1567,7 @@ class RBI::Node
 
   # : (?out: (IO | StringIO), ?indent: Integer, ?print_locs: bool, ?positional_names: bool) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1127
+  # source://rbi//lib/rbi/rbs_printer.rb#1131
   sig do
     params(
       out: T.any(::IO, ::StringIO),
@@ -1580,7 +1580,7 @@ class RBI::Node
 
   # : (?indent: Integer, ?print_locs: bool, ?positional_names: bool) -> String
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1133
+  # source://rbi//lib/rbi/rbs_printer.rb#1137
   sig { params(indent: ::Integer, print_locs: T::Boolean, positional_names: T::Boolean).returns(::String) }
   def rbs_string(indent: T.unsafe(nil), print_locs: T.unsafe(nil), positional_names: T.unsafe(nil)); end
 
@@ -1602,7 +1602,7 @@ class RBI::Node
 
   # : (?indent: Integer, ?print_locs: bool, ?max_line_length: Integer?) -> String
   #
-  # source://rbi//lib/rbi/printer.rb#834
+  # source://rbi//lib/rbi/printer.rb#838
   sig { params(indent: ::Integer, print_locs: T::Boolean, max_line_length: T.nilable(::Integer)).returns(::String) }
   def string(indent: T.unsafe(nil), print_locs: T.unsafe(nil), max_line_length: T.unsafe(nil)); end
 end
@@ -1776,145 +1776,145 @@ class RBI::Parser
   end
 end
 
-# source://rbi//lib/rbi/parser.rb#954
+# source://rbi//lib/rbi/parser.rb#970
 class RBI::Parser::HeredocLocationVisitor < ::Prism::Visitor
   # : (Prism::Source source, Integer begin_offset, Integer end_offset) -> void
   #
   # @return [HeredocLocationVisitor] a new instance of HeredocLocationVisitor
   #
-  # source://rbi//lib/rbi/parser.rb#956
+  # source://rbi//lib/rbi/parser.rb#972
   sig { params(source: ::Prism::Source, begin_offset: ::Integer, end_offset: ::Integer).void }
   def initialize(source, begin_offset, end_offset); end
 
   # : -> Prism::Location
   #
-  # source://rbi//lib/rbi/parser.rb#985
+  # source://rbi//lib/rbi/parser.rb#1003
   sig { returns(::Prism::Location) }
   def location; end
 
   # : (Prism::InterpolatedStringNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#975
-  sig { params(node: ::Prism::InterpolatedStringNode).void }
+  # source://rbi//lib/rbi/parser.rb#993
+  sig { override.params(node: ::Prism::InterpolatedStringNode).void }
   def visit_interpolated_string_node(node); end
 
   # : (Prism::StringNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#965
-  sig { params(node: ::Prism::StringNode).void }
+  # source://rbi//lib/rbi/parser.rb#982
+  sig { override.params(node: ::Prism::StringNode).void }
   def visit_string_node(node); end
 
   private
 
   # : (Prism::StringNode | Prism::InterpolatedStringNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#996
+  # source://rbi//lib/rbi/parser.rb#1014
   sig { params(node: T.any(::Prism::InterpolatedStringNode, ::Prism::StringNode)).void }
   def handle_string_node(node); end
 end
 
-# source://rbi//lib/rbi/parser.rb#871
+# source://rbi//lib/rbi/parser.rb#885
 class RBI::Parser::SigBuilder < ::RBI::Parser::Visitor
   # : (String content, file: String) -> void
   #
   # @return [SigBuilder] a new instance of SigBuilder
   #
-  # source://rbi//lib/rbi/parser.rb#876
+  # source://rbi//lib/rbi/parser.rb#890
   sig { params(content: ::String, file: ::String).void }
   def initialize(content, file:); end
 
   # : Sig
   #
-  # source://rbi//lib/rbi/parser.rb#873
+  # source://rbi//lib/rbi/parser.rb#887
   sig { returns(::RBI::Sig) }
   def current; end
 
   # : (Prism::AssocNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#946
+  # source://rbi//lib/rbi/parser.rb#962
   sig { override.params(node: ::Prism::AssocNode).void }
   def visit_assoc_node(node); end
 
   # : (Prism::CallNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#884
+  # source://rbi//lib/rbi/parser.rb#898
   sig { override.params(node: ::Prism::CallNode).void }
   def visit_call_node(node); end
 end
 
-# source://rbi//lib/rbi/parser.rb#154
+# source://rbi//lib/rbi/parser.rb#164
 class RBI::Parser::TreeBuilder < ::RBI::Parser::Visitor
   # : (String source, comments: Array[Prism::Comment], file: String) -> void
   #
   # @return [TreeBuilder] a new instance of TreeBuilder
   #
-  # source://rbi//lib/rbi/parser.rb#162
+  # source://rbi//lib/rbi/parser.rb#172
   sig { params(source: ::String, comments: T::Array[::Prism::Comment], file: ::String).void }
   def initialize(source, comments:, file:); end
 
   # : Prism::Node?
   #
-  # source://rbi//lib/rbi/parser.rb#159
+  # source://rbi//lib/rbi/parser.rb#169
   sig { returns(T.nilable(::Prism::Node)) }
   def last_node; end
 
   # : Tree
   #
-  # source://rbi//lib/rbi/parser.rb#156
+  # source://rbi//lib/rbi/parser.rb#166
   sig { returns(::RBI::Tree) }
   def tree; end
 
   # : (Prism::CallNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#351
+  # source://rbi//lib/rbi/parser.rb#361
   sig { params(node: ::Prism::CallNode).void }
   def visit_call_node(node); end
 
   # : (Prism::ClassNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#175
+  # source://rbi//lib/rbi/parser.rb#185
   sig { override.params(node: ::Prism::ClassNode).void }
   def visit_class_node(node); end
 
   # : ((Prism::ConstantWriteNode | Prism::ConstantPathWriteNode) node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#226
+  # source://rbi//lib/rbi/parser.rb#236
   sig { params(node: T.any(::Prism::ConstantPathWriteNode, ::Prism::ConstantWriteNode)).void }
   def visit_constant_assign(node); end
 
   # : (Prism::ConstantPathWriteNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#219
+  # source://rbi//lib/rbi/parser.rb#229
   sig { override.params(node: ::Prism::ConstantPathWriteNode).void }
   def visit_constant_path_write_node(node); end
 
   # : (Prism::ConstantWriteNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#211
+  # source://rbi//lib/rbi/parser.rb#221
   sig { override.params(node: ::Prism::ConstantWriteNode).void }
   def visit_constant_write_node(node); end
 
   # : (Prism::DefNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#281
+  # source://rbi//lib/rbi/parser.rb#291
   sig { override.params(node: ::Prism::DefNode).void }
   def visit_def_node(node); end
 
   # : (Prism::ModuleNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#303
+  # source://rbi//lib/rbi/parser.rb#313
   sig { override.params(node: ::Prism::ModuleNode).void }
   def visit_module_node(node); end
 
   # : (Prism::ProgramNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#322
+  # source://rbi//lib/rbi/parser.rb#332
   sig { override.params(node: ::Prism::ProgramNode).void }
   def visit_program_node(node); end
 
   # : (Prism::SingletonClassNode node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#334
+  # source://rbi//lib/rbi/parser.rb#344
   sig { override.params(node: ::Prism::SingletonClassNode).void }
   def visit_singleton_class_node(node); end
 
@@ -1923,7 +1923,7 @@ class RBI::Parser::TreeBuilder < ::RBI::Parser::Visitor
   # Collect all the remaining comments within a node
   # : (Prism::Node node) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#525
+  # source://rbi//lib/rbi/parser.rb#539
   # Collect all the remaining comments within a node
   sig { params(node: ::Prism::Node).void }
   def collect_dangling_comments(node); end
@@ -1931,62 +1931,62 @@ class RBI::Parser::TreeBuilder < ::RBI::Parser::Visitor
   # Collect all the remaining comments after visiting the tree
   # : -> void
   #
-  # source://rbi//lib/rbi/parser.rb#543
+  # source://rbi//lib/rbi/parser.rb#557
   # Collect all the remaining comments after visiting the tree
   sig { void }
   def collect_orphan_comments; end
 
   # : -> Tree
   #
-  # source://rbi//lib/rbi/parser.rb#566
+  # source://rbi//lib/rbi/parser.rb#580
   sig { returns(::RBI::Tree) }
   def current_scope; end
 
   # : -> Array[Sig]
   #
-  # source://rbi//lib/rbi/parser.rb#571
+  # source://rbi//lib/rbi/parser.rb#585
   sig { returns(T::Array[::RBI::Sig]) }
   def current_sigs; end
 
   # : (Array[Sig] sigs) -> Array[Comment]
   #
-  # source://rbi//lib/rbi/parser.rb#578
+  # source://rbi//lib/rbi/parser.rb#592
   sig { params(sigs: T::Array[::RBI::Sig]).returns(T::Array[::RBI::Comment]) }
   def detach_comments_from_sigs(sigs); end
 
   # : (Prism::Node node) -> Array[Comment]
   #
-  # source://rbi//lib/rbi/parser.rb#590
+  # source://rbi//lib/rbi/parser.rb#604
   sig { params(node: ::Prism::Node).returns(T::Array[::RBI::Comment]) }
   def node_comments(node); end
 
   # : (Prism::Comment node) -> Comment
   #
-  # source://rbi//lib/rbi/parser.rb#608
+  # source://rbi//lib/rbi/parser.rb#622
   sig { params(node: ::Prism::Comment).returns(::RBI::Comment) }
   def parse_comment(node); end
 
   # : (Prism::Node? node) -> Array[Param]
   #
-  # source://rbi//lib/rbi/parser.rb#647
+  # source://rbi//lib/rbi/parser.rb#661
   sig { params(node: T.nilable(::Prism::Node)).returns(T::Array[::RBI::Param]) }
   def parse_params(node); end
 
   # : (Prism::Node? node) -> Array[Arg]
   #
-  # source://rbi//lib/rbi/parser.rb#621
+  # source://rbi//lib/rbi/parser.rb#635
   sig { params(node: T.nilable(::Prism::Node)).returns(T::Array[::RBI::Arg]) }
   def parse_send_args(node); end
 
   # : (Prism::CallNode node) -> Sig
   #
-  # source://rbi//lib/rbi/parser.rb#721
+  # source://rbi//lib/rbi/parser.rb#735
   sig { params(node: ::Prism::CallNode).returns(::RBI::Sig) }
   def parse_sig(node); end
 
   # : ((Prism::ConstantWriteNode | Prism::ConstantPathWriteNode) node) -> Struct?
   #
-  # source://rbi//lib/rbi/parser.rb#730
+  # source://rbi//lib/rbi/parser.rb#744
   sig do
     params(
       node: T.any(::Prism::ConstantPathWriteNode, ::Prism::ConstantWriteNode)
@@ -1996,25 +1996,25 @@ class RBI::Parser::TreeBuilder < ::RBI::Parser::Visitor
 
   # : (Prism::CallNode send) -> void
   #
-  # source://rbi//lib/rbi/parser.rb#778
+  # source://rbi//lib/rbi/parser.rb#792
   sig { params(send: ::Prism::CallNode).void }
   def parse_tstruct_field(send); end
 
   # : (String name, Prism::Node node) -> Visibility
   #
-  # source://rbi//lib/rbi/parser.rb#815
+  # source://rbi//lib/rbi/parser.rb#829
   sig { params(name: ::String, node: ::Prism::Node).returns(::RBI::Visibility) }
   def parse_visibility(name, node); end
 
   # : -> void
   #
-  # source://rbi//lib/rbi/parser.rb#829
+  # source://rbi//lib/rbi/parser.rb#843
   sig { void }
   def separate_header_comments; end
 
   # : -> void
   #
-  # source://rbi//lib/rbi/parser.rb#839
+  # source://rbi//lib/rbi/parser.rb#853
   sig { void }
   def set_root_tree_loc; end
 
@@ -2022,7 +2022,7 @@ class RBI::Parser::TreeBuilder < ::RBI::Parser::Visitor
   #
   # @return [Boolean]
   #
-  # source://rbi//lib/rbi/parser.rb#858
+  # source://rbi//lib/rbi/parser.rb#872
   sig { params(node: T.nilable(::Prism::Node)).returns(T::Boolean) }
   def t_enum_value?(node); end
 
@@ -2030,7 +2030,7 @@ class RBI::Parser::TreeBuilder < ::RBI::Parser::Visitor
   #
   # @return [Boolean]
   #
-  # source://rbi//lib/rbi/parser.rb#853
+  # source://rbi//lib/rbi/parser.rb#867
   sig { params(node: T.nilable(::Prism::Node)).returns(T::Boolean) }
   def type_variable_definition?(node); end
 end
@@ -2070,6 +2070,22 @@ class RBI::Parser::Visitor < ::Prism::Visitor
   # source://rbi//lib/rbi/parser.rb#138
   sig { params(node: ::Prism::Node).returns(::String) }
   def node_string!(node); end
+
+  # : (Prism::Node? node) -> bool
+  #
+  # @return [Boolean]
+  #
+  # source://rbi//lib/rbi/parser.rb#154
+  sig { params(node: T.nilable(::Prism::Node)).returns(T::Boolean) }
+  def self?(node); end
+
+  # : (Prism::Node? node) -> bool
+  #
+  # @return [Boolean]
+  #
+  # source://rbi//lib/rbi/parser.rb#159
+  sig { params(node: T.nilable(::Prism::Node)).returns(T::Boolean) }
+  def t_sig_without_runtime?(node); end
 end
 
 # source://rbi//lib/rbi/printer.rb#7
@@ -2218,7 +2234,7 @@ class RBI::Printer < ::RBI::Visitor
 
   # : (Sig node) -> void
   #
-  # source://rbi//lib/rbi/printer.rb#734
+  # source://rbi//lib/rbi/printer.rb#736
   sig { params(node: ::RBI::Sig).void }
   def print_sig_as_block(node); end
 
@@ -2236,7 +2252,7 @@ class RBI::Printer < ::RBI::Visitor
 
   # : (Sig node) -> Array[String]
   #
-  # source://rbi//lib/rbi/printer.rb#792
+  # source://rbi//lib/rbi/printer.rb#796
   sig { params(node: ::RBI::Sig).returns(T::Array[::String]) }
   def sig_modifiers(node); end
 
@@ -2806,7 +2822,7 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : (RBI::Method node, Sig sig) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#384
+  # source://rbi//lib/rbi/rbs_printer.rb#388
   sig { params(node: ::RBI::Method, sig: ::RBI::Sig).void }
   def print_method_sig(node, sig); end
 
@@ -2842,7 +2858,7 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : (Arg node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#581
+  # source://rbi//lib/rbi/rbs_printer.rb#585
   sig { override.params(node: ::RBI::Arg).void }
   def visit_arg(node); end
 
@@ -2878,7 +2894,7 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : (BlockParam node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#513
+  # source://rbi//lib/rbi/rbs_printer.rb#517
   sig { override.params(node: ::RBI::BlockParam).void }
   def visit_block_param(node); end
 
@@ -2896,7 +2912,7 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : (ConflictTree node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#717
+  # source://rbi//lib/rbi/rbs_printer.rb#721
   sig { override.params(node: ::RBI::ConflictTree).void }
   def visit_conflict_tree(node); end
 
@@ -2908,7 +2924,7 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : (Extend node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#525
+  # source://rbi//lib/rbi/rbs_printer.rb#529
   sig { override.params(node: ::RBI::Extend).void }
   def visit_extend(node); end
 
@@ -2920,43 +2936,43 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : (Group node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#690
+  # source://rbi//lib/rbi/rbs_printer.rb#694
   sig { override.params(node: ::RBI::Group).void }
   def visit_group(node); end
 
   # : (Helper node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#678
+  # source://rbi//lib/rbi/rbs_printer.rb#682
   sig { override.params(node: ::RBI::Helper).void }
   def visit_helper(node); end
 
   # : (Include node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#519
+  # source://rbi//lib/rbi/rbs_printer.rb#523
   sig { override.params(node: ::RBI::Include).void }
   def visit_include(node); end
 
   # : (KwArg node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#587
+  # source://rbi//lib/rbi/rbs_printer.rb#591
   sig { override.params(node: ::RBI::KwArg).void }
   def visit_kw_arg(node); end
 
   # : (KwOptParam node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#501
+  # source://rbi//lib/rbi/rbs_printer.rb#505
   sig { override.params(node: ::RBI::KwOptParam).void }
   def visit_kw_opt_param(node); end
 
   # : (KwParam node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#495
+  # source://rbi//lib/rbi/rbs_printer.rb#499
   sig { override.params(node: ::RBI::KwParam).void }
   def visit_kw_param(node); end
 
   # : (KwRestParam node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#507
+  # source://rbi//lib/rbi/rbs_printer.rb#511
   sig { override.params(node: ::RBI::KwRestParam).void }
   def visit_kw_rest_param(node); end
 
@@ -2968,13 +2984,13 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : (MixesInClassMethods node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#684
+  # source://rbi//lib/rbi/rbs_printer.rb#688
   sig { override.params(node: ::RBI::MixesInClassMethods).void }
   def visit_mixes_in_class_methods(node); end
 
   # : (Mixin node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#530
+  # source://rbi//lib/rbi/rbs_printer.rb#534
   sig { params(node: ::RBI::Mixin).void }
   def visit_mixin(node); end
 
@@ -2986,43 +3002,43 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : (OptParam node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#475
+  # source://rbi//lib/rbi/rbs_printer.rb#479
   sig { override.params(node: ::RBI::OptParam).void }
   def visit_opt_param(node); end
 
   # : (Private node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#560
+  # source://rbi//lib/rbi/rbs_printer.rb#564
   sig { override.params(node: ::RBI::Private).void }
   def visit_private(node); end
 
   # : (Protected node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#554
+  # source://rbi//lib/rbi/rbs_printer.rb#558
   sig { override.params(node: ::RBI::Protected).void }
   def visit_protected(node); end
 
   # : (Public node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#548
+  # source://rbi//lib/rbi/rbs_printer.rb#552
   sig { override.params(node: ::RBI::Public).void }
   def visit_public(node); end
 
   # : (ReqParam node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#465
+  # source://rbi//lib/rbi/rbs_printer.rb#469
   sig { override.params(node: ::RBI::ReqParam).void }
   def visit_req_param(node); end
 
   # : (RequiresAncestor node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#711
+  # source://rbi//lib/rbi/rbs_printer.rb#715
   sig { override.params(node: ::RBI::RequiresAncestor).void }
   def visit_requires_ancestor(node); end
 
   # : (RestParam node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#485
+  # source://rbi//lib/rbi/rbs_printer.rb#489
   sig { override.params(node: ::RBI::RestParam).void }
   def visit_rest_param(node); end
 
@@ -3040,7 +3056,7 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : (ScopeConflict node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#727
+  # source://rbi//lib/rbi/rbs_printer.rb#731
   sig { override.params(node: ::RBI::ScopeConflict).void }
   def visit_scope_conflict(node); end
 
@@ -3052,19 +3068,19 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : (Send node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#575
+  # source://rbi//lib/rbi/rbs_printer.rb#579
   sig { override.params(node: ::RBI::Send).void }
   def visit_send(node); end
 
   # : (Sig node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#446
+  # source://rbi//lib/rbi/rbs_printer.rb#450
   sig { params(node: ::RBI::Sig).void }
   def visit_sig(node); end
 
   # : (SigParam node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#459
+  # source://rbi//lib/rbi/rbs_printer.rb#463
   sig { params(node: ::RBI::SigParam).void }
   def visit_sig_param(node); end
 
@@ -3082,19 +3098,19 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : (TEnum node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#644
+  # source://rbi//lib/rbi/rbs_printer.rb#648
   sig { override.params(node: ::RBI::TEnum).void }
   def visit_tenum(node); end
 
   # : (TEnumBlock node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#650
+  # source://rbi//lib/rbi/rbs_printer.rb#654
   sig { override.params(node: ::RBI::TEnumBlock).void }
   def visit_tenum_block(node); end
 
   # : (TEnumValue node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#656
+  # source://rbi//lib/rbi/rbs_printer.rb#660
   sig { override.params(node: ::RBI::TEnumValue).void }
   def visit_tenum_value(node); end
 
@@ -3106,37 +3122,37 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : (TStruct node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#593
+  # source://rbi//lib/rbi/rbs_printer.rb#597
   sig { override.params(node: ::RBI::TStruct).void }
   def visit_tstruct(node); end
 
   # : (TStructConst node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#628
+  # source://rbi//lib/rbi/rbs_printer.rb#632
   sig { override.params(node: ::RBI::TStructConst).void }
   def visit_tstruct_const(node); end
 
   # : (TStructProp node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#636
+  # source://rbi//lib/rbi/rbs_printer.rb#640
   sig { override.params(node: ::RBI::TStructProp).void }
   def visit_tstruct_prop(node); end
 
   # : (TypeMember node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#672
+  # source://rbi//lib/rbi/rbs_printer.rb#676
   sig { override.params(node: ::RBI::TypeMember).void }
   def visit_type_member(node); end
 
   # : (Visibility node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#565
+  # source://rbi//lib/rbi/rbs_printer.rb#569
   sig { params(node: ::RBI::Visibility).void }
   def visit_visibility(node); end
 
   # : (VisibilityGroup node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#697
+  # source://rbi//lib/rbi/rbs_printer.rb#701
   sig { override.params(node: ::RBI::VisibilityGroup).void }
   def visit_visibility_group(node); end
 
@@ -3146,7 +3162,7 @@ class RBI::RBSPrinter < ::RBI::Visitor
   #
   # @return [Boolean]
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#830
+  # source://rbi//lib/rbi/rbs_printer.rb#834
   sig { params(node: ::RBI::Node).returns(T::Boolean) }
   def oneline?(node); end
 
@@ -3155,7 +3171,7 @@ class RBI::RBSPrinter < ::RBI::Visitor
   # Returns `nil` is the string is not a `T.let`.
   # : (String? code) -> String?
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#864
+  # source://rbi//lib/rbi/rbs_printer.rb#868
   # Parse a string containing a `T.let(x, X)` and extract the type
   # Returns `nil` is the string is not a `T.let`.
   sig { params(code: T.nilable(::String)).returns(T.nilable(::String)) }
@@ -3163,37 +3179,37 @@ class RBI::RBSPrinter < ::RBI::Visitor
 
   # : ((Type | String) type) -> Type
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#852
+  # source://rbi//lib/rbi/rbs_printer.rb#856
   sig { params(type: T.any(::RBI::Type, ::String)).returns(::RBI::Type) }
   def parse_type(type); end
 
   # : (Node node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#743
+  # source://rbi//lib/rbi/rbs_printer.rb#747
   sig { params(node: ::RBI::Node).void }
   def print_blank_line_before(node); end
 
   # : (Node node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#762
+  # source://rbi//lib/rbi/rbs_printer.rb#766
   sig { params(node: ::RBI::Node).void }
   def print_loc(node); end
 
   # : (Param node, last: bool) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#804
+  # source://rbi//lib/rbi/rbs_printer.rb#808
   sig { params(node: ::RBI::Param, last: T::Boolean).void }
   def print_param_comment_leading_space(node, last:); end
 
   # : (Method node, SigParam param) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#768
+  # source://rbi//lib/rbi/rbs_printer.rb#772
   sig { params(node: ::RBI::Method, param: ::RBI::SigParam).void }
   def print_sig_param(node, param); end
 
   # : (SigParam node, last: bool) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#822
+  # source://rbi//lib/rbi/rbs_printer.rb#826
   sig { params(node: ::RBI::SigParam, last: T::Boolean).void }
   def print_sig_param_comment_leading_space(node, last:); end
 end
@@ -3228,7 +3244,7 @@ class RBI::ReqParam < ::RBI::Param
   def ==(other); end
 end
 
-# source://rbi//lib/rbi/model.rb#1125
+# source://rbi//lib/rbi/model.rb#1127
 class RBI::RequiresAncestor < ::RBI::NodeWithComments
   include ::RBI::Indexable
 
@@ -3236,7 +3252,7 @@ class RBI::RequiresAncestor < ::RBI::NodeWithComments
   #
   # @return [RequiresAncestor] a new instance of RequiresAncestor
   #
-  # source://rbi//lib/rbi/model.rb#1130
+  # source://rbi//lib/rbi/model.rb#1132
   sig { params(name: ::String, loc: T.nilable(::RBI::Loc), comments: T::Array[::RBI::Comment]).void }
   def initialize(name, loc: T.unsafe(nil), comments: T.unsafe(nil)); end
 
@@ -3248,13 +3264,13 @@ class RBI::RequiresAncestor < ::RBI::NodeWithComments
 
   # : String
   #
-  # source://rbi//lib/rbi/model.rb#1127
+  # source://rbi//lib/rbi/model.rb#1129
   sig { returns(::String) }
   def name; end
 
   # : -> String
   #
-  # source://rbi//lib/rbi/model.rb#1137
+  # source://rbi//lib/rbi/model.rb#1139
   sig { override.returns(::String) }
   def to_s; end
 end
@@ -3741,7 +3757,7 @@ class RBI::Rewriters::Merge::Conflict < ::T::Struct
   def to_s; end
 
   class << self
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -4086,7 +4102,7 @@ class RBI::Rewriters::RemoveKnownDefinitions::Operation < ::T::Struct
   def to_s; end
 
   class << self
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -4326,7 +4342,7 @@ end
 #
 # source://rbi//lib/rbi/model.rb#848
 class RBI::Sig < ::RBI::NodeWithComments
-  # : (?params: Array[SigParam], ?return_type: (Type | String), ?is_abstract: bool, ?is_override: bool, ?is_overridable: bool, ?is_final: bool, ?allow_incompatible_override: bool, ?type_params: Array[String], ?checked: Symbol?, ?loc: Loc?, ?comments: Array[Comment]) ?{ (Sig node) -> void } -> void
+  # : (?params: Array[SigParam], ?return_type: (Type | String), ?is_abstract: bool, ?is_override: bool, ?is_overridable: bool, ?is_final: bool, ?allow_incompatible_override: bool, ?without_runtime: bool, ?type_params: Array[String], ?checked: Symbol?, ?loc: Loc?, ?comments: Array[Comment]) ?{ (Sig node) -> void } -> void
   #
   # @return [Sig] a new instance of Sig
   #
@@ -4340,6 +4356,7 @@ class RBI::Sig < ::RBI::NodeWithComments
       is_overridable: T::Boolean,
       is_final: T::Boolean,
       allow_incompatible_override: T::Boolean,
+      without_runtime: T::Boolean,
       type_params: T::Array[::String],
       checked: T.nilable(::Symbol),
       loc: T.nilable(::RBI::Loc),
@@ -4347,23 +4364,23 @@ class RBI::Sig < ::RBI::NodeWithComments
       block: T.nilable(T.proc.params(node: ::RBI::Sig).void)
     ).void
   end
-  def initialize(params: T.unsafe(nil), return_type: T.unsafe(nil), is_abstract: T.unsafe(nil), is_override: T.unsafe(nil), is_overridable: T.unsafe(nil), is_final: T.unsafe(nil), allow_incompatible_override: T.unsafe(nil), type_params: T.unsafe(nil), checked: T.unsafe(nil), loc: T.unsafe(nil), comments: T.unsafe(nil), &block); end
+  def initialize(params: T.unsafe(nil), return_type: T.unsafe(nil), is_abstract: T.unsafe(nil), is_override: T.unsafe(nil), is_overridable: T.unsafe(nil), is_final: T.unsafe(nil), allow_incompatible_override: T.unsafe(nil), without_runtime: T.unsafe(nil), type_params: T.unsafe(nil), checked: T.unsafe(nil), loc: T.unsafe(nil), comments: T.unsafe(nil), &block); end
 
   # : (SigParam param) -> void
   #
-  # source://rbi//lib/rbi/model.rb#893
+  # source://rbi//lib/rbi/model.rb#895
   sig { params(param: ::RBI::SigParam).void }
   def <<(param); end
 
   # : (Object other) -> bool
   #
-  # source://rbi//lib/rbi/model.rb#903
+  # source://rbi//lib/rbi/model.rb#905
   sig { params(other: ::Object).returns(T::Boolean) }
   def ==(other); end
 
   # : (String name, (Type | String) type) -> void
   #
-  # source://rbi//lib/rbi/model.rb#898
+  # source://rbi//lib/rbi/model.rb#900
   sig { params(name: ::String, type: T.any(::RBI::Type, ::String)).void }
   def add_param(name, type); end
 
@@ -4462,15 +4479,27 @@ class RBI::Sig < ::RBI::NodeWithComments
   # source://rbi//lib/rbi/model.rb#859
   sig { returns(T::Array[::String]) }
   def type_params; end
+
+  # : bool
+  #
+  # source://rbi//lib/rbi/model.rb#856
+  # @return [Boolean]
+  def without_runtime; end
+
+  # : bool
+  #
+  # source://rbi//lib/rbi/model.rb#856
+  # @return [Boolean]
+  def without_runtime=(_arg0); end
 end
 
-# source://rbi//lib/rbi/model.rb#912
+# source://rbi//lib/rbi/model.rb#914
 class RBI::SigParam < ::RBI::NodeWithComments
   # : (String name, (Type | String) type, ?loc: Loc?, ?comments: Array[Comment]) ?{ (SigParam node) -> void } -> void
   #
   # @return [SigParam] a new instance of SigParam
   #
-  # source://rbi//lib/rbi/model.rb#920
+  # source://rbi//lib/rbi/model.rb#922
   sig do
     params(
       name: ::String,
@@ -4484,19 +4513,19 @@ class RBI::SigParam < ::RBI::NodeWithComments
 
   # : (Object other) -> bool
   #
-  # source://rbi//lib/rbi/model.rb#928
+  # source://rbi//lib/rbi/model.rb#930
   sig { params(other: ::Object).returns(T::Boolean) }
   def ==(other); end
 
   # : String
   #
-  # source://rbi//lib/rbi/model.rb#914
+  # source://rbi//lib/rbi/model.rb#916
   sig { returns(::String) }
   def name; end
 
   # : (Type | String)
   #
-  # source://rbi//lib/rbi/model.rb#917
+  # source://rbi//lib/rbi/model.rb#919
   sig { returns(T.any(::RBI::Type, ::String)) }
   def type; end
 end
@@ -4596,13 +4625,13 @@ end
 
 # Sorbet's T::Enum
 #
-# source://rbi//lib/rbi/model.rb#1014
+# source://rbi//lib/rbi/model.rb#1016
 class RBI::TEnum < ::RBI::Class
   # : (String name, ?loc: Loc?, ?comments: Array[Comment]) ?{ (TEnum klass) -> void } -> void
   #
   # @return [TEnum] a new instance of TEnum
   #
-  # source://rbi//lib/rbi/model.rb#1016
+  # source://rbi//lib/rbi/model.rb#1018
   sig do
     params(
       name: ::String,
@@ -4614,13 +4643,13 @@ class RBI::TEnum < ::RBI::Class
   def initialize(name, loc: T.unsafe(nil), comments: T.unsafe(nil), &block); end
 end
 
-# source://rbi//lib/rbi/model.rb#1022
+# source://rbi//lib/rbi/model.rb#1024
 class RBI::TEnumBlock < ::RBI::Scope
   # : (?loc: Loc?, ?comments: Array[Comment]) ?{ (TEnumBlock node) -> void } -> void
   #
   # @return [TEnumBlock] a new instance of TEnumBlock
   #
-  # source://rbi//lib/rbi/model.rb#1024
+  # source://rbi//lib/rbi/model.rb#1026
   sig do
     params(
       loc: T.nilable(::RBI::Loc),
@@ -4632,7 +4661,7 @@ class RBI::TEnumBlock < ::RBI::Scope
 
   # : -> String
   #
-  # source://rbi//lib/rbi/model.rb#1031
+  # source://rbi//lib/rbi/model.rb#1033
   sig { override.returns(::String) }
   def fully_qualified_name; end
 
@@ -4644,12 +4673,12 @@ class RBI::TEnumBlock < ::RBI::Scope
 
   # : -> String
   #
-  # source://rbi//lib/rbi/model.rb#1037
+  # source://rbi//lib/rbi/model.rb#1039
   sig { override.returns(::String) }
   def to_s; end
 end
 
-# source://rbi//lib/rbi/model.rb#1042
+# source://rbi//lib/rbi/model.rb#1044
 class RBI::TEnumValue < ::RBI::NodeWithComments
   include ::RBI::Indexable
 
@@ -4657,7 +4686,7 @@ class RBI::TEnumValue < ::RBI::NodeWithComments
   #
   # @return [TEnumValue] a new instance of TEnumValue
   #
-  # source://rbi//lib/rbi/model.rb#1047
+  # source://rbi//lib/rbi/model.rb#1049
   sig do
     params(
       name: ::String,
@@ -4670,7 +4699,7 @@ class RBI::TEnumValue < ::RBI::NodeWithComments
 
   # : -> String
   #
-  # source://rbi//lib/rbi/model.rb#1054
+  # source://rbi//lib/rbi/model.rb#1056
   sig { returns(::String) }
   def fully_qualified_name; end
 
@@ -4682,26 +4711,26 @@ class RBI::TEnumValue < ::RBI::NodeWithComments
 
   # : String
   #
-  # source://rbi//lib/rbi/model.rb#1044
+  # source://rbi//lib/rbi/model.rb#1046
   sig { returns(::String) }
   def name; end
 
   # : -> String
   #
-  # source://rbi//lib/rbi/model.rb#1060
+  # source://rbi//lib/rbi/model.rb#1062
   sig { override.returns(::String) }
   def to_s; end
 end
 
 # Sorbet's T::Struct
 #
-# source://rbi//lib/rbi/model.rb#935
+# source://rbi//lib/rbi/model.rb#937
 class RBI::TStruct < ::RBI::Class
   # : (String name, ?loc: Loc?, ?comments: Array[Comment]) ?{ (TStruct klass) -> void } -> void
   #
   # @return [TStruct] a new instance of TStruct
   #
-  # source://rbi//lib/rbi/model.rb#937
+  # source://rbi//lib/rbi/model.rb#939
   sig do
     params(
       name: ::String,
@@ -4713,7 +4742,7 @@ class RBI::TStruct < ::RBI::Class
   def initialize(name, loc: T.unsafe(nil), comments: T.unsafe(nil), &block); end
 end
 
-# source://rbi//lib/rbi/model.rb#970
+# source://rbi//lib/rbi/model.rb#972
 class RBI::TStructConst < ::RBI::TStructField
   include ::RBI::Indexable
 
@@ -4721,7 +4750,7 @@ class RBI::TStructConst < ::RBI::TStructField
   #
   # @return [TStructConst] a new instance of TStructConst
   #
-  # source://rbi//lib/rbi/model.rb#972
+  # source://rbi//lib/rbi/model.rb#974
   sig do
     params(
       name: ::String,
@@ -4744,7 +4773,7 @@ class RBI::TStructConst < ::RBI::TStructField
 
   # : -> Array[String]
   #
-  # source://rbi//lib/rbi/model.rb#979
+  # source://rbi//lib/rbi/model.rb#981
   sig { override.returns(T::Array[::String]) }
   def fully_qualified_names; end
 
@@ -4756,14 +4785,14 @@ class RBI::TStructConst < ::RBI::TStructField
 
   # : -> String
   #
-  # source://rbi//lib/rbi/model.rb#986
+  # source://rbi//lib/rbi/model.rb#988
   sig { override.returns(::String) }
   def to_s; end
 end
 
 # @abstract It cannot be directly instantiated. Subclasses must implement the `abstract` methods below.
 #
-# source://rbi//lib/rbi/model.rb#943
+# source://rbi//lib/rbi/model.rb#945
 class RBI::TStructField < ::RBI::NodeWithComments
   abstract!
 
@@ -4771,7 +4800,7 @@ class RBI::TStructField < ::RBI::NodeWithComments
   #
   # @return [TStructField] a new instance of TStructField
   #
-  # source://rbi//lib/rbi/model.rb#959
+  # source://rbi//lib/rbi/model.rb#961
   sig do
     params(
       name: ::String,
@@ -4793,48 +4822,48 @@ class RBI::TStructField < ::RBI::NodeWithComments
 
   # : String?
   #
-  # source://rbi//lib/rbi/model.rb#956
+  # source://rbi//lib/rbi/model.rb#958
   sig { returns(T.nilable(::String)) }
   def default; end
 
   # : String?
   #
-  # source://rbi//lib/rbi/model.rb#956
+  # source://rbi//lib/rbi/model.rb#958
   # @return [String, nil]
   def default=(_arg0); end
 
   # @abstract
   #
-  # source://rbi//lib/rbi/model.rb#967
+  # source://rbi//lib/rbi/model.rb#969
   sig { abstract.returns(T::Array[::String]) }
   def fully_qualified_names; end
 
   # : String
   #
-  # source://rbi//lib/rbi/model.rb#950
+  # source://rbi//lib/rbi/model.rb#952
   sig { returns(::String) }
   def name; end
 
   # : String
   #
-  # source://rbi//lib/rbi/model.rb#950
+  # source://rbi//lib/rbi/model.rb#952
   # @return [String]
   def name=(_arg0); end
 
   # : (Type | String)
   #
-  # source://rbi//lib/rbi/model.rb#953
+  # source://rbi//lib/rbi/model.rb#955
   sig { returns(T.any(::RBI::Type, ::String)) }
   def type; end
 
   # : (Type | String)
   #
-  # source://rbi//lib/rbi/model.rb#953
+  # source://rbi//lib/rbi/model.rb#955
   # @return [Type, String]
   def type=(_arg0); end
 end
 
-# source://rbi//lib/rbi/model.rb#991
+# source://rbi//lib/rbi/model.rb#993
 class RBI::TStructProp < ::RBI::TStructField
   include ::RBI::Indexable
 
@@ -4842,7 +4871,7 @@ class RBI::TStructProp < ::RBI::TStructField
   #
   # @return [TStructProp] a new instance of TStructProp
   #
-  # source://rbi//lib/rbi/model.rb#993
+  # source://rbi//lib/rbi/model.rb#995
   sig do
     params(
       name: ::String,
@@ -4865,7 +4894,7 @@ class RBI::TStructProp < ::RBI::TStructField
 
   # : -> Array[String]
   #
-  # source://rbi//lib/rbi/model.rb#1000
+  # source://rbi//lib/rbi/model.rb#1002
   sig { override.returns(T::Array[::String]) }
   def fully_qualified_names; end
 
@@ -4877,7 +4906,7 @@ class RBI::TStructProp < ::RBI::TStructField
 
   # : -> String
   #
-  # source://rbi//lib/rbi/model.rb#1007
+  # source://rbi//lib/rbi/model.rb#1009
   sig { override.returns(::String) }
   def to_s; end
 end
@@ -5183,7 +5212,7 @@ class RBI::Type
 
   # : -> String
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1142
+  # source://rbi//lib/rbi/rbs_printer.rb#1146
   sig { returns(::String) }
   def rbs_string; end
 
@@ -6115,7 +6144,7 @@ class RBI::Type::Void < ::RBI::Type
   def to_rbi; end
 end
 
-# source://rbi//lib/rbi/model.rb#1085
+# source://rbi//lib/rbi/model.rb#1087
 class RBI::TypeMember < ::RBI::NodeWithComments
   include ::RBI::Indexable
 
@@ -6123,7 +6152,7 @@ class RBI::TypeMember < ::RBI::NodeWithComments
   #
   # @return [TypeMember] a new instance of TypeMember
   #
-  # source://rbi//lib/rbi/model.rb#1090
+  # source://rbi//lib/rbi/model.rb#1092
   sig do
     params(
       name: ::String,
@@ -6137,7 +6166,7 @@ class RBI::TypeMember < ::RBI::NodeWithComments
 
   # : -> String
   #
-  # source://rbi//lib/rbi/model.rb#1098
+  # source://rbi//lib/rbi/model.rb#1100
   sig { returns(::String) }
   def fully_qualified_name; end
 
@@ -6149,150 +6178,150 @@ class RBI::TypeMember < ::RBI::NodeWithComments
 
   # : String
   #
-  # source://rbi//lib/rbi/model.rb#1087
+  # source://rbi//lib/rbi/model.rb#1089
   sig { returns(::String) }
   def name; end
 
   # : -> String
   #
-  # source://rbi//lib/rbi/model.rb#1106
+  # source://rbi//lib/rbi/model.rb#1108
   sig { override.returns(::String) }
   def to_s; end
 
   # : String
   #
-  # source://rbi//lib/rbi/model.rb#1087
+  # source://rbi//lib/rbi/model.rb#1089
   # @return [String]
   def value; end
 end
 
-# source://rbi//lib/rbi/rbs_printer.rb#885
+# source://rbi//lib/rbi/rbs_printer.rb#889
 class RBI::TypePrinter
   # : -> void
   #
   # @return [TypePrinter] a new instance of TypePrinter
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#890
+  # source://rbi//lib/rbi/rbs_printer.rb#894
   sig { void }
   def initialize; end
 
   # : String
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#887
+  # source://rbi//lib/rbi/rbs_printer.rb#891
   sig { returns(::String) }
   def string; end
 
   # : (Type node) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#895
+  # source://rbi//lib/rbi/rbs_printer.rb#899
   sig { params(node: ::RBI::Type).void }
   def visit(node); end
 
   # : (Type::All type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1010
+  # source://rbi//lib/rbi/rbs_printer.rb#1014
   sig { params(type: ::RBI::Type::All).void }
   def visit_all(type); end
 
   # : (Type::Any type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1020
+  # source://rbi//lib/rbi/rbs_printer.rb#1024
   sig { params(type: ::RBI::Type::Any).void }
   def visit_any(type); end
 
   # : (Type::Anything type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#960
+  # source://rbi//lib/rbi/rbs_printer.rb#964
   sig { params(type: ::RBI::Type::Anything).void }
   def visit_anything(type); end
 
   # : (Type::AttachedClass type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#985
+  # source://rbi//lib/rbi/rbs_printer.rb#989
   sig { params(type: ::RBI::Type::AttachedClass).void }
   def visit_attached_class(type); end
 
   # : (Type::Boolean type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#944
+  # source://rbi//lib/rbi/rbs_printer.rb#948
   sig { params(type: ::RBI::Type::Boolean).void }
   def visit_boolean(type); end
 
   # : (Type::Class type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1087
+  # source://rbi//lib/rbi/rbs_printer.rb#1091
   sig { params(type: ::RBI::Type::Class).void }
   def visit_class(type); end
 
   # : (Type::ClassOf type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1003
+  # source://rbi//lib/rbi/rbs_printer.rb#1007
   sig { params(type: ::RBI::Type::ClassOf).void }
   def visit_class_of(type); end
 
   # : (Type::Generic type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#949
+  # source://rbi//lib/rbi/rbs_printer.rb#953
   sig { params(type: ::RBI::Type::Generic).void }
   def visit_generic(type); end
 
   # : (Type::Nilable type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#990
+  # source://rbi//lib/rbi/rbs_printer.rb#994
   sig { params(type: ::RBI::Type::Nilable).void }
   def visit_nilable(type); end
 
   # : (Type::NoReturn type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#970
+  # source://rbi//lib/rbi/rbs_printer.rb#974
   sig { params(type: ::RBI::Type::NoReturn).void }
   def visit_no_return(type); end
 
   # : (Type::Proc type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1060
+  # source://rbi//lib/rbi/rbs_printer.rb#1064
   sig { params(type: ::RBI::Type::Proc).void }
   def visit_proc(type); end
 
   # : (Type::SelfType type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#980
+  # source://rbi//lib/rbi/rbs_printer.rb#984
   sig { params(type: ::RBI::Type::SelfType).void }
   def visit_self_type(type); end
 
   # : (Type::Shape type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1040
+  # source://rbi//lib/rbi/rbs_printer.rb#1044
   sig { params(type: ::RBI::Type::Shape).void }
   def visit_shape(type); end
 
   # : (Type::Simple type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#939
+  # source://rbi//lib/rbi/rbs_printer.rb#943
   sig { params(type: ::RBI::Type::Simple).void }
   def visit_simple(type); end
 
   # : (Type::Tuple type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1030
+  # source://rbi//lib/rbi/rbs_printer.rb#1034
   sig { params(type: ::RBI::Type::Tuple).void }
   def visit_tuple(type); end
 
   # : (Type::TypeParameter type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1082
+  # source://rbi//lib/rbi/rbs_printer.rb#1086
   sig { params(type: ::RBI::Type::TypeParameter).void }
   def visit_type_parameter(type); end
 
   # : (Type::Untyped type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#975
+  # source://rbi//lib/rbi/rbs_printer.rb#979
   sig { params(type: ::RBI::Type::Untyped).void }
   def visit_untyped(type); end
 
   # : (Type::Void type) -> void
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#965
+  # source://rbi//lib/rbi/rbs_printer.rb#969
   sig { params(type: ::RBI::Type::Void).void }
   def visit_void(type); end
 
@@ -6300,7 +6329,7 @@ class RBI::TypePrinter
 
   # : (String type_name) -> String
   #
-  # source://rbi//lib/rbi/rbs_printer.rb#1096
+  # source://rbi//lib/rbi/rbs_printer.rb#1100
   sig { params(type_name: ::String).returns(::String) }
   def translate_t_type(type_name); end
 end
diff --git a/Library/Homebrew/sorbet/rbi/gems/rbs@3.9.2.rbi b/Library/Homebrew/sorbet/rbi/gems/rbs@3.9.4.rbi
similarity index 100%
rename from Library/Homebrew/sorbet/rbi/gems/rbs@3.9.2.rbi
rename to Library/Homebrew/sorbet/rbi/gems/rbs@3.9.4.rbi
diff --git a/Library/Homebrew/sorbet/rbi/gems/rubocop@1.75.5.rbi b/Library/Homebrew/sorbet/rbi/gems/rubocop@1.75.6.rbi
similarity index 99%
rename from Library/Homebrew/sorbet/rbi/gems/rubocop@1.75.5.rbi
rename to Library/Homebrew/sorbet/rbi/gems/rubocop@1.75.6.rbi
index a434735a02..7f307d4617 100644
--- a/Library/Homebrew/sorbet/rbi/gems/rubocop@1.75.5.rbi
+++ b/Library/Homebrew/sorbet/rbi/gems/rubocop@1.75.6.rbi
@@ -16291,64 +16291,64 @@ class RuboCop::Cop::Layout::SpaceInsideArrayLiteralBrackets < ::RuboCop::Cop::Ba
 
   private
 
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#118
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#119
   def array_brackets(node); end
 
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#104
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#105
   def autocorrect(corrector, node); end
 
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#226
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#227
   def compact(corrector, bracket, side); end
 
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#212
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#213
   def compact_corrections(corrector, node, left, right); end
 
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#204
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#205
   def compact_offense(node, token, side: T.unsafe(nil)); end
 
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#166
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#167
   def compact_offenses(node, left, right, start_ok, end_ok); end
 
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#127
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#128
   def empty_config; end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#135
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#136
   def end_has_own_line?(token); end
 
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#142
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#143
   def index_for(node, token); end
 
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#150
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#151
   def issue_offenses(node, left, right, start_ok, end_ok); end
 
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#146
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#147
   def line_and_column_for(token); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#187
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#188
   def multi_dimensional_array?(node, token, side: T.unsafe(nil)); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#198
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#199
   def next_to_bracket?(token, side: T.unsafe(nil)); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#162
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#163
   def next_to_comment?(node, token); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#131
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#132
   def next_to_newline?(node, token); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#179
+  # source://rubocop//lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb#180
   def qualifies_for_compact?(node, token, side: T.unsafe(nil)); end
 end
 
@@ -19155,81 +19155,110 @@ RuboCop::Cop::Lint::DuplicateMatchPattern::MSG = T.let(T.unsafe(nil), String)
 #   end
 #
 #   alias bar foo
+# @example AllCops:ActiveSupportExtensionsEnabled: false (default)
 #
-# source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#42
+#   # good
+#   def foo
+#   1
+#   end
+#
+#   delegate :foo, to: :bar
+# @example AllCops:ActiveSupportExtensionsEnabled: true
+#
+#   # bad
+#   def foo
+#   1
+#   end
+#
+#   delegate :foo, to: :bar
+#
+#   # good
+#   def foo
+#   1
+#   end
+#
+#   delegate :baz, to: :bar
+#
+# source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#67
 class RuboCop::Cop::Lint::DuplicateMethods < ::RuboCop::Cop::Base
   # @return [DuplicateMethods] a new instance of DuplicateMethods
   #
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#46
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#72
   def initialize(config = T.unsafe(nil), options = T.unsafe(nil)); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#84
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#110
   def alias_method?(param0 = T.unsafe(nil)); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#72
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#115
+  def delegate_method?(param0 = T.unsafe(nil)); end
+
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#98
   def method_alias?(param0 = T.unsafe(nil)); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#76
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#102
   def on_alias(node); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#52
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#78
   def on_def(node); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#60
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#86
   def on_defs(node); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#90
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#122
   def on_send(node); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#89
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#120
   def sym_name(param0 = T.unsafe(nil)); end
 
   private
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#102
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#138
   def check_const_receiver(node, name, const_name); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#109
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#145
   def check_self_receiver(node, name); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#193
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#235
   def found_attr(node, args, readable: T.unsafe(nil), writable: T.unsafe(nil)); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#121
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#163
   def found_instance_method(node, name); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#144
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#186
   def found_method(node, method_name); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#134
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#176
   def found_sclass_method(node, name); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#171
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#213
   def location(node); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#203
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#245
   def lookup_constant(node, const_name); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#116
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#152
   def message_for_dup(node, method_name, key); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#163
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#205
   def method_key(node, method_name); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#179
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#221
   def on_attr(node, attr_name, args); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#221
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#157
+  def on_delegate(node, method_names); end
+
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#263
   def qualified_name(enclosing, namespace, mod_name); end
 
-  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#235
+  # source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#277
   def source_location(node); end
 end
 
-# source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#43
+# source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#68
 RuboCop::Cop::Lint::DuplicateMethods::MSG = T.let(T.unsafe(nil), String)
 
-# source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#44
+# source://rubocop//lib/rubocop/cop/lint/duplicate_methods.rb#69
 RuboCop::Cop::Lint::DuplicateMethods::RESTRICT_ON_SEND = T.let(T.unsafe(nil), Array)
 
 # Checks for duplicate elements in `Regexp` character classes.
@@ -26740,7 +26769,7 @@ class RuboCop::Cop::Lint::UselessAssignment < ::RuboCop::Cop::Base
   # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#51
   def after_leaving_scope(scope, _variable_table); end
 
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#165
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#167
   def autocorrect(corrector, assignment); end
 
   # @return [Boolean]
@@ -26751,42 +26780,42 @@ class RuboCop::Cop::Lint::UselessAssignment < ::RuboCop::Cop::Base
   # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#56
   def check_for_unused_assignments(variable); end
 
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#149
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#151
   def collect_variable_like_names(scope); end
 
   # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#82
   def message_for_useless_assignment(assignment); end
 
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#110
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#112
   def message_specification(assignment, variable); end
 
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#120
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#122
   def multiple_assignment_message(variable_name); end
 
   # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#88
   def offense_range(assignment); end
 
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#125
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#127
   def operator_assignment_message(scope, assignment); end
 
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#182
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#184
   def remove_exception_assignment_part(corrector, node); end
 
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#206
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#208
   def remove_local_variable_assignment_part(corrector, node); end
 
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#195
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#197
   def remove_trailing_character_from_operator(corrector, node); end
 
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#191
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#193
   def rename_variable_with_underscore(corrector, node); end
 
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#199
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#201
   def replace_named_capture_group_with_non_capturing_group(corrector, node, variable_name); end
 
   # TODO: More precise handling (rescue, ensure, nested begin, etc.)
   #
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#139
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#141
   def return_value_node_of_scope(scope); end
 
   # @return [Boolean]
@@ -26794,12 +26823,12 @@ class RuboCop::Cop::Lint::UselessAssignment < ::RuboCop::Cop::Base
   # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#96
   def sequential_assignment?(node); end
 
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#132
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#134
   def similar_name_message(variable); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#158
+  # source://rubocop//lib/rubocop/cop/lint/useless_assignment.rb#160
   def variable_like_method_invocation?(node); end
 
   class << self
@@ -36128,26 +36157,26 @@ RuboCop::Cop::Style::CommentedKeyword::SUBCLASS_DEFINITION = T.let(T.unsafe(nil)
 #   # good
 #   x.between?(min, max)
 #
-# source://rubocop//lib/rubocop/cop/style/comparable_between.rb#23
+# source://rubocop//lib/rubocop/cop/style/comparable_between.rb#26
 class RuboCop::Cop::Style::ComparableBetween < ::RuboCop::Cop::Base
   extend ::RuboCop::Cop::AutoCorrector
 
-  # source://rubocop//lib/rubocop/cop/style/comparable_between.rb#38
+  # source://rubocop//lib/rubocop/cop/style/comparable_between.rb#41
   def logical_comparison_between_by_max_first?(param0 = T.unsafe(nil)); end
 
-  # source://rubocop//lib/rubocop/cop/style/comparable_between.rb#29
+  # source://rubocop//lib/rubocop/cop/style/comparable_between.rb#32
   def logical_comparison_between_by_min_first?(param0 = T.unsafe(nil)); end
 
-  # source://rubocop//lib/rubocop/cop/style/comparable_between.rb#46
+  # source://rubocop//lib/rubocop/cop/style/comparable_between.rb#49
   def on_and(node); end
 
   private
 
-  # source://rubocop//lib/rubocop/cop/style/comparable_between.rb#62
+  # source://rubocop//lib/rubocop/cop/style/comparable_between.rb#65
   def register_offense(node, min_and_value, max_and_value); end
 end
 
-# source://rubocop//lib/rubocop/cop/style/comparable_between.rb#26
+# source://rubocop//lib/rubocop/cop/style/comparable_between.rb#29
 RuboCop::Cop::Style::ComparableBetween::MSG = T.let(T.unsafe(nil), String)
 
 # Enforces the use of `Comparable#clamp` instead of comparison by minimum and maximum.
@@ -36757,6 +36786,7 @@ RuboCop::Cop::Style::Copyright::AUTOCORRECT_EMPTY_WARNING = T.let(T.unsafe(nil),
 RuboCop::Cop::Style::Copyright::MSG = T.let(T.unsafe(nil), String)
 
 # Checks for inheritance from `Data.define` to avoid creating the anonymous parent class.
+# Inheriting from `Data.define` adds a superfluous level in inheritance tree.
 #
 # @example
 #   # bad
@@ -36766,6 +36796,9 @@ RuboCop::Cop::Style::Copyright::MSG = T.let(T.unsafe(nil), String)
 #   end
 #   end
 #
+#   Person.ancestors
+#   # => [Person, #, Data, (...)]
+#
 #   # good
 #   Person = Data.define(:first_name, :last_name) do
 #   def age
@@ -36773,28 +36806,31 @@ RuboCop::Cop::Style::Copyright::MSG = T.let(T.unsafe(nil), String)
 #   end
 #   end
 #
-# source://rubocop//lib/rubocop/cop/style/data_inheritance.rb#26
+#   Person.ancestors
+#   # => [Person, Data, (...)]
+#
+# source://rubocop//lib/rubocop/cop/style/data_inheritance.rb#33
 class RuboCop::Cop::Style::DataInheritance < ::RuboCop::Cop::Base
   include ::RuboCop::Cop::RangeHelp
   extend ::RuboCop::Cop::AutoCorrector
   extend ::RuboCop::Cop::TargetRubyVersion
 
-  # source://rubocop//lib/rubocop/cop/style/data_inheritance.rb#48
+  # source://rubocop//lib/rubocop/cop/style/data_inheritance.rb#55
   def data_define?(param0 = T.unsafe(nil)); end
 
-  # source://rubocop//lib/rubocop/cop/style/data_inheritance.rb#36
+  # source://rubocop//lib/rubocop/cop/style/data_inheritance.rb#43
   def on_class(node); end
 
   private
 
-  # source://rubocop//lib/rubocop/cop/style/data_inheritance.rb#55
+  # source://rubocop//lib/rubocop/cop/style/data_inheritance.rb#62
   def correct_parent(parent, corrector); end
 
-  # source://rubocop//lib/rubocop/cop/style/data_inheritance.rb#65
+  # source://rubocop//lib/rubocop/cop/style/data_inheritance.rb#72
   def range_for_empty_class_body(class_node, data_define); end
 end
 
-# source://rubocop//lib/rubocop/cop/style/data_inheritance.rb#31
+# source://rubocop//lib/rubocop/cop/style/data_inheritance.rb#38
 RuboCop::Cop::Style::DataInheritance::MSG = T.let(T.unsafe(nil), String)
 
 # Checks for consistent usage of the `DateTime` class over the
@@ -41461,6 +41497,17 @@ RuboCop::Cop::Style::IfInsideElse::MSG = T.let(T.unsafe(nil), String)
 # end
 # ----
 #
+# The code `def method_name = body if condition` is considered a bad case by
+# `Style/AmbiguousEndlessMethodDefinition` cop. So, to respect the user's intention to use
+# an endless method definition in the `if` body, the following code is allowed:
+#
+# [source,ruby]
+# ----
+# if condition
+#   def method_name = body
+# end
+# ----
+#
 # NOTE: It is allowed when `defined?` argument has an undefined value,
 # because using the modifier form causes the following incompatibility:
 #
@@ -41499,7 +41546,7 @@ RuboCop::Cop::Style::IfInsideElse::MSG = T.let(T.unsafe(nil), String)
 #   do_something
 #   end
 #
-# source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#63
+# source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#74
 class RuboCop::Cop::Style::IfUnlessModifier < ::RuboCop::Cop::Base
   include ::RuboCop::Cop::Alignment
   include ::RuboCop::Cop::LineLengthHelp
@@ -41509,120 +41556,125 @@ class RuboCop::Cop::Style::IfUnlessModifier < ::RuboCop::Cop::Base
   include ::RuboCop::Cop::CommentsHelp
   extend ::RuboCop::Cop::AutoCorrector
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#80
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#92
   def on_if(node); end
 
   private
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#171
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#191
   def allowed_patterns; end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#231
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#251
   def another_statement_on_same_line?(node); end
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#132
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#152
   def autocorrect(corrector, node); end
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#285
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#305
   def comment_on_node_line(node); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#104
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#124
   def defined_argument_is_undefined?(if_node, defined_node); end
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#96
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#116
   def defined_nodes(condition); end
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#272
+  # @return [Boolean]
+  #
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#112
+  def endless_method?(body); end
+
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#292
   def extract_heredoc_from(last_argument); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#215
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#235
   def line_length_enabled_at_line?(line); end
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#124
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#144
   def message(node); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#219
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#239
   def named_capture_in_condition?(node); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#223
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#243
   def non_eligible_node?(node); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#227
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#247
   def non_simple_if_unless?(node); end
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#114
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#134
   def pattern_matching_nodes(condition); end
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#289
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#309
   def remove_comment(corrector, _node, comment); end
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#279
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#299
   def remove_heredoc(corrector, heredoc); end
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#141
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#161
   def replacement_for_modifier_form(corrector, node); end
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#265
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#285
   def to_modifier_form_with_move_comment(node, indentation, comment); end
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#245
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#265
   def to_normal_form(node, indentation); end
 
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#253
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#273
   def to_normal_form_with_heredoc(node, indentation, heredoc); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#165
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#185
   def too_long_due_to_comment_after_modifier?(node, comment); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#160
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#180
   def too_long_due_to_modifier?(node); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#206
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#226
   def too_long_line_based_on_allow_uri?(line); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#189
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#209
   def too_long_line_based_on_config?(range, line); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#198
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#218
   def too_long_line_based_on_ignore_cop_directives?(range, line); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#176
+  # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#196
   def too_long_single_line?(node); end
 
   class << self
-    # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#76
+    # source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#87
     def autocorrect_incompatible_with; end
   end
 end
 
-# source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#71
+# source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#82
 RuboCop::Cop::Style::IfUnlessModifier::MSG_USE_MODIFIER = T.let(T.unsafe(nil), String)
 
-# source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#74
+# source://rubocop//lib/rubocop/cop/style/if_unless_modifier.rb#85
 RuboCop::Cop::Style::IfUnlessModifier::MSG_USE_NORMAL = T.let(T.unsafe(nil), String)
 
 # Checks for if and unless statements used as modifiers of other if or
@@ -44585,10 +44637,10 @@ class RuboCop::Cop::Style::MultilineIfModifier < ::RuboCop::Cop::Base
 
   private
 
-  # source://rubocop//lib/rubocop/cop/style/multiline_if_modifier.rb#43
+  # source://rubocop//lib/rubocop/cop/style/multiline_if_modifier.rb#45
   def indented_body(body, node); end
 
-  # source://rubocop//lib/rubocop/cop/style/multiline_if_modifier.rb#35
+  # source://rubocop//lib/rubocop/cop/style/multiline_if_modifier.rb#37
   def to_normal_if(node); end
 end
 
@@ -52677,7 +52729,7 @@ class RuboCop::Cop::Style::SoleNestedConditional < ::RuboCop::Cop::Base
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/sole_nested_conditional.rb#199
+  # source://rubocop//lib/rubocop/cop/style/sole_nested_conditional.rb#201
   def allow_modifier?; end
 
   # source://rubocop//lib/rubocop/cop/style/sole_nested_conditional.rb#81
@@ -52717,7 +52769,7 @@ class RuboCop::Cop::Style::SoleNestedConditional < ::RuboCop::Cop::Base
   # source://rubocop//lib/rubocop/cop/style/sole_nested_conditional.rb#182
   def parenthesize_method?(node); end
 
-  # source://rubocop//lib/rubocop/cop/style/sole_nested_conditional.rb#192
+  # source://rubocop//lib/rubocop/cop/style/sole_nested_conditional.rb#194
   def parenthesized_method_arguments(node); end
 
   # @return [Boolean]
@@ -53148,76 +53200,75 @@ RuboCop::Cop::Style::StringChars::RESTRICT_ON_SEND = T.let(T.unsafe(nil), Array)
 #
 # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#53
 class RuboCop::Cop::Style::StringConcatenation < ::RuboCop::Cop::Base
-  include ::RuboCop::Cop::RangeHelp
   extend ::RuboCop::Cop::AutoCorrector
 
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#68
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#67
   def on_new_investigation; end
 
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#72
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#71
   def on_send(node); end
 
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#61
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#60
   def string_concatenation?(param0 = T.unsafe(nil)); end
 
   private
 
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#159
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#158
   def adjust_str(node); end
 
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#115
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#114
   def collect_parts(node, parts = T.unsafe(nil)); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#140
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#139
   def corrected_ancestor?(node); end
 
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#107
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#106
   def find_topmost_plus_node(node); end
 
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#163
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#162
   def handle_quotes(parts); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#134
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#133
   def heredoc?(node); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#97
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#96
   def line_end_concatenation?(node); end
 
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#173
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#172
   def mode; end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#126
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#125
   def plus_node?(node); end
 
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#85
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#84
   def register_offense(topmost_plus_node, parts); end
 
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#144
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#143
   def replacement(parts); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#169
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#168
   def single_quoted?(str_node); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#130
+  # source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#129
   def uncorrectable?(part); end
 end
 
-# source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#57
+# source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#56
 RuboCop::Cop::Style::StringConcatenation::MSG = T.let(T.unsafe(nil), String)
 
-# source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#58
+# source://rubocop//lib/rubocop/cop/style/string_concatenation.rb#57
 RuboCop::Cop::Style::StringConcatenation::RESTRICT_ON_SEND = T.let(T.unsafe(nil), Array)
 
 # Checks for the use of strings as keys in hashes. The use of
@@ -53454,7 +53505,8 @@ RuboCop::Cop::Style::Strip::MSG = T.let(T.unsafe(nil), String)
 # source://rubocop//lib/rubocop/cop/style/strip.rb#21
 RuboCop::Cop::Style::Strip::RESTRICT_ON_SEND = T.let(T.unsafe(nil), Array)
 
-# Checks for inheritance from Struct.new.
+# Checks for inheritance from `Struct.new`. Inheriting from `Struct.new`
+# adds a superfluous level in inheritance tree.
 #
 # @example
 #   # bad
@@ -53464,6 +53516,9 @@ RuboCop::Cop::Style::Strip::RESTRICT_ON_SEND = T.let(T.unsafe(nil), Array)
 #   end
 #   end
 #
+#   Person.ancestors
+#   # => [Person, #, Struct, (...)]
+#
 #   # good
 #   Person = Struct.new(:first_name, :last_name) do
 #   def age
@@ -53471,27 +53526,30 @@ RuboCop::Cop::Style::Strip::RESTRICT_ON_SEND = T.let(T.unsafe(nil), Array)
 #   end
 #   end
 #
-# source://rubocop//lib/rubocop/cop/style/struct_inheritance.rb#26
+#   Person.ancestors
+#   # => [Person, Struct, (...)]
+#
+# source://rubocop//lib/rubocop/cop/style/struct_inheritance.rb#33
 class RuboCop::Cop::Style::StructInheritance < ::RuboCop::Cop::Base
   include ::RuboCop::Cop::RangeHelp
   extend ::RuboCop::Cop::AutoCorrector
 
-  # source://rubocop//lib/rubocop/cop/style/struct_inheritance.rb#33
+  # source://rubocop//lib/rubocop/cop/style/struct_inheritance.rb#40
   def on_class(node); end
 
-  # source://rubocop//lib/rubocop/cop/style/struct_inheritance.rb#45
+  # source://rubocop//lib/rubocop/cop/style/struct_inheritance.rb#52
   def struct_constructor?(param0 = T.unsafe(nil)); end
 
   private
 
-  # source://rubocop//lib/rubocop/cop/style/struct_inheritance.rb#52
+  # source://rubocop//lib/rubocop/cop/style/struct_inheritance.rb#59
   def correct_parent(parent, corrector); end
 
-  # source://rubocop//lib/rubocop/cop/style/struct_inheritance.rb#62
+  # source://rubocop//lib/rubocop/cop/style/struct_inheritance.rb#69
   def range_for_empty_class_body(class_node, struct_new); end
 end
 
-# source://rubocop//lib/rubocop/cop/style/struct_inheritance.rb#30
+# source://rubocop//lib/rubocop/cop/style/struct_inheritance.rb#37
 RuboCop::Cop::Style::StructInheritance::MSG = T.let(T.unsafe(nil), String)
 
 # Checks for redundant argument forwarding when calling super with arguments identical to
@@ -58818,13 +58876,13 @@ class RuboCop::Formatter::DisabledConfigFormatter < ::RuboCop::Formatter::BaseFo
   # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#165
   def cop_config_params(default_cfg, cfg); end
 
-  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#185
+  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#186
   def default_config(cop_name); end
 
-  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#229
+  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#230
   def excludes(offending_files, cop_name, parent); end
 
-  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#200
+  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#201
   def filtered_config(cfg); end
 
   # Returns true if the given arr include the given elm or if any of the
@@ -58832,17 +58890,17 @@ class RuboCop::Formatter::DisabledConfigFormatter < ::RuboCop::Formatter::BaseFo
   #
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#277
+  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#278
   def include_or_match?(arr, elm); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#250
+  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#251
   def merge_mode_for_exclude?(cfg); end
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#271
+  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#272
   def no_exclude_limit?; end
 
   # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#102
@@ -58851,19 +58909,19 @@ class RuboCop::Formatter::DisabledConfigFormatter < ::RuboCop::Formatter::BaseFo
   # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#137
   def output_cop_comments(output_buffer, cfg, cop_name, offense_count); end
 
-  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#189
+  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#190
   def output_cop_config(output_buffer, cfg, cop_name); end
 
   # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#172
   def output_cop_param_comments(output_buffer, params, default_cfg); end
 
-  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#219
+  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#220
   def output_exclude_list(output_buffer, offending_files, cop_name); end
 
-  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#254
+  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#255
   def output_exclude_path(output_buffer, exclude_path, parent); end
 
-  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#208
+  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#209
   def output_offending_files(output_buffer, cfg, cop_name); end
 
   # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#96
@@ -58871,7 +58929,7 @@ class RuboCop::Formatter::DisabledConfigFormatter < ::RuboCop::Formatter::BaseFo
 
   # @return [Boolean]
   #
-  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#267
+  # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#268
   def safe_autocorrect?(config); end
 
   # source://rubocop//lib/rubocop/formatter/disabled_config_formatter.rb#116
diff --git a/Library/Homebrew/sorbet/rbi/gems/ruby-lsp@0.23.17.rbi b/Library/Homebrew/sorbet/rbi/gems/ruby-lsp@0.23.21.rbi
similarity index 100%
rename from Library/Homebrew/sorbet/rbi/gems/ruby-lsp@0.23.17.rbi
rename to Library/Homebrew/sorbet/rbi/gems/ruby-lsp@0.23.21.rbi
diff --git a/Library/Homebrew/sorbet/rbi/gems/spoom@1.6.1.rbi b/Library/Homebrew/sorbet/rbi/gems/spoom@1.6.3.rbi
similarity index 90%
rename from Library/Homebrew/sorbet/rbi/gems/spoom@1.6.1.rbi
rename to Library/Homebrew/sorbet/rbi/gems/spoom@1.6.3.rbi
index 3439a2b3c0..47d8116a53 100644
--- a/Library/Homebrew/sorbet/rbi/gems/spoom@1.6.1.rbi
+++ b/Library/Homebrew/sorbet/rbi/gems/spoom@1.6.3.rbi
@@ -56,33 +56,30 @@ module Spoom::Cli::Helper
 
   # : (String string) -> String
   #
-  # source://spoom//lib/spoom/cli/helper.rb#147
+  # source://spoom//lib/spoom/cli/helper.rb#149
   sig { params(string: ::String).returns(::String) }
   def blue(string); end
 
   # Collect files from `paths`, defaulting to `exec_path`
-  # : (Array[String] paths) -> Array[String]
+  # : (Array[String] paths, ?include_rbi_files: bool) -> Array[String]
   #
   # source://spoom//lib/spoom/cli/helper.rb#85
-  # Collect files from `paths`, defaulting to `exec_path`
-  sig { params(paths: T::Array[::String]).returns(T::Array[::String]) }
-  def collect_files(paths); end
+  sig { params(paths: T::Array[::String], include_rbi_files: T::Boolean).returns(T::Array[::String]) }
+  def collect_files(paths, include_rbi_files: T.unsafe(nil)); end
 
   # Is the `--color` option true?
   # : -> bool
   #
   # @return [Boolean]
   #
-  # source://spoom//lib/spoom/cli/helper.rb#111
-  # Is the `--color` option true?
+  # source://spoom//lib/spoom/cli/helper.rb#113
   sig { returns(T::Boolean) }
   def color?; end
 
   # Colorize a string if `color?`
   # : (String string, *Color color) -> String
   #
-  # source://spoom//lib/spoom/cli/helper.rb#140
-  # Colorize a string if `color?`
+  # source://spoom//lib/spoom/cli/helper.rb#142
   sig { params(string: ::String, color: ::Spoom::Color).returns(::String) }
   def colorize(string, *color); end
 
@@ -90,7 +87,6 @@ module Spoom::Cli::Helper
   # : -> Context
   #
   # source://spoom//lib/spoom/cli/helper.rb#58
-  # Returns the context at `--path` (by default the current working directory)
   sig { returns(::Spoom::Context) }
   def context; end
 
@@ -98,13 +94,12 @@ module Spoom::Cli::Helper
   # : -> Context
   #
   # source://spoom//lib/spoom/cli/helper.rb#64
-  # Raise if `spoom` is not ran inside a context with a `sorbet/config` file
   sig { returns(::Spoom::Context) }
   def context_requiring_sorbet!; end
 
   # : (String string) -> String
   #
-  # source://spoom//lib/spoom/cli/helper.rb#152
+  # source://spoom//lib/spoom/cli/helper.rb#154
   sig { params(string: ::String).returns(::String) }
   def cyan(string); end
 
@@ -112,31 +107,30 @@ module Spoom::Cli::Helper
   # : -> String
   #
   # source://spoom//lib/spoom/cli/helper.rb#79
-  # Return the path specified through `--path`
   sig { returns(::String) }
   def exec_path; end
 
   # : (String string) -> String
   #
-  # source://spoom//lib/spoom/cli/helper.rb#157
+  # source://spoom//lib/spoom/cli/helper.rb#159
   sig { params(string: ::String).returns(::String) }
   def gray(string); end
 
   # : (String string) -> String
   #
-  # source://spoom//lib/spoom/cli/helper.rb#162
+  # source://spoom//lib/spoom/cli/helper.rb#164
   sig { params(string: ::String).returns(::String) }
   def green(string); end
 
   # : (String string) -> String
   #
-  # source://spoom//lib/spoom/cli/helper.rb#116
+  # source://spoom//lib/spoom/cli/helper.rb#118
   sig { params(string: ::String).returns(::String) }
   def highlight(string); end
 
   # : (String string) -> String
   #
-  # source://spoom//lib/spoom/cli/helper.rb#167
+  # source://spoom//lib/spoom/cli/helper.rb#169
   sig { params(string: ::String).returns(::String) }
   def red(string); end
 
@@ -144,7 +138,6 @@ module Spoom::Cli::Helper
   # : (String message) -> void
   #
   # source://spoom//lib/spoom/cli/helper.rb#19
-  # Print `message` on `$stdout`
   sig { params(message: ::String).void }
   def say(message); end
 
@@ -154,8 +147,6 @@ module Spoom::Cli::Helper
   # : (String message, ?status: String?, ?nl: bool) -> void
   #
   # source://spoom//lib/spoom/cli/helper.rb#32
-  # Print `message` on `$stderr`
-  # The message is prefixed by a status (default: `Error`).
   sig { params(message: ::String, status: T.nilable(::String), nl: T::Boolean).void }
   def say_error(message, status: T.unsafe(nil), nl: T.unsafe(nil)); end
 
@@ -165,14 +156,12 @@ module Spoom::Cli::Helper
   # : (String message, ?status: String?, ?nl: bool) -> void
   #
   # source://spoom//lib/spoom/cli/helper.rb#46
-  # Print `message` on `$stderr`
-  # The message is prefixed by a status (default: `Warning`).
   sig { params(message: ::String, status: T.nilable(::String), nl: T::Boolean).void }
   def say_warning(message, status: T.unsafe(nil), nl: T.unsafe(nil)); end
 
   # : (String string) -> String
   #
-  # source://spoom//lib/spoom/cli/helper.rb#172
+  # source://spoom//lib/spoom/cli/helper.rb#174
   sig { params(string: ::String).returns(::String) }
   def yellow(string); end
 end
@@ -380,21 +369,21 @@ class Spoom::Cli::Srb::Sigs < ::Thor
   include ::Spoom::Colorize
   include ::Spoom::Cli::Helper
 
-  # source://spoom//lib/spoom/cli/srb/sigs.rb#197
+  # source://spoom//lib/spoom/cli/srb/sigs.rb#198
   def exec(context, command); end
 
-  # source://spoom//lib/spoom/cli/srb/sigs.rb#68
+  # source://spoom//lib/spoom/cli/srb/sigs.rb#69
   def export(output_path = T.unsafe(nil)); end
 
   def help(command = T.unsafe(nil), subcommand = T.unsafe(nil)); end
 
-  # source://spoom//lib/spoom/cli/srb/sigs.rb#49
+  # source://spoom//lib/spoom/cli/srb/sigs.rb#50
   def strip(*paths); end
 
-  # source://spoom//lib/spoom/cli/srb/sigs.rb#174
+  # source://spoom//lib/spoom/cli/srb/sigs.rb#175
   def transform_files(files, &block); end
 
-  # source://spoom//lib/spoom/cli/srb/sigs.rb#20
+  # source://spoom//lib/spoom/cli/srb/sigs.rb#21
   def translate(*paths); end
 end
 
@@ -403,15 +392,15 @@ class Spoom::Cli::Srb::Tc < ::Thor
   include ::Spoom::Colorize
   include ::Spoom::Cli::Helper
 
-  # source://spoom//lib/spoom/cli/srb/tc.rb#132
+  # source://spoom//lib/spoom/cli/srb/tc.rb#147
   def colorize_message(message); end
 
-  # source://spoom//lib/spoom/cli/srb/tc.rb#123
+  # source://spoom//lib/spoom/cli/srb/tc.rb#138
   def format_error(error, format); end
 
   def help(command = T.unsafe(nil), subcommand = T.unsafe(nil)); end
 
-  # source://spoom//lib/spoom/cli/srb/tc.rb#27
+  # source://spoom//lib/spoom/cli/srb/tc.rb#28
   def tc(*paths_to_select); end
 end
 
@@ -472,8 +461,6 @@ end
 # It is used to manipulate files and run commands in the context of this directory.
 #
 # source://spoom//lib/spoom/context/bundle.rb#5
-# An abstraction to a Ruby project context
-# A context maps to a directory in the file system.
 class Spoom::Context
   include ::Spoom::Context::Bundle
   include ::Spoom::Context::Exec
@@ -490,9 +477,6 @@ class Spoom::Context
   # @return [Context] a new instance of Context
   #
   # source://spoom//lib/spoom/context.rb#47
-  # Create a new context about `absolute_path`
-  # The directory will not be created if it doesn't exist.
-  # Call `#make!` to create it.
   sig { params(absolute_path: ::String).void }
   def initialize(absolute_path); end
 
@@ -500,7 +484,6 @@ class Spoom::Context
   # : String
   #
   # source://spoom//lib/spoom/context.rb#40
-  # The absolute path to the directory this context is about
   sig { returns(::String) }
   def absolute_path; end
 
@@ -512,9 +495,6 @@ class Spoom::Context
     # : (?String? name) -> instance
     #
     # source://spoom//lib/spoom/context.rb#33
-    # Create a new context in the system's temporary directory
-    # `name` is used as prefix to the temporary directory name.
-    # The directory will be created if it doesn't exist.
     sig { params(name: T.nilable(::String)).returns(T.attached_class) }
     def mktmp!(name = T.unsafe(nil)); end
   end
@@ -530,7 +510,6 @@ module Spoom::Context::Bundle
   # : (String command, ?version: String?, ?capture_err: bool) -> ExecResult
   #
   # source://spoom//lib/spoom/context/bundle.rb#32
-  # Run a command with `bundle` in this context directory
   sig { params(command: ::String, version: T.nilable(::String), capture_err: T::Boolean).returns(::Spoom::ExecResult) }
   def bundle(command, version: T.unsafe(nil), capture_err: T.unsafe(nil)); end
 
@@ -538,7 +517,6 @@ module Spoom::Context::Bundle
   # : (String command, ?version: String?, ?capture_err: bool) -> ExecResult
   #
   # source://spoom//lib/spoom/context/bundle.rb#45
-  # Run a command `bundle exec` in this context directory
   sig { params(command: ::String, version: T.nilable(::String), capture_err: T::Boolean).returns(::Spoom::ExecResult) }
   def bundle_exec(command, version: T.unsafe(nil), capture_err: T.unsafe(nil)); end
 
@@ -546,7 +524,6 @@ module Spoom::Context::Bundle
   # : (?version: String?, ?capture_err: bool) -> ExecResult
   #
   # source://spoom//lib/spoom/context/bundle.rb#39
-  # Run `bundle install` in this context directory
   sig { params(version: T.nilable(::String), capture_err: T::Boolean).returns(::Spoom::ExecResult) }
   def bundle_install!(version: T.unsafe(nil), capture_err: T.unsafe(nil)); end
 
@@ -556,8 +533,6 @@ module Spoom::Context::Bundle
   # : (String gem) -> Gem::Version?
   #
   # source://spoom//lib/spoom/context/bundle.rb#61
-  # Get `gem` version from the `Gemfile.lock` content
-  # Returns `nil` if `gem` cannot be found in the Gemfile.
   sig { params(gem: ::String).returns(T.nilable(::Gem::Version)) }
   def gem_version_from_gemfile_lock(gem); end
 
@@ -571,7 +546,6 @@ module Spoom::Context::Bundle
   # : -> String?
   #
   # source://spoom//lib/spoom/context/bundle.rb#14
-  # Read the contents of the Gemfile in this context directory
   sig { returns(T.nilable(::String)) }
   def read_gemfile; end
 
@@ -579,7 +553,6 @@ module Spoom::Context::Bundle
   # : -> String?
   #
   # source://spoom//lib/spoom/context/bundle.rb#20
-  # Read the contents of the Gemfile.lock in this context directory
   sig { returns(T.nilable(::String)) }
   def read_gemfile_lock; end
 
@@ -587,7 +560,6 @@ module Spoom::Context::Bundle
   # : (String contents, ?append: bool) -> void
   #
   # source://spoom//lib/spoom/context/bundle.rb#26
-  # Set the `contents` of the Gemfile in this context directory
   sig { params(contents: ::String, append: T::Boolean).void }
   def write_gemfile!(contents, append: T.unsafe(nil)); end
 end
@@ -602,7 +574,6 @@ module Spoom::Context::Exec
   # : (String command, ?capture_err: bool) -> ExecResult
   #
   # source://spoom//lib/spoom/context/exec.rb#32
-  # Run a command in this context directory
   sig { params(command: ::String, capture_err: T::Boolean).returns(::Spoom::ExecResult) }
   def exec(command, capture_err: T.unsafe(nil)); end
 end
@@ -617,7 +588,6 @@ module Spoom::Context::FileSystem
   # : (String relative_path) -> String
   #
   # source://spoom//lib/spoom/context/file_system.rb#14
-  # Returns the absolute path to `relative_path` in the context's directory
   sig { params(relative_path: ::String).returns(::String) }
   def absolute_path_to(relative_path); end
 
@@ -639,8 +609,6 @@ module Spoom::Context::FileSystem
   # : -> void
   #
   # source://spoom//lib/spoom/context/file_system.rb#98
-  # Delete this context and its content
-  # Warning: it will `rm -rf` the context directory on the file system.
   sig { void }
   def destroy!; end
 
@@ -650,7 +618,6 @@ module Spoom::Context::FileSystem
   # @return [Boolean]
   #
   # source://spoom//lib/spoom/context/file_system.rb#20
-  # Does the context directory at `absolute_path` exist and is a directory?
   sig { returns(T::Boolean) }
   def exist?; end
 
@@ -660,7 +627,6 @@ module Spoom::Context::FileSystem
   # @return [Boolean]
   #
   # source://spoom//lib/spoom/context/file_system.rb#58
-  # Does `relative_path` point to an existing file in this context directory?
   sig { params(relative_path: ::String).returns(T::Boolean) }
   def file?(relative_path); end
 
@@ -668,7 +634,6 @@ module Spoom::Context::FileSystem
   # : (?String pattern) -> Array[String]
   #
   # source://spoom//lib/spoom/context/file_system.rb#33
-  # List all files in this context matching `pattern`
   sig { params(pattern: ::String).returns(T::Array[::String]) }
   def glob(pattern = T.unsafe(nil)); end
 
@@ -676,7 +641,6 @@ module Spoom::Context::FileSystem
   # : -> Array[String]
   #
   # source://spoom//lib/spoom/context/file_system.rb#41
-  # List all files at the top level of this context directory
   sig { returns(T::Array[::String]) }
   def list; end
 
@@ -684,7 +648,6 @@ module Spoom::Context::FileSystem
   # : -> void
   #
   # source://spoom//lib/spoom/context/file_system.rb#26
-  # Create the context directory at `absolute_path`
   sig { void }
   def mkdir!; end
 
@@ -692,7 +655,6 @@ module Spoom::Context::FileSystem
   # : (String from_relative_path, String to_relative_path) -> void
   #
   # source://spoom//lib/spoom/context/file_system.rb#88
-  # Move the file or directory from `from_relative_path` to `to_relative_path`
   sig { params(from_relative_path: ::String, to_relative_path: ::String).void }
   def move!(from_relative_path, to_relative_path); end
 
@@ -702,8 +664,6 @@ module Spoom::Context::FileSystem
   # : (String relative_path) -> String
   #
   # source://spoom//lib/spoom/context/file_system.rb#66
-  # Return the contents of the file at `relative_path` in this context directory
-  # Will raise if the file doesn't exist.
   sig { params(relative_path: ::String).returns(::String) }
   def read(relative_path); end
 
@@ -711,7 +671,6 @@ module Spoom::Context::FileSystem
   # : (String relative_path) -> void
   #
   # source://spoom//lib/spoom/context/file_system.rb#82
-  # Remove the path at `relative_path` (recursive + force) in this context directory
   sig { params(relative_path: ::String).void }
   def remove!(relative_path); end
 
@@ -721,8 +680,6 @@ module Spoom::Context::FileSystem
   # : (String relative_path, ?String contents, ?append: bool) -> void
   #
   # source://spoom//lib/spoom/context/file_system.rb#74
-  # Write `contents` in the file at `relative_path` in this context directory
-  # Append to the file if `append` is true.
   sig { params(relative_path: ::String, contents: ::String, append: T::Boolean).void }
   def write!(relative_path, contents = T.unsafe(nil), append: T.unsafe(nil)); end
 end
@@ -737,7 +694,6 @@ module Spoom::Context::Git
   # : (String command) -> ExecResult
   #
   # source://spoom//lib/spoom/context/git.rb#38
-  # Run a command prefixed by `git` in this context directory
   sig { params(command: ::String).returns(::Spoom::ExecResult) }
   def git(command); end
 
@@ -745,7 +701,6 @@ module Spoom::Context::Git
   # : (?ref: String) -> ExecResult
   #
   # source://spoom//lib/spoom/context/git.rb#57
-  # Run `git checkout` in this context directory
   sig { params(ref: ::String).returns(::Spoom::ExecResult) }
   def git_checkout!(ref: T.unsafe(nil)); end
 
@@ -753,7 +708,6 @@ module Spoom::Context::Git
   # : (String branch_name, ?ref: String?) -> ExecResult
   #
   # source://spoom//lib/spoom/context/git.rb#63
-  # Run `git checkout -b  [` in this context directory
   sig { params(branch_name: ::String, ref: T.nilable(::String)).returns(::Spoom::ExecResult) }
   def git_checkout_new_branch!(branch_name, ref: T.unsafe(nil)); end
 
@@ -761,7 +715,6 @@ module Spoom::Context::Git
   # : (?message: String, ?time: Time, ?allow_empty: bool) -> ExecResult
   #
   # source://spoom//lib/spoom/context/git.rb#73
-  # Run `git add . && git commit` in this context directory
   sig { params(message: ::String, time: ::Time, allow_empty: T::Boolean).returns(::Spoom::ExecResult) }
   def git_commit!(message: T.unsafe(nil), time: T.unsafe(nil), allow_empty: T.unsafe(nil)); end
 
@@ -769,7 +722,6 @@ module Spoom::Context::Git
   # : -> String?
   #
   # source://spoom//lib/spoom/context/git.rb#84
-  # Get the current git branch in this context directory
   sig { returns(T.nilable(::String)) }
   def git_current_branch; end
 
@@ -777,7 +729,6 @@ module Spoom::Context::Git
   # : (*String arg) -> ExecResult
   #
   # source://spoom//lib/spoom/context/git.rb#93
-  # Run `git diff` in this context directory
   sig { params(arg: ::String).returns(::Spoom::ExecResult) }
   def git_diff(*arg); end
 
@@ -788,9 +739,6 @@ module Spoom::Context::Git
   # : (?branch: String?) -> ExecResult
   #
   # source://spoom//lib/spoom/context/git.rb#47
-  # Run `git init` in this context directory
-  # Warning: passing a branch will run `git init -b ` which is only available in git 2.28+.
-  # In older versions, use `git_init!` followed by `git("checkout -b ")`.
   sig { params(branch: T.nilable(::String)).returns(::Spoom::ExecResult) }
   def git_init!(branch: T.unsafe(nil)); end
 
@@ -798,7 +746,6 @@ module Spoom::Context::Git
   # : (?short_sha: bool) -> Spoom::Git::Commit?
   #
   # source://spoom//lib/spoom/context/git.rb#99
-  # Get the last commit in the currently checked out branch
   sig { params(short_sha: T::Boolean).returns(T.nilable(::Spoom::Git::Commit)) }
   def git_last_commit(short_sha: T.unsafe(nil)); end
 
@@ -812,7 +759,6 @@ module Spoom::Context::Git
   # : (String remote, String ref, ?force: bool) -> ExecResult
   #
   # source://spoom//lib/spoom/context/git.rb#116
-  # Run `git push  ][` in this context directory
   sig { params(remote: ::String, ref: ::String, force: T::Boolean).returns(::Spoom::ExecResult) }
   def git_push!(remote, ref, force: T.unsafe(nil)); end
 
@@ -828,7 +774,6 @@ module Spoom::Context::Git
   # @return [Boolean]
   #
   # source://spoom//lib/spoom/context/git.rb#127
-  # Is there uncommitted changes in this context directory?
   sig { params(path: ::String).returns(T::Boolean) }
   def git_workdir_clean?(path: T.unsafe(nil)); end
 end
@@ -845,7 +790,6 @@ module Spoom::Context::Sorbet
   # @return [Boolean]
   #
   # source://spoom//lib/spoom/context/sorbet.rb#106
-  # Does this context has a `sorbet/config` file?
   sig { returns(T::Boolean) }
   def has_sorbet_config?; end
 
@@ -853,7 +797,6 @@ module Spoom::Context::Sorbet
   # : (String relative_path) -> String?
   #
   # source://spoom//lib/spoom/context/sorbet.rb#129
-  # Read the strictness sigil from the file at `relative_path` (returns `nil` if no sigil)
   sig { params(relative_path: ::String).returns(T.nilable(::String)) }
   def read_file_strictness(relative_path); end
 
@@ -861,7 +804,6 @@ module Spoom::Context::Sorbet
   # : -> String
   #
   # source://spoom//lib/spoom/context/sorbet.rb#117
-  # Read the contents of `sorbet/config` in this context directory
   sig { returns(::String) }
   def read_sorbet_config; end
 
@@ -875,7 +817,6 @@ module Spoom::Context::Sorbet
   # : -> Spoom::Git::Commit?
   #
   # source://spoom//lib/spoom/context/sorbet.rb#135
-  # Get the commit introducing the `sorbet/config` file
   sig { returns(T.nilable(::Spoom::Git::Commit)) }
   def sorbet_intro_commit; end
 
@@ -883,7 +824,6 @@ module Spoom::Context::Sorbet
   # : -> Spoom::Git::Commit?
   #
   # source://spoom//lib/spoom/context/sorbet.rb#147
-  # Get the commit removing the `sorbet/config` file
   sig { returns(T.nilable(::Spoom::Git::Commit)) }
   def sorbet_removal_commit; end
 
@@ -891,7 +831,6 @@ module Spoom::Context::Sorbet
   # : (*String arg, ?sorbet_bin: String?, ?capture_err: bool) -> ExecResult
   #
   # source://spoom//lib/spoom/context/sorbet.rb#14
-  # Run `bundle exec srb` in this context directory
   sig { params(arg: ::String, sorbet_bin: T.nilable(::String), capture_err: T::Boolean).returns(::Spoom::ExecResult) }
   def srb(*arg, sorbet_bin: T.unsafe(nil), capture_err: T.unsafe(nil)); end
 
@@ -899,7 +838,6 @@ module Spoom::Context::Sorbet
   # : (?with_config: Spoom::Sorbet::Config?, ?include_rbis: bool) -> Array[String]
   #
   # source://spoom//lib/spoom/context/sorbet.rb#58
-  # List all files typechecked by Sorbet from its `config`
   sig { params(with_config: T.nilable(::Spoom::Sorbet::Config), include_rbis: T::Boolean).returns(T::Array[::String]) }
   def srb_files(with_config: T.unsafe(nil), include_rbis: T.unsafe(nil)); end
 
@@ -907,7 +845,6 @@ module Spoom::Context::Sorbet
   # : (String strictness, ?with_config: Spoom::Sorbet::Config?, ?include_rbis: bool) -> Array[String]
   #
   # source://spoom//lib/spoom/context/sorbet.rb#91
-  # List all files typechecked by Sorbet from its `config` that matches `strictness`
   sig do
     params(
       strictness: ::String,
@@ -945,7 +882,6 @@ module Spoom::Context::Sorbet
   # : (String contents, ?append: bool) -> void
   #
   # source://spoom//lib/spoom/context/sorbet.rb#123
-  # Set the `contents` of `sorbet/config` in this context directory
   sig { params(contents: ::String, append: T::Boolean).void }
   def write_sorbet_config!(contents, append: T.unsafe(nil)); end
 end
@@ -1001,7 +937,6 @@ class Spoom::Coverage::Cards::Card < ::Spoom::Coverage::Template
   # : String?
   #
   # source://spoom//lib/spoom/coverage/report.rb#94
-  # @return [String, nil]
   def body; end
 
   # : String?
@@ -1011,6 +946,8 @@ class Spoom::Coverage::Cards::Card < ::Spoom::Coverage::Template
   def title; end
 end
 
+# : String
+#
 # source://spoom//lib/spoom/coverage/report.rb#91
 Spoom::Coverage::Cards::Card::TEMPLATE = T.let(T.unsafe(nil), String)
 
@@ -1094,6 +1031,8 @@ class Spoom::Coverage::Cards::Snapshot < ::Spoom::Coverage::Cards::Card
   def snapshot; end
 end
 
+# : String
+#
 # source://spoom//lib/spoom/coverage/report.rb#123
 Spoom::Coverage::Cards::Snapshot::TEMPLATE = T.let(T.unsafe(nil), String)
 
@@ -1332,7 +1271,7 @@ class Spoom::Coverage::D3::ColorPalette < ::T::Struct
   prop :strong, ::String
 
   class << self
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -1726,6 +1665,8 @@ class Spoom::Coverage::Page < ::Spoom::Coverage::Template
   def title; end
 end
 
+# : String
+#
 # source://spoom//lib/spoom/coverage/report.rb#43
 Spoom::Coverage::Page::TEMPLATE = T.let(T.unsafe(nil), String)
 
@@ -1810,7 +1751,7 @@ class Spoom::Coverage::Snapshot < ::T::Struct
     sig { params(obj: T::Hash[::String, T.untyped]).returns(::Spoom::Coverage::Snapshot) }
     def from_obj(obj); end
 
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -1855,7 +1796,6 @@ class Spoom::Coverage::Template
   # @return [Template] a new instance of Template
   #
   # source://spoom//lib/spoom/coverage/report.rb#17
-  # Create a new template from an Erb file path
   sig { params(template: ::String).void }
   def initialize(template:); end
 
@@ -1883,13 +1823,13 @@ module Spoom::Deadcode
   class << self
     # : (Context context) -> Array[singleton(Plugins::Base)]
     #
-    # source://spoom//lib/spoom/deadcode/plugins.rb#73
+    # source://spoom//lib/spoom/deadcode/plugins.rb#67
     sig { params(context: ::Spoom::Context).returns(T::Array[T.class_of(Spoom::Deadcode::Plugins::Base)]) }
     def load_custom_plugins(context); end
 
     # : (Context context) -> Set[singleton(Plugins::Base)]
     #
-    # source://spoom//lib/spoom/deadcode/plugins.rb#59
+    # source://spoom//lib/spoom/deadcode/plugins.rb#53
     sig { params(context: ::Spoom::Context).returns(T::Set[T.class_of(Spoom::Deadcode::Plugins::Base)]) }
     def plugins_from_gemfile_lock(context); end
   end
@@ -1922,7 +1862,6 @@ class Spoom::Deadcode::Definition < ::T::Struct
   # @return [Boolean]
   #
   # source://spoom//lib/spoom/deadcode/definition.rb#71
-  # Status
   sig { returns(T::Boolean) }
   def alive?; end
 
@@ -1931,7 +1870,6 @@ class Spoom::Deadcode::Definition < ::T::Struct
   # @return [Boolean]
   #
   # source://spoom//lib/spoom/deadcode/definition.rb#39
-  # Kind
   sig { returns(T::Boolean) }
   def attr_reader?; end
 
@@ -2000,12 +1938,11 @@ class Spoom::Deadcode::Definition < ::T::Struct
   # : (*untyped args) -> String
   #
   # source://spoom//lib/spoom/deadcode/definition.rb#98
-  # Utils
   sig { params(args: T.untyped).returns(::String) }
   def to_json(*args); end
 
   class << self
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -2122,7 +2059,6 @@ class Spoom::Deadcode::Index
   # : (String name) -> Array[Definition]
   #
   # source://spoom//lib/spoom/deadcode/index.rb#210
-  # Utils
   sig { params(name: ::String).returns(T::Array[::Spoom::Deadcode::Definition]) }
   def definitions_for_name(name); end
 
@@ -2132,8 +2068,6 @@ class Spoom::Deadcode::Index
   # : -> void
   #
   # source://spoom//lib/spoom/deadcode/index.rb#118
-  # Mark all definitions having a reference of the same name as `alive`
-  # To be called once all the files have been indexed and all the definitions and references discovered.
   sig { void }
   def finalize!; end
 
@@ -2152,7 +2086,6 @@ class Spoom::Deadcode::Index
   # : (String file, ?plugins: Array[Plugins::Base]) -> void
   #
   # source://spoom//lib/spoom/deadcode/index.rb#35
-  # Indexing
   sig { params(file: ::String, plugins: T::Array[::Spoom::Deadcode::Plugins::Base]).void }
   def index_file(file, plugins: T.unsafe(nil)); end
 
@@ -2233,7 +2166,9 @@ class Spoom::Deadcode::Indexer < ::Spoom::Visitor
   def visit_call_node(node); end
 end
 
-# source://spoom//lib/spoom/deadcode/plugins.rb#36
+# : Set[singleton(Plugins::Base)]
+#
+# source://spoom//lib/spoom/deadcode/plugins.rb#33
 Spoom::Deadcode::PLUGINS_FOR_GEM = T.let(T.unsafe(nil), Hash)
 
 # source://spoom//lib/spoom/deadcode/plugins/base.rb#8
@@ -2261,13 +2196,13 @@ end
 class Spoom::Deadcode::Plugins::ActionPack < ::Spoom::Deadcode::Plugins::Base
   # : (Model::Method definition) -> void
   #
-  # source://spoom//lib/spoom/deadcode/plugins/actionpack.rb#30
+  # source://spoom//lib/spoom/deadcode/plugins/actionpack.rb#27
   sig { override.params(definition: ::Spoom::Model::Method).void }
   def on_define_method(definition); end
 
   # : (Send send) -> void
   #
-  # source://spoom//lib/spoom/deadcode/plugins/actionpack.rb#39
+  # source://spoom//lib/spoom/deadcode/plugins/actionpack.rb#36
   sig { override.params(send: ::Spoom::Deadcode::Send).void }
   def on_send(send); end
 end
@@ -2291,18 +2226,22 @@ end
 class Spoom::Deadcode::Plugins::ActiveRecord < ::Spoom::Deadcode::Plugins::Base
   # : (Send send) -> void
   #
-  # source://spoom//lib/spoom/deadcode/plugins/active_record.rb#73
+  # source://spoom//lib/spoom/deadcode/plugins/active_record.rb#64
   sig { override.params(send: ::Spoom::Deadcode::Send).void }
   def on_send(send); end
 end
 
-# source://spoom//lib/spoom/deadcode/plugins/active_record.rb#62
+# : Array[String]
+#
+# source://spoom//lib/spoom/deadcode/plugins/active_record.rb#56
 Spoom::Deadcode::Plugins::ActiveRecord::ARRAY_METHODS = T.let(T.unsafe(nil), Array)
 
 # source://spoom//lib/spoom/deadcode/plugins/active_record.rb#18
 Spoom::Deadcode::Plugins::ActiveRecord::CALLBACKS = T.let(T.unsafe(nil), Array)
 
-# source://spoom//lib/spoom/deadcode/plugins/active_record.rb#47
+# : Array[String]
+#
+# source://spoom//lib/spoom/deadcode/plugins/active_record.rb#44
 Spoom::Deadcode::Plugins::ActiveRecord::CRUD_METHODS = T.let(T.unsafe(nil), Array)
 
 # source://spoom//lib/spoom/deadcode/plugins/active_support.rb#7
@@ -2314,6 +2253,8 @@ class Spoom::Deadcode::Plugins::ActiveSupport < ::Spoom::Deadcode::Plugins::Base
   def on_send(send); end
 end
 
+# : Array[String]
+#
 # source://spoom//lib/spoom/deadcode/plugins/active_support.rb#19
 Spoom::Deadcode::Plugins::ActiveSupport::SETUP_AND_TEARDOWN_METHODS = T.let(T.unsafe(nil), Array)
 
@@ -2341,7 +2282,6 @@ class Spoom::Deadcode::Plugins::Base
   # : (Model::Attr definition) -> void
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#155
-  # Do not override this method, use `on_define_accessor` instead.
   sig { params(definition: ::Spoom::Model::Attr).void }
   def internal_on_define_accessor(definition); end
 
@@ -2349,7 +2289,6 @@ class Spoom::Deadcode::Plugins::Base
   # : (Model::Class definition) -> void
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#179
-  # Do not override this method, use `on_define_class` instead.
   sig { params(definition: ::Spoom::Model::Class).void }
   def internal_on_define_class(definition); end
 
@@ -2357,7 +2296,6 @@ class Spoom::Deadcode::Plugins::Base
   # : (Model::Constant definition) -> void
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#209
-  # Do not override this method, use `on_define_constant` instead.
   sig { params(definition: ::Spoom::Model::Constant).void }
   def internal_on_define_constant(definition); end
 
@@ -2365,7 +2303,6 @@ class Spoom::Deadcode::Plugins::Base
   # : (Model::Method definition) -> void
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#235
-  # Do not override this method, use `on_define_method` instead.
   sig { params(definition: ::Spoom::Model::Method).void }
   def internal_on_define_method(definition); end
 
@@ -2373,7 +2310,6 @@ class Spoom::Deadcode::Plugins::Base
   # : (Model::Module definition) -> void
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#261
-  # Do not override this method, use `on_define_module` instead.
   sig { params(definition: ::Spoom::Model::Module).void }
   def internal_on_define_module(definition); end
 
@@ -2393,17 +2329,6 @@ class Spoom::Deadcode::Plugins::Base
   # : (Model::Attr definition) -> void
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#149
-  # Called when an accessor is defined.
-  # Will be called when the indexer processes a `attr_reader`, `attr_writer` or `attr_accessor` node.
-  # Note that when this method is called, the definition for the node has already been added to the index.
-  # It is still possible to ignore it from the plugin:
-  # ~~~rb
-  # class MyPlugin < Spoom::Deadcode::Plugins::Base
-  #   def on_define_accessor(definition)
-  #     @index.ignore(definition) if symbol_def.name == "foo"
-  #   end
-  # end
-  # ~~~
   sig { params(definition: ::Spoom::Model::Attr).void }
   def on_define_accessor(definition); end
 
@@ -2423,17 +2348,6 @@ class Spoom::Deadcode::Plugins::Base
   # : (Model::Class definition) -> void
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#173
-  # Called when a class is defined.
-  # Will be called when the indexer processes a `class` node.
-  # Note that when this method is called, the definition for the node has already been added to the index.
-  # It is still possible to ignore it from the plugin:
-  # ~~~rb
-  # class MyPlugin < Spoom::Deadcode::Plugins::Base
-  #   def on_define_class(definition)
-  #     @index.ignore(definition) if definition.name == "Foo"
-  #   end
-  # end
-  # ~~~
   sig { params(definition: ::Spoom::Model::Class).void }
   def on_define_class(definition); end
 
@@ -2453,17 +2367,6 @@ class Spoom::Deadcode::Plugins::Base
   # : (Model::Constant definition) -> void
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#203
-  # Called when a constant is defined.
-  # Will be called when the indexer processes a `CONST =` node.
-  # Note that when this method is called, the definition for the node has already been added to the index.
-  # It is still possible to ignore it from the plugin:
-  # ~~~rb
-  # class MyPlugin < Spoom::Deadcode::Plugins::Base
-  #   def on_define_constant(definition)
-  #     @index.ignore(definition) if definition.name == "FOO"
-  #   end
-  # end
-  # ~~~
   sig { params(definition: ::Spoom::Model::Constant).void }
   def on_define_constant(definition); end
 
@@ -2483,17 +2386,6 @@ class Spoom::Deadcode::Plugins::Base
   # : (Model::Method definition) -> void
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#229
-  # Called when a method is defined.
-  # Will be called when the indexer processes a `def` or `defs` node.
-  # Note that when this method is called, the definition for the node has already been added to the index.
-  # It is still possible to ignore it from the plugin:
-  # ~~~rb
-  # class MyPlugin < Spoom::Deadcode::Plugins::Base
-  #   def on_define_method(definition)
-  #     @index.ignore(definition) if definition.name == "foo"
-  #   end
-  # end
-  # ~~~
   sig { params(definition: ::Spoom::Model::Method).void }
   def on_define_method(definition); end
 
@@ -2513,17 +2405,6 @@ class Spoom::Deadcode::Plugins::Base
   # : (Model::Module definition) -> void
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#255
-  # Called when a module is defined.
-  # Will be called when the indexer processes a `module` node.
-  # Note that when this method is called, the definition for the node has already been added to the index.
-  # It is still possible to ignore it from the plugin:
-  # ~~~rb
-  # class MyPlugin < Spoom::Deadcode::Plugins::Base
-  #   def on_define_module(definition)
-  #     @index.ignore(definition) if definition.name == "Foo"
-  #   end
-  # end
-  # ~~~
   sig { params(definition: ::Spoom::Model::Module).void }
   def on_define_module(definition); end
 
@@ -2543,17 +2424,6 @@ class Spoom::Deadcode::Plugins::Base
   # : (Send send) -> void
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#281
-  # Called when a send is being processed
-  # ~~~rb
-  # class MyPlugin < Spoom::Deadcode::Plugins::Base
-  #   def on_send(send)
-  #     return unless send.name == "dsl_method"
-  #     return if send.args.empty?
-  #     method_name = send.args.first.slice.delete_prefix(":")
-  #     @index.reference_method(method_name, send.node, send.loc)
-  #   end
-  # end
-  # ~~~
   sig { params(send: ::Spoom::Deadcode::Send).void }
   def on_send(send); end
 
@@ -2562,7 +2432,6 @@ class Spoom::Deadcode::Plugins::Base
   # : (String name) -> String
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#349
-  # Plugin utils
   sig { params(name: ::String).returns(::String) }
   def camelize(name); end
 
@@ -2631,7 +2500,6 @@ class Spoom::Deadcode::Plugins::Base
   # @return [Boolean]
   #
   # source://spoom//lib/spoom/deadcode/plugins/base.rb#290
-  # DSL support
   sig { params(definition: ::Spoom::Model::Namespace, superclass_name: ::String).returns(T::Boolean) }
   def subclass_of?(definition, superclass_name); end
 
@@ -2652,17 +2520,6 @@ class Spoom::Deadcode::Plugins::Base
     # : (*(String | Regexp) names) -> void
     #
     # source://spoom//lib/spoom/deadcode/plugins/base.rb#49
-    # Mark classes directly subclassing a class matching `names` as ignored.
-    # Names can be either strings or regexps:
-    # ~~~rb
-    # class MyPlugin < Spoom::Deadcode::Plugins::Base
-    #   ignore_classes_inheriting_from(
-    #     "Foo",
-    #     "Bar",
-    #     /Baz.*/,
-    #   )
-    # end
-    # ~~~
     sig { params(names: T.any(::Regexp, ::String)).void }
     def ignore_classes_inheriting_from(*names); end
 
@@ -2682,17 +2539,6 @@ class Spoom::Deadcode::Plugins::Base
     # : (*(String | Regexp) names) -> void
     #
     # source://spoom//lib/spoom/deadcode/plugins/base.rb#31
-    # Mark classes matching `names` as ignored.
-    # Names can be either strings or regexps:
-    # ~~~rb
-    # class MyPlugin < Spoom::Deadcode::Plugins::Base
-    #   ignore_class_names(
-    #     "Foo",
-    #     "Bar",
-    #     /Baz.*/,
-    #   )
-    # end
-    # ~~~
     sig { params(names: T.any(::Regexp, ::String)).void }
     def ignore_classes_named(*names); end
 
@@ -2712,17 +2558,6 @@ class Spoom::Deadcode::Plugins::Base
     # : (*(String | Regexp) names) -> void
     #
     # source://spoom//lib/spoom/deadcode/plugins/base.rb#67
-    # Mark constants matching `names` as ignored.
-    # Names can be either strings or regexps:
-    # ~~~rb
-    # class MyPlugin < Spoom::Deadcode::Plugins::Base
-    #   ignore_class_names(
-    #     "FOO",
-    #     "BAR",
-    #     /BAZ.*/,
-    #   )
-    # end
-    # ~~~
     sig { params(names: T.any(::Regexp, ::String)).void }
     def ignore_constants_named(*names); end
 
@@ -2742,17 +2577,6 @@ class Spoom::Deadcode::Plugins::Base
     # : (*(String | Regexp) names) -> void
     #
     # source://spoom//lib/spoom/deadcode/plugins/base.rb#85
-    # Mark methods matching `names` as ignored.
-    # Names can be either strings or regexps:
-    # ~~~rb
-    # class MyPlugin < Spoom::Deadcode::Plugins::Base
-    #   ignore_method_names(
-    #     "foo",
-    #     "bar",
-    #     /baz.*/,
-    #   )
-    # end
-    # ~~~
     sig { params(names: T.any(::Regexp, ::String)).void }
     def ignore_methods_named(*names); end
 
@@ -2772,17 +2596,6 @@ class Spoom::Deadcode::Plugins::Base
     # : (*(String | Regexp) names) -> void
     #
     # source://spoom//lib/spoom/deadcode/plugins/base.rb#103
-    # Mark modules matching `names` as ignored.
-    # Names can be either strings or regexps:
-    # ~~~rb
-    # class MyPlugin < Spoom::Deadcode::Plugins::Base
-    #   ignore_class_names(
-    #     "Foo",
-    #     "Bar",
-    #     /Baz.*/,
-    #   )
-    # end
-    # ~~~
     sig { params(names: T.any(::Regexp, ::String)).void }
     def ignore_modules_named(*names); end
 
@@ -2897,6 +2710,8 @@ class Spoom::Deadcode::Plugins::Rubocop < ::Spoom::Deadcode::Plugins::Base
   def on_define_method(definition); end
 end
 
+# : Set[String]
+#
 # source://spoom//lib/spoom/deadcode/plugins/rubocop.rb#8
 Spoom::Deadcode::Plugins::Rubocop::RUBOCOP_CONSTANTS = T.let(T.unsafe(nil), Set)
 
@@ -2979,13 +2794,13 @@ end
 # source://spoom//lib/spoom/deadcode/remover.rb#7
 class Spoom::Deadcode::Remover::Error < ::Spoom::Error; end
 
-# source://spoom//lib/spoom/deadcode/remover.rb#362
+# source://spoom//lib/spoom/deadcode/remover.rb#366
 class Spoom::Deadcode::Remover::NodeContext
   # : (String source, Hash[Integer, Prism::Comment] comments, Prism::Node node, Array[Prism::Node] nesting) -> void
   #
   # @return [NodeContext] a new instance of NodeContext
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#373
+  # source://spoom//lib/spoom/deadcode/remover.rb#377
   sig do
     params(
       source: ::String,
@@ -2998,49 +2813,48 @@ class Spoom::Deadcode::Remover::NodeContext
 
   # : (Prism::Node node) -> Array[Prism::Comment]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#487
+  # source://spoom//lib/spoom/deadcode/remover.rb#491
   sig { params(node: ::Prism::Node).returns(T::Array[::Prism::Comment]) }
   def attached_comments(node); end
 
   # : -> Prism::CallNode?
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#515
+  # source://spoom//lib/spoom/deadcode/remover.rb#519
   sig { returns(T.nilable(::Prism::CallNode)) }
   def attached_sig; end
 
   # : -> Array[Prism::Node]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#502
+  # source://spoom//lib/spoom/deadcode/remover.rb#506
   sig { returns(T::Array[::Prism::Node]) }
   def attached_sigs; end
 
   # : Hash[Integer, Prism::Comment]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#364
+  # source://spoom//lib/spoom/deadcode/remover.rb#368
   sig { returns(T::Hash[::Integer, ::Prism::Comment]) }
   def comments; end
 
   # : (Integer start_line, Integer end_line) -> Array[Prism::Comment]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#475
+  # source://spoom//lib/spoom/deadcode/remover.rb#479
   sig { params(start_line: ::Integer, end_line: ::Integer).returns(T::Array[::Prism::Comment]) }
   def comments_between_lines(start_line, end_line); end
 
   # : Array[Prism::Node]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#370
+  # source://spoom//lib/spoom/deadcode/remover.rb#374
   sig { returns(T::Array[::Prism::Node]) }
   def nesting; end
 
   # : Array[Prism::Node]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#370
-  # @return [Array]
+  # source://spoom//lib/spoom/deadcode/remover.rb#374
   def nesting=(_arg0); end
 
   # : -> Prism::Node?
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#425
+  # source://spoom//lib/spoom/deadcode/remover.rb#429
   sig { returns(T.nilable(::Prism::Node)) }
   def next_node; end
 
@@ -3048,13 +2862,13 @@ class Spoom::Deadcode::Remover::NodeContext
   #
   # @raise [Error]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#414
+  # source://spoom//lib/spoom/deadcode/remover.rb#418
   sig { returns(T::Array[::Prism::Node]) }
   def next_nodes; end
 
   # : Prism::Node
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#367
+  # source://spoom//lib/spoom/deadcode/remover.rb#371
   sig { returns(::Prism::Node) }
   def node; end
 
@@ -3062,7 +2876,7 @@ class Spoom::Deadcode::Remover::NodeContext
   #
   # @raise [Error]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#389
+  # source://spoom//lib/spoom/deadcode/remover.rb#393
   sig { returns(::Spoom::Deadcode::Remover::NodeContext) }
   def parent_context; end
 
@@ -3070,13 +2884,13 @@ class Spoom::Deadcode::Remover::NodeContext
   #
   # @raise [Error]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#381
+  # source://spoom//lib/spoom/deadcode/remover.rb#385
   sig { returns(::Prism::Node) }
   def parent_node; end
 
   # : -> Prism::Node?
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#409
+  # source://spoom//lib/spoom/deadcode/remover.rb#413
   sig { returns(T.nilable(::Prism::Node)) }
   def previous_node; end
 
@@ -3084,13 +2898,13 @@ class Spoom::Deadcode::Remover::NodeContext
   #
   # @raise [Error]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#398
+  # source://spoom//lib/spoom/deadcode/remover.rb#402
   sig { returns(T::Array[::Prism::Node]) }
   def previous_nodes; end
 
   # : -> NodeContext?
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#430
+  # source://spoom//lib/spoom/deadcode/remover.rb#434
   sig { returns(T.nilable(::Spoom::Deadcode::Remover::NodeContext)) }
   def sclass_context; end
 
@@ -3098,7 +2912,7 @@ class Spoom::Deadcode::Remover::NodeContext
   #
   # @return [Boolean]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#463
+  # source://spoom//lib/spoom/deadcode/remover.rb#467
   sig { params(node: T.nilable(::Prism::Node)).returns(T::Boolean) }
   def sorbet_extend_sig?(node); end
 
@@ -3106,43 +2920,43 @@ class Spoom::Deadcode::Remover::NodeContext
   #
   # @return [Boolean]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#458
+  # source://spoom//lib/spoom/deadcode/remover.rb#462
   sig { params(node: T.nilable(::Prism::Node)).returns(T::Boolean) }
   def sorbet_signature?(node); end
 end
 
-# source://spoom//lib/spoom/deadcode/remover.rb#530
+# source://spoom//lib/spoom/deadcode/remover.rb#534
 class Spoom::Deadcode::Remover::NodeFinder < ::Spoom::Visitor
   # : (Location location, Definition::Kind? kind) -> void
   #
   # @return [NodeFinder] a new instance of NodeFinder
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#598
+  # source://spoom//lib/spoom/deadcode/remover.rb#599
   sig { params(location: ::Spoom::Location, kind: T.nilable(::Spoom::Deadcode::Definition::Kind)).void }
   def initialize(location, kind); end
 
   # : Prism::Node?
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#592
+  # source://spoom//lib/spoom/deadcode/remover.rb#593
   sig { returns(T.nilable(::Prism::Node)) }
   def node; end
 
   # : Array[Prism::Node]
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#595
+  # source://spoom//lib/spoom/deadcode/remover.rb#596
   sig { returns(T::Array[::Prism::Node]) }
   def nodes_nesting; end
 
   # : (Prism::Node? node) -> void
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#608
+  # source://spoom//lib/spoom/deadcode/remover.rb#609
   sig { override.params(node: T.nilable(::Prism::Node)).void }
   def visit(node); end
 
   class << self
     # : (String source, Location location, Definition::Kind? kind) -> NodeContext
     #
-    # source://spoom//lib/spoom/deadcode/remover.rb#533
+    # source://spoom//lib/spoom/deadcode/remover.rb#537
     sig do
       params(
         source: ::String,
@@ -3156,7 +2970,7 @@ class Spoom::Deadcode::Remover::NodeFinder < ::Spoom::Visitor
     #
     # @return [Boolean]
     #
-    # source://spoom//lib/spoom/deadcode/remover.rb#567
+    # source://spoom//lib/spoom/deadcode/remover.rb#568
     sig { params(node: ::Prism::Node, kind: ::Spoom::Deadcode::Definition::Kind).returns(T::Boolean) }
     def node_match_kind?(node, kind); end
   end
@@ -3194,13 +3008,13 @@ class Spoom::Deadcode::Remover::NodeRemover
 
   # : (NodeContext context) -> void
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#149
+  # source://spoom//lib/spoom/deadcode/remover.rb#151
   sig { params(context: ::Spoom::Deadcode::Remover::NodeContext).void }
   def delete_attr_accessor(context); end
 
   # : (Integer start_char, Integer end_char) -> void
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#321
+  # source://spoom//lib/spoom/deadcode/remover.rb#325
   sig { params(start_char: ::Integer, end_char: ::Integer).void }
   def delete_chars(start_char, end_char); end
 
@@ -3212,19 +3026,19 @@ class Spoom::Deadcode::Remover::NodeRemover
 
   # : (Integer start_line, Integer end_line) -> void
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#314
+  # source://spoom//lib/spoom/deadcode/remover.rb#318
   sig { params(start_line: ::Integer, end_line: ::Integer).void }
   def delete_lines(start_line, end_line); end
 
   # : (NodeContext context) -> void
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#251
+  # source://spoom//lib/spoom/deadcode/remover.rb#255
   sig { params(context: ::Spoom::Deadcode::Remover::NodeContext).void }
   def delete_node_and_comments_and_sigs(context); end
 
   # : (Prism::Node node, NodeContext send_context, was_removed: bool) -> void
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#208
+  # source://spoom//lib/spoom/deadcode/remover.rb#212
   sig do
     params(
       node: ::Prism::Node,
@@ -3236,13 +3050,13 @@ class Spoom::Deadcode::Remover::NodeRemover
 
   # : (Integer start_char, Integer end_char, String replacement) -> void
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#326
+  # source://spoom//lib/spoom/deadcode/remover.rb#330
   sig { params(start_char: ::Integer, end_char: ::Integer, replacement: ::String).void }
   def replace_chars(start_char, end_char, replacement); end
 
   # : (Prism::CallNode node, name: String, kind: Definition::Kind?) -> String
   #
-  # source://spoom//lib/spoom/deadcode/remover.rb#331
+  # source://spoom//lib/spoom/deadcode/remover.rb#335
   sig do
     params(
       node: ::Prism::CallNode,
@@ -3283,7 +3097,7 @@ class Spoom::Deadcode::Send < ::T::Struct
   def each_arg_assoc(&block); end
 
   class << self
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -3305,7 +3119,7 @@ class Spoom::ExecResult < ::T::Struct
   def to_s; end
 
   class << self
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -3325,12 +3139,6 @@ class Spoom::FileCollector
   # @return [FileCollector] a new instance of FileCollector
   #
   # source://spoom//lib/spoom/file_collector.rb#18
-  # Initialize a new file collector
-  # If `allow_extensions` is empty, all files are collected.
-  # If `allow_extensions` is an array of extensions, only files with one of these extensions are collected.
-  # If `allow_mime_types` is empty, all files are collected.
-  # If `allow_mime_types` is an array of mimetypes, files without an extension are collected if their mimetype is in
-  # the list.
   sig do
     params(
       allow_extensions: T::Array[::String],
@@ -3419,8 +3227,6 @@ class Spoom::FileTree
   # : (String path) -> Node
   #
   # source://spoom//lib/spoom/file_tree.rb#23
-  # Add a `path` to the tree
-  # This will create all nodes until the root of `path`.
   sig { params(path: ::String).returns(::Spoom::FileTree::Node) }
   def add_path(path); end
 
@@ -3428,7 +3234,6 @@ class Spoom::FileTree
   # : (T::Enumerable[String] paths) -> void
   #
   # source://spoom//lib/spoom/file_tree.rb#15
-  # Add all `paths` to the tree
   sig { params(paths: T::Enumerable[::String]).void }
   def add_paths(paths); end
 
@@ -3436,7 +3241,6 @@ class Spoom::FileTree
   # : -> Array[Node]
   #
   # source://spoom//lib/spoom/file_tree.rb#43
-  # All the nodes in this tree
   sig { returns(T::Array[::Spoom::FileTree::Node]) }
   def nodes; end
 
@@ -3444,7 +3248,6 @@ class Spoom::FileTree
   # : (Context context) -> Hash[Node, Float]
   #
   # source://spoom//lib/spoom/file_tree.rb#57
-  # Return a map of typing scores for each node in the tree
   sig { params(context: ::Spoom::Context).returns(T::Hash[::Spoom::FileTree::Node, ::Float]) }
   def nodes_strictness_scores(context); end
 
@@ -3452,7 +3255,6 @@ class Spoom::FileTree
   # : -> Array[String]
   #
   # source://spoom//lib/spoom/file_tree.rb#51
-  # All the paths in this tree
   sig { returns(T::Array[::String]) }
   def paths; end
 
@@ -3460,7 +3262,6 @@ class Spoom::FileTree
   # : (Context context) -> Hash[String, Float]
   #
   # source://spoom//lib/spoom/file_tree.rb#65
-  # Return a map of typing scores for each path in the tree
   sig { params(context: ::Spoom::Context).returns(T::Hash[::String, ::Float]) }
   def paths_strictness_scores(context); end
 
@@ -3474,7 +3275,6 @@ class Spoom::FileTree
   # : -> Array[Node]
   #
   # source://spoom//lib/spoom/file_tree.rb#37
-  # All root nodes
   sig { returns(T::Array[::Spoom::FileTree::Node]) }
   def roots; end
 end
@@ -3580,12 +3380,11 @@ class Spoom::FileTree::Node < ::T::Struct
   # : -> String
   #
   # source://spoom//lib/spoom/file_tree.rb#88
-  # Full path to this node from root
   sig { returns(::String) }
   def path; end
 
   class << self
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -3595,7 +3394,6 @@ end
 # See `FileTree#print`
 #
 # source://spoom//lib/spoom/file_tree.rb#204
-# An internal class used to print a FileTree
 class Spoom::FileTree::Printer < ::Spoom::FileTree::Visitor
   # : (Hash[FileTree::Node, String?] strictnesses, ?out: (IO | StringIO), ?colors: bool) -> void
   #
@@ -3668,14 +3466,13 @@ class Spoom::Git::Commit < ::T::Struct
   def timestamp; end
 
   class << self
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
 
     # Parse a line formatted as `%h %at` into a `Commit`
     # : (String string) -> Commit?
     #
     # source://spoom//lib/spoom/context/git.rb#10
-    # Parse a line formatted as `%h %at` into a `Commit`
     sig { params(string: ::String).returns(T.nilable(::Spoom::Git::Commit)) }
     def parse_line(string); end
   end
@@ -3729,7 +3526,6 @@ class Spoom::LSP::Client
   # @raise [Error::AlreadyOpen]
   #
   # source://spoom//lib/spoom/sorbet/lsp.rb#70
-  # LSP requests
   sig { params(workspace_path: ::String).void }
   def open(workspace_path); end
 
@@ -3819,7 +3615,7 @@ class Spoom::LSP::Diagnostic < ::T::Struct
     sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::Diagnostic) }
     def from_json(json); end
 
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -3860,7 +3656,7 @@ class Spoom::LSP::DocumentSymbol < ::T::Struct
     sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::DocumentSymbol) }
     def from_json(json); end
 
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -3934,7 +3730,7 @@ class Spoom::LSP::Hover < ::T::Struct
     sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::Hover) }
     def from_json(json); end
 
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -3965,7 +3761,7 @@ class Spoom::LSP::Location < ::T::Struct
     sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::Location) }
     def from_json(json); end
 
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -3975,7 +3771,6 @@ end
 # The language server protocol always uses `"2.0"` as the `jsonrpc` version.
 #
 # source://spoom//lib/spoom/sorbet/lsp/base.rb#12
-# A general message as defined by JSON-RPC.
 class Spoom::LSP::Message
   # : -> void
   #
@@ -4003,7 +3798,6 @@ end
 # A processed notification message must not send a response back. They work like events.
 #
 # source://spoom//lib/spoom/sorbet/lsp/base.rb#54
-# A notification message.
 class Spoom::LSP::Notification < ::Spoom::LSP::Message
   # : (String method, Hash[untyped, untyped] params) -> void
   #
@@ -4052,7 +3846,7 @@ class Spoom::LSP::Position < ::T::Struct
     sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::Position) }
     def from_json(json); end
 
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -4096,7 +3890,7 @@ class Spoom::LSP::Range < ::T::Struct
     sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::Range) }
     def from_json(json); end
 
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
@@ -4106,7 +3900,6 @@ end
 # Every processed request must send a response back to the sender of the request.
 #
 # source://spoom//lib/spoom/sorbet/lsp/base.rb#35
-# A request message to describe a request between the client and the server.
 class Spoom::LSP::Request < ::Spoom::LSP::Message
   # : (Integer id, String method, Hash[untyped, untyped] params) -> void
   #
@@ -4187,18 +3980,18 @@ class Spoom::LSP::SignatureHelp < ::T::Struct
     sig { params(json: T::Hash[T.untyped, T.untyped]).returns(::Spoom::LSP::SignatureHelp) }
     def from_json(json); end
 
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
   end
 end
 
-# source://spoom//lib/spoom/sorbet/lsp/structures.rb#295
+# source://spoom//lib/spoom/sorbet/lsp/structures.rb#292
 class Spoom::LSP::SymbolPrinter < ::Spoom::Printer
   # : (?out: (IO | StringIO), ?colors: bool, ?indent_level: Integer, ?prefix: String?) -> void
   #
   # @return [SymbolPrinter] a new instance of SymbolPrinter
   #
-  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#303
+  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#300
   sig do
     params(
       out: T.any(::IO, ::StringIO),
@@ -4211,43 +4004,42 @@ class Spoom::LSP::SymbolPrinter < ::Spoom::Printer
 
   # : (String uri) -> String
   #
-  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#325
+  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#322
   sig { params(uri: ::String).returns(::String) }
   def clean_uri(uri); end
 
   # : String?
   #
-  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#300
+  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#297
   sig { returns(T.nilable(::String)) }
   def prefix; end
 
   # : String?
   #
-  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#300
-  # @return [String, nil]
+  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#297
   def prefix=(_arg0); end
 
   # : (Array[PrintableSymbol] objects) -> void
   #
-  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#333
+  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#330
   sig { params(objects: T::Array[::Spoom::LSP::PrintableSymbol]).void }
   def print_list(objects); end
 
   # : (PrintableSymbol? object) -> void
   #
-  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#313
+  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#310
   sig { params(object: T.nilable(::Spoom::LSP::PrintableSymbol)).void }
   def print_object(object); end
 
   # : (Array[PrintableSymbol] objects) -> void
   #
-  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#320
+  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#317
   sig { params(objects: T::Array[::Spoom::LSP::PrintableSymbol]).void }
   def print_objects(objects); end
 
   # : Set[Integer]
   #
-  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#297
+  # source://spoom//lib/spoom/sorbet/lsp/structures.rb#294
   sig { returns(T::Set[::Integer]) }
   def seen; end
 end
@@ -4282,13 +4074,11 @@ class Spoom::Location
   # : Integer?
   #
   # source://spoom//lib/spoom/location.rb#58
-  # @return [Integer, nil]
   def end_column; end
 
   # : Integer?
   #
   # source://spoom//lib/spoom/location.rb#58
-  # @return [Integer, nil]
   def end_line; end
 
   # : String
@@ -4308,7 +4098,6 @@ class Spoom::Location
   # : Integer?
   #
   # source://spoom//lib/spoom/location.rb#58
-  # @return [Integer, nil]
   def start_column; end
 
   # : Integer?
@@ -4361,8 +4150,6 @@ class Spoom::Model
   # @raise [Error]
   #
   # source://spoom//lib/spoom/model/model.rb#244
-  # Get a symbol by it's full name
-  # Raises an error if the symbol is not found
   sig { params(full_name: ::String).returns(::Spoom::Model::Symbol) }
   def [](full_name); end
 
@@ -4378,8 +4165,6 @@ class Spoom::Model
   # : (String full_name) -> Symbol
   #
   # source://spoom//lib/spoom/model/model.rb#255
-  # Register a new symbol by it's full name
-  # If the symbol already exists, it will be returned.
   sig { params(full_name: ::String).returns(::Spoom::Model::Symbol) }
   def register_symbol(full_name); end
 
@@ -4405,7 +4190,6 @@ class Spoom::Model
   # : Hash[String, Symbol]
   #
   # source://spoom//lib/spoom/model/model.rb#229
-  # All the symbols registered in this model
   sig { returns(T::Hash[::String, ::Spoom::Model::Symbol]) }
   def symbols; end
 
@@ -4454,49 +4238,49 @@ class Spoom::Model::Builder < ::Spoom::Model::NamespaceVisitor
 
   # : (Prism::CallNode node) -> void
   #
-  # source://spoom//lib/spoom/model/builder.rb#165
+  # source://spoom//lib/spoom/model/builder.rb#162
   sig { override.params(node: ::Prism::CallNode).void }
   def visit_call_node(node); end
 
   # : (Prism::ClassNode node) -> void
   #
-  # source://spoom//lib/spoom/model/builder.rb#29
+  # source://spoom//lib/spoom/model/builder.rb#26
   sig { override.params(node: ::Prism::ClassNode).void }
   def visit_class_node(node); end
 
   # : (Prism::ConstantPathWriteNode node) -> void
   #
-  # source://spoom//lib/spoom/model/builder.rb#82
+  # source://spoom//lib/spoom/model/builder.rb#79
   sig { override.params(node: ::Prism::ConstantPathWriteNode).void }
   def visit_constant_path_write_node(node); end
 
   # : (Prism::ConstantWriteNode node) -> void
   #
-  # source://spoom//lib/spoom/model/builder.rb#105
+  # source://spoom//lib/spoom/model/builder.rb#102
   sig { override.params(node: ::Prism::ConstantWriteNode).void }
   def visit_constant_write_node(node); end
 
   # : (Prism::DefNode node) -> void
   #
-  # source://spoom//lib/spoom/model/builder.rb#144
+  # source://spoom//lib/spoom/model/builder.rb#141
   sig { override.params(node: ::Prism::DefNode).void }
   def visit_def_node(node); end
 
   # : (Prism::ModuleNode node) -> void
   #
-  # source://spoom//lib/spoom/model/builder.rb#64
+  # source://spoom//lib/spoom/model/builder.rb#61
   sig { override.params(node: ::Prism::ModuleNode).void }
   def visit_module_node(node); end
 
   # : (Prism::MultiWriteNode node) -> void
   #
-  # source://spoom//lib/spoom/model/builder.rb#121
+  # source://spoom//lib/spoom/model/builder.rb#118
   sig { override.params(node: ::Prism::MultiWriteNode).void }
   def visit_multi_write_node(node); end
 
   # : (Prism::SingletonClassNode node) -> void
   #
-  # source://spoom//lib/spoom/model/builder.rb#46
+  # source://spoom//lib/spoom/model/builder.rb#43
   sig { override.params(node: ::Prism::SingletonClassNode).void }
   def visit_singleton_class_node(node); end
 
@@ -4504,25 +4288,25 @@ class Spoom::Model::Builder < ::Spoom::Model::NamespaceVisitor
 
   # : -> Array[Sig]
   #
-  # source://spoom//lib/spoom/model/builder.rb#256
+  # source://spoom//lib/spoom/model/builder.rb#253
   sig { returns(T::Array[::Spoom::Model::Sig]) }
   def collect_sigs; end
 
   # : -> Visibility
   #
-  # source://spoom//lib/spoom/model/builder.rb#251
+  # source://spoom//lib/spoom/model/builder.rb#248
   sig { returns(::Spoom::Model::Visibility) }
   def current_visibility; end
 
   # : (Prism::Node node) -> Array[Comment]
   #
-  # source://spoom//lib/spoom/model/builder.rb#268
+  # source://spoom//lib/spoom/model/builder.rb#265
   sig { params(node: ::Prism::Node).returns(T::Array[::Spoom::Model::Comment]) }
   def node_comments(node); end
 
   # : (Prism::Node node) -> Location
   #
-  # source://spoom//lib/spoom/model/builder.rb#263
+  # source://spoom//lib/spoom/model/builder.rb#260
   sig { params(node: ::Prism::Node).returns(::Spoom::Location) }
   def node_location(node); end
 end
@@ -4554,7 +4338,6 @@ class Spoom::Model::Class < ::Spoom::Model::Namespace
   # : String?
   #
   # source://spoom//lib/spoom/model/model.rb#134
-  # @return [String, nil]
   def superclass_name=(_arg0); end
 end
 
@@ -4748,8 +4531,6 @@ end
 # Methods could be accessors, instance or class methods, aliases, etc.
 #
 # source://spoom//lib/spoom/model/reference.rb#10
-# A reference to something that looks like a constant or a method
-# Constants could be classes, modules, or actual constants.
 class Spoom::Model::Reference < ::T::Struct
   const :kind, ::Spoom::Model::Reference::Kind
   const :name, ::String
@@ -4778,7 +4559,7 @@ class Spoom::Model::Reference < ::T::Struct
     sig { params(name: ::String, location: ::Spoom::Location).returns(::Spoom::Model::Reference) }
     def constant(name, location); end
 
-    # source://sorbet-runtime/0.5.12026/lib/types/struct.rb#13
+    # source://sorbet-runtime/0.5.12079/lib/types/struct.rb#13
     def inherited(s); end
 
     # : (String name, Spoom::Location location) -> Reference
@@ -4997,9 +4778,6 @@ class Spoom::Model::SingletonClass < ::Spoom::Model::Namespace; end
 # e.g. `foo` method can be defined both as a method and as an attribute accessor.
 #
 # source://spoom//lib/spoom/model/model.rb#27
-# A Symbol is a uniquely named entity in the Ruby codebase
-# A symbol can have multiple definitions, e.g. a class can be reopened.
-# Sometimes a symbol can have multiple definitions of different types,
 class Spoom::Model::Symbol
   # : (String full_name) -> void
   #
@@ -5013,7 +4791,6 @@ class Spoom::Model::Symbol
   # : Array[SymbolDef]
   #
   # source://spoom//lib/spoom/model/model.rb#34
-  # The definitions of this symbol (where it exists in the code)
   sig { returns(T::Array[::Spoom::Model::SymbolDef]) }
   def definitions; end
 
@@ -5021,7 +4798,6 @@ class Spoom::Model::Symbol
   # : String
   #
   # source://spoom//lib/spoom/model/model.rb#30
-  # The full, unique name of this symbol
   sig { returns(::String) }
   def full_name; end
 
@@ -5029,7 +4805,6 @@ class Spoom::Model::Symbol
   # : -> String
   #
   # source://spoom//lib/spoom/model/model.rb#44
-  # The short name of this symbol
   sig { returns(::String) }
   def name; end
 
@@ -5048,8 +4823,6 @@ end
 # @abstract It cannot be directly instantiated. Subclasses must implement the `abstract` methods below.
 #
 # source://spoom//lib/spoom/model/model.rb#66
-# A SymbolDef is a definition of a Symbol
-# It can be a class, module, constant, method, etc.
 class Spoom::Model::SymbolDef
   abstract!
 
@@ -5072,7 +4845,6 @@ class Spoom::Model::SymbolDef
   # : Array[Comment]
   #
   # source://spoom//lib/spoom/model/model.rb#85
-  # The comments associated with this definition
   sig { returns(T::Array[::Spoom::Model::Comment]) }
   def comments; end
 
@@ -5080,7 +4852,6 @@ class Spoom::Model::SymbolDef
   # : -> String
   #
   # source://spoom//lib/spoom/model/model.rb#100
-  # The full name of the symbol this definition belongs to
   sig { returns(::String) }
   def full_name; end
 
@@ -5088,7 +4859,6 @@ class Spoom::Model::SymbolDef
   # : Location
   #
   # source://spoom//lib/spoom/model/model.rb#81
-  # The actual code location of this definition
   sig { returns(::Spoom::Location) }
   def location; end
 
@@ -5096,7 +4866,6 @@ class Spoom::Model::SymbolDef
   # : -> String
   #
   # source://spoom//lib/spoom/model/model.rb#106
-  # The short name of the symbol this definition belongs to
   sig { returns(::String) }
   def name; end
 
@@ -5104,7 +4873,6 @@ class Spoom::Model::SymbolDef
   # : Namespace?
   #
   # source://spoom//lib/spoom/model/model.rb#77
-  # The enclosing namespace this definition belongs to
   sig { returns(T.nilable(::Spoom::Model::Namespace)) }
   def owner; end
 
@@ -5112,7 +4880,6 @@ class Spoom::Model::SymbolDef
   # : Symbol
   #
   # source://spoom//lib/spoom/model/model.rb#73
-  # The symbol this definition belongs to
   sig { returns(::Spoom::Model::Symbol) }
   def symbol; end
 end
@@ -5144,8 +4911,6 @@ class Spoom::ParseError < ::Spoom::Error; end
 # It can be used to represent a hierarchy of classes or modules, the dependencies between gems, etc.
 #
 # source://spoom//lib/spoom/poset.rb#9
-# A Poset is a set of elements with a partial order relation.
-# The partial order relation is a binary relation that is reflexive, antisymmetric, and transitive.
 class Spoom::Poset
   extend T::Generic
 
@@ -5167,8 +4932,6 @@ class Spoom::Poset
   # @raise [Error]
   #
   # source://spoom//lib/spoom/poset.rb#25
-  # Get the POSet element for a given value
-  # Raises if the element is not found
   sig { params(value: E).returns(Spoom::Poset::Element[E]) }
   def [](value); end
 
@@ -5180,10 +4943,6 @@ class Spoom::Poset
   # : (E from, E to) -> void
   #
   # source://spoom//lib/spoom/poset.rb#53
-  # Add a direct edge from one element to another
-  # Transitive edges (transitive closure) are automatically computed.
-  # Adds the elements if they don't exist.
-  # If the direct edge already exists, nothing is done.
   sig { params(from: E, to: E).void }
   def add_direct_edge(from, to); end
 
@@ -5191,7 +4950,6 @@ class Spoom::Poset
   # : (E value) -> Element[E]
   #
   # source://spoom//lib/spoom/poset.rb#34
-  # Add an element to the POSet
   sig { params(value: E).returns(Spoom::Poset::Element[E]) }
   def add_element(value); end
 
@@ -5201,7 +4959,6 @@ class Spoom::Poset
   # @return [Boolean]
   #
   # source://spoom//lib/spoom/poset.rb#100
-  # Is there a direct edge from `from` to `to`?
   sig { params(from: E, to: E).returns(T::Boolean) }
   def direct_edge?(from, to); end
 
@@ -5211,7 +4968,6 @@ class Spoom::Poset
   # @return [Boolean]
   #
   # source://spoom//lib/spoom/poset.rb#91
-  # Is there an edge (direct or indirect) from `from` to `to`?
   sig { params(from: E, to: E).returns(T::Boolean) }
   def edge?(from, to); end
 
@@ -5221,7 +4977,6 @@ class Spoom::Poset
   # @return [Boolean]
   #
   # source://spoom//lib/spoom/poset.rb#43
-  # Is the given value a element in the POSet?
   sig { params(value: E).returns(T::Boolean) }
   def element?(value); end
 
@@ -5229,7 +4984,6 @@ class Spoom::Poset
   # : (?direct: bool, ?transitive: bool) -> void
   #
   # source://spoom//lib/spoom/poset.rb#106
-  # Show the POSet as a DOT graph using xdot (used for debugging)
   sig { params(direct: T::Boolean, transitive: T::Boolean).void }
   def show_dot(direct: T.unsafe(nil), transitive: T.unsafe(nil)); end
 
@@ -5237,7 +4991,6 @@ class Spoom::Poset
   # : (?direct: bool, ?transitive: bool) -> String
   #
   # source://spoom//lib/spoom/poset.rb#115
-  # Return the POSet as a DOT graph
   sig { params(direct: T::Boolean, transitive: T::Boolean).returns(::String) }
   def to_dot(direct: T.unsafe(nil), transitive: T.unsafe(nil)); end
 end
@@ -5269,7 +5022,6 @@ class Spoom::Poset::Element
   # : -> Array[E]
   #
   # source://spoom//lib/spoom/poset.rb#178
-  # Direct and indirect ancestors of this element
   sig { returns(T::Array[E]) }
   def ancestors; end
 
@@ -5277,7 +5029,6 @@ class Spoom::Poset::Element
   # : -> Array[E]
   #
   # source://spoom//lib/spoom/poset.rb#184
-  # Direct children of this element
   sig { returns(T::Array[E]) }
   def children; end
 
@@ -5285,7 +5036,6 @@ class Spoom::Poset::Element
   # : -> Array[E]
   #
   # source://spoom//lib/spoom/poset.rb#190
-  # Direct and indirect descendants of this element
   sig { returns(T::Array[E]) }
   def descendants; end
 
@@ -5293,15 +5043,12 @@ class Spoom::Poset::Element
   # : Set[Element[E]]
   #
   # source://spoom//lib/spoom/poset.rb#147
-  # Edges (direct and indirect) from this element to other elements in the same POSet
-  # @return [Set]
   def dfroms; end
 
   # Edges (direct and indirect) from this element to other elements in the same POSet
   # : Set[Element[E]]
   #
   # source://spoom//lib/spoom/poset.rb#147
-  # Edges (direct and indirect) from this element to other elements in the same POSet
   sig { returns(T::Set[Spoom::Poset::Element[E]]) }
   def dtos; end
 
@@ -5309,15 +5056,12 @@ class Spoom::Poset::Element
   # : Set[Element[E]]
   #
   # source://spoom//lib/spoom/poset.rb#147
-  # Edges (direct and indirect) from this element to other elements in the same POSet
-  # @return [Set]
   def froms; end
 
   # Direct parents of this element
   # : -> Array[E]
   #
   # source://spoom//lib/spoom/poset.rb#172
-  # Direct parents of this element
   sig { returns(T::Array[E]) }
   def parents; end
 
@@ -5325,15 +5069,12 @@ class Spoom::Poset::Element
   # : Set[Element[E]]
   #
   # source://spoom//lib/spoom/poset.rb#147
-  # Edges (direct and indirect) from this element to other elements in the same POSet
-  # @return [Set]
   def tos; end
 
   # The value held by this element
   # : E
   #
   # source://spoom//lib/spoom/poset.rb#143
-  # The value held by this element
   sig { returns(E) }
   def value; end
 end
@@ -5357,7 +5098,6 @@ class Spoom::Printer
   # : (String string, *Spoom::Color color) -> String
   #
   # source://spoom//lib/spoom/printer.rb#75
-  # Colorize `string` with color if `@colors`
   sig { params(string: ::String, color: ::Spoom::Color).returns(::String) }
   def colorize(string, *color); end
 
@@ -5365,7 +5105,6 @@ class Spoom::Printer
   # : -> void
   #
   # source://spoom//lib/spoom/printer.rb#28
-  # Decrease indent level
   sig { void }
   def dedent; end
 
@@ -5373,7 +5112,6 @@ class Spoom::Printer
   # : -> void
   #
   # source://spoom//lib/spoom/printer.rb#22
-  # Increase indent level
   sig { void }
   def indent; end
 
@@ -5386,14 +5124,12 @@ class Spoom::Printer
   # : (IO | StringIO)
   #
   # source://spoom//lib/spoom/printer.rb#11
-  # @return [IO, StringIO]
   def out=(_arg0); end
 
   # Print `string` into `out`
   # : (String? string) -> void
   #
   # source://spoom//lib/spoom/printer.rb#34
-  # Print `string` into `out`
   sig { params(string: T.nilable(::String)).void }
   def print(string); end
 
@@ -5403,8 +5139,6 @@ class Spoom::Printer
   # : (String? string, *Color color) -> void
   #
   # source://spoom//lib/spoom/printer.rb#44
-  # Print `string` colored with `color` into `out`
-  # Does not use colors unless `@colors`.
   sig { params(string: T.nilable(::String), color: ::Spoom::Color).void }
   def print_colored(string, *color); end
 
@@ -5412,7 +5146,6 @@ class Spoom::Printer
   # : (String? string) -> void
   #
   # source://spoom//lib/spoom/printer.rb#59
-  # Print `string` with indent and newline
   sig { params(string: T.nilable(::String)).void }
   def printl(string); end
 
@@ -5420,7 +5153,6 @@ class Spoom::Printer
   # : -> void
   #
   # source://spoom//lib/spoom/printer.rb#53
-  # Print a new line into `out`
   sig { void }
   def printn; end
 
@@ -5428,11 +5160,12 @@ class Spoom::Printer
   # : -> void
   #
   # source://spoom//lib/spoom/printer.rb#69
-  # Print an indent space into `out`
   sig { void }
   def printt; end
 end
 
+# : String
+#
 # source://spoom//lib/spoom.rb#8
 Spoom::SPOOM_PATH = T.let(T.unsafe(nil), String)
 
@@ -5504,7 +5237,6 @@ class Spoom::Sorbet::Assertions::AssignNode
   # : Prism::Node
   #
   # source://spoom//lib/spoom/sorbet/assertions.rb#130
-  # @return [Prism::Node]
   def type; end
 
   # : Prism::Node
@@ -5547,7 +5279,6 @@ class Spoom::Sorbet::Assertions::Locator < ::Spoom::Visitor
   # @return [Boolean]
   #
   # source://spoom//lib/spoom/sorbet/assertions.rb#223
-  # Is this node a `T` or `::T` constant?
   sig { params(node: T.nilable(::Prism::Node)).returns(T::Boolean) }
   def t?(node); end
 
@@ -5557,7 +5288,6 @@ class Spoom::Sorbet::Assertions::Locator < ::Spoom::Visitor
   # @return [Boolean]
   #
   # source://spoom//lib/spoom/sorbet/assertions.rb#236
-  # Is this node a `T.let` or `T.cast`?
   sig { params(node: ::Prism::CallNode).returns(T::Boolean) }
   def t_annotation?(node); end
 
@@ -5697,6 +5427,8 @@ class Spoom::Sorbet::Assertions::Locator < ::Spoom::Visitor
   def visit_multi_write_node(node); end
 end
 
+# : Array[Symbol]
+#
 # source://spoom//lib/spoom/sorbet/assertions.rb#147
 Spoom::Sorbet::Assertions::Locator::ANNOTATION_METHODS = T.let(T.unsafe(nil), Array)
 
@@ -5723,6 +5455,8 @@ class Spoom::Sorbet::Assertions::Locator::HeredocVisitor < ::Spoom::Visitor
   def visit(node); end
 end
 
+# : String
+#
 # source://spoom//lib/spoom/sorbet.rb#33
 Spoom::Sorbet::BIN_PATH = T.let(T.unsafe(nil), String)
 
@@ -5751,19 +5485,6 @@ Spoom::Sorbet::CONFIG_PATH = T.let(T.unsafe(nil), String)
 # ```
 #
 # source://spoom//lib/spoom/sorbet/config.rb#26
-# Parse Sorbet config files
-# Parses a Sorbet config file:
-# ```ruby
-# config = Spoom::Sorbet::Config.parse_file("sorbet/config")
-# puts config.paths   # "."
-# Parses a Sorbet config string:
-# config = Spoom::Sorbet::Config.parse_string(<<~CONFIG)
-#   a
-#   --file=b
-#   --ignore=c
-# CONFIG
-# puts config.paths   # "a", "b"
-# puts config.ignore  # "c"
 class Spoom::Sorbet::Config
   # : -> void
   #
@@ -5776,13 +5497,11 @@ class Spoom::Sorbet::Config
   # : Array[String]
   #
   # source://spoom//lib/spoom/sorbet/config.rb#30
-  # @return [Array]
   def allowed_extensions; end
 
   # : Array[String]
   #
   # source://spoom//lib/spoom/sorbet/config.rb#30
-  # @return [Array]
   def allowed_extensions=(_arg0); end
 
   # : -> Config
@@ -5794,13 +5513,11 @@ class Spoom::Sorbet::Config
   # : Array[String]
   #
   # source://spoom//lib/spoom/sorbet/config.rb#30
-  # @return [Array]
   def ignore; end
 
   # : Array[String]
   #
   # source://spoom//lib/spoom/sorbet/config.rb#30
-  # @return [Array]
   def ignore=(_arg0); end
 
   # : bool
@@ -5812,7 +5529,6 @@ class Spoom::Sorbet::Config
   # : bool
   #
   # source://spoom//lib/spoom/sorbet/config.rb#33
-  # @return [Boolean]
   def no_stdlib=(_arg0); end
 
   # Returns self as a string of options that can be passed to Sorbet
@@ -5830,16 +5546,6 @@ class Spoom::Sorbet::Config
   # : -> String
   #
   # source://spoom//lib/spoom/sorbet/config.rb#66
-  # Returns self as a string of options that can be passed to Sorbet
-  # Example:
-  # ~~~rb
-  # config = Sorbet::Config.new
-  # config.paths << "/foo"
-  # config.paths << "/bar"
-  # config.ignore << "/baz"
-  # config.allowed_extensions << ".rb"
-  # puts config.options_string # "/foo /bar --ignore /baz --allowed-extension .rb"
-  # ~~~
   sig { returns(::String) }
   def options_string; end
 
@@ -5852,7 +5558,6 @@ class Spoom::Sorbet::Config
   # : Array[String]
   #
   # source://spoom//lib/spoom/sorbet/config.rb#30
-  # @return [Array]
   def paths=(_arg0); end
 
   class << self
@@ -5878,6 +5583,8 @@ class Spoom::Sorbet::Config
   end
 end
 
+# : Array[String]
+#
 # source://spoom//lib/spoom/sorbet/config.rb#27
 Spoom::Sorbet::Config::DEFAULT_ALLOWED_EXTENSIONS = T.let(T.unsafe(nil), Array)
 
@@ -5904,21 +5611,27 @@ class Spoom::Sorbet::Error::Killed < ::Spoom::Sorbet::Error; end
 # source://spoom//lib/spoom/sorbet.rb#17
 class Spoom::Sorbet::Error::Segfault < ::Spoom::Sorbet::Error; end
 
-# source://spoom//lib/spoom/sorbet/errors.rb#6
+# source://spoom//lib/spoom/sorbet/errors.rb#8
 module Spoom::Sorbet::Errors
   class << self
     # : (Array[Error] errors) -> Array[Error]
     #
-    # source://spoom//lib/spoom/sorbet/errors.rb#11
+    # source://spoom//lib/spoom/sorbet/errors.rb#13
     sig { params(errors: T::Array[::Spoom::Sorbet::Errors::Error]).returns(T::Array[::Spoom::Sorbet::Errors::Error]) }
     def sort_errors_by_code(errors); end
+
+    # : (Array[Error]) -> REXML::Document
+    #
+    # source://spoom//lib/spoom/sorbet/errors.rb#18
+    sig { params(errors: T::Array[::Spoom::Sorbet::Errors::Error]).returns(::REXML::Document) }
+    def to_junit_xml(errors); end
   end
 end
 
-# source://spoom//lib/spoom/sorbet/errors.rb#7
+# source://spoom//lib/spoom/sorbet/errors.rb#9
 Spoom::Sorbet::Errors::DEFAULT_ERROR_URL_BASE = T.let(T.unsafe(nil), String)
 
-# source://spoom//lib/spoom/sorbet/errors.rb#121
+# source://spoom//lib/spoom/sorbet/errors.rb#149
 class Spoom::Sorbet::Errors::Error
   include ::Comparable
 
@@ -5926,7 +5639,7 @@ class Spoom::Sorbet::Errors::Error
   #
   # @return [Error] a new instance of Error
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#138
+  # source://spoom//lib/spoom/sorbet/errors.rb#166
   sig do
     params(
       file: T.nilable(::String),
@@ -5941,71 +5654,73 @@ class Spoom::Sorbet::Errors::Error
   # By default errors are sorted by location
   # : (untyped other) -> Integer
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#149
-  # By default errors are sorted by location
+  # source://spoom//lib/spoom/sorbet/errors.rb#177
   sig { params(other: T.untyped).returns(::Integer) }
   def <=>(other); end
 
   # : Integer?
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#128
-  # @return [Integer, nil]
+  # source://spoom//lib/spoom/sorbet/errors.rb#156
   def code; end
 
   # : String?
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#125
+  # source://spoom//lib/spoom/sorbet/errors.rb#153
   sig { returns(T.nilable(::String)) }
   def file; end
 
   # Other files associated with the error
   # : Set[String]
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#135
-  # Other files associated with the error
+  # source://spoom//lib/spoom/sorbet/errors.rb#163
   sig { returns(T::Set[::String]) }
   def files_from_error_sections; end
 
   # : Integer?
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#128
+  # source://spoom//lib/spoom/sorbet/errors.rb#156
   sig { returns(T.nilable(::Integer)) }
   def line; end
 
   # : String?
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#125
-  # @return [String, nil]
+  # source://spoom//lib/spoom/sorbet/errors.rb#153
   def message; end
 
   # : Array[String]
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#131
+  # source://spoom//lib/spoom/sorbet/errors.rb#159
   sig { returns(T::Array[::String]) }
   def more; end
 
+  # : -> REXML::Element
+  #
+  # source://spoom//lib/spoom/sorbet/errors.rb#189
+  sig { returns(::REXML::Element) }
+  def to_junit_xml_element; end
+
   # : -> String
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#156
+  # source://spoom//lib/spoom/sorbet/errors.rb#184
   sig { returns(::String) }
   def to_s; end
 end
 
 # Parse errors from Sorbet output
 #
-# source://spoom//lib/spoom/sorbet/errors.rb#16
+# source://spoom//lib/spoom/sorbet/errors.rb#47
 class Spoom::Sorbet::Errors::Parser
   # : (?error_url_base: String) -> void
   #
   # @return [Parser] a new instance of Parser
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#39
+  # source://spoom//lib/spoom/sorbet/errors.rb#67
   sig { params(error_url_base: ::String).void }
   def initialize(error_url_base: T.unsafe(nil)); end
 
   # : (String output) -> Array[Error]
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#46
+  # source://spoom//lib/spoom/sorbet/errors.rb#74
   sig { params(output: ::String).returns(T::Array[::Spoom::Sorbet::Errors::Error]) }
   def parse(output); end
 
@@ -6015,7 +5730,7 @@ class Spoom::Sorbet::Errors::Parser
   #
   # @raise [ParseError]
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#110
+  # source://spoom//lib/spoom/sorbet/errors.rb#138
   sig { params(line: ::String).void }
   def append_error(line); end
 
@@ -6023,19 +5738,19 @@ class Spoom::Sorbet::Errors::Parser
   #
   # @raise [ParseError]
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#102
+  # source://spoom//lib/spoom/sorbet/errors.rb#130
   sig { void }
   def close_error; end
 
   # : (String error_url_base) -> Regexp
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#69
+  # source://spoom//lib/spoom/sorbet/errors.rb#97
   sig { params(error_url_base: ::String).returns(::Regexp) }
   def error_line_match_regexp(error_url_base); end
 
   # : (String line) -> Error?
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#86
+  # source://spoom//lib/spoom/sorbet/errors.rb#114
   sig { params(line: ::String).returns(T.nilable(::Spoom::Sorbet::Errors::Error)) }
   def match_error_line(line); end
 
@@ -6043,28 +5758,32 @@ class Spoom::Sorbet::Errors::Parser
   #
   # @raise [ParseError]
   #
-  # source://spoom//lib/spoom/sorbet/errors.rb#95
+  # source://spoom//lib/spoom/sorbet/errors.rb#123
   sig { params(error: ::Spoom::Sorbet::Errors::Error).void }
   def open_error(error); end
 
   class << self
     # : (String output, ?error_url_base: String) -> Array[Error]
     #
-    # source://spoom//lib/spoom/sorbet/errors.rb#32
+    # source://spoom//lib/spoom/sorbet/errors.rb#60
     sig { params(output: ::String, error_url_base: ::String).returns(T::Array[::Spoom::Sorbet::Errors::Error]) }
     def parse_string(output, error_url_base: T.unsafe(nil)); end
   end
 end
 
-# source://spoom//lib/spoom/sorbet/errors.rb#19
+# source://spoom//lib/spoom/sorbet/errors.rb#50
 Spoom::Sorbet::Errors::Parser::HEADER = T.let(T.unsafe(nil), Array)
 
-# source://spoom//lib/spoom/sorbet/errors.rb#17
+# source://spoom//lib/spoom/sorbet/errors.rb#48
 class Spoom::Sorbet::Errors::Parser::ParseError < ::Spoom::Error; end
 
+# : String
+#
 # source://spoom//lib/spoom/sorbet.rb#31
 Spoom::Sorbet::GEM_PATH = T.let(T.unsafe(nil), String)
 
+# : String
+#
 # source://spoom//lib/spoom/sorbet.rb#32
 Spoom::Sorbet::GEM_VERSION = T.let(T.unsafe(nil), String)
 
@@ -6106,16 +5825,14 @@ module Spoom::Sorbet::Sigils
     # changes the sigil in the file at the passed path to the specified new strictness
     # : ((String | Pathname) path, String new_strictness) -> bool
     #
-    # source://spoom//lib/spoom/sorbet/sigils.rb#68
-    # changes the sigil in the file at the passed path to the specified new strictness
+    # source://spoom//lib/spoom/sorbet/sigils.rb#65
     sig { params(path: T.any(::Pathname, ::String), new_strictness: ::String).returns(T::Boolean) }
     def change_sigil_in_file(path, new_strictness); end
 
     # changes the sigil to have a new strictness in a list of files
     # : (Array[String] path_list, String new_strictness) -> Array[String]
     #
-    # source://spoom//lib/spoom/sorbet/sigils.rb#79
-    # changes the sigil to have a new strictness in a list of files
+    # source://spoom//lib/spoom/sorbet/sigils.rb#76
     sig { params(path_list: T::Array[::String], new_strictness: ::String).returns(T::Array[::String]) }
     def change_sigil_in_files(path_list, new_strictness); end
 
@@ -6123,33 +5840,28 @@ module Spoom::Sorbet::Sigils
     # * returns nil if no sigil
     # : ((String | Pathname) path) -> String?
     #
-    # source://spoom//lib/spoom/sorbet/sigils.rb#59
-    # returns a string containing the strictness of a sigil in a file at the passed path
-    # * returns nil if no sigil
+    # source://spoom//lib/spoom/sorbet/sigils.rb#56
     sig { params(path: T.any(::Pathname, ::String)).returns(T.nilable(::String)) }
     def file_strictness(path); end
 
     # returns the full sigil comment string for the passed strictness
     # : (String strictness) -> String
     #
-    # source://spoom//lib/spoom/sorbet/sigils.rb#34
-    # returns the full sigil comment string for the passed strictness
+    # source://spoom//lib/spoom/sorbet/sigils.rb#31
     sig { params(strictness: ::String).returns(::String) }
     def sigil_string(strictness); end
 
     # returns the strictness of a sigil in the passed file content string (nil if no sigil)
     # : (String content) -> String?
     #
-    # source://spoom//lib/spoom/sorbet/sigils.rb#46
-    # returns the strictness of a sigil in the passed file content string (nil if no sigil)
+    # source://spoom//lib/spoom/sorbet/sigils.rb#43
     sig { params(content: ::String).returns(T.nilable(::String)) }
     def strictness_in_content(content); end
 
     # returns a string which is the passed content but with the sigil updated to a new strictness
     # : (String content, String new_strictness) -> String
     #
-    # source://spoom//lib/spoom/sorbet/sigils.rb#52
-    # returns a string which is the passed content but with the sigil updated to a new strictness
+    # source://spoom//lib/spoom/sorbet/sigils.rb#49
     sig { params(content: ::String, new_strictness: ::String).returns(::String) }
     def update_sigil(content, new_strictness); end
 
@@ -6158,14 +5870,15 @@ module Spoom::Sorbet::Sigils
     #
     # @return [Boolean]
     #
-    # source://spoom//lib/spoom/sorbet/sigils.rb#40
-    # returns true if the passed string is a valid strictness (else false)
+    # source://spoom//lib/spoom/sorbet/sigils.rb#37
     sig { params(strictness: ::String).returns(T::Boolean) }
     def valid_strictness?(strictness); end
   end
 end
 
-# source://spoom//lib/spoom/sorbet/sigils.rb#29
+# : Array[String]
+#
+# source://spoom//lib/spoom/sorbet/sigils.rb#26
 Spoom::Sorbet::Sigils::SIGIL_REGEXP = T.let(T.unsafe(nil), Regexp)
 
 # source://spoom//lib/spoom/sorbet/sigils.rb#11
@@ -6248,7 +5961,7 @@ class Spoom::Sorbet::Sigs::RBIToRBSTranslator
 
     # : (RBI::Sig sig, RBI::Attr node, positional_names: bool) -> String
     #
-    # source://spoom//lib/spoom/sorbet/sigs.rb#173
+    # source://spoom//lib/spoom/sorbet/sigs.rb#178
     sig { params(sig: ::RBI::Sig, node: ::RBI::Attr, positional_names: T::Boolean).returns(::String) }
     def translate_attr_sig(sig, node, positional_names: T.unsafe(nil)); end
 
@@ -6260,12 +5973,12 @@ class Spoom::Sorbet::Sigs::RBIToRBSTranslator
   end
 end
 
-# source://spoom//lib/spoom/sorbet/sigs.rb#182
+# source://spoom//lib/spoom/sorbet/sigs.rb#187
 class Spoom::Sorbet::Sigs::RBSToRBITranslator
   class << self
     # : (RBI::RBSComment comment, (RBI::Method | RBI::Attr) node) -> String?
     #
-    # source://spoom//lib/spoom/sorbet/sigs.rb#187
+    # source://spoom//lib/spoom/sorbet/sigs.rb#192
     sig { params(comment: ::RBI::RBSComment, node: T.any(::RBI::Attr, ::RBI::Method)).returns(T.nilable(::String)) }
     def translate(comment, node); end
 
@@ -6273,13 +5986,13 @@ class Spoom::Sorbet::Sigs::RBSToRBITranslator
 
     # : (RBI::RBSComment comment, RBI::Attr node) -> String
     #
-    # source://spoom//lib/spoom/sorbet/sigs.rb#228
+    # source://spoom//lib/spoom/sorbet/sigs.rb#235
     sig { params(comment: ::RBI::RBSComment, node: ::RBI::Attr).returns(::String) }
     def translate_attr_sig(comment, node); end
 
     # : (RBI::RBSComment rbs_comment, RBI::Method node) -> String
     #
-    # source://spoom//lib/spoom/sorbet/sigs.rb#201
+    # source://spoom//lib/spoom/sorbet/sigs.rb#206
     sig { params(rbs_comment: ::RBI::RBSComment, node: ::RBI::Method).returns(::String) }
     def translate_method_sig(rbs_comment, node); end
   end
@@ -6287,26 +6000,27 @@ end
 
 # From https://github.com/Shopify/ruby-lsp/blob/9154bfc6ef/lib/ruby_lsp/document.rb#L127
 #
-# source://spoom//lib/spoom/sorbet/sigs.rb#248
+# source://spoom//lib/spoom/sorbet/sigs.rb#255
 class Spoom::Sorbet::Sigs::Scanner
   # : (String source) -> void
   #
   # @return [Scanner] a new instance of Scanner
   #
-  # source://spoom//lib/spoom/sorbet/sigs.rb#252
+  # source://spoom//lib/spoom/sorbet/sigs.rb#259
   sig { params(source: ::String).void }
   def initialize(source); end
 
   # Finds the character index inside the source string for a given line and column
   # : (Integer line, Integer character) -> Integer
   #
-  # source://spoom//lib/spoom/sorbet/sigs.rb#260
-  # Finds the character index inside the source string for a given line and column
+  # source://spoom//lib/spoom/sorbet/sigs.rb#267
   sig { params(line: ::Integer, character: ::Integer).returns(::Integer) }
   def find_char_position(line, character); end
 end
 
-# source://spoom//lib/spoom/sorbet/sigs.rb#249
+# : Integer
+#
+# source://spoom//lib/spoom/sorbet/sigs.rb#256
 Spoom::Sorbet::Sigs::Scanner::LINE_BREAK = T.let(T.unsafe(nil), Integer)
 
 # source://spoom//lib/spoom/sorbet/sigs.rb#88
@@ -6352,7 +6066,6 @@ class Spoom::Timeline
   # : (Array[Time] dates) -> Array[Git::Commit]
   #
   # source://spoom//lib/spoom/timeline.rb#34
-  # Return one commit for each date in `dates`
   sig { params(dates: T::Array[::Time]).returns(T::Array[::Spoom::Git::Commit]) }
   def commits_for_dates(dates); end
 
@@ -6360,7 +6073,6 @@ class Spoom::Timeline
   # : -> Array[Time]
   #
   # source://spoom//lib/spoom/timeline.rb#21
-  # Return all months between `from` and `to`
   sig { returns(T::Array[::Time]) }
   def months; end
 
@@ -6368,7 +6080,6 @@ class Spoom::Timeline
   # : -> Array[Git::Commit]
   #
   # source://spoom//lib/spoom/timeline.rb#15
-  # Return one commit for each month between `from` and `to`
   sig { returns(T::Array[::Spoom::Git::Commit]) }
   def ticks; end
 end
diff --git a/Library/Homebrew/sorbet/rbi/gems/vernier@1.7.0.rbi b/Library/Homebrew/sorbet/rbi/gems/vernier@1.7.1.rbi
similarity index 100%
rename from Library/Homebrew/sorbet/rbi/gems/vernier@1.7.0.rbi
rename to Library/Homebrew/sorbet/rbi/gems/vernier@1.7.1.rbi
diff --git a/Library/Homebrew/tap.rb b/Library/Homebrew/tap.rb
index 2cf80ed4a5..bf83e7ee29 100644
--- a/Library/Homebrew/tap.rb
+++ b/Library/Homebrew/tap.rb
@@ -590,8 +590,9 @@ class Tap
     end
     return unless remote
 
-    current_upstream_head = T.must(git_repository.origin_branch_name)
-    return if requested_remote.blank? && git_repository.origin_has_branch?(current_upstream_head)
+    current_upstream_head = git_repository.origin_branch_name
+    return if current_upstream_head.present? && requested_remote.blank? &&
+              git_repository.origin_has_branch?(current_upstream_head)
 
     args = %w[fetch]
     args << "--quiet" if quiet
@@ -600,6 +601,8 @@ class Tap
     safe_system "git", "-C", path, *args
     git_repository.set_head_origin_auto
 
+    current_upstream_head ||= T.must(git_repository.origin_branch_name)
+
     new_upstream_head = T.must(git_repository.origin_branch_name)
     return if new_upstream_head == current_upstream_head
 
@@ -985,19 +988,21 @@ class Tap
   # Array with autobump names
   sig { returns(T::Array[String]) }
   def autobump
-    autobump_packages = if core_cask_tap?
-      Homebrew::API::Cask.all_casks
-    elsif core_tap?
-      Homebrew::API::Formula.all_formulae
-    else
-      {}
-    end
+    # TODO: uncomment when official taps are prepared to use new autobump system
+    #
+    # autobump_packages = if core_cask_tap?
+    #   Homebrew::API::Cask.all_casks
+    # elsif core_tap?
+    #   Homebrew::API::Formula.all_formulae
+    # else
+    #   {}
+    # end
+    #
+    # @autobump ||= autobump_packages.select do |_, p|
+    #   p["autobump"] == true && !p["skip_livecheck"] && !(p["deprecated"] || p["disabled"])
+    # end.keys
 
-    @autobump ||= autobump_packages.select do |_, p|
-      p["autobump"] == true && !p["skip_livecheck"] && !(p["deprecated"] || p["disabled"])
-    end.keys
-
-    if @autobump.empty?
+    if @autobump.blank?
       @autobump = if (autobump_file = path/HOMEBREW_TAP_AUTOBUMP_FILE).file?
         autobump_file.readlines(chomp: true)
       else
diff --git a/Library/Homebrew/test/bundle/commands/cleanup_spec.rb b/Library/Homebrew/test/bundle/commands/cleanup_spec.rb
index d234f07b1e..e85f78ddc7 100644
--- a/Library/Homebrew/test/bundle/commands/cleanup_spec.rb
+++ b/Library/Homebrew/test/bundle/commands/cleanup_spec.rb
@@ -158,6 +158,12 @@ RSpec.describe Homebrew::Bundle::Commands::Cleanup do
       expect(described_class).to receive(:system_output_no_stderr).and_return("")
       expect { described_class.run(force: true) }.to output(/Uninstalled 2 casks/).to_stdout
     end
+
+    it "does not uninstall casks if --brews is disabled" do
+      expect(Kernel).not_to receive(:system)
+      expect(described_class).to receive(:system_output_no_stderr).and_return("")
+      expect { described_class.run(force: true, casks: false) }.not_to output.to_stdout
+    end
   end
 
   context "when there are casks to zap" do
@@ -174,6 +180,12 @@ RSpec.describe Homebrew::Bundle::Commands::Cleanup do
       expect(described_class).to receive(:system_output_no_stderr).and_return("")
       expect { described_class.run(force: true, zap: true) }.to output(/Uninstalled 2 casks/).to_stdout
     end
+
+    it "does not uninstall casks if --casks is disabled" do
+      expect(Kernel).not_to receive(:system)
+      expect(described_class).to receive(:system_output_no_stderr).and_return("")
+      expect { described_class.run(force: true, zap: true, casks: false) }.not_to output.to_stdout
+    end
   end
 
   context "when there are formulae to uninstall" do
@@ -190,6 +202,12 @@ RSpec.describe Homebrew::Bundle::Commands::Cleanup do
       expect(described_class).to receive(:system_output_no_stderr).and_return("")
       expect { described_class.run(force: true) }.to output(/Uninstalled 2 formulae/).to_stdout
     end
+
+    it "does not uninstall formulae if --casks is disabled" do
+      expect(Kernel).not_to receive(:system)
+      expect(described_class).to receive(:system_output_no_stderr).and_return("")
+      expect { described_class.run(force: true, brews: false) }.not_to output.to_stdout
+    end
   end
 
   context "when there are taps to untap" do
@@ -206,6 +224,12 @@ RSpec.describe Homebrew::Bundle::Commands::Cleanup do
       expect(described_class).to receive(:system_output_no_stderr).and_return("")
       described_class.run(force: true)
     end
+
+    it "does not untap taps if --taps is disabled" do
+      expect(Kernel).not_to receive(:system)
+      expect(described_class).to receive(:system_output_no_stderr).and_return("")
+      described_class.run(force: true, taps: false)
+    end
   end
 
   context "when there are VSCode extensions to uninstall" do
@@ -223,6 +247,12 @@ RSpec.describe Homebrew::Bundle::Commands::Cleanup do
       expect(described_class).to receive(:system_output_no_stderr).and_return("")
       described_class.run(force: true)
     end
+
+    it "does not uninstall extensions if --vscode is disabled" do
+      expect(Kernel).not_to receive(:system)
+      expect(described_class).to receive(:system_output_no_stderr).and_return("")
+      described_class.run(force: true, vscode: false)
+    end
   end
 
   context "when there are casks and formulae to uninstall and taps to untap but without passing `--force`" do
diff --git a/Library/Homebrew/test/bundle/dsl_spec.rb b/Library/Homebrew/test/bundle/dsl_spec.rb
index 636bda3334..27f47bffd3 100644
--- a/Library/Homebrew/test/bundle/dsl_spec.rb
+++ b/Library/Homebrew/test/bundle/dsl_spec.rb
@@ -60,6 +60,20 @@ RSpec.describe Homebrew::Bundle::Dsl do
     end
   end
 
+  context "with multiple cask_args" do
+    subject(:dsl) do
+      dsl_from_string <<~EOS
+        cask_args appdir: '/global-apps'
+        cask_args require_sha: true
+        cask_args appdir: '~/my-apps'
+      EOS
+    end
+
+    it "merges the arguments" do
+      expect(dsl.cask_arguments).to eql(appdir: "~/my-apps", require_sha: true)
+    end
+  end
+
   context "with invalid input" do
     it "handles completely invalid code" do
       expect { dsl_from_string "abcdef" }.to raise_error(RuntimeError)
diff --git a/Library/Homebrew/test/formatter_spec.rb b/Library/Homebrew/test/formatter_spec.rb
index e02451a594..ba866ee8f5 100644
--- a/Library/Homebrew/test/formatter_spec.rb
+++ b/Library/Homebrew/test/formatter_spec.rb
@@ -110,4 +110,18 @@ RSpec.describe Formatter do
       expect(described_class.format_help_text(text, width: 80)).to eq expected
     end
   end
+
+  describe "::truncate" do
+    it "returns the original string if it's shorter than max length" do
+      expect(described_class.truncate("short", max: 10)).to eq("short")
+    end
+
+    it "truncates strings longer than max length" do
+      expect(described_class.truncate("this is a long string", max: 10)).to eq("this is...")
+    end
+
+    it "uses custom omission string" do
+      expect(described_class.truncate("this is a long string", max: 10, omission: " [...]")).to eq("this [...]")
+    end
+  end
 end
diff --git a/Library/Homebrew/test/livecheck/strategy/bitbucket_spec.rb b/Library/Homebrew/test/livecheck/strategy/bitbucket_spec.rb
index a0a9c3eb47..3e3e0070bc 100644
--- a/Library/Homebrew/test/livecheck/strategy/bitbucket_spec.rb
+++ b/Library/Homebrew/test/livecheck/strategy/bitbucket_spec.rb
@@ -16,11 +16,11 @@ RSpec.describe Homebrew::Livecheck::Strategy::Bitbucket do
   let(:generated) do
     {
       get:       {
-        url:   "https://bitbucket.org/abc/def/downloads/?tab=tags",
+        url:   "https://bitbucket.org/abc/def/downloads/?tab=tags&iframe=true&spa=0",
         regex: /]| ]*?class="name"[^>]*?>\s*v?(\d+(?:\.\d+)+)\s*?=")
+    exact_requirement = described_class.new([:big_sur], comparator: "==")
+    range_requirement = described_class.new([[:catalina, :big_sur]], comparator: "==")
+    expect(no_requirement.maximum_version).to eq macos_newest_allowed
+    expect(max_requirement.maximum_version).to eq big_sur_major
+    expect(min_requirement.maximum_version).to eq macos_newest_allowed
+    expect(exact_requirement.maximum_version).to eq big_sur_major
+    expect(range_requirement.maximum_version).to eq big_sur_major
+  end
+
   specify "#allows?" do
     no_requirement = described_class.new
     max_requirement = described_class.new([:mojave], comparator: "<=")
diff --git a/Library/Homebrew/test/rubocops/patches_spec.rb b/Library/Homebrew/test/rubocops/patches_spec.rb
index 45a2acbb91..9f568fd453 100644
--- a/Library/Homebrew/test/rubocops/patches_spec.rb
+++ b/Library/Homebrew/test/rubocops/patches_spec.rb
@@ -39,6 +39,7 @@ RSpec.describe RuboCop::Cop::FormulaAudit::Patches do
         "http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=5;filename=patch-libunac1.txt;att=1;bug=623340",
         "https://patch-diff.githubusercontent.com/raw/foo/foo-bar/pull/100.patch",
         "https://github.com/dlang/dub/commit/2c916b1a7999a050ac4970c3415ff8f91cd487aa.patch",
+        "https://bitbucket.org/multicoreware/x265_git/commits/b354c009a60bcd6d7fc04014e200a1ee9c45c167/raw",
       ]
       patch_urls.each do |patch_url|
         source = <<~EOS
@@ -78,6 +79,12 @@ RSpec.describe RuboCop::Cop::FormulaAudit::Patches do
           expect_offense_hash(message: <<~EOS.chomp, severity: :convention, line: 5, column: 4, source:)
             FormulaAudit/Patches: GitHub patches should use the full_index parameter: #{patch_url}?full_index=1
           EOS
+        elsif patch_url.start_with?("https://bitbucket.org/")
+          commit = "b354c009a60bcd6d7fc04014e200a1ee9c45c167"
+          fixed_url = "https://api.bitbucket.org/2.0/repositories/multicoreware/x265_git/diff/#{commit}"
+          expect_offense_hash(message: <<~EOS.chomp, severity: :convention, line: 5, column: 4, source:)
+            FormulaAudit/Patches: Bitbucket patches should use the api url: #{fixed_url}
+          EOS
         end
         expected_offense.zip([inspect_source(source).last]).each do |expected, actual|
           expect(actual.message).to eq(expected[:message])
diff --git a/Library/Homebrew/test/rubocops/urls_spec.rb b/Library/Homebrew/test/rubocops/urls_spec.rb
index 80bf49199a..fab6d84ada 100644
--- a/Library/Homebrew/test/rubocops/urls_spec.rb
+++ b/Library/Homebrew/test/rubocops/urls_spec.rb
@@ -177,6 +177,14 @@ RSpec.describe RuboCop::Cop::FormulaAudit::Urls do
       "url" => "svn+http://brew.sh/foo/bar",
       "msg" => "Use of the svn+http:// scheme is deprecated, pass `:using => :svn` instead",
       "col" => 2,
+    }, {
+      "url" => "https://🫠.sh/foo/bar",
+      "msg" => "Please use the ASCII (Punycode encoded host, URL-encoded path and query) version of https://🫠.sh/foo/bar.",
+      "col" => 2,
+    }, {
+      "url" => "https://ßrew.sh/foo/bar",
+      "msg" => "Please use the ASCII (Punycode encoded host, URL-encoded path and query) version of https://ßrew.sh/foo/bar.",
+      "col" => 2,
     }]
   end
 
diff --git a/Library/Homebrew/test/utils/github_spec.rb b/Library/Homebrew/test/utils/github_spec.rb
index e07f093e7c..d4b6ca2ac6 100644
--- a/Library/Homebrew/test/utils/github_spec.rb
+++ b/Library/Homebrew/test/utils/github_spec.rb
@@ -71,14 +71,6 @@ RSpec.describe GitHub do
       )
       expect(urls).to eq(["https://api.github.com/repos/Homebrew/homebrew-core/actions/artifacts/1969725476/zip"])
     end
-
-    it "supports pattern matching" do
-      urls = described_class.get_artifact_urls(
-        described_class.get_workflow_run("Homebrew", "brew", "17068",
-                                         workflow_id: "pkg-installer.yml", artifact_pattern: "Homebrew-*.pkg"),
-      )
-      expect(urls).to eq(["https://api.github.com/repos/Homebrew/brew/actions/artifacts/1405050842/zip"])
-    end
   end
 
   describe "::pull_request_commits", :needs_network do
diff --git a/Library/Homebrew/uninstall.rb b/Library/Homebrew/uninstall.rb
index ba03abc04f..c8d0e59ae8 100644
--- a/Library/Homebrew/uninstall.rb
+++ b/Library/Homebrew/uninstall.rb
@@ -67,7 +67,18 @@ module Homebrew
               end
 
               unversioned_name = f.name.gsub(/@.+$/, "")
-              maybe_paths = Dir.glob("#{f.etc}/*#{unversioned_name}*")
+              maybe_paths = Dir.glob("#{f.etc}/#{unversioned_name}*")
+              excluded_names = Homebrew::API::Formula.all_formulae.keys
+              maybe_paths = maybe_paths.reject do |path|
+                # Remove extension only if a file
+                # (f.e. directory with name "openssl@1.1" will be trimmed to "openssl@1")
+                basename = if File.directory?(path)
+                  File.basename(path)
+                else
+                  File.basename(path, ".*")
+                end
+                excluded_names.include?(basename)
+              end
               maybe_paths -= paths if paths.present?
               if maybe_paths.present?
                 puts
diff --git a/Library/Homebrew/utils/formatter.rb b/Library/Homebrew/utils/formatter.rb
index 9815425204..3e7428c80e 100644
--- a/Library/Homebrew/utils/formatter.rb
+++ b/Library/Homebrew/utils/formatter.rb
@@ -54,6 +54,19 @@ module Formatter
     label(label, string, :red)
   end
 
+  # Truncate a string to a specific length.
+  #
+  # @api internal
+  sig { params(string: String, max: Integer, omission: String).returns(String) }
+  def self.truncate(string, max: 30, omission: "...")
+    return string if string.length <= max
+
+    length_with_room_for_omission = max - omission.length
+    truncated = string[0, length_with_room_for_omission]
+
+    "#{truncated}#{omission}"
+  end
+
   # Wraps text to fit within a given number of columns using regular expressions that:
   #
   # 1. convert hard-wrapped paragraphs to a single line
diff --git a/Library/Homebrew/utils/spdx.rb b/Library/Homebrew/utils/spdx.rb
index bf45bf377c..7b8e69e865 100644
--- a/Library/Homebrew/utils/spdx.rb
+++ b/Library/Homebrew/utils/spdx.rb
@@ -87,7 +87,7 @@ module SPDX
     return ALLOWED_LICENSE_SYMBOLS.include? license if license.is_a? Symbol
 
     license = license.delete_suffix "+"
-    license_data["licenses"].any? { |spdx_license| spdx_license["licenseId"] == license }
+    license_data["licenses"].any? { |spdx_license| spdx_license["licenseId"].downcase == license.downcase }
   end
 
   sig { params(license: T.any(String, Symbol)).returns(T::Boolean) }
@@ -97,14 +97,14 @@ module SPDX
 
     license = license.to_s.delete_suffix "+"
     license_data["licenses"].none? do |spdx_license|
-      spdx_license["licenseId"] == license && !spdx_license["isDeprecatedLicenseId"]
+      spdx_license["licenseId"].downcase == license.downcase && !spdx_license["isDeprecatedLicenseId"]
     end
   end
 
   sig { params(exception: String).returns(T::Boolean) }
   def valid_license_exception?(exception)
     exception_data["exceptions"].any? do |spdx_exception|
-      spdx_exception["licenseExceptionId"] == exception && !spdx_exception["isDeprecatedLicenseId"]
+      spdx_exception["licenseExceptionId"].downcase == exception.downcase && !spdx_exception["isDeprecatedLicenseId"]
     end
   end
 
diff --git a/Library/Homebrew/vendor/bundle/bundler/setup.rb b/Library/Homebrew/vendor/bundle/bundler/setup.rb
index 3ec5337dc4..f58f1245dc 100644
--- a/Library/Homebrew/vendor/bundle/bundler/setup.rb
+++ b/Library/Homebrew/vendor/bundle/bundler/setup.rb
@@ -45,26 +45,26 @@ $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/coderay-1.1.3/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/csv-3.3.4/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/diff-lcs-1.6.1/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/diff-lcs-1.6.2/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/docile-1.4.1/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/elftools-1.3.1/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/erubi-1.13.1/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/hana-1.3.7/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/json-2.11.3")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/json-2.11.3/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/json-2.12.0")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/json-2.12.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/regexp_parser-2.10.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/simpleidn-0.2.3/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/json_schemer-2.4.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rexml-3.4.1/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/kramdown-2.5.1/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/language_server-protocol-3.17.0.4/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/language_server-protocol-3.17.0.5/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/lint_roller-1.1.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/logger-1.7.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/method_source-1.1.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/minitest-5.25.5/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/netrc-0.11.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/parallel-1.27.0/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/parallel_tests-5.1.0/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/parallel_tests-5.2.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/racc-1.8.1")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/racc-1.8.1/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/parser-3.3.8.0/lib")
@@ -76,10 +76,10 @@ $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/pycall-1.5.2")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/pycall-1.5.2/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rainbow-3.1.1/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/rbs-3.9.2")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rbs-3.9.2/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-runtime-0.5.12067/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rbi-0.3.2/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/rbs-3.9.4")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rbs-3.9.4/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-runtime-0.5.12117/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rbi-0.3.3/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/redcarpet-3.6.1")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/redcarpet-3.6.1/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rspec-support-3.13.3/lib")
@@ -95,12 +95,12 @@ $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/ruby-progressbar-1.13.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/unicode-emoji-4.0.4/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/unicode-display_width-3.1.4/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rubocop-1.75.5/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rubocop-1.75.6/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rubocop-md-2.0.1/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rubocop-performance-1.25.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rubocop-rspec-3.6.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rubocop-sorbet-0.10.0/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/ruby-lsp-0.23.17/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/ruby-lsp-0.23.21/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/ruby-macho-4.1.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/ruby-prof-1.7.1")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/ruby-prof-1.7.1/lib")
@@ -108,16 +108,16 @@ $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/simplecov_json_formatter-0.1.4/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/simplecov-0.22.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/simplecov-cobertura-2.1.0/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-static-0.5.12067-universal-darwin/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-0.5.12067/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-static-and-runtime-0.5.12067/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-static-0.5.12117-universal-darwin/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-0.5.12117/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-static-and-runtime-0.5.12117/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/thor-1.3.2/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/spoom-1.6.1/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/spoom-1.6.3/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/stackprof-0.2.27")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/stackprof-0.2.27/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/yard-0.9.37/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/yard-sorbet-0.9.0/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/tapioca-0.16.11/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/vernier-1.7.0")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/vernier-1.7.0/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/vernier-1.7.1")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/vernier-1.7.1/lib")
 $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/warning-1.5.0/lib")
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/sorbet-runtime.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/sorbet-runtime.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/sorbet-runtime.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/sorbet-runtime.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/_types.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/_types.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/_types.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/_types.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/abstract_utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/abstract_utils.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/abstract_utils.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/abstract_utils.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/boolean.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/boolean.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/boolean.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/boolean.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/compatibility_patches.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/compatibility_patches.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/compatibility_patches.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/compatibility_patches.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/configuration.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/configuration.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/configuration.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/configuration.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/enum.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/enum.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/enum.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/enum.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/generic.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/generic.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/generic.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/generic.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/helpers.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/helpers.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/helpers.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/helpers.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/non_forcing_constants.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/non_forcing_constants.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/non_forcing_constants.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/non_forcing_constants.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/abstract/data.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/data.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/abstract/data.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/data.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/abstract/declare.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/declare.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/abstract/declare.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/declare.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/abstract/hooks.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/hooks.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/abstract/hooks.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/hooks.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/abstract/validate.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/validate.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/abstract/validate.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/validate.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/caller_utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/caller_utils.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/caller_utils.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/caller_utils.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/casts.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/casts.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/casts.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/casts.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/class_utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/class_utils.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/class_utils.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/class_utils.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/decl_state.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/decl_state.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/decl_state.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/decl_state.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/final.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/final.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/final.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/final.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/_methods.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/_methods.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/_methods.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/_methods.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/call_validation.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/call_validation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/call_validation.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/call_validation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/call_validation_2_6.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/call_validation_2_6.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/call_validation_2_6.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/call_validation_2_6.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/call_validation_2_7.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/call_validation_2_7.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/call_validation_2_7.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/call_validation_2_7.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/decl_builder.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/decl_builder.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/decl_builder.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/decl_builder.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/modes.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/modes.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/modes.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/modes.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/signature.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/signature.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/signature.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/signature.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/signature_validation.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/signature_validation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/methods/signature_validation.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/signature_validation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/mixins/mixins.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/mixins/mixins.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/mixins/mixins.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/mixins/mixins.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/retry.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/retry.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/retry.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/retry.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/runtime_levels.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/runtime_levels.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/runtime_levels.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/runtime_levels.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/sealed.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/sealed.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/sealed.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/sealed.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/types/not_typed.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/not_typed.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/types/not_typed.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/not_typed.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/types/simple_pair_union.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/simple_pair_union.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/types/simple_pair_union.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/simple_pair_union.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/types/string_holder.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/string_holder.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/types/string_holder.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/string_holder.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/types/type_alias.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/type_alias.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/types/type_alias.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/type_alias.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/types/void.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/void.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/private/types/void.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/void.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/_props.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/_props.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/_props.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/_props.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/constructor.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/constructor.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/constructor.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/constructor.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/custom_type.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/custom_type.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/custom_type.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/custom_type.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/decorator.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/decorator.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/decorator.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/decorator.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/errors.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/errors.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/errors.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/errors.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/generated_code_validation.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/generated_code_validation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/generated_code_validation.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/generated_code_validation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/has_lazily_specialized_methods.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/has_lazily_specialized_methods.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/has_lazily_specialized_methods.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/has_lazily_specialized_methods.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/optional.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/optional.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/optional.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/optional.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/plugin.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/plugin.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/plugin.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/plugin.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/pretty_printable.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/pretty_printable.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/pretty_printable.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/pretty_printable.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/private/apply_default.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/apply_default.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/private/apply_default.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/apply_default.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/private/deserializer_generator.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/deserializer_generator.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/private/deserializer_generator.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/deserializer_generator.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/private/parser.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/parser.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/private/parser.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/parser.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/private/serde_transform.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/serde_transform.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/private/serde_transform.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/serde_transform.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/private/serializer_generator.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/serializer_generator.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/private/serializer_generator.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/serializer_generator.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/private/setter_factory.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/setter_factory.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/private/setter_factory.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/setter_factory.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/serializable.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/serializable.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/serializable.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/serializable.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/type_validation.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/type_validation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/type_validation.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/type_validation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/utils.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/utils.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/utils.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/weak_constructor.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/weak_constructor.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/props/weak_constructor.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/weak_constructor.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/sig.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/sig.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/sig.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/sig.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/struct.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/struct.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/struct.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/struct.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/anything.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/anything.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/anything.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/anything.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/attached_class.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/attached_class.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/attached_class.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/attached_class.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/base.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/base.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/base.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/base.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/class_of.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/class_of.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/class_of.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/class_of.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/enum.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/enum.rb
similarity index 77%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/enum.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/enum.rb
index 34eb26f51d..cc97cb4c94 100644
--- a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/enum.rb
+++ b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/enum.rb
@@ -9,7 +9,13 @@ module T::Types
     attr_reader :values
 
     def initialize(values)
-      @values = values
+      case values
+      when Hash
+        @values = values
+      else
+        require "set" unless defined?(Set)
+        @values = values.to_set
+      end
     end
 
     def build_type
@@ -25,7 +31,7 @@ module T::Types
     private def subtype_of_single?(other)
       case other
       when Enum
-        (other.values - @values).empty?
+        (@values - other.values).empty?
       else
         false
       end
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/fixed_array.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/fixed_array.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/fixed_array.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/fixed_array.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/fixed_hash.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/fixed_hash.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/fixed_hash.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/fixed_hash.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/intersection.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/intersection.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/intersection.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/intersection.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/noreturn.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/noreturn.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/noreturn.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/noreturn.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/proc.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/proc.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/proc.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/proc.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/self_type.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/self_type.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/self_type.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/self_type.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/simple.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/simple.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/simple.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/simple.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/t_enum.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/t_enum.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/t_enum.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/t_enum.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/type_member.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_member.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/type_member.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_member.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/type_parameter.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_parameter.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/type_parameter.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_parameter.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/type_template.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_template.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/type_template.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_template.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/type_variable.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_variable.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/type_variable.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_variable.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_array.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_array.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_array.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_array.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_class.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_class.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_class.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_class.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_enumerable.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerable.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_enumerable.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerable.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_enumerator.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerator.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_enumerator.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerator.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_enumerator_chain.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerator_chain.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_enumerator_chain.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerator_chain.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_enumerator_lazy.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerator_lazy.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_enumerator_lazy.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerator_lazy.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_hash.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_hash.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_hash.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_hash.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_range.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_range.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_range.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_range.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_set.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_set.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/typed_set.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_set.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/union.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/union.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/union.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/union.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/untyped.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/untyped.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/types/untyped.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/untyped.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/utils.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12067/lib/types/utils.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/utils.rb
diff --git a/Library/Homebrew/vendor/portable-ruby-arm64-darwin b/Library/Homebrew/vendor/portable-ruby-arm64-darwin
index 5541eab5ff..be6f2f64eb 100644
--- a/Library/Homebrew/vendor/portable-ruby-arm64-darwin
+++ b/Library/Homebrew/vendor/portable-ruby-arm64-darwin
@@ -1,2 +1,2 @@
 ruby_TAG=arm64_big_sur
-ruby_SHA=40e7f5d7514a7e9757facdd39006f7a351d3d7986d3a228be13c8b1c3216727b
+ruby_SHA=fd162df7a06190ee800a9e6afd28f4466d33548821a480ba043cd927b44d60f7
diff --git a/Library/Homebrew/vendor/portable-ruby-arm64-linux b/Library/Homebrew/vendor/portable-ruby-arm64-linux
index 05179765df..775700f340 100644
--- a/Library/Homebrew/vendor/portable-ruby-arm64-linux
+++ b/Library/Homebrew/vendor/portable-ruby-arm64-linux
@@ -1,2 +1,2 @@
 ruby_TAG=arm64_linux
-ruby_SHA=2d6aa10b134b4a3abac7f24c812d06b533b65134cdfd70bba82ee8b902e44f51
+ruby_SHA=0ef476ef3a86632414a79055814ef7e545294a8329939f3fb3b3016decac6cd3
diff --git a/Library/Homebrew/vendor/portable-ruby-version b/Library/Homebrew/vendor/portable-ruby-version
index 6cb9d3dd0d..f9892605c7 100644
--- a/Library/Homebrew/vendor/portable-ruby-version
+++ b/Library/Homebrew/vendor/portable-ruby-version
@@ -1 +1 @@
-3.4.3
+3.4.4
diff --git a/Library/Homebrew/vendor/portable-ruby-x86_64-darwin b/Library/Homebrew/vendor/portable-ruby-x86_64-darwin
index 8bfd98819e..ed1f817e2f 100644
--- a/Library/Homebrew/vendor/portable-ruby-x86_64-darwin
+++ b/Library/Homebrew/vendor/portable-ruby-x86_64-darwin
@@ -1,2 +1,2 @@
 ruby_TAG=el_capitan
-ruby_SHA=9fd394a40fb1467f89206a9c89c1274d9dc053af688176667a0cac0c3014113f
+ruby_SHA=45cea656cc5b5f5b53a9d4fc9e6c88d3a29b3aac862d1a55f1c70df534df5636
diff --git a/Library/Homebrew/vendor/portable-ruby-x86_64-linux b/Library/Homebrew/vendor/portable-ruby-x86_64-linux
index 988c1fd455..e7c3143b24 100644
--- a/Library/Homebrew/vendor/portable-ruby-x86_64-linux
+++ b/Library/Homebrew/vendor/portable-ruby-x86_64-linux
@@ -1,2 +1,2 @@
 ruby_TAG=x86_64_linux
-ruby_SHA=1764a2629da860b95afc96704725ec7c4cdb333724a9066ccc41ca6c55aa4f62
+ruby_SHA=b5c9268815fbab7b7971307b2871f4206e081218b9deb4625d668d6c3563483b
diff --git a/Library/Homebrew/version.rb b/Library/Homebrew/version.rb
index acf6d440de..8d455e75fb 100644
--- a/Library/Homebrew/version.rb
+++ b/Library/Homebrew/version.rb
@@ -346,7 +346,8 @@ class Version
 
   sig { params(spec: T.any(String, Pathname), detected_from_url: T::Boolean).returns(Version) }
   def self.parse(spec, detected_from_url: false)
-    spec = CGI.unescape(spec.to_s) if detected_from_url
+    # This type of full-URL decoding is not technically correct but we only need a rough decode for version parsing.
+    spec = URI.decode_www_form_component(spec.to_s) if detected_from_url
 
     spec = Pathname(spec)
 
diff --git a/README.md b/README.md
index 98dc15d911..aafa616417 100644
--- a/README.md
+++ b/README.md
@@ -59,7 +59,7 @@ Homebrew's [Project Leader](https://docs.brew.sh/Homebrew-Governance#6-project-l
 
 Homebrew's [Project Leadership Committee](https://docs.brew.sh/Homebrew-Governance#4-project-leadership-committee) is [Colin Dean](https://github.com/colindean), [Michka Popoff](https://github.com/iMichka), [Mike McQuaid](https://github.com/MikeMcQuaid), [Patrick Linnane](https://github.com/p-linnane) and [Vanessa Gennarelli](https://github.com/mozzadrella).
 
-Homebrew's [Technical Steering Committee](https://docs.brew.sh/Homebrew-Governance#7-technical-steering-committee) is [Bo Anderson](https://github.com/Bo98), [FX Coudert](https://github.com/fxcoudert), [Mike McQuaid](https://github.com/MikeMcQuaid) and [Rylan Polster](https://github.com/Rylan12).
+Homebrew's [Technical Steering Committee](https://docs.brew.sh/Homebrew-Governance#7-technical-steering-committee) is [Bo Anderson](https://github.com/Bo98), [Issy Long](https://github.com/issyl0), [Michael Cho](https://github.com/cho-m), [Mike McQuaid](https://github.com/MikeMcQuaid) and [Ruoyu Zhong](https://github.com/ZhongRuoyu).
 
 Homebrew's maintainers are [Alexander Bayandin](https://github.com/bayandin), [Bevan Kay](https://github.com/bevanjkay), [Bo Anderson](https://github.com/Bo98), [Branch Vincent](https://github.com/branchvincent), [Caleb Xu](https://github.com/alebcay), [Carlo Cabrera](https://github.com/carlocab), [Daeho Ro](https://github.com/daeho-ro), [Douglas Eichelberger](https://github.com/dduugg), [Dustin Rodrigues](https://github.com/dtrodrigues), [Eric Knibbe](https://github.com/EricFromCanada), [FX Coudert](https://github.com/fxcoudert), [Issy Long](https://github.com/issyl0), [Justin Krehel](https://github.com/krehel), [Klaus Hipp](https://github.com/khipp), [Markus Reiter](https://github.com/reitermarkus), [Michael Cho](https://github.com/cho-m), [Michka Popoff](https://github.com/iMichka), [Mike McQuaid](https://github.com/MikeMcQuaid), [Nanda H Krishna](https://github.com/nandahkrishna), [Patrick Linnane](https://github.com/p-linnane), [Rui Chen](https://github.com/chenrui333), [Ruoyu Zhong](https://github.com/ZhongRuoyu), [Rylan Polster](https://github.com/Rylan12), [Sam Ford](https://github.com/samford), [Sean Molenaar](https://github.com/SMillerDev), [Štefan Baebler](https://github.com/stefanb), [Thierry Moisan](https://github.com/Moisan), [Timothy Sutton](https://github.com/timsutton) and [William Woodruff](https://github.com/woodruffw).
 
@@ -85,6 +85,6 @@ Secure password storage and syncing is provided by [1Password for Teams](https:/
 [](https://dnsimple.com/resolving/homebrew#gh-light-mode-only)
 [](https://dnsimple.com/resolving/homebrew#gh-dark-mode-only)
 
-Homebrew is generously supported by [GitHub](https://github.com/github), [Custom Ink](https://github.com/customink), [Randy Reddig](https://github.com/ydnar), [Codecademy](https://github.com/Codecademy), [Workbrew](https://github.com/Workbrew) and many other users and organisations via [GitHub Sponsors](https://github.com/sponsors/Homebrew).
+Homebrew is generously supported by [GitHub](https://github.com/github), [Custom Ink](https://github.com/customink), [Randy Reddig](https://github.com/ydnar), [Codecademy](https://github.com/Codecademy), [mikadelbert](https://github.com/mikadelbert), [Workbrew](https://github.com/Workbrew) and many other users and organisations via [GitHub Sponsors](https://github.com/sponsors/Homebrew).
 
 [](https://github.com/github)
diff --git a/completions/bash/brew b/completions/bash/brew
index ff172835c2..7e00bdfa81 100644
--- a/completions/bash/brew
+++ b/completions/bash/brew
@@ -836,6 +836,7 @@ _brew_create() {
       __brewcomp "
       --HEAD
       --autotools
+      --cabal
       --cask
       --cmake
       --crystal
diff --git a/completions/fish/brew.fish b/completions/fish/brew.fish
index ff6e37aa56..0457b6dd6a 100644
--- a/completions/fish/brew.fish
+++ b/completions/fish/brew.fish
@@ -506,14 +506,14 @@ __fish_brew_complete_sub_cmd 'bundle' 'sh'
 __fish_brew_complete_sub_cmd 'bundle' 'env'
 __fish_brew_complete_sub_cmd 'bundle' 'edit'
 __fish_brew_complete_arg 'bundle' -l all -d '`list` all dependencies'
-__fish_brew_complete_arg 'bundle' -l cask -d '`list` or `dump` Homebrew cask dependencies'
+__fish_brew_complete_arg 'bundle' -l cask -d '`list`, `dump` or `cleanup` Homebrew cask dependencies'
 __fish_brew_complete_arg 'bundle' -l check -d 'Check that all dependencies in the Brewfile are installed before running `exec`, `sh`, or `env`'
 __fish_brew_complete_arg 'bundle' -l cleanup -d '`install` performs cleanup operation, same as running `cleanup --force`. This is enabled by default if `$HOMEBREW_BUNDLE_INSTALL_CLEANUP` is set and `--global` is passed'
 __fish_brew_complete_arg 'bundle' -l debug -d 'Display any debugging information'
 __fish_brew_complete_arg 'bundle' -l describe -d '`dump` adds a description comment above each line, unless the dependency does not have a description. This is enabled by default if `$HOMEBREW_BUNDLE_DUMP_DESCRIBE` is set'
 __fish_brew_complete_arg 'bundle' -l file -d 'Read from or write to the `Brewfile` from this location. Use `--file=-` to pipe to stdin/stdout'
 __fish_brew_complete_arg 'bundle' -l force -d '`install` runs with `--force`/`--overwrite`. `dump` overwrites an existing `Brewfile`. `cleanup` actually performs its cleanup operations'
-__fish_brew_complete_arg 'bundle' -l formula -d '`list` or `dump` Homebrew formula dependencies'
+__fish_brew_complete_arg 'bundle' -l formula -d '`list`, `dump` or `cleanup` Homebrew formula dependencies'
 __fish_brew_complete_arg 'bundle' -l global -d 'Read from or write to the `Brewfile` from `$HOMEBREW_BUNDLE_FILE_GLOBAL` (if set), `${XDG_CONFIG_HOME}/homebrew/Brewfile` (if `$XDG_CONFIG_HOME` is set), `~/.homebrew/Brewfile` or `~/.Brewfile` otherwise'
 __fish_brew_complete_arg 'bundle' -l help -d 'Show this message'
 __fish_brew_complete_arg 'bundle' -l install -d 'Run `install` before continuing to other operations e.g. `exec`'
@@ -523,11 +523,11 @@ __fish_brew_complete_arg 'bundle' -l no-upgrade -d '`install` does not run `brew
 __fish_brew_complete_arg 'bundle' -l no-vscode -d '`dump` without VSCode (and forks/variants) extensions. This is enabled by default if `$HOMEBREW_BUNDLE_DUMP_NO_VSCODE` is set'
 __fish_brew_complete_arg 'bundle' -l quiet -d 'Make some output more quiet'
 __fish_brew_complete_arg 'bundle' -l services -d 'Temporarily start services while running the `exec` or `sh` command. This is enabled by default if `$HOMEBREW_BUNDLE_SERVICES` is set'
-__fish_brew_complete_arg 'bundle' -l tap -d '`list` or `dump` Homebrew tap dependencies'
+__fish_brew_complete_arg 'bundle' -l tap -d '`list`, `dump` or `cleanup` Homebrew tap dependencies'
 __fish_brew_complete_arg 'bundle' -l upgrade -d '`install` runs `brew upgrade` on outdated dependencies, even if `$HOMEBREW_BUNDLE_NO_UPGRADE` is set'
 __fish_brew_complete_arg 'bundle' -l upgrade-formulae -d '`install` runs `brew upgrade` on any of these comma-separated formulae, even if `$HOMEBREW_BUNDLE_NO_UPGRADE` is set'
 __fish_brew_complete_arg 'bundle' -l verbose -d '`install` prints output from commands as they are run. `check` lists all missing dependencies'
-__fish_brew_complete_arg 'bundle' -l vscode -d '`list` or `dump` VSCode (and forks/variants) extensions'
+__fish_brew_complete_arg 'bundle' -l vscode -d '`list`, `dump` or `cleanup` VSCode (and forks/variants) extensions'
 __fish_brew_complete_arg 'bundle' -l whalebrew -d '`list` or `dump` Whalebrew dependencies'
 __fish_brew_complete_arg 'bundle' -l zap -d '`cleanup` casks using the `zap` command instead of `uninstall`'
 
@@ -611,6 +611,7 @@ __fish_brew_complete_arg 'contributions' -l verbose -d 'Make some output more ve
 __fish_brew_complete_cmd 'create' 'Generate a formula or, with `--cask`, a cask for the downloadable file at URL and open it in the editor'
 __fish_brew_complete_arg 'create' -l HEAD -d 'Indicate that URL points to the package\'s repository rather than a file'
 __fish_brew_complete_arg 'create' -l autotools -d 'Create a basic template for an Autotools-style build'
+__fish_brew_complete_arg 'create' -l cabal -d 'Create a basic template for a Cabal build'
 __fish_brew_complete_arg 'create' -l cask -d 'Create a basic template for a cask'
 __fish_brew_complete_arg 'create' -l cmake -d 'Create a basic template for a CMake-style build'
 __fish_brew_complete_arg 'create' -l crystal -d 'Create a basic template for a Crystal build'
@@ -1556,7 +1557,7 @@ __fish_brew_complete_arg 'services' -l file -d 'Use the service file from this l
 __fish_brew_complete_arg 'services' -l help -d 'Show this message'
 __fish_brew_complete_arg 'services' -l json -d 'Output as JSON'
 __fish_brew_complete_arg 'services' -l keep -d 'When stopped, don\'t unregister the service from launching at login (or boot)'
-__fish_brew_complete_arg 'services' -l max-wait -d 'Wait at most this many seconds for `stop` to finish stopping a service. Omit this flag or set this to zero (0) seconds to wait indefinitely'
+__fish_brew_complete_arg 'services' -l max-wait -d 'Wait at most this many seconds for `stop` to finish stopping a service. Defaults to 60. Set this to zero (0) seconds to wait indefinitely'
 __fish_brew_complete_arg 'services' -l no-wait -d 'Don\'t wait for `stop` to finish stopping the service'
 __fish_brew_complete_arg 'services' -l quiet -d 'Make some output more quiet'
 __fish_brew_complete_arg 'services' -l sudo-service-user -d 'When run as root on macOS, run the service(s) as this user'
diff --git a/completions/zsh/_brew b/completions/zsh/_brew
index 72453df3d6..8d1d4e3da9 100644
--- a/completions/zsh/_brew
+++ b/completions/zsh/_brew
@@ -566,7 +566,7 @@ _brew_bump_cask_pr() {
     '--fork-org[Use the specified GitHub organization for forking]' \
     '--help[Show this message]' \
     '--message[Prepend message to the default pull request message]' \
-    '(--online)--no-audit[Don'\''t run `brew audit` before opening the PR]' \
+    '--no-audit[Don'\''t run `brew audit` before opening the PR]' \
     '--no-browse[Print the pull request URL instead of opening in a browser]' \
     '--no-fork[Don'\''t try to fork the repository]' \
     '--no-style[Don'\''t run `brew style --fix` before opening the PR]' \
@@ -649,14 +649,14 @@ _brew_bump_unversioned_casks() {
 _brew_bundle() {
   _arguments \
     '(--no-vscode)--all[`list` all dependencies]' \
-    '--cask[`list` or `dump` Homebrew cask dependencies]' \
+    '--cask[`list`, `dump` or `cleanup` Homebrew cask dependencies]' \
     '--check[Check that all dependencies in the Brewfile are installed before running `exec`, `sh`, or `env`]' \
     '--cleanup[`install` performs cleanup operation, same as running `cleanup --force`. This is enabled by default if `$HOMEBREW_BUNDLE_INSTALL_CLEANUP` is set and `--global` is passed]' \
     '--debug[Display any debugging information]' \
     '--describe[`dump` adds a description comment above each line, unless the dependency does not have a description. This is enabled by default if `$HOMEBREW_BUNDLE_DUMP_DESCRIBE` is set]' \
     '--file[Read from or write to the `Brewfile` from this location. Use `--file=-` to pipe to stdin/stdout]' \
     '--force[`install` runs with `--force`/`--overwrite`. `dump` overwrites an existing `Brewfile`. `cleanup` actually performs its cleanup operations]' \
-    '--formula[`list` or `dump` Homebrew formula dependencies]' \
+    '--formula[`list`, `dump` or `cleanup` Homebrew formula dependencies]' \
     '--global[Read from or write to the `Brewfile` from `$HOMEBREW_BUNDLE_FILE_GLOBAL` (if set), `${XDG_CONFIG_HOME}/homebrew/Brewfile` (if `$XDG_CONFIG_HOME` is set), `~/.homebrew/Brewfile` or `~/.Brewfile` otherwise]' \
     '--help[Show this message]' \
     '(--upgrade)--install[Run `install` before continuing to other operations e.g. `exec`]' \
@@ -666,11 +666,11 @@ _brew_bundle() {
     '(--all --vscode)--no-vscode[`dump` without VSCode (and forks/variants) extensions. This is enabled by default if `$HOMEBREW_BUNDLE_DUMP_NO_VSCODE` is set]' \
     '--quiet[Make some output more quiet]' \
     '--services[Temporarily start services while running the `exec` or `sh` command. This is enabled by default if `$HOMEBREW_BUNDLE_SERVICES` is set]' \
-    '--tap[`list` or `dump` Homebrew tap dependencies]' \
+    '--tap[`list`, `dump` or `cleanup` Homebrew tap dependencies]' \
     '(--install)--upgrade[`install` runs `brew upgrade` on outdated dependencies, even if `$HOMEBREW_BUNDLE_NO_UPGRADE` is set]' \
     '--upgrade-formulae[`install` runs `brew upgrade` on any of these comma-separated formulae, even if `$HOMEBREW_BUNDLE_NO_UPGRADE` is set]' \
     '--verbose[`install` prints output from commands as they are run. `check` lists all missing dependencies]' \
-    '(--no-vscode)--vscode[`list` or `dump` VSCode (and forks/variants) extensions]' \
+    '(--no-vscode)--vscode[`list`, `dump` or `cleanup` VSCode (and forks/variants) extensions]' \
     '--whalebrew[`list` or `dump` Whalebrew dependencies]' \
     '--zap[`cleanup` casks using the `zap` command instead of `uninstall`]' \
     - subcommand \
@@ -777,28 +777,29 @@ _brew_contributions() {
 _brew_create() {
   _arguments \
     '(--cask)--HEAD[Indicate that URL points to the package'\''s repository rather than a file]' \
-    '(--cmake --crystal --go --meson --node --perl --python --ruby --rust --zig --cask)--autotools[Create a basic template for an Autotools-style build]' \
-    '(--autotools --cmake --crystal --go --meson --node --perl --python --ruby --rust --zig --HEAD --set-license)--cask[Create a basic template for a cask]' \
-    '(--autotools --crystal --go --meson --node --perl --python --ruby --rust --zig --cask)--cmake[Create a basic template for a CMake-style build]' \
-    '(--autotools --cmake --go --meson --node --perl --python --ruby --rust --zig --cask)--crystal[Create a basic template for a Crystal build]' \
+    '(--cabal --cmake --crystal --go --meson --node --perl --python --ruby --rust --zig --cask)--autotools[Create a basic template for an Autotools-style build]' \
+    '(--autotools --cmake --crystal --go --meson --node --perl --python --ruby --rust --zig --cask)--cabal[Create a basic template for a Cabal build]' \
+    '(--autotools --cabal --cmake --crystal --go --meson --node --perl --python --ruby --rust --zig --HEAD --set-license)--cask[Create a basic template for a cask]' \
+    '(--autotools --cabal --crystal --go --meson --node --perl --python --ruby --rust --zig --cask)--cmake[Create a basic template for a CMake-style build]' \
+    '(--autotools --cabal --cmake --go --meson --node --perl --python --ruby --rust --zig --cask)--crystal[Create a basic template for a Crystal build]' \
     '--debug[Display any debugging information]' \
     '--force[Ignore errors for disallowed formula names and names that shadow aliases]' \
-    '(--autotools --cmake --crystal --meson --node --perl --python --ruby --rust --zig --cask)--go[Create a basic template for a Go build]' \
+    '(--autotools --cabal --cmake --crystal --meson --node --perl --python --ruby --rust --zig --cask)--go[Create a basic template for a Go build]' \
     '--help[Show this message]' \
-    '(--autotools --cmake --crystal --go --node --perl --python --ruby --rust --zig --cask)--meson[Create a basic template for a Meson-style build]' \
+    '(--autotools --cabal --cmake --crystal --go --node --perl --python --ruby --rust --zig --cask)--meson[Create a basic template for a Meson-style build]' \
     '--no-fetch[Homebrew will not download URL to the cache and will thus not add its SHA-256 to the formula for you, nor will it check the GitHub API for GitHub projects (to fill out its description and homepage)]' \
-    '(--autotools --cmake --crystal --go --meson --perl --python --ruby --rust --zig --cask)--node[Create a basic template for a Node build]' \
-    '(--autotools --cmake --crystal --go --meson --node --python --ruby --rust --zig --cask)--perl[Create a basic template for a Perl build]' \
-    '(--autotools --cmake --crystal --go --meson --node --perl --ruby --rust --zig --cask)--python[Create a basic template for a Python build]' \
+    '(--autotools --cabal --cmake --crystal --go --meson --perl --python --ruby --rust --zig --cask)--node[Create a basic template for a Node build]' \
+    '(--autotools --cabal --cmake --crystal --go --meson --node --python --ruby --rust --zig --cask)--perl[Create a basic template for a Perl build]' \
+    '(--autotools --cabal --cmake --crystal --go --meson --node --perl --ruby --rust --zig --cask)--python[Create a basic template for a Python build]' \
     '--quiet[Make some output more quiet]' \
-    '(--autotools --cmake --crystal --go --meson --node --perl --python --rust --zig --cask)--ruby[Create a basic template for a Ruby build]' \
-    '(--autotools --cmake --crystal --go --meson --node --perl --python --ruby --zig --cask)--rust[Create a basic template for a Rust build]' \
+    '(--autotools --cabal --cmake --crystal --go --meson --node --perl --python --rust --zig --cask)--ruby[Create a basic template for a Ruby build]' \
+    '(--autotools --cabal --cmake --crystal --go --meson --node --perl --python --ruby --zig --cask)--rust[Create a basic template for a Rust build]' \
     '(--cask)--set-license[Explicitly set the license of the new formula]' \
     '--set-name[Explicitly set the name of the new formula or cask]' \
     '--set-version[Explicitly set the version of the new formula or cask]' \
     '--tap[Generate the new formula within the given tap, specified as user`/`repo]' \
     '--verbose[Make some output more verbose]' \
-    '(--autotools --cmake --crystal --go --meson --node --perl --python --ruby --rust --cask)--zig[Create a basic template for a Zig build]'
+    '(--autotools --cabal --cmake --crystal --go --meson --node --perl --python --ruby --rust --cask)--zig[Create a basic template for a Zig build]'
 }
 
 # brew debugger
@@ -1195,7 +1196,7 @@ _brew_instal() {
     '(--formula --force)--adopt[Adopt existing artifacts in the destination that are identical to those being installed. Cannot be combined with `--force`]' \
     '(--formula)--appdir[Target location for Applications (default: `/Applications`)]' \
     '(--cask)--as-dependency[Install but mark as installed as a dependency and not installed on request]' \
-    '(--cask)--ask[Ask for confirmation before downloading and installing formulae. Print bottles and dependencies download size and install size]' \
+    '--ask[Ask for confirmation before downloading and installing formulae. Print bottles and dependencies download size and install size]' \
     '(--formula)--audio-unit-plugindir[Target location for Audio Unit Plugins (default: `~/Library/Audio/Plug-Ins/Components`)]' \
     '(--formula)--binaries[Disable/enable linking of helper executables (default: enabled)]' \
     '(--cask)--bottle-arch[Optimise bottles for the specified architecture rather than the oldest architecture supported by the version of macOS the bottles are built on]' \
@@ -1245,7 +1246,7 @@ _brew_instal() {
     '(--casks --binaries --require-sha --quarantine --adopt --skip-cask-deps --zap --appdir --keyboard-layoutdir --colorpickerdir --prefpanedir --qlplugindir --mdimporterdir --dictionarydir --fontdir --servicedir --input-methoddir --internet-plugindir --audio-unit-plugindir --vst-plugindir --vst3-plugindir --screen-saverdir --language)--formula[Treat all named arguments as formulae]' \
     '*:formula:__brew_formulae' \
     - cask \
-    '(--formulae --env --ignore-dependencies --only-dependencies --cc --build-from-source --force-bottle --include-test --HEAD --fetch-HEAD --keep-tmp --debug-symbols --build-bottle --skip-post-install --skip-link --as-dependency --bottle-arch --interactive --git --overwrite --ask)--cask[Treat all named arguments as casks]' \
+    '(--formulae --env --ignore-dependencies --only-dependencies --cc --build-from-source --force-bottle --include-test --HEAD --fetch-HEAD --keep-tmp --debug-symbols --build-bottle --skip-post-install --skip-link --as-dependency --bottle-arch --interactive --git --overwrite)--cask[Treat all named arguments as casks]' \
     '*:cask:__brew_casks'
 }
 
@@ -1256,7 +1257,7 @@ _brew_install() {
     '(--formula --force)--adopt[Adopt existing artifacts in the destination that are identical to those being installed. Cannot be combined with `--force`]' \
     '(--formula)--appdir[Target location for Applications (default: `/Applications`)]' \
     '(--cask)--as-dependency[Install but mark as installed as a dependency and not installed on request]' \
-    '(--cask)--ask[Ask for confirmation before downloading and installing formulae. Print bottles and dependencies download size and install size]' \
+    '--ask[Ask for confirmation before downloading and installing formulae. Print bottles and dependencies download size and install size]' \
     '(--formula)--audio-unit-plugindir[Target location for Audio Unit Plugins (default: `~/Library/Audio/Plug-Ins/Components`)]' \
     '(--formula)--binaries[Disable/enable linking of helper executables (default: enabled)]' \
     '(--cask)--bottle-arch[Optimise bottles for the specified architecture rather than the oldest architecture supported by the version of macOS the bottles are built on]' \
@@ -1306,7 +1307,7 @@ _brew_install() {
     '(--casks --binaries --require-sha --quarantine --adopt --skip-cask-deps --zap --appdir --keyboard-layoutdir --colorpickerdir --prefpanedir --qlplugindir --mdimporterdir --dictionarydir --fontdir --servicedir --input-methoddir --internet-plugindir --audio-unit-plugindir --vst-plugindir --vst3-plugindir --screen-saverdir --language)--formula[Treat all named arguments as formulae]' \
     '*:formula:__brew_formulae' \
     - cask \
-    '(--formulae --env --ignore-dependencies --only-dependencies --cc --build-from-source --force-bottle --include-test --HEAD --fetch-HEAD --keep-tmp --debug-symbols --build-bottle --skip-post-install --skip-link --as-dependency --bottle-arch --interactive --git --overwrite --ask)--cask[Treat all named arguments as casks]' \
+    '(--formulae --env --ignore-dependencies --only-dependencies --cc --build-from-source --force-bottle --include-test --HEAD --fetch-HEAD --keep-tmp --debug-symbols --build-bottle --skip-post-install --skip-link --as-dependency --bottle-arch --interactive --git --overwrite)--cask[Treat all named arguments as casks]' \
     '*:cask:__brew_casks'
 }
 
@@ -1746,7 +1747,7 @@ _brew_reinstall() {
   _arguments \
     '(--formula)--adopt[Adopt existing artifacts in the destination that are identical to those being installed. Cannot be combined with `--force`]' \
     '(--formula)--appdir[Target location for Applications (default: `/Applications`)]' \
-    '(--cask)--ask[Ask for confirmation before downloading and upgrading formulae. Print bottles and dependencies download size, install and net install size]' \
+    '--ask[Ask for confirmation before downloading and upgrading formulae. Print bottles and dependencies download size, install and net install size]' \
     '(--formula)--audio-unit-plugindir[Target location for Audio Unit Plugins (default: `~/Library/Audio/Plug-Ins/Components`)]' \
     '(--formula)--binaries[Disable/enable linking of helper executables (default: enabled)]' \
     '(--cask --force-bottle)--build-from-source[Compile formula from source even if a bottle is available]' \
@@ -1785,7 +1786,7 @@ _brew_reinstall() {
     '(--casks --binaries --require-sha --quarantine --adopt --skip-cask-deps --zap --appdir --keyboard-layoutdir --colorpickerdir --prefpanedir --qlplugindir --mdimporterdir --dictionarydir --fontdir --servicedir --input-methoddir --internet-plugindir --audio-unit-plugindir --vst-plugindir --vst3-plugindir --screen-saverdir --language)--formula[Treat all named arguments as formulae]' \
     '*:formula:__brew_formulae' \
     - cask \
-    '(--formulae --build-from-source --interactive --force-bottle --keep-tmp --debug-symbols --git --ask)--cask[Treat all named arguments as casks]' \
+    '(--formulae --build-from-source --interactive --force-bottle --keep-tmp --debug-symbols --git)--cask[Treat all named arguments as casks]' \
     '*:cask:__brew_casks'
 }
 
@@ -1902,7 +1903,7 @@ _brew_services() {
     '--help[Show this message]' \
     '--json[Output as JSON]' \
     '--keep[When stopped, don'\''t unregister the service from launching at login (or boot)]' \
-    '(--no-wait)--max-wait[Wait at most this many seconds for `stop` to finish stopping a service. Omit this flag or set this to zero (0) seconds to wait indefinitely]' \
+    '(--no-wait)--max-wait[Wait at most this many seconds for `stop` to finish stopping a service. Defaults to 60. Set this to zero (0) seconds to wait indefinitely]' \
     '(--max-wait)--no-wait[Don'\''t wait for `stop` to finish stopping the service]' \
     '--quiet[Make some output more quiet]' \
     '--sudo-service-user[When run as root on macOS, run the service(s) as this user]' \
@@ -2325,7 +2326,7 @@ _brew_update_test() {
 _brew_upgrade() {
   _arguments \
     '(--formula)--appdir[Target location for Applications (default: `/Applications`)]' \
-    '(--cask)--ask[Ask for confirmation before downloading and upgrading formulae. Print bottles and dependencies download size, install and net install size]' \
+    '--ask[Ask for confirmation before downloading and upgrading formulae. Print bottles and dependencies download size, install and net install size]' \
     '(--formula)--audio-unit-plugindir[Target location for Audio Unit Plugins (default: `~/Library/Audio/Plug-Ins/Components`)]' \
     '(--formula)--binaries[Disable/enable linking of helper executables (default: enabled)]' \
     '(--cask --force-bottle)--build-from-source[Compile formula from source even if a bottle is available]' \
@@ -2368,7 +2369,7 @@ _brew_upgrade() {
     '(--casks --skip-cask-deps --greedy --greedy-latest --greedy-auto-updates --binaries --require-sha --quarantine --appdir --keyboard-layoutdir --colorpickerdir --prefpanedir --qlplugindir --mdimporterdir --dictionarydir --fontdir --servicedir --input-methoddir --internet-plugindir --audio-unit-plugindir --vst-plugindir --vst3-plugindir --screen-saverdir --language)--formula[Treat all named arguments as formulae. If no named arguments are specified, upgrade only outdated formulae]' \
     '*:installed_formula:__brew_installed_formulae' \
     - installed_cask \
-    '(--formulae --build-from-source --interactive --force-bottle --fetch-HEAD --keep-tmp --debug-symbols --overwrite --ask)--cask[Treat all named arguments as casks. If no named arguments are specified, upgrade only outdated casks]' \
+    '(--formulae --build-from-source --interactive --force-bottle --fetch-HEAD --keep-tmp --debug-symbols --overwrite)--cask[Treat all named arguments as casks. If no named arguments are specified, upgrade only outdated casks]' \
     '*:installed_cask:__brew_installed_casks'
 }
 
diff --git a/docs/.mdl_ruleset.rb b/docs/.mdl_ruleset.rb
index 7cf80606d7..fab331a825 100644
--- a/docs/.mdl_ruleset.rb
+++ b/docs/.mdl_ruleset.rb
@@ -8,3 +8,17 @@ rule "HB034", "Bare unstyled URL used" do
     doc.matching_text_element_lines(%r{(?<=\s)https?://})
   end
 end
+rule "HB100", "Full URL for internal link used" do
+  tags :links, :url
+  aliases "no-full-urls-for-internal-links"
+  check do |doc|
+    doc.matching_lines(%r{\]\(https://docs.brew.sh/.+?\)})
+  end
+end
+rule "HB101", "File extension missing from internal link" do
+  tags :links, :url
+  aliases "file-extension-required-for-internal-links"
+  check do |doc|
+    doc.matching_lines(/\]\((?!#|\w+:)(?>[^#.)]+)(?!\.\w+)/)
+  end
+end
diff --git a/docs/Acceptable-Casks.md b/docs/Acceptable-Casks.md
index 2146d0c2e3..5813f17c49 100644
--- a/docs/Acceptable-Casks.md
+++ b/docs/Acceptable-Casks.md
@@ -36,7 +36,7 @@ These versions also live in the main repository at [Homebrew/homebrew-cask](http
 
 ### Regional and Localized
 
-When an app exists in more than one language or has different regional editions, [the `language` stanza should be used to switch between languages or regions](https://docs.brew.sh/Cask-Cookbook#stanza-language).
+When an app exists in more than one language or has different regional editions, [the `language` stanza should be used to switch between languages or regions](Cask-Cookbook.md#stanza-language).
 
 ### Trial and Freemium versions
 
@@ -111,7 +111,7 @@ Common reasons to reject a cask entirely:
   * An app from a code repository that is not notable enough (under 30 forks, 30 watchers, 75 stars).
   * [Electronic Identification (eID) software](https://github.com/Homebrew/homebrew-cask/issues/59021).
 * App requires [SIP to be disabled](https://github.com/Homebrew/homebrew-cask/pull/41890) to be installed and/or used.
-* App installer is a `pkg` that requires [`allow_untrusted: true`](https://docs.brew.sh/Cask-Cookbook#pkg-allow_untrusted).
+* App installer is a `pkg` that requires [`allow_untrusted: true`](Cask-Cookbook.md#pkg-allow_untrusted).
 * App is a trial version, and the only way to acquire the full version is through the Mac App Store.
   * Similarly (and trickier to spot), the app has moved to the Mac App Store but still provides old versions via direct download. We reject these in all official repositories so users don’t get stuck using an old version, wrongly thinking they’re using the most up-to-date one (which, amongst other things, might be a security risk).
 * App is unmaintained, i.e. no releases in the last year, or [explicitly discontinued](https://github.com/Homebrew/homebrew-cask/pull/22699).
@@ -120,7 +120,7 @@ Common reasons to reject a cask entirely:
   * Or if the Cask has a download URL that is both behind a login/registration form and from a host that differs from the homepage.
 * Cask is unreasonably difficult to maintain. Examples have included [Audacity](https://github.com/Homebrew/homebrew-cask/pull/27517) and [older Java development casks](https://github.com/Homebrew/homebrew-cask/issues/57387).
 * Cask has been rejected before due to an issue we cannot fix, and the new submission doesn’t fix that. An example would be the [first submission of `soapui`](https://github.com/Homebrew/homebrew-cask/pull/4939), whose installation problems were not fixed in the two [subsequent](https://github.com/Homebrew/homebrew-cask/pull/9969) [submissions](https://github.com/Homebrew/homebrew-cask/pull/10606).
-* Cask is a duplicate. These submissions mostly occur when the [token reference](https://docs.brew.sh/Cask-Cookbook#token-reference) was not followed.
+* Cask is a duplicate. These submissions mostly occur when the [token reference](Cask-Cookbook.md#token-reference) was not followed.
 * The author has [specifically asked us not to include it](https://github.com/Homebrew/homebrew-cask/pull/5342).
 * App is both open-source and CLI-only (i.e. it only uses the `binary` artifact). In that case, and [in the spirit of deduplication](https://github.com/Homebrew/homebrew-cask/issues/15603), submit it first to [homebrew/core](https://github.com/Homebrew/homebrew-core) as a formula that builds from source. If it is rejected, you may then try again as a cask (link to the issue from your pull request so we can see the discussion and reasoning for rejection).
 * App is open-source and has a GUI but no compiled versions (or only old ones) are provided. It’s better to have them in [homebrew/core](https://github.com/Homebrew/homebrew-core) so users don’t get perpetually outdated versions. See [`gedit`](https://github.com/Homebrew/homebrew-cask/pull/23360) for example.
diff --git a/docs/Brew-Bundle-and-Brewfile.md b/docs/Brew-Bundle-and-Brewfile.md
index 27c7ead3fd..27894a7bcb 100644
--- a/docs/Brew-Bundle-and-Brewfile.md
+++ b/docs/Brew-Bundle-and-Brewfile.md
@@ -10,7 +10,7 @@ It uses `Brewfile`s to provide a declarative interface for installing/upgrading
 
 Rather than specifying the `brew` commands you wish to run, you can specify the state you wish to reach.
 
-See also the [`brew bundle` section of `man brew`](https://docs.brew.sh/Manpage#bundle-subcommand) or `brew bundle --help`.
+See also the [`brew bundle` section of `man brew`](Manpage.md#bundle-subcommand) or `brew bundle --help`.
 
 ## Basic Usage
 
diff --git a/docs/Brew-Livecheck.md b/docs/Brew-Livecheck.md
index e186436ae4..3b4b0d535f 100644
--- a/docs/Brew-Livecheck.md
+++ b/docs/Brew-Livecheck.md
@@ -1,23 +1,26 @@
 ---
-last_review_date: "1970-01-01"
+last_review_date: 2025-05-28
 ---
 
 # `brew livecheck`
 
 The `brew livecheck` command finds the newest version of a formula or cask's software by checking upstream. Livecheck has [strategies](https://rubydoc.brew.sh/Homebrew/Livecheck/Strategy) to identify versions from various sources, such as Git repositories, websites, etc.
 
-## Behavior
+## Behaviour
 
 When livecheck isn't given instructions for how to check for upstream versions, it does the following by default:
 
-1. For formulae: Collect the `stable`, `head`, and `homepage` URLs, in that order (resources simply use their `url`). For casks: Collect the `url` and `homepage` URLs, in that order.
+1. Collect a list of URLs to check.
+  * For formulae: use their `stable`, `head`, and `homepage` URLs, in that order.
+  * For formula resources: use their `url`.
+  * For casks: use their `url` and `homepage` URLs, in that order.
 1. Determine if any strategies apply to the first URL. If not, try the next URL.
 1. If a strategy can be applied, use it to check for new versions.
 1. Return the newest version (or an error if versions could not be found at any available URLs).
 
-It's sometimes necessary to override this default behavior to create a working check. If a source doesn't provide the newest version, we need to check a different one. If livecheck doesn't correctly match version text, we need to provide an appropriate regex or `strategy` block.
+It's sometimes necessary to override this default behaviour to create a working check. If a source doesn't provide the newest version, we need to check a different one. If livecheck doesn't correctly match version text, we need to provide an appropriate regex or `strategy` block.
 
-This can be accomplished by adding a `livecheck` block to the formula/cask/resource. For more information on the available methods, please refer to the [`Livecheck` class documentation](https://rubydoc.brew.sh/Livecheck).
+This can be accomplished by adding a `livecheck` block to the formula/cask/resource. For more information on the available methods, please refer to the [`Livecheck` class](https://rubydoc.brew.sh/Livecheck) documentation.
 
 ## Creating a check
 
@@ -47,9 +50,9 @@ The `livecheck` block regex restricts matches to a subset of the fetched content
 
 * **Regexes should be made case insensitive, whenever possible**, by adding `i` at the end (e.g. `/.../i` or `%r{...}i`). This improves reliability, as the regex will handle changes in letter case without needing modifications.
 
-* **Regexes should only use a capturing group around the version text**. For example, in `/href=.*?example-v?(\d+(?:\.\d+)+)(?:-src)?\.t/i`, we're only using a capturing group around the version test (matching a version like `1.2`, `1.2.3`, etc.) and we're using non-capturing groups elsewhere (e.g. `(?:-src)?`).
+* **Regexes should only use a capturing group around the version text**. For example, in `/href=.*?example-v?(\d+(?:\.\d+)+)(?:-src)?\.t/i`, we're only using a capturing group around the version text (matching a version like `1.2`, `1.2.3`, etc.) and we're using non-capturing groups elsewhere (e.g. `(?:-src)?`).
 
-* **Anchor the start/end of the regex, to restrict the scope**. For example, on HTML pages we often match file names or version directories in `href` attribute URLs (e.g. `/href=.*?example[._-]v?(\d+(?:\.\d+)+)\.zip/i`). The general idea is that limiting scope will help exclude unwanted matches.
+* **Anchor the start/end of the regex to restrict its scope**. For example, on HTML pages we often match file names or version directories in `href` attribute URLs (e.g. `/href=.*?example[._-]v?(\d+(?:\.\d+)+)\.zip/i`). The general idea is that limiting scope will help exclude unwanted matches.
 
 * **Avoid generic catchalls like `.*` or `.+`** in favor of something non-greedy and/or contextually appropriate. For example, to match characters within the bounds of an HTML attribute, use `[^"' >]+?`.
 
@@ -112,9 +115,17 @@ end
 
 The referenced formula/cask should be in the same tap, as a reference to a formula/cask from another tap will generate an error if the user doesn't already have it tapped.
 
+A formula resource whose version stays in sync with its parent formula versioning can use the same check with `formula :parent`.
+
+```ruby
+livecheck do
+  formula :parent
+end
+```
+
 ### `POST` requests
 
-Some checks require making a `POST` request and that can be accomplished by adding a `post_form` or `post_json` option to a `livecheck` block `url`.
+Some checks require making a `POST` request, which can be accomplished by adding a `post_form` or `post_json` option to a `livecheck` block `url`.
 
 ```ruby
 livecheck do
@@ -126,7 +137,7 @@ livecheck do
 end
 ```
 
-`post_form` is used for form data and `post_json` is used for JSON data. livecheck will encode the provided hash value to the appropriate format before making the request.
+`post_form` is used for form data and `post_json` is used for JSON data. Livecheck will encode the provided hash value to the appropriate format before making the request.
 
 `POST` support only applies to strategies that use `Strategy::page_headers` or `::page_content` (directly or indirectly), so it does not apply to `ExtractPlist`, `Git`, `GithubLatest`, `GithubReleases`, etc.
 
@@ -219,7 +230,7 @@ end
 
 A `strategy` block for `GithubLatest` receives the parsed JSON data from the GitHub API for a repository's "latest" release, along with a regex. When a regex is not provided in a `livecheck` block, the strategy's default regex is passed into the `strategy` block instead.
 
-By default, the strategy matches version text in the release's tag or title but a `strategy` block can be used to check any of the fields in the release JSON. The logic in the following `strategy` block is similar to the default behavior but only checks the release tag instead, for the sake of demonstration:
+By default, the strategy matches version text in the release's tag or title but a `strategy` block can be used to check any of the fields in the release JSON. The logic in the following `strategy` block is similar to the default behaviour but only checks the release tag instead, for the sake of demonstration:
 
 ```ruby
 livecheck do
@@ -240,7 +251,7 @@ You can find more information on the response JSON from this API endpoint in the
 
 A `strategy` block for `GithubReleases` receives the parsed JSON data from the GitHub API for a repository's most recent releases, along with a regex. When a regex is not provided in a `livecheck` block, the strategy's default regex is passed into the `strategy` block instead.
 
-By default, the strategy matches version text in each release's tag or title but a `strategy` block can be used to check any of the fields in the release JSON. The logic in the following `strategy` block is similar to the default behavior but only checks the release tag instead, for the sake of demonstration:
+By default, the strategy matches version text in each release's tag or title but a `strategy` block can be used to check any of the fields in the release JSON. The logic in the following `strategy` block is similar to the default behaviour but only checks the release tag instead, for the sake of demonstration:
 
 ```ruby
 livecheck do
@@ -343,7 +354,7 @@ A `strategy` block for `Sparkle` receives an `item` which has methods for the `v
 brew find-appcast '/path/to/application.app'
 ```
 
-The default pattern for the `Sparkle` strategy is to generate `"#{item.short_version},#{item.version}"` from `sparkle:shortVersionString` and `sparkle:version` if both are set. In the example below, the `url` also includes a download ID which is needed:
+The default pattern for the `Sparkle` strategy is to generate `"#{item.short_version},#{item.version}"` from `sparkle:shortVersionString` and `sparkle:version` if both are set. In the example below, the returned value also includes a needed download ID from the `url`:
 
 ```ruby
 livecheck do
@@ -363,6 +374,17 @@ livecheck do
 end
 ```
 
+If the value returned by `item` is not the most recent or not what's desired, passing `items` instead will allow iterating over all the items in the feed:
+
+```ruby
+livecheck do
+  url "https://www.example.com/example.xml"
+  strategy :sparkle do |items|
+    items.find { |item| item.channel.nil? }&.short_version
+  end
+end
+```
+
 #### `Xml` `strategy` block
 
 A `strategy` block for `Xml` receives an `REXML::Document` object and, if provided, a regex. For example, if the XML contains a `versions` element with nested `version` elements and their inner text contains the version string, we could extract it using a regex as follows:
@@ -416,6 +438,18 @@ livecheck do
 end
 ```
 
+### `throttle`
+
+For software with extremely frequent releases that don't all need to be published as formula/cask updates, livecheck can be set to reduce how many versions it surfaces by using `throttle`. In this example, only versions whose last component is divisible by 10 will be returned.
+
+```ruby
+livecheck do
+  url :stable
+  regex(/^v?(\d+(?:\.\d+)+)$/i)
+  throttle 10
+end
+```
+
 ### `skip`
 
 Livecheck automatically skips some formulae/casks for a number of reasons (deprecated, disabled, etc.). However, on rare occasions we need to use a `livecheck` block to do a manual skip. The `skip` method takes a string containing a very brief reason for skipping.
diff --git a/docs/Cask-Cookbook.md b/docs/Cask-Cookbook.md
index b1f280eb5b..7d750b8ac4 100644
--- a/docs/Cask-Cookbook.md
+++ b/docs/Cask-Cookbook.md
@@ -1,5 +1,5 @@
 ---
-last_review_date: "1970-01-01"
+last_review_date: 2025-05-18
 ---
 
 # Cask Cookbook
@@ -33,7 +33,7 @@ Exception: `do` blocks such as `postflight` may enclose a block of pure Ruby cod
 
 ## Header line details
 
-The Cask name ([``](#token-reference)) on the header line `cask  do` should match the cask filename, without the `.rb` extension, enclosed in double quotes.
+The cask name ([``](#token-reference)) on the header line `cask  do` should match the cask filename, without the `.rb` extension, enclosed in double quotes.
 
 There are currently some arbitrary limitations on cask tokens which are in the process of being removed. GitHub Actions will catch any errors during the transition.
 
@@ -41,6 +41,9 @@ There are currently some arbitrary limitations on cask tokens which are in the p
 
 Having a common order for stanzas makes casks easier to update and parse. Below is the complete stanza sequence (no cask will have all stanzas). The empty lines shown here are also important, as they help to visually delimit information.
 
+    arch
+    os
+
     version
     sha256
 
@@ -67,6 +70,9 @@ Having a common order for stanzas makes casks easier to update and parse. Below
     installer
     binary
     manpage
+    bash_completion
+    fish_completion
+    zsh_completion
     colorpicker
     dictionary
     font
@@ -106,21 +112,21 @@ Note that every stanza that has additional parameters (`:symbols` after a `,`) s
 
 Each of the following stanzas is required for every cask.
 
-| name                         | multiple occurrences allowed? | value |
-| ---------------------------- | :---------------------------: | ----- |
-| [`version`](#stanza-version) | no                            | Application version. |
-| [`sha256`](#stanza-sha256)   | no                            | SHA-256 checksum of the file downloaded from `url`, calculated by the command `shasum -a 256 `. Can be suppressed by using the special value `:no_check`. |
-| [`url`](#stanza-url)         | no                            | URL to the `.dmg`/`.zip`/`.tgz`/`.tbz2` file that contains the application. A [comment](#when-url-and-homepage-domains-differ-add-verified) should be added if the domains in the `url` and `homepage` stanzas differ. Block syntax should be used for URLs that change on every visit. |
-| [`name`](#stanza-name)       | yes                           | String providing the full and proper name defined by the vendor. |
-| [`desc`](#stanza-desc)       | no                            | One-line description of the cask. Shown when running `brew info`. |
-| `homepage`                   | no                            | Application homepage; used for the `brew home` command. |
-| [`livecheck`](#stanza-livecheck)           | no                            | Ruby block describing how to find updates for this cask. Supersedes `appcast`. |
-| [`depends_on`](#stanza-depends_on)         | yes                           | List of dependencies and requirements for this cask. |
-| [`zap`](#stanza-zap)                       | yes                           | Additional procedures for a more complete uninstall, including user files and shared resources. |
+| name                               | multiple occurrences allowed? | value |
+| ---------------------------------- | :---------------------------: | ----- |
+| [`version`](#stanza-version)       | no                            | Application version, or the special value `:latest`. |
+| [`sha256`](#stanza-sha256)         | no                            | SHA-256 checksum of the file downloaded from `url` as calculated by the command `shasum -a 256 `, or the special value `:no_check`. |
+| [`url`](#stanza-url)               | no                            | URL to the `.dmg`/`.zip`/`.tgz`/`.tbz2` file that contains the application. A [comment](#when-url-and-homepage-domains-differ-add-verified) should be added if the domains in the `url` and `homepage` stanzas differ. |
+| [`name`](#stanza-name)             | yes                           | String providing the full and proper name defined by the vendor. |
+| [`desc`](#stanza-desc)             | no                            | One-line description of the cask. Shown when running `brew info`. |
+| `homepage`                         | no                            | Application homepage; used for the `brew home` command. |
+| [`livecheck`](#stanza-livecheck)   | no                            | Ruby block describing how to find updates for this cask. Supersedes `appcast`. |
+| [`depends_on`](#stanza-depends_on) | yes                           | List of dependencies and requirements for this cask. |
+| [`zap`](#stanza-zap)               | yes                           | Additional procedures for a more complete uninstall, including user files and shared resources. |
 
 ### At least one artifact stanza is also required
 
-Each cask must declare one or more *artifacts* (i.e. something to install).
+Each cask must declare one or more [artifacts](https://rubydoc.brew.sh/Cask/Artifact) (i.e. something to install).
 
 | name                             | multiple occurrences allowed? | value |
 | -------------------------------- | :---------------------------: | ----- |
@@ -130,6 +136,9 @@ Each cask must declare one or more *artifacts* (i.e. something to install).
 | [`installer`](#stanza-installer) | yes                           | Describes an executable which must be run to complete the installation. |
 | [`binary`](#stanza-binary)       | yes                           | Relative path to a Binary that should be linked into the `$(brew --prefix)/bin` folder on installation. |
 | `manpage`                        | yes                           | Relative path to a Man Page that should be linked into the respective man page folder on installation, e.g. `/opt/homebrew/share/man/man3` for `my_app.3`. |
+| `bash_completion`                | yes                           | Relative path to a Bash completion file that should be linked into the `$(brew --prefix)/etc/bash_completion.d` folder on installation. |
+| `fish_completion`                | yes                           | Relative path to a fish completion file that should be linked into the `$(brew --prefix)/share/fish/vendor_completions.d` folder on installation. |
+| `zsh_completion`                 | yes                           | Relative path to a Zsh completion file that should be linked into the `$(brew --prefix)/share/zsh/site-functions` folder on installation. |
 | `colorpicker`                    | yes                           | Relative path to a ColorPicker plugin that should be moved into the `~/Library/ColorPickers` folder on installation. |
 | `dictionary`                     | yes                           | Relative path to a Dictionary that should be moved into the `~/Library/Dictionaries` folder on installation. |
 | `font`                           | yes                           | Relative path to a Font that should be moved into the `~/Library/Fonts` folder on installation. |
@@ -151,11 +160,11 @@ Each cask must declare one or more *artifacts* (i.e. something to install).
 
 | name                                       | multiple occurrences allowed? | value |
 | ------------------------------------------ | :---------------------------: | ----- |
-| [`uninstall`](#stanza-uninstall)           | yes                           | Procedures to uninstall a cask. Optional unless the `pkg` stanza is used. |
-| [`conflicts_with`](#stanza-conflicts_with) | yes                           | List of conflicts with this cask (*not yet functional*). |
+| [`uninstall`](#stanza-uninstall)           | yes                           | Procedures to uninstall a cask. Optional unless a `pkg` or `installer` artifact stanza is used. |
+| [`conflicts_with`](#stanza-conflicts_with) | yes                           | List of conflicts with this cask. |
 | [`caveats`](#stanza-caveats)               | yes                           | String or Ruby block providing the user with cask-specific information at install time. |
-| [`deprecate!`](#stanza-deprecate--disable) | no                            | Date as a String in `YYYY-MM-DD` format and a String or Symbol providing a reason. |
-| [`disable!`](#stanza-deprecate--disable)   | no                            | Date as a String in `YYYY-MM-DD` format and a String or Symbol providing a reason. |
+| [`deprecate!`](#stanza-deprecate--disable) | no                            | Date as a string in `YYYY-MM-DD` format and a string or symbol providing a reason. |
+| [`disable!`](#stanza-deprecate--disable)   | no                            | Date as a string in `YYYY-MM-DD` format and a string or symbol providing a reason. |
 | `preflight`                                | yes                           | Ruby block containing preflight install operations (needed only in very rare cases). |
 | [`postflight`](#stanza-flight)             | yes                           | Ruby block containing postflight install operations. |
 | `uninstall_preflight`                      | yes                           | Ruby block containing preflight uninstall operations (needed only in very rare cases). |
@@ -199,7 +208,7 @@ artifact "sapmachine-jdk-#{version}.jdk", target: "/Library/Java/JavaVirtualMach
 
 #### *target* works on most artifact types
 
-The `target:` key works similarly for most cask artifacts, such as `app`, `binary`, `colorpicker`, `dictionary`, `font`, `input_method`, `internet_plugin`, `keyboard_layout`, `prefpane`, `qlplugin`, `mdimporter`, `screen_saver`, `service`, `suite`, `audio_unit_plugin`, `vst_plugin`, `vst3_plugin`, and `artifact`.
+The `target:` key works similarly for most cask artifacts, such as `app`, `binary`, `bash_completion`, `fish_completion`, `zsh_completion`, `colorpicker`, `dictionary`, `font`, `input_method`, `internet_plugin`, `keyboard_layout`, `prefpane`, `qlplugin`, `mdimporter`, `screen_saver`, `service`, `suite`, `audio_unit_plugin`, `vst_plugin`, `vst3_plugin`, and `artifact`.
 
 #### *target* should only be used in select cases
 
@@ -244,7 +253,7 @@ Behaviour and usage of `target:` is [the same as with `app`](#renaming-the-targe
 
 Sometimes there are particularities with the installation of a piece of software that cannot or should not be handled programmatically by Homebrew Cask. In those instances, `caveats` is the way to inform the user. Information in `caveats` is displayed when a cask is invoked with either `install` or `info`.
 
-To avoid flooding users with too many messages (thus desensitising them to the important ones), `caveats` should be used sparingly and exclusively for installation-related matters. If you’re not sure a `caveat` you find pertinent is installation-related or not, ask a maintainer. As a general rule, if your case isn’t already covered in our comprehensive [`caveats Mini-DSL`](#caveats-mini-dsl), it’s unlikely to be accepted.
+To avoid flooding users with too many messages (thus desensitising them to the important ones), `caveats` should be used sparingly and exclusively for installation-related matters. If you’re not sure whether a `caveat` you find pertinent is installation-related or not, ask a maintainer. As a general rule, if your case isn’t already covered in our comprehensive [`caveats mini-DSL`](#caveats-mini-dsl), it’s unlikely to be accepted.
 
 #### `caveats` as a string
 
@@ -296,52 +305,15 @@ caveats do
 end
 ```
 
-### Stanza: `deprecate!` / `disable!`
-
-`deprecate!` and `disable!` are used to declare that a cask is no longer functional or supported.
-Casks that contain a `deprecate!` stanza can still be installed, but will print a warning message when they are installed or upgraded.
-Casks that contain a `disable!` stanza cannot be installed or upgraded and will print an error message.
-
-The syntax for both stanzas is the same:
-
-```ruby
-deprecate! date: "YYYY-MM-DD", because: "is ..."
-disable! date: "YYYY-MM-DD", because: "is ..."
-
-# Or with a preset reason (see the `because:` argument section below)
-deprecate! date: "YYYY-MM-DD", because: :discontinued
-disable! date: "YYYY-MM-DD", because: :discontinued
-```
-
-#### `date:` argument
-
-The `date:` argument controls when the deprecation or disabling will take effect.
-Casks that have a `deprecate!` stanza with a date in the future will not be treated as being deprecated until that date.
-Casks that have a `disable!` stanza with a date in the future will be automatically deprecated until that date, at which point they will be disabled.
-
-#### `because:` argument
-
-The `because:` argument accepts a reason for the cask being deprecated or disabled.
-The info message will be ` is deprecated because it !`, so format the reason to fit that sentence.
-For example, `because: "is broken"` will result in ` is deprecated because it is broken!`.
-
-The `because:` argument can also accept a symbol that corresponds to a preset reason, for example:
-
-```ruby
-deprecate! date: "YYYY-MM-DD", because: :discontinued
-```
-
-A complete list of allowable symbols can be found in the [`DeprecateDisable` module](https://github.com/Homebrew/brew/blob/master/Library/Homebrew/deprecate_disable.rb).
-
 ### Stanza: `conflicts_with`
 
-`conflicts_with` is used to declare conflicts that keep a cask from installing or working correctly.
+`conflicts_with` is used to declare conflicts that prevent a cask from installing or working correctly.
 
 #### `conflicts_with` *cask*
 
 The value should be another cask token.
 
-Example: the [macFUSE](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/m/macfuse.rb#L17) cask, which conflicts with `macfuse-dev`.
+Example: [macFUSE](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/m/macfuse.rb#L17), which conflicts with `macfuse-dev`.
 
 ```ruby
 conflicts_with cask: "macfuse-dev"
@@ -363,9 +335,17 @@ conflicts_with formula: "macvim"
 
 `depends_on` is used to declare dependencies and requirements for a cask. `depends_on` is not consulted until `install` is attempted.
 
+| key        | description |
+| ---------- | ----------- |
+| `cask:`    | required Homebrew cask tokens as string or array |
+| `formula:` | required Homebrew formula names as string or array |
+| `macos:`   | macOS release requirements as symbol, array or string comparison expression |
+| `arch:`    | hardware requirements as symbol or array  |
+| `java:`    | *stub - not yet functional* |
+
 #### `depends_on` *cask*
 
-The value should be another cask token, needed by the current cask.
+The value should be one or more tokens of casks needed by the current cask, as a string or array of strings.
 
 Example: [NTFSTool](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/n/ntfstool.rb#L11), which depends on macFUSE.
 
@@ -375,7 +355,7 @@ depends_on cask: "macfuse"
 
 #### `depends_on` *formula*
 
-The value should name a Homebrew formula needed by the cask.
+The value should be one or more names of formulae needed by the current cask, as a string or array of strings.
 
 Example: some distributions are contained in archive formats such as `7z` which are not supported by stock Apple tools. For these cases, a more capable archive reader may be pulled in at install time by declaring a dependency on the `unar` formula:
 
@@ -387,7 +367,7 @@ depends_on formula: "unar"
 
 ##### Requiring an exact macOS release
 
-The value for `depends_on macos:` may be a symbol or an array of symbols, listing the exact compatible macOS releases. The available values for macOS releases are defined in the [MacOSVersion class](https://rubydoc.brew.sh/MacOSVersion.html).
+The value for `depends_on macos:` may be a symbol or an array of symbols, listing the exact compatible macOS releases. The values for supported macOS releases can be found in the [`MacOSVersion` class](https://rubydoc.brew.sh/MacOSVersion) documentation.
 
 Only major releases are covered (10.x numbers containing a single dot or whole numbers since macOS 11). The symbol form is used for readability. The following are all valid ways to enumerate the exact macOS release requirements for a cask:
 
@@ -401,7 +381,7 @@ depends_on macos: [
 
 ##### Setting a minimum macOS release
 
-`depends_on macos:` can also accept a string starting with a comparison operator such as `>=`, followed by an macOS release in the form above. The following is a valid expression meaning “at least macOS Big Sur (11.0)”:
+`depends_on macos:` can also accept a string starting with a comparison operator such as `>=`, followed by a macOS release in the form above. The following is a valid expression meaning “at least macOS Big Sur (11.0)”:
 
 ```ruby
 depends_on macos: ">= :big_sur"
@@ -411,12 +391,12 @@ A comparison expression cannot be combined with any other form of `depends_on ma
 
 #### `depends_on` *arch*
 
-The value for `depends_on arch:` may be a symbol or an array of symbols, listing the hardware compatibility requirements for a cask. The requirement is satisfied at install time if any one of multiple `arch:` values matches the user’s hardware.
+The value for `depends_on arch:` may be a symbol or an array of symbols, listing the hardware compatibility requirements for a cask. The requirement is satisfied at install time if any one of the provided `arch:` values matches the user’s hardware.
 
 The available symbols for hardware are:
 
-| symbol     | meaning        |
-| ---------- | -------------- |
+| symbol     | meaning |
+| ---------- | ------- |
 | `:arm64`   | Apple Silicon |
 | `:x86_64`  | 64-bit Intel |
 | `:intel`   | 64-bit Intel |
@@ -430,19 +410,52 @@ depends_on arch: :x86_64            # same meaning as above
 depends_on arch: [:x86_64]          # same meaning as above
 ```
 
-#### `depends_on` parameters
+### Stanza: `deprecate!` / `disable!`
 
-| key        | description |
-| ---------- | ----------- |
-| `formula:` | Homebrew formula |
-| `cask:`    | cask token |
-| `macos:`   | symbol, array, or string comparison expression defining macOS release requirements |
-| `arch:`    | symbol or array defining hardware requirements |
-| `java:`    | *stub - not yet functional* |
+`deprecate!` and `disable!` are used to declare that a cask is no longer functional or supported.
+Casks that contain a `deprecate!` stanza can still be installed, but will print a warning message when they are installed or upgraded.
+Casks that contain a `disable!` stanza cannot be installed or upgraded and will print an error message.
+
+The syntax for both stanzas is the same:
+
+```ruby
+deprecate! date: "YYYY-MM-DD", because: "is ..."
+disable! date: "YYYY-MM-DD", because: "is ..."
+
+# Or with a preset reason and suggested replacement (see the parameter sections below)
+deprecate! date: "YYYY-MM-DD", because: :discontinued, replacement_formula: "another"
+disable! date: "YYYY-MM-DD", because: :unmaintained, replacement_cask: "alternative"
+```
+
+#### `date:` parameter
+
+The `date:` parameter controls when the deprecation or disabling will take effect.
+Casks that have a `deprecate!` stanza with a date in the future will not be treated as being deprecated until that date.
+Casks that have a `disable!` stanza with a date in the future will be automatically deprecated until that date, at which point they will become disabled.
+
+#### `because:` parameter
+
+The `because:` parameter accepts a reason for the cask being deprecated or disabled.
+The info message will be ` is deprecated because it !`, so format the reason to fit that sentence.
+For example, `because: "is broken"` will result in ` is deprecated because it is broken!`.
+
+The `because:` parameter can also accept a symbol that corresponds to a preset reason, for example:
+
+```ruby
+deprecate! date: "YYYY-MM-DD", because: :discontinued
+```
+
+A complete list of allowable symbols can be found in the [`DeprecateDisable` module](https://rubydoc.brew.sh/DeprecateDisable) documentation.
+
+#### `replacement_formula:` / `replacement_cask:` parameter
+
+The `replacement_formula:` and `replacement_cask:` parameters accept a string for suggesting a replacement formula or cask to the user.
+
+Refer to [Deprecating, Disabling and Removing Casks](Deprecating-Disabling-and-Removing-Casks.md) for more information about the deprecation process for casks.
 
 ### Stanza: `desc`
 
-`desc` accepts a single-line UTF-8 string containing a short description of the software. It’s used to help with searchability and disambiguation, thus it must concisely describe what the software does (or what you can accomplish with it).
+`desc` accepts a single-line UTF-8 string containing a short description of the software. As it’s used to help with searchability and disambiguation, it must concisely describe what the software does (or what you can accomplish with it).
 
 `desc` is not for app slogans! Vendors’ descriptions tend to be filled with generic adjectives such as “modern” and “lightweight”. Those are meaningless marketing fluff (do you ever see apps proudly describing themselves as outdated and bulky?) which must be deleted. It’s fine to use the information on the software’s website as a starting point, but it will require editing in almost all cases.
 
@@ -469,7 +482,7 @@ depends_on arch: [:x86_64]          # same meaning as above
   + desc "Sound and music editor"
   ```
 
-* **Do not** include the platform. Casks only work on macOS, so this is redundant information.
+* **Do not** include the platform. Casks always work on macOS, so this is redundant information.
 
   ```diff
   - desc "Sound and music editor for macOS"
@@ -523,7 +536,7 @@ The following methods may be called to perform standard tasks:
 | `set_ownership(paths)`                    | `preflight`, `postflight`, `uninstall_preflight` | Set user and group ownership of `paths`. (Example: [docker-toolbox.rb](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/d/docker-toolbox.rb#L42)) |
 | `set_permissions(paths, permissions_str)` | `preflight`, `postflight`, `uninstall_preflight` | Set permissions in `paths` to `permissions_str`. (Example: [ngrok.rb](https://github.com/Homebrew/homebrew-cask/blob/41d91ff669d85343175202adf568e2328486205f/Casks/n/ngrok.rb#L30)) |
 
-`set_ownership(paths)` defaults user ownership to the current user and group ownership to `staff`. These can be changed by passing in extra options: `set_ownership(paths, user: "user", group: "group")`. (Example: [hummingbird.rb](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/h/hummingbird.rb#L24))
+`set_ownership(paths)` defaults to setting user and group ownership to the current user and `staff`. These can be changed by passing in extra options: `set_ownership(paths, user: "user", group: "group")`. (Example: [hummingbird.rb](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/h/hummingbird.rb#L24))
 
 ### Stanza: `installer`
 
@@ -533,7 +546,7 @@ The `installer` stanza takes a series of key-value pairs, the first key of which
 
 #### `installer` *manual*
 
-`installer manual:` takes a single string value, describing a GUI installer which must be run by the user at a later time. The path may be absolute, or relative to the cask. Example (from [rubymotion.rb](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/r/rubymotion.rb#L15)):
+`installer manual:` takes a single string value for the path to an interactive installer which must be run by the user at a later time. The path may be absolute, or relative to the cask. Example (from [rubymotion.rb](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/r/rubymotion.rb#L15)):
 
 ```ruby
 installer manual: "RubyMotion Installer.app"
@@ -541,7 +554,7 @@ installer manual: "RubyMotion Installer.app"
 
 #### `installer` *script*
 
-`installer script:` introduces a series of key-value pairs describing a command which will automate completion of the install. **It should never be used for interactive installations.** The form is similar to [`uninstall script:`](#uninstall-script):
+`installer script:` takes a series of key-value pairs describing a command which will automate completion of the install. **It should never be used for interactive installations.** The form is similar to [`uninstall script:`](#uninstall-script):
 
 | key             | value |
 | --------------- | ----- |
@@ -549,6 +562,8 @@ installer manual: "RubyMotion Installer.app"
 | `args:`         | array of arguments to the install script |
 | `input:`        | array of lines of input to be sent to `stdin` of the script |
 | `must_succeed:` | set to `false` if the script is allowed to fail |
+| `print_stderr:` | set to `false` to suppress `stderr` output |
+| `print_stdout:` | set to `false` to suppress `stdout` output |
 | `sudo:`         | set to `true` if the script needs *sudo* |
 
 The path may be absolute, or relative to the cask. Example (from [miniforge.rb](https://github.com/Homebrew/homebrew-cask/blob/864f623e2cd17dbde5987a7b3923fdb0b4ac9ee5/Casks/m/miniforge.rb#L23-L26)):
@@ -560,7 +575,7 @@ installer script: {
 }
 ```
 
-If the `installer script:` does not require any of the key-values it can point directly to the path of the install script:
+If the `installer script:` does not require any of the key-value pairs, it can be given just the path to the install script:
 
 ```ruby
 installer script: "#{staged_path}/install.sh"
@@ -624,7 +639,7 @@ The `livecheck` stanza is used to automatically fetch the latest version of a ca
 
 Every `livecheck` block must contain a `url`, which can be either a string or a symbol pointing to other URLs in the cask (`:url` or `:homepage`).
 
-Refer to the [`brew livecheck` documentation](Brew-Livecheck.md) for how to write a `livecheck` block.
+Refer to the [`brew livecheck`](Brew-Livecheck.md) documentation for how to write a `livecheck` block.
 
 ### Stanza: `name`
 
@@ -646,7 +661,7 @@ The first argument to the `pkg` stanza should be a relative path to the `.pkg` f
 pkg "Unity.pkg"
 ```
 
-Subsequent arguments to `pkg` are key/value pairs which modify the install process. Currently supported keys are `allow_untrusted:` and `choices:`.
+Subsequent arguments to `pkg` are key-value pairs which modify the install process. Currently supported keys are `allow_untrusted:` and `choices:`.
 
 #### `pkg` *allow_untrusted*
 
@@ -717,9 +732,9 @@ shasum --algorithm 256 
 
 #### Special value `:no_check`
 
-The special value `sha256 :no_check` is used to turn off SHA checking whenever checksumming is impractical due to the upstream configuration.
+The special value `sha256 :no_check` is used to turn off SHA checking whenever checksumming is impractical due to the upstream configuration, e.g. when `url` does not change between releases.
 
-`version :latest` requires `sha256 :no_check`, and this pairing is common. However, `sha256 :no_check` does not require `version :latest`.
+`sha256 :no_check` is required by [`version :latest`](#special-value-latest), and this pairing is common. However, `sha256 :no_check` does not require `version :latest`.
 
 We use a checksum whenever possible.
 
@@ -739,46 +754,41 @@ The value of `suite` is never an `.app` bundle, but a plain directory.
 
 > If you cannot design a working `uninstall` stanza, please submit your cask anyway. The maintainers can help you write an `uninstall` stanza, just ask!
 
-#### `uninstall pkgutil:` is the easiest and most useful
+#### `uninstall` is required for casks that install using `pkg` or `installer`
 
-The easiest and most useful `uninstall` directive is [`pkgutil:`](#uninstall-pkgutil). It should cover most use cases.
+For most casks, uninstall actions are determined automatically, and an explicit `uninstall` stanza is not needed. However, a cask which uses the [`pkg`](#stanza-pkg) or [`installer`](#stanza-installer) stanzas will **not** know how to uninstall correctly unless an `uninstall` stanza is given.
 
-#### `uninstall` is required for casks that install using `pkg` or `installer manual:`
+So, while the [cask DSL](#required-stanzas) does not enforce the requirement, it is much better for users if every `pkg` and `installer` has a corresponding `uninstall`.
 
-For most casks, uninstall actions are determined automatically, and an explicit `uninstall` stanza is not needed. However, a cask which uses the `pkg` or `installer manual:` stanzas will **not** know how to uninstall correctly unless an `uninstall` stanza is given.
-
-So, while the [cask DSL](#required-stanzas) does not enforce the requirement, it is much better for users if every `pkg` and `installer manual:` has a corresponding `uninstall`.
-
-The `uninstall` stanza is available for non-`pkg` casks, and is useful for a few corner cases. However, the documentation below concerns the typical case of using `uninstall` to define procedures for a `pkg`.
+The `uninstall` stanza is available for other artifact types, and is useful for a few corner cases. However, the documentation below concerns the typical case of using `uninstall` to define procedures for a `pkg`.
 
 #### There are multiple uninstall techniques
 
-Since `pkg` installers can do arbitrary things, different techniques are needed to uninstall in each case. You may need to specify one, or several, of the following key/value pairs as arguments to `uninstall`.
+Since `pkg` installers can do arbitrary things, different techniques are needed to uninstall in each case. You may need to specify one, or several, of the following key-value pairs as arguments to `uninstall`.
+
+##### `uninstall pkgutil:` is the easiest and most useful
+
+The easiest and most useful `uninstall` directive is [`pkgutil:`](#uninstall-pkgutil). It should cover most use cases.
 
 #### Summary of keys
 
 * **`early_script:`** (string or hash) - like [`script:`](#uninstall-script), but runs early (for special cases, best avoided)
 * [`launchctl:`](#uninstall-launchctl) (string or array) - IDs of `launchd` jobs to remove
 * [`quit:`](#uninstall-quit) (string or array) - bundle IDs of running applications to quit (does not run when uninstall is initiated by `brew upgrade` or `brew reinstall`)
-* [`signal:`](#uninstall-signal) (array of arrays) - signal numbers and bundle IDs of running applications to send a Unix signal to - for when `quit:` does not work (does not run when uninstall is initiated by `brew upgrade` or `brew reinstall`)
+* [`signal:`](#uninstall-signal) (array of arrays) - signal numbers and bundle IDs of running applications to send a Unix signal to, for when `quit:` does not work (does not run when uninstall is initiated by `brew upgrade` or `brew reinstall`)
 * [`login_item:`](#uninstall-login_item) (string or array) - names of login items to remove
 * [`kext:`](#uninstall-kext) (string or array) - bundle IDs of kexts to unload from the system
-* [`script:`](#uninstall-script) (string or hash) - relative path to an uninstall script to be run via sudo; use hash if args are needed
-  * `executable:` - relative path to an uninstall script to be run via sudo (required for hash form)
-  * `args:` - array of arguments to the uninstall script
-  * `input:` - array of lines of input to be sent to `stdin` of the script
-  * `must_succeed:` - set to `false` if the script is allowed to fail
-  * `sudo:` - set to `true` if the script needs *sudo*
+* [`script:`](#uninstall-script) (string or hash) - relative path to an uninstall script to be run via *sudo*; use hash if args are needed
 * [`pkgutil:`](#uninstall-pkgutil) (string, regexp or array of strings and regexps) - strings or regexps matching bundle IDs of packages to uninstall using `pkgutil`
 * [`delete:`](#uninstall-delete) (string or array) - double-quoted, absolute paths of files or directory trees to remove. Should only be used as a last resort; `pkgutil:` is strongly preferred.
-* **`rmdir:`** (string or array) - double-quoted, absolute paths of directories to remove if empty. Works recursively.
+* **`rmdir:`** (string or array) - double-quoted, absolute paths of directories to remove if empty; works recursively
 * [`trash:`](#uninstall-trash) (string or array) - double-quoted, absolute paths of files or directory trees to move to Trash
 
 Each `uninstall` technique is applied according to the order above. The order in which `uninstall` keys appear in the cask file is ignored.
 
-For assistance filling in the right values for `uninstall` keys, there are several helper scripts found under `developer/bin` in the Homebrew Cask repository. Each of these scripts responds to the `-help` option with additional documentation.
+For assistance filling in the right values for `uninstall` keys, there are several [helper scripts found under `developer/bin`](https://github.com/Homebrew/homebrew-cask/tree/HEAD/developer/bin) in the Homebrew Cask repository. Each of these scripts responds to the `-help` option with additional documentation.
 
-Working out an `uninstall` stanza is easiest when done on a system where the package is currently installed and operational. To operate on an uninstalled `.pkg` file, see [Working With a `.pkg` File Manually](#working-with-a-pkg-file-manually), below.
+Working out an `uninstall` stanza is easiest when done on a system where the package is currently installed and operational. To operate on an uninstalled `.pkg` file, see [Working with a `.pkg` file manually](#working-with-a-pkg-file-manually), below.
 
 #### `uninstall` *pkgutil*
 
@@ -790,7 +800,7 @@ IDs for the most recently installed packages can be listed using [`list_recent_p
 "$(brew --repository homebrew/cask)/developer/bin/list_recent_pkg_ids"
 ```
 
-`pkgutil:` also accepts a regular expression match against multiple package IDs. The regular expressions are somewhat nonstandard. To test a `pkgutil:` regular expression against currently installed packages, use [`list_pkg_ids_by_regexp`](https://github.com/Homebrew/homebrew-cask/blob/HEAD/developer/bin/list_pkg_ids_by_regexp):
+`pkgutil:` also accepts a regular expression to match against multiple package IDs. The regular expressions are somewhat nonstandard. To test a `pkgutil:` regular expression against currently installed packages, use [`list_pkg_ids_by_regexp`](https://github.com/Homebrew/homebrew-cask/blob/HEAD/developer/bin/list_pkg_ids_by_regexp):
 
 ```bash
 "$(brew --repository homebrew/cask)/developer/bin/list_pkg_ids_by_regexp" 
@@ -838,7 +848,7 @@ Bundle IDs inside an application bundle on disk can be listed using [`list_ids_i
 
 `signal:` should only be needed in the rare case that a process does not respond to `quit:`.
 
-Bundle IDs for `signal:` targets may be obtained in the same way as for `quit:`. The value for `signal:` is an array-of-arrays, with each cell containing two elements: the desired Unix signal followed by the corresponding bundle ID.
+Bundle IDs for `signal:` targets may be obtained in the same way as for `quit:`. The value for `signal:` is an array of arrays, with each cell containing two elements: the desired Unix signal followed by the corresponding bundle ID.
 
 The Unix signal may be given in numeric or string form (see the `kill`(1) man page for more details).
 
@@ -860,7 +870,7 @@ uninstall signal: [
 
 Note that when multiple running processes match the given bundle ID, all matching processes will be signaled.
 
-Unlike `quit:` directives, Unix signals originate from the current user, not from the superuser. This is construed as a safety feature, since the superuser is capable of bringing down the system via signals. However, this inconsistency may also be considered a bug, and should be addressed in some fashion in a future version.
+Unlike `quit:` directives, Unix signals originate from the current user, not from the superuser. This is construed as a safety feature, since the superuser is capable of bringing down the system via signals. However, this inconsistency could also be considered a bug, and may be addressed in some fashion in a future version.
 
 #### `uninstall` *login_item*
 
@@ -888,7 +898,19 @@ IDs inside a kext bundle on disk can be listed using [`list_id_in_kext`](https:/
 
 #### `uninstall` *script*
 
-`uninstall script:` introduces a series of key-value pairs describing a command which will automate completion of the uninstall. Example (from [virtualbox.rb](https://github.com/Homebrew/homebrew-cask/blob/ef9931087f6e101262bf64119166e2d9cec068f0/Casks/v/virtualbox.rb#L55-L61)):
+`uninstall script:` introduces a series of key-value pairs describing a command which will automate completion of the uninstall. The form is similar to [`installer script:`](#installer-script):
+
+| key             | value |
+| --------------- | ----- |
+| `executable:`   | path to an uninstall script to be run |
+| `args:`         | array of arguments to the uninstall script |
+| `input:`        | array of lines of input to be sent to `stdin` of the script |
+| `must_succeed:` | set to `false` if the script is allowed to fail |
+| `print_stderr:` | set to `false` to suppress `stderr` output |
+| `print_stdout:` | set to `false` to suppress `stdout` output |
+| `sudo:`         | set to `true` if the script needs *sudo* |
+
+The path may be absolute, or relative to the cask. Example (from [virtualbox.rb](https://github.com/Homebrew/homebrew-cask/blob/ef9931087f6e101262bf64119166e2d9cec068f0/Casks/v/virtualbox.rb#L55-L61)):
 
 ```ruby
 uninstall script:  {
@@ -944,7 +966,7 @@ A fully manual method for finding bundle IDs in a package file follows:
 
 1. Unpack `/path/to/my.pkg` (replace with your package name) with `pkgutil --expand /path/to/my.pkg /tmp/expanded.unpkg`.
 2. The unpacked package is a folder. Bundle IDs are contained within files named `PackageInfo`. These files can be found with the command `find /tmp/expanded.unpkg -name PackageInfo`.
-3. `PackageInfo` files are XML files, and bundle IDs are found within the `identifier` attributes of `` tags that look like ``, where extraneous attributes have been snipped out and replaced with ellipses.
+3. `PackageInfo` files are XML files, and bundle IDs are found within the `identifier` attributes of `` tags that look like `` (where extraneous attributes have been snipped out and replaced with ellipses).
 4. Kexts inside packages are also described in `PackageInfo` files. If any kernel extensions are present, the command `find /tmp/expanded.unpkg -name PackageInfo -print0 | xargs -0 grep -i kext` should return a `` tag with a `path` attribute that contains a `.kext` extension, for example ``.
 5. Once bundle IDs have been identified, the unpacked package directory can be deleted.
 
@@ -956,17 +978,17 @@ If available, an HTTPS URL is preferred. A plain HTTP URL should only be used in
 
 #### Additional `url` parameters
 
-When a plain URL string is insufficient to fetch a file, additional information may be provided to the `curl`-based downloader, in the form of key/value pairs appended to `url`:
+When a plain URL string is insufficient to fetch a file, additional information may be provided to the `curl`-based downloader, in the form of key-value pairs appended to `url`:
 
-| key                | value       |
-| ------------------ | ----------- |
+| key                | value |
+| ------------------ | ----- |
 | `verified:`        | string repeating the beginning of `url`, for [verification purposes](#when-url-and-homepage-domains-differ-add-verified) |
 | `using:`           | the symbols `:post` and `:homebrew_curl` are the only legal values |
-| `cookies:`         | hash of cookies to be set in the download request (Example: [oracle-jdk-javadoc.rb](https://github.com/Homebrew/homebrew-cask/blob/326c44e93aeb8d4dd73acea14a99ae215c75fdd6/Casks/o/oracle-jdk-javadoc.rb#L5-L8)) |
-| `referer:`         | string holding the URL to set as referer in the download request (Example: [firealpaca.rb](https://github.com/Homebrew/homebrew-cask/blob/c4b3f0742e044ae2a6e114eb6b90068763d0d12b/Casks/f/firealpaca.rb#L5-L6)) |
+| `cookies:`         | hash of cookies to be set for the download request (Example: [oracle-jdk-javadoc.rb](https://github.com/Homebrew/homebrew-cask/blob/326c44e93aeb8d4dd73acea14a99ae215c75fdd6/Casks/o/oracle-jdk-javadoc.rb#L5-L8)) |
+| `referer:`         | string holding the URL to set as referer for the download request (Example: [firealpaca.rb](https://github.com/Homebrew/homebrew-cask/blob/c4b3f0742e044ae2a6e114eb6b90068763d0d12b/Casks/f/firealpaca.rb#L5-L6)) |
 | `header:`          | string or array of strings holding the header(s) to set for the download request (Example: [pull-6545](https://github.com/Homebrew/brew/pull/6545#issue-503302353), [issue-15590](https://github.com/Homebrew/brew/issues/15590#issue-1774825542)) |
 | `user_agent:`      | string holding the user agent to set for the download request. Can also be set to the symbol `:fake`, which will use a generic browser-like user agent string. We prefer `:fake` when the server does not require a specific user agent. |
-| `data:`            | hash of parameters to be set in the POST request (Example: [segger-jlink.rb](https://github.com/Homebrew/homebrew-cask/blob/38ac55614f146d68ae317594f0c119e9acbd7c9e/Casks/s/segger-jlink.rb#L6-L11)) |
+| `data:`            | hash of parameters to be set for a POST request (Example: [segger-jlink.rb](https://github.com/Homebrew/homebrew-cask/blob/38ac55614f146d68ae317594f0c119e9acbd7c9e/Casks/s/segger-jlink.rb#L6-L11)) |
 
 #### When URL and homepage domains differ, add `verified:`
 
@@ -974,11 +996,11 @@ When the domains of `url` and `homepage` differ, the discrepancy should be docum
 
 This must be added so a user auditing the cask knows the URL was verified by the Homebrew Cask team as the one provided by the vendor, even though it may look unofficial. It is our responsibility as Homebrew Cask maintainers to verify both the `url` and `homepage` information when first added (or subsequently modified, apart from versioning).
 
-The parameter doesn’t mean you should trust the source blindly, but we only approve casks in which users can easily verify its authenticity with basic means, such as checking the official homepage or public repository. Occasionally, slightly more elaborate techniques may be used, such as inspecting a [`livecheck`](#stanza-livecheck) URL we established as official. Cases where such quick verifications aren’t possible (e.g. when the download URL is behind a registration wall) are [treated in a stricter manner](https://docs.brew.sh/Acceptable-Casks#unofficial-vendorless-and-walled-builds).
+The parameter doesn’t mean you should trust the source blindly, but we only approve casks in which users can easily verify its authenticity with basic means, such as checking the official homepage or public repository. Occasionally, slightly more elaborate techniques may be used, such as inspecting a [`livecheck`](#stanza-livecheck) URL we established as official. Cases where such quick verifications aren’t possible (e.g. when the download URL is behind a registration wall) are [treated in a stricter manner](Acceptable-Casks.md#unofficial-vendorless-and-walled-builds).
 
 #### Difficulty finding a URL
 
-Web browsers may obscure the direct `url` download location for a variety of reasons. Homebrew Cask supplies a [`list_url_attributes_on_file`](https://github.com/Homebrew/homebrew-cask/blob/HEAD/developer/bin/list_url_attributes_on_file) script which can read extended file attributes to extract the actual source URL of most files downloaded by a browser on macOS. The script usually emits multiple candidate URLs; you may have to test each of them:
+Web browsers may obscure the direct `url` of a download for a variety of reasons. Homebrew Cask supplies a [`list_url_attributes_on_file`](https://github.com/Homebrew/homebrew-cask/blob/HEAD/developer/bin/list_url_attributes_on_file) script which can read extended file attributes to extract the actual source URL of most files downloaded by a browser on macOS. The script usually emits multiple candidate URLs; you may have to test each of them:
 
 ```bash
 $(brew --repository homebrew/cask)/developer/bin/list_url_attributes_on_file 
@@ -986,25 +1008,25 @@ $(brew --repository homebrew/cask)/developer/bin/list_url_attributes_on_file *"`
-* An uninstaller tool such as [AppCleaner](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/a/appcleaner.rb).
-* Inspection of the usual paths, i.e. `/Library/{'Application Support',LaunchAgents,LaunchDaemons,Frameworks,Logs,Preferences,PrivilegedHelperTools}` and `~/Library/{'Application Support',Caches,Containers,LaunchAgents,Logs,Preferences,'Saved Application State'}`.
+* An uninstaller tool such as [AppCleaner](https://formulae.brew.sh/cask/appcleaner)
+* Inspection of the usual paths, i.e. `/Library/{'Application Support',LaunchAgents,LaunchDaemons,Frameworks,Logs,Preferences,PrivilegedHelperTools}` and `~/Library/{'Application Support',Caches,Containers,LaunchAgents,Logs,Preferences,'Saved Application State'}`
 
 If no additional files are discovered, instead of a zap stanza, include the following comment:
 
@@ -1180,7 +1203,7 @@ If no additional files are discovered, instead of a zap stanza, include the foll
 
 ### Handling different system configurations
 
-Casks can deliver specific versions of artifacts depending on the current macOS release or CPU architecture by either tailoring the URL / SHA-256 hash / version, using the [`on_` syntax](Formula-Cookbook.md#handling-different-system-configurations) (which replaces conditional statements using `MacOS.version` or `Hardware::CPU`), or both.
+Casks can deliver specific versions of artifacts depending on the current macOS release or CPU architecture by either tailoring the `url` / `sha256` / `version` stanzas, using the [`on_` syntax](Formula-Cookbook.md#handling-different-system-configurations) (which replaces conditional statements using `MacOS.version` or `Hardware::CPU`), or both.
 
 If your cask's artifact is offered as separate downloads for Apple Silicon and Intel architectures, they'll presumably be downloadable at distinct URLs that differ only slightly. To adjust the URL depending on the current CPU architecture, supply a hash for each to the `arm:` and `intel:` parameters of `sha256`, and use the special `arch` stanza to define the unique components of the respective URLs for substitution in the `url`. Additional substitutions can be defined by calling `on_arch_conditional` directly. Example (from [libreoffice.rb](https://github.com/Homebrew/homebrew-cask/blob/a4164b8f5084fdaefb6e2e2f4f699270690b7845/Casks/l/libreoffice.rb#L1-L10)):
 
@@ -1247,7 +1270,7 @@ cask "calibre" do
 end
 ```
 
-Such `on_` blocks can be nested and contain other stanzas not listed here. Examples: [calhash.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/c/calhash.rb), [openzfs.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/o/openzfs.rb), [r.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/r/r.rb), [wireshark.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/w/wireshark.rb)
+Such `on_` blocks can be nested and contain other stanzas not listed here. However, they should not contain `depends_on macos:` stanzas, which should occur once below the `on_` blocks and encompass all releases listed in the cask. Examples: [calhash.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/c/calhash.rb), [openzfs.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/o/openzfs.rb), [r.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/r/r.rb), [wireshark.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/w/wireshark.rb)
 
 ### Switch between languages or regions
 
@@ -1284,12 +1307,12 @@ Variables and methods should not be defined outside the `Utils` namespace, as th
 This section describes the algorithm implemented in the `generate_cask_token` script, and covers detailed rules and exceptions which are not needed in most cases.
 
 * [Purpose](#purpose)
-* [Finding the Simplified Name of the Vendor’s Distribution](#finding-the-simplified-name-of-the-vendors-distribution)
-* [Converting the Simplified Name To a Token](#converting-the-simplified-name-to-a-token)
-* [Cask Filenames](#cask-filenames)
-* [Cask Headers](#cask-headers)
-* [Cask Token Examples](#cask-token-examples)
-* [Special Affixes](#special-affixes)
+* [Finding the simplified name of the vendor’s distribution](#finding-the-simplified-name-of-the-vendors-distribution)
+* [Converting the simplified name to a token](#converting-the-simplified-name-to-a-token)
+* [Cask filenames](#cask-filenames)
+* [Cask headers](#cask-headers)
+* [Cask token examples](#cask-token-examples)
+* [Special affixes](#special-affixes)
 
 ### Purpose
 
@@ -1299,7 +1322,7 @@ Software vendors are often inconsistent with their naming. By enforcing strict n
 * Minimize renaming events
 * Unambiguously boil down the name of the software into a unique identifier
 
-Details of software names and brands will inevitably be lost in the conversion to a minimal token. To capture the vendor’s full name for a distribution, use the [`name`](#stanza-name) within a cask. `name` accepts an unrestricted UTF-8 string.
+Details of software names and brands will inevitably be lost in the conversion to a minimal token. To capture the vendor’s full name for a distribution, use the [`name`](#stanza-name) within a cask, which accepts an unrestricted UTF-8 string.
 
 ### Finding the simplified name of the vendor’s distribution
 
@@ -1311,9 +1334,13 @@ Details of software names and brands will inevitably be lost in the conversion t
 
 * Remove `.app` from the end.
 
-* Remove from the end: the string “app”, if the vendor styles the name like “Software App.app”. Exception: when “app” is an inseparable part of the name, without which the name would be inherently nonsensical, as in [whatsapp.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/w/whatsapp.rb).
+* Remove from the end: the string “app”, if the vendor styles the name like “Software App.app”.
 
-* Remove from the end: version numbers or incremental release designations such as “alpha”, “beta”, or “release candidate”. Strings which distinguish different capabilities or codebases such as “Community Edition” are currently accepted. Exception: when a number is not an incremental release counter, but a differentiator for a different product from a different vendor, as in [kdiff3.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/k/kdiff3.rb).
+  * Exception: when “app” is an inseparable part of the name, without which the name would be inherently nonsensical, as in [whatsapp.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/w/whatsapp.rb).
+
+* Remove from the end: version numbers or incremental release designations such as “alpha”, “beta”, or “release candidate”. Strings which distinguish different capabilities or codebases such as “Community Edition” are currently accepted.
+
+  * Exception: when a number is not an incremental release counter, but a differentiator for a different product from a different vendor, as in [kdiff3.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/k/kdiff3.rb).
 
 * If the version number is arranged to occur in the middle of the App name, it should also be removed.
 
@@ -1321,15 +1348,19 @@ Details of software names and brands will inevitably be lost in the conversion t
 
 * Remove from the end: strings such as “Desktop”, “for Desktop”.
 
-* Remove from the end: strings such as “Mac”, “for Mac”, “for OS X”, “macOS”, “for macOS”. These terms are generally added to ported software such as “MAME OS X.app”. Exception: when the software is not a port, and “Mac” is an inseparable part of the name, without which the name would be inherently nonsensical, as in [PlayOnMac.app](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/p/playonmac.rb).
+* Remove from the end: strings such as “Mac”, “for Mac”, “for OS X”, “macOS”, “for macOS”. These terms are generally added to ported software such as “MAME OS X.app”.
+
+  * Exception: when the software is not a port, and “Mac” is an inseparable part of the name, without which the name would be inherently nonsensical, as in [PlayOnMac.app](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/p/playonmac.rb).
 
 * Remove from the end: hardware designations such as “for x86”, “32-bit”, “ARM”.
 
-* Remove from the end: software framework names such as “Cocoa”, “Qt”, “Gtk”, “Wx”, “Java”, “Oracle JVM”, etc. Exception: the framework is the product being casked.
+* Remove from the end: software framework names such as “Cocoa”, “Qt”, “Gtk”, “Wx”, “Java”, “Oracle JVM”, etc.
+
+  * Exception: the framework is the product being casked.
 
 * Remove from the end: localization strings such as “en-US”.
 
-* If the result of that process is a generic term, such as “Macintosh Installer”, try prepending the name of the vendor or developer, followed by a hyphen. If that doesn’t work, then just create the best name you can, based on the vendor’s web page.
+* If the result of this process is a generic term, such as “Macintosh Installer”, try prepending the name of the vendor or developer, followed by a hyphen. If that doesn’t work, then just create the best name you can, based on the vendor’s web page.
 
 * If the result conflicts with the name of an existing cask, make yours unique by prepending the name of the vendor or developer, followed by a hyphen. Example: [unison.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/u/unison.rb) and [panic-unison.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/p/panic-unison.rb).
 
@@ -1352,7 +1383,7 @@ Details of software names and brands will inevitably be lost in the conversion t
 
 #### Simplified names of `pkg`-based installers
 
-* The Simplified Name of a `pkg` may be more tricky to determine than that of an App. If a `pkg` installs an App, then use that App name with the rules above. If not, just create the best name you can, based on the vendor’s web page.
+* The simplified name of a `pkg` may be more tricky to determine than that of an App. If a `pkg` installs an App, then use that App name with the rules above. If not, just create the best name you can, based on the vendor’s web page.
 
 #### Simplified names of non-App software
 
@@ -1362,9 +1393,9 @@ Details of software names and brands will inevitably be lost in the conversion t
 
 ### Converting the simplified name to a token
 
-The token is the primary identifier for a package in this project. It’s the unique string users refer to when operating on the cask.
+As the token is the primary identifier for casks, it’s the unique string users refer to when operating on them.
 
-To convert the App’s Simplified Name (above) to a token:
+To convert the App’s simplified name (above) to a token:
 
 * Convert all letters to lower case.
 * Expand the `+` symbol into a separated English word: `-plus-`.
@@ -1376,19 +1407,19 @@ To convert the App’s Simplified Name (above) to a token:
 * Digits stay digits.
 * Delete any character which is not alphanumeric or a hyphen.
 * Collapse a series of multiple hyphens into one hyphen.
-* Delete a leading or trailing hyphen.
+* Delete any leading or trailing hyphens.
 
-### Casks pinned to specific versions
+#### Casks pinned to specific versions
 
-Casks pinned to a specific version of the application (i.e. [`carbon-copy-cloner@5`](https://github.com/Homebrew/homebrew-cask/blob/1b8f44198e5e184c597ee07454a1e10f97f36b15/Casks/c/carbon-copy-cloner%405.rb)) should use the same token as the standard cask with a suffix of `@`. For Carbon Copy Cloner (`carbon-copy-cloner`), pinned to version 5, the token should be `carbon-copy-cloner@5`.
 
-### Casks pinned to development channels
+#### Casks pinned to development channels
 
-Casks that use an development "channel", such as betas, should use the same token as the standard cask with a suffix of `@`. For Google Chrome (`google-chrome`), using the "beta" channel, the token should be `google-chrome@beta`.
+Casks that use a development "channel", such as betas, should use the same token as the standard cask with a suffix of `@`. For Google Chrome (`google-chrome`), using the "beta" channel, the token should be `google-chrome@beta`.
 
 ### Cask filenames
 
-Casks are stored in a Ruby file named after the token, with the file extension `.rb`.
+Casks are defined in a Ruby file named after the token, with the file extension `.rb`.
 
 ### Cask headers
 
@@ -1399,7 +1430,7 @@ The token is also given in the header line for each cask.
 These illustrate most of the rules for generating a token:
 
 | App Name on Disk       | Simplified App Name | Cask Token       | Filename |
-|------------------------|---------------------|------------------|----------------------|
+| ---------------------- | ------------------- | ---------------- | -------- |
 | `Audio Hijack Pro.app` | Audio Hijack Pro    | audio-hijack-pro | `audio-hijack-pro.rb` |
 | `VLC.app`              | VLC                 | vlc              | `vlc.rb` |
 | `BetterTouchTool.app`  | BetterTouchTool     | bettertouchtool  | `bettertouchtool.rb` |
@@ -1408,11 +1439,11 @@ These illustrate most of the rules for generating a token:
 
 For versioned/development channel casks:
 
-| Standard Cask Token     | Derivative          | Cask Token           | Filename  |
-|------------------------|---------------------|-----------------------|----------------------|
-| `google-chrome`        | Beta Channel        | `google-chrome@beta`  | `google-chrome@beta.rb` |
-| `vlc`                  | Nightly Channel     | `vlc@nightly`         | `vlc@nightly.rb` |
-| `carbon-copy-cloner`   | Pinned to version 5 | `carbon-copy-cloner@5`| `carbon-copy-cloner@5.rb` |
+| Standard Cask Token  | Derivative          | Cask Token             | Filename |
+| -------------------- | ------------------- | ---------------------- | -------- |
+| `google-chrome`      | Beta channel        | `google-chrome@beta`   | `google-chrome@beta.rb` |
+| `vlc`                | Nightly channel     | `vlc@nightly`          | `vlc@nightly.rb` |
+| `carbon-copy-cloner` | Pinned to version 5 | `carbon-copy-cloner@5` | `carbon-copy-cloner@5.rb` |
 
 ### Special affixes
 
@@ -1420,7 +1451,7 @@ A few situations require a prefix or suffix to be added to the token.
 
 #### Token overlap
 
-When the token for a new cask would otherwise conflict with the token of an already existing cask, the nature of that overlap dictates the token, potentially for both casks. See [Forks and Apps with Conflicting Names](Acceptable-Casks.md#forks-and-apps-with-conflicting-names) for information on how to proceed.
+When the token for a new cask would otherwise conflict with the token of an already existing cask, the nature of that overlap dictates the token, potentially for both casks. See [Forks and apps with conflicting names](Acceptable-Casks.md#forks-and-apps-with-conflicting-names) for information on how to proceed.
 
 #### Potentially misleading name
 
diff --git a/docs/Common-Issues.md b/docs/Common-Issues.md
index 30d29ae5de..257555e8e1 100644
--- a/docs/Common-Issues.md
+++ b/docs/Common-Issues.md
@@ -229,7 +229,7 @@ Help us by [submitting a fix](https://github.com/Homebrew/homebrew-cask/blob/HEA
 
 ### Cask - source is not there
 
-First, you need to identify which artifact is not being handled correctly anymore. It’s explicit in the error message: if it says `It seems the App source…'` then the problem is with the [`app`](https://docs.brew.sh/Cask-Cookbook#stanza-app) stanza. This pattern is the same across [all artifacts](https://docs.brew.sh/Cask-Cookbook#at-least-one-artifact-stanza-is-also-required).
+First, you need to identify which artifact is not being handled correctly anymore. It’s explicit in the error message: if it says `It seems the App source…'` then the problem is with the [`app`](Cask-Cookbook.md#stanza-app) stanza. This pattern is the same across [all artifacts](Cask-Cookbook.md#at-least-one-artifact-stanza-is-also-required).
 
 Fixing this error is typically easy, and requires only a bit of time on your part. Start by downloading the package for the cask: `brew fetch `. The last line of output will inform you of the location of the download. Navigate there and manually unpack it. As an example, let's say the structure inside the archive is as follows:
 
@@ -246,19 +246,19 @@ Now, if we find this when looking at the cask with `brew cat `:
 
 The cask expects `SomeApp.app` to be in the top directory of the archive (see how it says simply `SomeApp.app`) but the developer has since moved it to be inside a `Files` directory. All we have to do is update that line of the cask to follow the new structure: `app "Files/SomeApp.app"`.
 
-Note that occasionally the app’s name changes completely (from `SomeApp.app` to `OtherApp.app`, let's say). In these instances, the filename of the cask itself, as well as its token, must also change. Consult the [`token reference`](https://docs.brew.sh/Cask-Cookbook#token-reference) for complete instructions on the new name.
+Note that occasionally the app’s name changes completely (from `SomeApp.app` to `OtherApp.app`, let's say). In these instances, the filename of the cask itself, as well as its token, must also change. Consult the [`token reference`](Cask-Cookbook.md#token-reference) for complete instructions on the new name.
 
 Help us by [submitting a fix](https://github.com/Homebrew/homebrew-cask/blob/HEAD/CONTRIBUTING.md#updating-a-cask). If you get stumped, [open an issue](https://github.com/Homebrew/homebrew-cask/issues/new?template=01_bug_report.md) explaining your steps so far and where you’re having trouble.
 
 ### Cask - wrong number of arguments
 
-Make sure the issue really lies with your macOS version. To do so, try to install the software manually. If it is incompatible with your macOS version, it will tell you. In that case, there is nothing we can do to help you install the software, but we can add a [`depends_on macos:`](https://docs.brew.sh/Cask-Cookbook#depends_on-macos) stanza to prevent the cask from being installed on incompatible macOS versions.
+Make sure the issue really lies with your macOS version. To do so, try to install the software manually. If it is incompatible with your macOS version, it will tell you. In that case, there is nothing we can do to help you install the software, but we can add a [`depends_on macos:`](Cask-Cookbook.md#depends_on-macos) stanza to prevent the cask from being installed on incompatible macOS versions.
 
 Help us by [submitting a fix](https://github.com/Homebrew/homebrew-cask/blob/HEAD/CONTRIBUTING.md#updating-a-cask). If you get stumped, [open an issue](https://github.com/Homebrew/homebrew-cask/issues/new?template=01_bug_report.md) explaining your steps so far and where you’re having trouble.
 
 ## Other local issues
 
-If your Homebrew installation gets messed up (and fixing the issues found by `brew doctor` doesn't solve the problem), reinstalling Homebrew may help to reset to a normal state. To easily reinstall Homebrew, use `brew bundle` to automatically restore your installed formulae and casks. To do so, run `brew bundle dump`, [uninstall](https://docs.brew.sh/FAQ#how-do-i-uninstall-homebrew), [reinstall](https://docs.brew.sh/Installation) and run `brew bundle install`.
+If your Homebrew installation gets messed up (and fixing the issues found by `brew doctor` doesn't solve the problem), reinstalling Homebrew may help to reset to a normal state. To easily reinstall Homebrew, use `brew bundle` to automatically restore your installed formulae and casks. To do so, run `brew bundle dump`, [uninstall](FAQ.md#how-do-i-uninstall-homebrew), [reinstall](Installation.md) and run `brew bundle install`.
 
 ## Possible `curl` issues
 
diff --git a/docs/Deprecating-Disabling-and-Removing-Casks.md b/docs/Deprecating-Disabling-and-Removing-Casks.md
index 9e89ae14b3..375e19ed53 100644
--- a/docs/Deprecating-Disabling-and-Removing-Casks.md
+++ b/docs/Deprecating-Disabling-and-Removing-Casks.md
@@ -1,5 +1,5 @@
 ---
-last_review_date: "1970-01-01"
+last_review_date: 2025-05-15
 ---
 
 # Deprecating, Disabling and Removing Casks
@@ -10,9 +10,9 @@ There are many reasons why casks may be deprecated, disabled or removed. This do
 
 These general rules of thumb can be followed:
 
-- `deprecate!` should be used for casks that _should_ no longer be used.
-- `disable!` should be used for casks that _cannot_ be used.
-- Casks that are no longer acceptable in `homebrew/cask` or have been disabled for over a year _should_ be removed.
+1. `deprecate!` should be used for casks that _should_ no longer be used.
+2. `disable!` should be used for casks that _cannot_ be used.
+3. Casks that are no longer acceptable in `homebrew/cask` or have been disabled for over a year _should_ be removed.
 
 ## Deprecation
 
@@ -24,10 +24,10 @@ The most common reasons for deprecation are when the upstream project is depreca
 
 Casks should only be deprecated if at least one of the following are true:
 
-- the software installed by the cask cannot be run on any of our supported macOS versions
+- the software installed by the cask cannot be run on any supported OS versions
 - the cask has outstanding CVEs
 - the cask has [zero installs in the last 90 days](https://formulae.brew.sh/analytics/cask-install/90d/)
-- the software installed by the cask has been discontinued upstream
+- the software installed by the cask has been discontinued or abandoned upstream
 
 To deprecate a cask, add a `deprecate!` call. This call should include a deprecation date in the ISO 8601 format and a deprecation reason:
 
@@ -39,43 +39,43 @@ The `date` parameter should be set to the date that the deprecation period shoul
 
 The `because` parameter can be a preset reason (using a symbol) or a custom reason. See the [Deprecate and Disable Reasons](#deprecate-and-disable-reasons) section below for more details about the `because` parameter.
 
-An optional `replacement` parameter may also be specified to suggest a replacement formula or cask to the user. The value of the parameter is a string.
+An optional `replacement_formula` or `replacement_cask` parameter may also be specified to suggest a replacement formula or cask to the user. The value of the parameter is a string.
 
 ```ruby
-deprecate! date: "YYYY-MM-DD", because: :reason, replacement: "foo"
+deprecate! date: "YYYY-MM-DD", because: :reason, replacement_formula: "foo"
 ```
 
 ## Disabling
 
 If a user attempts to install a disabled cask, they will be shown an error message and the install will fail.
 
-A cask should be disabled to indicate to users that the cask cannot be used and will be removed in the future. Disabled cask are those that could not be installed successfully any longer.
+A cask should be disabled to indicate to users that the cask cannot be used and will be removed in the future. Disabled casks are those that can no longer be successfully installed.
 
 The most common reasons for disabling a cask are:
 
-- it cannot be installed on any of our supported macOS versions
+- it cannot be installed on any supported OS versions
 - it has been deprecated for a long time
 - the upstream URL has been removed
 
-Popular casks (e.g. have more than 300 [analytics installs in the last 90 days](https://formulae.brew.sh/analytics/cask-install/90d/)) should not be disabled without a deprecation period of at least six months unless they cannot be installed on all macOS versions and issue is unable be fixed (e.g. download URL no longer works and a mirror cannot be sourced).
+Popular casks (e.g. have more than 300 [analytics installs in the last 90 days](https://formulae.brew.sh/analytics/cask-install/90d/)) should not be disabled without a deprecation period of at least six months unless they cannot be installed on any supported OS versions and the issue is unfixable (e.g. download URL no longer works and a mirror cannot be sourced).
 
-Unpopular casks (e.g. have fewer than 300 [analytics installs in the last 90 days](https://formulae.brew.sh/analytics/cask-install/90d/)) can be disabled immediately for any of the reasons above.
+Unpopular casks (e.g. have fewer than 300 [analytics installs in the last 90 days](https://formulae.brew.sh/analytics/cask-install/90d/)) can be disabled immediately for any of the reasons above, e.g. the upstream URL has been removed.
 They can be manually removed three months after their disable date.
 
-To disable a cask, add a `disable!` call. This call should include a deprecation date (in the ISO 8601 format) and a deprecation reason:
+To disable a cask, add a `disable!` call. This call should include a deprecation date in the ISO 8601 format and a deprecation reason:
 
 ```ruby
 disable! date: "YYYY-MM-DD", because: :reason
 ```
 
-The `date` parameter should be set to the date that the reason for disabling came into effect. If there is no clear date but the cask needs to be disabled, use today's date. If the `date` parameter is set to a date in the future, the cask will be deprecated until that date (on which the cask will become disabled).
+The `date` parameter should be set to the date that the reason for disabling came into effect. If there is no clear date but the cask needs to be disabled, use today's date. If the `date` parameter is set to a date in the future, the cask will be deprecated until that date (upon which the cask will become disabled).
 
 The `because` parameter can be a preset reason (using a symbol) or a custom reason. See the [Deprecate and Disable Reasons](#deprecate-and-disable-reasons) section below for more details about the `because` parameter.
 
-Similar to deprecated casks, an optional `replacement` parameter may also be specified for disabled casks to suggest a replacement formula or cask to the user. The value of the parameter is a string.
+Similar to deprecated casks, an optional `replacement_formula` or `replacement_cask` parameter may also be specified for disabled casks to suggest a replacement formula or cask to the user. The value of the parameter is a string.
 
 ```ruby
-disable! date: "YYYY-MM-DD", because: :reason, replacement: "foo"
+disable! date: "YYYY-MM-DD", because: :reason, replacement_cask: "foo"
 ```
 
 ## Removal
@@ -88,11 +88,14 @@ A cask should be removed if it does not meet our criteria for [acceptable casks]
 
 When a cask is deprecated or disabled, a reason explaining the action must be provided.
 
-There are two ways to indicate the reason. The preferred way is to use a pre-existing symbol to indicate the reason. The available symbols are listed below and can be found in the [`DeprecateDisable` module](https://github.com/Homebrew/brew/blob/master/Library/Homebrew/deprecate_disable.rb):
+There are two ways to indicate the reason. The preferred way is to use a pre-existing symbol to indicate the reason. The available symbols are listed below and can be found in the [`DeprecateDisable` module](https://rubydoc.brew.sh/DeprecateDisable.html):
 
 - `:discontinued`: the cask is discontinued upstream
+- `:moved_to_mas`: the cask is now exclusively distributed on the Mac App Store
 - `:no_longer_available`: the cask is no longer available upstream
+- `:no_longer_meets_criteria`: the cask no longer meets the criteria for acceptable casks
 - `:unmaintained`: the cask is not maintained upstream
+- `:unsigned`: the cask is unsigned or does not meet signature requirements
 
 These reasons can be specified by their symbols (the comments show the message that will be displayed to users):
 
diff --git a/docs/Deprecating-Disabling-and-Removing-Formulae.md b/docs/Deprecating-Disabling-and-Removing-Formulae.md
index de34a93582..1168076645 100644
--- a/docs/Deprecating-Disabling-and-Removing-Formulae.md
+++ b/docs/Deprecating-Disabling-and-Removing-Formulae.md
@@ -1,5 +1,5 @@
 ---
-last_review_date: "1970-01-01"
+last_review_date: 2025-05-15
 ---
 
 # Deprecating, Disabling and Removing Formulae
@@ -10,9 +10,9 @@ There are many reasons why formulae may be deprecated, disabled or removed. This
 
 These general rules of thumb can be followed:
 
-- `deprecate!` should be used for formulae that _should_ no longer be used.
-- `disable!` should be used for formulae that _cannot_ be used.
-- Formulae that are no longer acceptable in `homebrew/core` or have been disabled for over a year _should_ be removed.
+1. `deprecate!` should be used for formulae that _should_ no longer be used.
+2. `disable!` should be used for formulae that _cannot_ be used.
+3. Formulae that are no longer acceptable in `homebrew/core` or have been disabled for over a year _should_ be removed.
 
 ## Deprecation
 
@@ -20,18 +20,18 @@ If a user attempts to install a deprecated formula, they will be shown a warning
 
 A formula should be deprecated to indicate to users that the formula should not be used and will be disabled in the future. Deprecated formulae should continue to be maintained by the Homebrew maintainers so they still build from source and their bottles continue to work (even if unmaintained upstream). If this is not possible, they should be disabled.
 
-The most common reasons for deprecation are when the upstream project is deprecated, unmaintained, or archived.
+The most common reasons for deprecation are when the upstream project is deprecated, unmaintained or archived.
 
 Formulae should only be deprecated if at least one of the following are true:
 
-- the formula does not build on any of our supported macOS versions and on Linux
+- the formula does not build on any supported OS versions
 - the formula has outstanding CVEs
 - the formula has [zero installs in the last 90 days](https://formulae.brew.sh/analytics/install/90d/)
 - the software installed by the formula has been discontinued or abandoned upstream
 
-Formulae with dependents should not be deprecated until or when all dependents are also deprecated.
+Formulae with dependents should not be deprecated unless all dependents are also deprecated.
 
-To deprecate a formula, add a `deprecate!` call. This call should include a deprecation date (in the ISO 8601 format) and a deprecation reason:
+To deprecate a formula, add a `deprecate!` call. This call should include a deprecation date in the ISO 8601 format and a deprecation reason:
 
 ```ruby
 deprecate! date: "YYYY-MM-DD", because: :reason
@@ -41,10 +41,10 @@ The `date` parameter should be set to the date that the deprecation period shoul
 
 The `because` parameter can be a preset reason (using a symbol) or a custom reason. See the [Deprecate and Disable Reasons](#deprecate-and-disable-reasons) section below for more details about the `because` parameter.
 
-An optional `replacement` parameter may also be specified to suggest a replacement formula or cask to the user. The value of the parameter is a string.
+An optional `replacement_formula` or `replacement_cask` parameter may also be specified to suggest a replacement formula or cask to the user. The value of the parameter is a string.
 
 ```ruby
-deprecate! date: "YYYY-MM-DD", because: :reason, replacement: "foo"
+deprecate! date: "YYYY-MM-DD", because: :reason, replacement_formula: "foo"
 ```
 
 ## Disabling
@@ -55,13 +55,13 @@ A formula should be disabled to indicate to users that the formula cannot be use
 
 The most common reasons for disabling a formula are:
 
-- it cannot be built from source on all supported OS versions (meaning no new bottles can be built)
+- it cannot be built from source on any supported OS versions (meaning no new bottles can be built)
 - it has been deprecated for a long time
 - the project has no license
 
 Popular formulae (e.g. have more than 1000 [analytics installs in the last 90 days](https://formulae.brew.sh/analytics/install/90d/)) should not be disabled without a deprecation period of at least six months even if e.g. they do not build from source and do not have a license.
 
-Unpopular formulae (e.g. have fewer than 1000 [analytics installs in the last 90 days](https://formulae.brew.sh/analytics/install/90d/)) can be disabled immediately for any of the reasons above e.g. they cannot be built from source on any supported macOS version or Linux.
+Unpopular formulae (e.g. have fewer than 1000 [analytics installs in the last 90 days](https://formulae.brew.sh/analytics/install/90d/)) can be disabled immediately for any of the reasons above, e.g. they cannot be built from source on any supported macOS version or Linux.
 They can be manually removed three months after their disable date.
 
 To disable a formula, add a `disable!` call. This call should include a deprecation date in the ISO 8601 format and a deprecation reason:
@@ -70,14 +70,14 @@ To disable a formula, add a `disable!` call. This call should include a deprecat
 disable! date: "YYYY-MM-DD", because: :reason
 ```
 
-The `date` parameter should be set to the date that the reason for disabling came into effect. If there is no clear date but the formula needs to be disabled, use today's date. If the `date` parameter is set to a date in the future, the formula will be deprecated until that date (on which the formula will become disabled).
+The `date` parameter should be set to the date that the reason for disabling came into effect. If there is no clear date but the formula needs to be disabled, use today's date. If the `date` parameter is set to a date in the future, the formula will be deprecated until that date (upon which the formula will become disabled).
 
 The `because` parameter can be a preset reason (using a symbol) or a custom reason. See the [Deprecate and Disable Reasons](#deprecate-and-disable-reasons) section below for more details about the `because` parameter.
 
-Similar to deprecated formulae, an optional `replacement` parameter may also be specified for disabled formulae to suggest a replacement formula or cask to the user. The value of the parameter is a string.
+Similar to deprecated formulae, an optional `replacement_formula` or `replacement_cask` parameter may also be specified for disabled formulae to suggest a replacement formula or cask to the user. The value of the parameter is a string.
 
 ```ruby
-disable! date: "YYYY-MM-DD", because: :reason, replacement: "foo"
+disable! date: "YYYY-MM-DD", because: :reason, replacement_cask: "foo"
 ```
 
 ## Removal
@@ -90,13 +90,13 @@ A formula should be removed if it does not meet our criteria for [acceptable for
 
 When a formula is deprecated or disabled, a reason explaining the action must be provided.
 
-There are two ways to indicate the reason. The preferred way is to use a pre-existing symbol to indicate the reason. The available symbols are listed below and can be found in the [`DeprecateDisable` module](https://github.com/Homebrew/brew/blob/master/Library/Homebrew/deprecate_disable.rb):
+There are two ways to indicate the reason. The preferred way is to use a pre-existing symbol to indicate the reason. The available symbols are listed below and can be found in the [`DeprecateDisable` module](https://rubydoc.brew.sh/DeprecateDisable.html):
 
 - `:does_not_build`: the formula cannot be built from source on any supported macOS version or Linux.
 - `:no_license`: we cannot identify a license for the formula
 - `:repo_archived`: the upstream repository has been archived and no replacement is pointed to that we can use
 - `:repo_removed`: the upstream repository has been removed and no replacement is mentioned on the homepage that we can use
-- `:unmaintained`: the project appears to be abandoned i.e. it has had no commits for at least a year and has critical bugs or CVE that have been reported and gone resolved longer. Note: some software is "done"; a lack of activity does not imply a need for removal.
+- `:unmaintained`: the project appears to be abandoned, i.e. it has had no commits for at least a year and has critical bugs or CVEs that have been reported and left unresolved for longer. **Note:** some software is "done"; a lack of activity does not imply a need for removal.
 - `:unsupported`: Homebrew's compilation of the software is not supported by the upstream developers (e.g. upstream only supports macOS versions older than 10.15)
 - `:deprecated_upstream`: the project is deprecated upstream and no replacement is pointed to that we can use
 - `:versioned_formula`: the formula is a versioned formula and no longer [meets the requirements](Versions.md).
diff --git a/docs/FAQ.md b/docs/FAQ.md
index 99cb87f333..6dca0305e5 100644
--- a/docs/FAQ.md
+++ b/docs/FAQ.md
@@ -222,7 +222,7 @@ There are a few ideas to fix this problem:
 
 So we let software be. Anything installed with Homebrew Cask should behave the same as if it were installed manually. But since we also want to support software that doesn’t self-upgrade, we add [`auto_updates true`](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/a/alfred.rb#L18) to casks for software that does, which excludes them from `brew upgrade`.
 
-Casks which use [`version :latest`](https://docs.brew.sh/Cask-Cookbook#version-latest) are also excluded, because we have no way to track their installed version. It helps to ask the developers of such software to provide versioned releases (i.e. include the version in the path of the download `url`).
+Casks which use [`version :latest`](Cask-Cookbook.md#special-value-latest) are also excluded, because we have no way to track their installed version. It helps to ask the developers of such software to provide versioned releases (i.e. include the version in the path of the download `url`).
 
 If you still want to force software to be upgraded via Homebrew Cask, you can reference it specifically in the `upgrade` command:
 
diff --git a/docs/Formula-Cookbook.md b/docs/Formula-Cookbook.md
index 94d1285545..f26de4266e 100644
--- a/docs/Formula-Cookbook.md
+++ b/docs/Formula-Cookbook.md
@@ -43,7 +43,7 @@ Packages are installed according to their formulae. Read over a simple one, e.g.
 
 Make sure you run `brew update` before you start. This ensures your Homebrew installation is a Git repository.
 
-To create or edit formulae locally, you'll need to first [tap `homebrew/core`](https://docs.brew.sh/FAQ#can-i-edit-formulae-myself) if you haven't previously. This clones the Homebrew/homebrew-core Git repository to `$(brew --repository homebrew/core)`. As you're developing, you'll also need to set `HOMEBREW_NO_INSTALL_FROM_API=1` in your shell environment or before any `install`, `reinstall` or `upgrade` commands to force `brew` to use the local repository instead of the API.
+To create or edit formulae locally, you'll need to first [tap `homebrew/core`](FAQ.md#can-i-edit-formulae-myself) if you haven't previously. This clones the Homebrew/homebrew-core Git repository to `$(brew --repository homebrew/core)`. As you're developing, you'll also need to set `HOMEBREW_NO_INSTALL_FROM_API=1` in your shell environment or before any `install`, `reinstall` or `upgrade` commands to force `brew` to use the local repository instead of the API.
 
 Before submitting a new formula make sure your package:
 
@@ -433,7 +433,7 @@ If you have already forked Homebrew on GitHub, then you can manually push (just
 git push https://github.com/myname/homebrew-core/ 
 ```
 
-Now, [open a pull request](https://docs.brew.sh/How-To-Open-a-Homebrew-Pull-Request) for your changes.
+Now, [open a pull request](How-To-Open-a-Homebrew-Pull-Request.md) for your changes.
 
 * One formula per commit; one commit per formula.
 * Keep merge commits out of the pull request.
diff --git a/docs/Homebrew-and-Python.md b/docs/Homebrew-and-Python.md
index d8283b3ccc..525d92fd68 100644
--- a/docs/Homebrew-and-Python.md
+++ b/docs/Homebrew-and-Python.md
@@ -11,7 +11,7 @@ Homebrew will install the necessary Python 3 version that is needed to make your
 ## Python 3
 
 Homebrew provides formulae for the newest and maintained releases of Python 3 (`python@3.y`) ().
-We keep older `python@3.y` versions according to our [versioned formulae guidelines](https://docs.brew.sh/Versions).
+We keep older `python@3.y` versions according to our [versioned formulae guidelines](Versions.md).
 
 **Important:** Python may be upgraded to a newer version at any time. Consider using a version
 manager such as `pyenv` if you require stability of minor or patch versions for virtual environments.
diff --git a/docs/Homebrew-on-Linux.md b/docs/Homebrew-on-Linux.md
index 015ef2736d..f10dff9693 100644
--- a/docs/Homebrew-on-Linux.md
+++ b/docs/Homebrew-on-Linux.md
@@ -61,11 +61,11 @@ To install build tools, paste at a terminal prompt:
   sudo apt-get install build-essential procps curl file git
   ```
 
-- **Fedora, CentOS, or Red Hat**
+- **Fedora, CentOS Stream, or RHEL**
 
   ```sh
-  sudo yum groupinstall 'Development Tools'
-  sudo yum install procps-ng curl file git
+  sudo dnf group install 'Development Tools'
+  sudo dnf install procps-ng curl file
   ```
 
 - **Arch Linux**
@@ -76,7 +76,7 @@ To install build tools, paste at a terminal prompt:
 
 ### ARM32 (Tier 3 Support)
 
-Homebrew can run on 32-bit ARM (e.g. Raspberry Pi and others), but as they lack bottles (binary packages) they are a [Tier 3 supported platform](https://docs.brew.sh/Support-Tiers#tier-3)
+Homebrew can run on 32-bit ARM systems (e.g. Raspberry Pi and others), but as they lack bottles (binary packages) they are a [Tier 3 supported platform](Support-Tiers.md#tier-3).
 
 You may need to install your own Ruby using your system package manager, a PPA, or `rbenv/ruby-build` as we don't distribute a Homebrew Portable Ruby for ARM32.
 
diff --git a/docs/How-To-Open-a-Homebrew-Pull-Request.md b/docs/How-To-Open-a-Homebrew-Pull-Request.md
index 0cff912297..8b0ca8a04b 100644
--- a/docs/How-To-Open-a-Homebrew-Pull-Request.md
+++ b/docs/How-To-Open-a-Homebrew-Pull-Request.md
@@ -10,11 +10,11 @@ The type of change you want to make influences which of Homebrew's main reposito
 
 ## Submit a new version of an existing formula
 
-1. Use [`brew bump-formula-pr`](Manpage#bump-formula-pr-options-formula) to do everything (i.e. forking, committing, pushing) with a single command. Run `brew bump-formula-pr --help` to learn more.
+1. Use [`brew bump-formula-pr`](Manpage.md#bump-formula-pr-options-formula) to do everything (i.e. forking, committing, pushing) with a single command. Run `brew bump-formula-pr --help` to learn more.
 
 ## Submit a new version of an existing cask
 
-1. Use [`brew bump-cask-pr`](Manpage#bump-cask-pr-options-cask) to do everything (i.e. forking, committing, pushing) with a single command. Run `brew bump-cask-pr --help` to learn more.
+1. Use [`brew bump-cask-pr`](Manpage.md#bump-cask-pr-options-cask) to do everything (i.e. forking, committing, pushing) with a single command. Run `brew bump-cask-pr --help` to learn more.
 
 ## Set up your own fork of the Homebrew repository
 
@@ -38,7 +38,7 @@ The type of change you want to make influences which of Homebrew's main reposito
 
 ### Formulae-related pull request
 
-Before creating a new formula, please read [Acceptable Formulae](https://docs.brew.sh/Acceptable-Formulae).
+Before creating a new formula, please read [Acceptable Formulae](Acceptable-Formulae.md).
 
 1. [Fork the Homebrew/homebrew-core repository on GitHub](https://github.com/Homebrew/homebrew-core/fork).
    * This creates a personal remote repository that you can push to. This is needed because only Homebrew maintainers have push access to the main repositories.
@@ -64,7 +64,7 @@ Before creating a new formula, please read [Acceptable Formulae](https://docs.br
 
 ### Cask-related pull request
 
-Before creating a new cask, please read [Acceptable Casks](https://docs.brew.sh/Acceptable-Casks).
+Before creating a new cask, please read [Acceptable Casks](Acceptable-Casks.md).
 
 1. [Fork the Homebrew/homebrew-cask repository on GitHub](https://github.com/Homebrew/homebrew-cask/fork).
    * This creates a personal remote repository that you can push to. This is needed because only Homebrew maintainers have push access to the main repositories.
@@ -110,7 +110,7 @@ To make changes on a new branch and submit it for review, create a GitHub pull r
    git checkout -b  origin/master
    ```
 
-4. Make your changes. For formulae or casks, use `brew edit` or your favourite text editor, following all the guidelines in the [Formula Cookbook](Formula-Cookbook.md) or [Cask Cookbook](Cask-Cookbook.md).
+4. Make your changes. For formulae or casks, use `brew edit` or your favourite text editor, using the guidelines in the [Formula Cookbook](Formula-Cookbook.md) or [Cask Cookbook](Cask-Cookbook.md) for reference.
    * If there's a `bottle do` block in the formula, don't remove or change it; we'll update it when we merge your PR.
 5. Test your changes by running the following, and ensure they all pass without issue. For changed formulae and casks, make sure you do the `brew audit` step after your changed formula/cask has been installed.
 
diff --git a/docs/How-To-Organize-AGM.md b/docs/How-To-Organize-AGM.md
index 33a71beafa..e27bdc90f3 100644
--- a/docs/How-To-Organize-AGM.md
+++ b/docs/How-To-Organize-AGM.md
@@ -74,7 +74,7 @@ using this quick command:_
   * This is primarily to enable members to begin planning travel by
       asking for time off, requesting employer reimbursement,
       arranging childcare or pet sitters,
-      [applying for a visa](https://5195.f2w.bosa.be/en/themes/entry/border-control/visa/visa-type-c)
+      [applying for a visa](https://5195.f2w.bosa.be/en/themes/entry/border-control/visa/visa-type-c-visa-short-stay)
       which may [take 2–7 weeks](https://dofi.ibz.be/en/themes/third-country-nationals/short-stay/processing-time-visa-application),
       etc.
 
diff --git a/docs/Installation.md b/docs/Installation.md
index fc2412b421..618925e1bd 100644
--- a/docs/Installation.md
+++ b/docs/Installation.md
@@ -104,12 +104,12 @@ eval "$(/bin/brew shellenv)"
 ```
 
 Replace `` with the directory where Homebrew is installed on your system.
-You can find Homebrew's default install location [in this FAQ entry](https://docs.brew.sh/FAQ#why-should-i-install-homebrew-in-the-default-location).
+You can find Homebrew's default install location in [this FAQ entry](FAQ.md#why-should-i-install-homebrew-in-the-default-location).
 
-For more insight, re-run the installer or inspect [the installer's source](https://github.com/Homebrew/install/blob/deacfa6a6e62e5f4002baf9e1fac7a96e9aa5d41/install.sh#L1072-L1088)
+For more insight, re-run the installer or inspect [the installer's source](https://github.com/Homebrew/install/blob/956abfa01f0d1dba285e6d3da86587ed428f19fe/install.sh#L1075-L1091)
 to see how the installer constructs the path it recommends.
 
-See [Tips and Tricks > Loading Homebrew from the same dotfiles on different operating systems](Tips-and-Tricks.md#loading-homebrew-from-the-same-dotfiles-on-different-operating-systems)
+See [this tip in Tips and Tricks](Tips-and-Tricks.md#load-homebrew-from-the-same-dotfiles-on-different-operating-systems)
 for another way to handle this across multiple operating systems.
 
 ## Uninstallation
diff --git a/docs/Manpage.md b/docs/Manpage.md
index e3d40b24e7..861f6d0e92 100644
--- a/docs/Manpage.md
+++ b/docs/Manpage.md
@@ -278,15 +278,15 @@ flags which will help with finding keg-only dependencies like `openssl`,
 
 `--formula`
 
-: `list` or `dump` Homebrew formula dependencies.
+: `list`, `dump` or `cleanup` Homebrew formula dependencies.
 
 `--cask`
 
-: `list` or `dump` Homebrew cask dependencies.
+: `list`, `dump` or `cleanup` Homebrew cask dependencies.
 
 `--tap`
 
-: `list` or `dump` Homebrew tap dependencies.
+: `list`, `dump` or `cleanup` Homebrew tap dependencies.
 
 `--mas`
 
@@ -298,7 +298,7 @@ flags which will help with finding keg-only dependencies like `openssl`,
 
 `--vscode`
 
-: `list` or `dump` VSCode (and forks/variants) extensions.
+: `list`, `dump` or `cleanup` VSCode (and forks/variants) extensions.
 
 `--no-vscode`
 
@@ -779,6 +779,11 @@ upgrade *`formula`* if it is already installed but outdated.
 
 : Show what would be installed, but do not actually install anything.
 
+`--ask`
+
+: Ask for confirmation before downloading and installing formulae. Print bottles
+  and dependencies download size and install size.
+
 `--formula`
 
 : Treat all named arguments as formulae.
@@ -873,11 +878,6 @@ upgrade *`formula`* if it is already installed but outdated.
 
 : Delete files that already exist in the prefix while linking.
 
-`--ask`
-
-: Ask for confirmation before downloading and installing formulae. Print bottles
-  and dependencies download size and install size.
-
 `--cask`
 
 : Treat all named arguments as casks.
@@ -1245,6 +1245,11 @@ for the reinstalled formulae or, every 30 days, for all formulae.
 
 : Print the verification and post-install steps.
 
+`--ask`
+
+: Ask for confirmation before downloading and upgrading formulae. Print bottles
+  and dependencies download size, install and net install size.
+
 `--formula`
 
 : Treat all named arguments as formulae.
@@ -1276,11 +1281,6 @@ for the reinstalled formulae or, every 30 days, for all formulae.
 
 : Create a Git repository, useful for creating patches to the software.
 
-`--ask`
-
-: Ask for confirmation before downloading and upgrading formulae. Print bottles
-  and dependencies download size, install and net install size.
-
 `--cask`
 
 : Treat all named arguments as casks.
@@ -1435,8 +1435,8 @@ If `sudo` is passed, operate on `/Library/LaunchDaemons` or
 
 `--max-wait`
 
-: Wait at most this many seconds for `stop` to finish stopping a service. Omit
-  this flag or set this to zero (0) seconds to wait indefinitely.
+: Wait at most this many seconds for `stop` to finish stopping a service.
+  Defaults to 60. Set this to zero (0) seconds to wait indefinitely.
 
 `--all`
 
@@ -1679,6 +1679,11 @@ for the upgraded formulae or, every 30 days, for all formulae.
 
 : Show what would be upgraded, but do not actually upgrade anything.
 
+`--ask`
+
+: Ask for confirmation before downloading and upgrading formulae. Print bottles
+  and dependencies download size, install and net install size.
+
 `--formula`
 
 : Treat all named arguments as formulae. If no named arguments are specified,
@@ -1717,11 +1722,6 @@ for the upgraded formulae or, every 30 days, for all formulae.
 
 : Delete files that already exist in the prefix while linking.
 
-`--ask`
-
-: Ask for confirmation before downloading and upgrading formulae. Print bottles
-  and dependencies download size, install and net install size.
-
 `--cask`
 
 : Treat all named arguments as casks. If no named arguments are specified,
@@ -2414,6 +2414,10 @@ see: 
 
 : Create a basic template for an Autotools-style build.
 
+`--cabal`
+
+: Create a basic template for a Cabal build.
+
 `--cask`
 
 : Create a basic template for a cask.
@@ -4443,8 +4447,8 @@ Homebrew's Project Leader is Mike McQuaid.
 Homebrew's Project Leadership Committee is Colin Dean, Michka Popoff, Mike
 McQuaid, Patrick Linnane and Vanessa Gennarelli.
 
-Homebrew's Technical Steering Committee is Bo Anderson, FX Coudert, Mike McQuaid
-and Rylan Polster.
+Homebrew's Technical Steering Committee is Bo Anderson, Issy Long, Michael Cho,
+Mike McQuaid and Ruoyu Zhong.
 
 Homebrew's maintainers are Alexander Bayandin, Bevan Kay, Bo Anderson, Branch
 Vincent, Caleb Xu, Carlo Cabrera, Daeho Ro, Douglas Eichelberger, Dustin
diff --git a/docs/New-Maintainer-Checklist.md b/docs/New-Maintainer-Checklist.md
index 1661901b9c..80ec6acd8a 100644
--- a/docs/New-Maintainer-Checklist.md
+++ b/docs/New-Maintainer-Checklist.md
@@ -82,7 +82,7 @@ Now sit back, relax and let the new maintainers handle more of our contributions
 
 ## PLC
 
-If a maintainer or member is elected to the Homebrew's [Project Leadership Committee](https://docs.brew.sh/Homebrew-Governance#4-project-leadership-committee):
+If a maintainer or member is elected to the Homebrew's [Project Leadership Committee](Homebrew-Governance.md#4-project-leadership-committee):
 
 - Invite them to the [**@Homebrew/plc** team](https://github.com/orgs/Homebrew/teams/plc/members)
 - Make them [billing managers](https://github.com/organizations/Homebrew/settings/billing) and [moderators](https://github.com/organizations/Homebrew/settings/moderators) on the Homebrew GitHub organisation
@@ -92,7 +92,7 @@ When they cease to be a PLC member, revoke or downgrade their access to all of t
 
 ## TSC
 
-If a maintainer is elected to the Homebrew's [Technical Steering Committee](https://docs.brew.sh/Homebrew-Governance#7-technical-steering-committee):
+If a maintainer is elected to the Homebrew's [Technical Steering Committee](Homebrew-Governance.md#7-technical-steering-committee):
 
 - Invite them to the [**@Homebrew/tsc** team](https://github.com/orgs/Homebrew/teams/tsc/members)
 - Make them [billing managers](https://github.com/organizations/Homebrew/settings/billing) and [moderators](https://github.com/organizations/Homebrew/settings/moderators) on the Homebrew GitHub organisation
@@ -111,7 +111,7 @@ When they cease to be an owner, revoke or downgrade their access to all of the a
 
 ## Members
 
-People who are either not eligible or willing to be Homebrew maintainers but have shown continued involvement in the Homebrew community may be admitted by a majority vote of the [Project Leadership Committee](https://docs.brew.sh/Homebrew-Governance#4-project-leadership-committee).
+People who are either not eligible or willing to be Homebrew maintainers but have shown continued involvement in the Homebrew community may be admitted by a majority vote of the [Project Leadership Committee](Homebrew-Governance.md#4-project-leadership-committee).
 
 When admitted as members:
 
diff --git a/docs/Prose-Style-Guidelines.md b/docs/Prose-Style-Guidelines.md
index ad64206f5a..c5e2907884 100644
--- a/docs/Prose-Style-Guidelines.md
+++ b/docs/Prose-Style-Guidelines.md
@@ -1,5 +1,5 @@
 ---
-last_review_date: "2025-02-08"
+last_review_date: 2025-05-22
 ---
 
 # Prose Style Guidelines
@@ -23,7 +23,7 @@ Homebrew's audience includes users with a wide range of education and experience
 
 We strive for "correct" but not "fancy" usage. Think newspaper article, not academic paper.
 
-This is a set of guidelines to be applied using human judgement, not a set of hard and fast rules. It is like [Garner's Modern American Usage](https://en.wikipedia.org/wiki/Garner's_Modern_American_Usage). It is less like the [Ruby Style Guide](https://github.com/rubocop-hq/ruby-style-guide#the-ruby-style-guide). All guidelines here are open to interpretation and discussion. 100% conformance to these guidelines is *not* a goal.
+This is a set of guidelines to be applied using human judgement, not a set of hard and fast rules. It is more like [Garner's Modern American Usage](https://en.wikipedia.org/wiki/Garner's_Modern_American_Usage) and less like the [Ruby Style Guide](https://github.com/rubocop-hq/ruby-style-guide#the-ruby-style-guide). All guidelines here are open to interpretation and discussion. 100% conformance to these guidelines is *not* a goal.
 
 The intent of this document is to help authors make decisions about clarity, style, and consistency. It is not to help settle arguments about who knows English better. Don't use this document to be a jerk.
 
@@ -53,6 +53,8 @@ We prefer:
 * Use a subordinate list item instead of dropping a multi-sentence paragraph-long item into a list of sentence fragments
 * Prefer Markdown over other markup formats unless their specific features are needed
   * GitHub Flavoured Markdown. GitHub's implementation is the standard, period.
+* Link to other documentation pages with relative links to the Markdown filename rather than the full URL
+  * e.g. `FAQ.md` instead of `https://docs.brew.sh/FAQ`
 
 ### Typographical conventions
 
diff --git a/docs/Rakefile b/docs/Rakefile
index 9d58bcb719..5411ccfa0a 100644
--- a/docs/Rakefile
+++ b/docs/Rakefile
@@ -34,8 +34,9 @@ task test: :build do
     ],
     ignore_urls:         [
       "/",
-      %r{https://formulae.brew.sh"},
+      %r{https://formulae.brew.sh},
       %r{https://github.com/},
+      %r{https://homebrew.1password.com/},
       "https://legacy.python.org/dev/peps/pep-0453/#recommendations-for-downstream-distributors",
     ],
     cache:               {
diff --git a/docs/Support-Tiers.md b/docs/Support-Tiers.md
index 2f5baf9193..5a98f0c72e 100644
--- a/docs/Support-Tiers.md
+++ b/docs/Support-Tiers.md
@@ -22,7 +22,7 @@ A Tier 1 supported configuration is one in which:
 For Tier 1 support, Homebrew on macOS must be all of:
 
 - running on official Apple hardware (e.g. not a "Hackintosh" or VM)
-- running a version of macOS supported by Apple on that hardware
+- running the latest patch release of a macOS version supported by Apple on that hardware
 - running a version of macOS with Homebrew CI coverage (i.e. the latest stable or prerelease version, two preceding versions)
 - installed in the default prefix (i.e. `/opt/homebrew` on Apple Silicon, `/usr/local` on Intel x86_64)
 - running on a supported architecture (i.e. Apple Silicon or Intel x86_64)
diff --git a/docs/Tips-and-Tricks.md b/docs/Tips-and-Tricks.md
index 198f1b914f..b3aedef367 100644
--- a/docs/Tips-and-Tricks.md
+++ b/docs/Tips-and-Tricks.md
@@ -143,7 +143,7 @@ export HOMEBREW_ARTIFACT_DOMAIN_NO_FALLBACK=1
 export HOMEBREW_DOCKER_REGISTRY_BASIC_AUTH_TOKEN="$(printf 'anonymous:' | base64)"
 ```
 
-## Loading Homebrew from the same dotfiles on different operating systems
+## Load Homebrew from the same dotfiles on different operating systems
 
 Some users may want to use the same shell initialization files on macOS and Linux.
 Use this to detect the likely Homebrew installation directory and load Homebrew when it's found.
diff --git a/docs/Typechecking.md b/docs/Typechecking.md
index a7599ea936..216b79f396 100644
--- a/docs/Typechecking.md
+++ b/docs/Typechecking.md
@@ -1,12 +1,12 @@
 ---
-last_review_date: "2025-02-08"
+last_review_date: 2025-05-22
 ---
 
 # Type Checking With Sorbet
 
-The majority of the code in Homebrew is written in Ruby which is a dynamic language. To avail the benefits of static type checking, we have set up Sorbet in our codebase which provides the benefits of static type checking to dynamic languages like Ruby.
+The majority of the code in Homebrew is written in Ruby which is a dynamic language. To avail the benefits of static type checking, we have set up [Sorbet](https://sorbet.org/) in our codebase which provides the benefits of static type checking to dynamic languages like Ruby.
 
-The [Sorbet Documentation] is a good place to get started if you want to dive deeper into Sorbet and its abilities.
+The [Sorbet Documentation](https://sorbet.org/docs/overview) is a good place to get started if you want to dive deeper into Sorbet and its abilities.
 
 ## Sorbet in the Homebrew Codebase
 
@@ -34,45 +34,41 @@ For more information on how to express more complex types, refer to the official
 
 ### Ruby interface files (`.rbi`)
 
-[RBI files](https://sorbet.org/docs/rbi) help Sorbet learn about constants, ancestors and methods defined in ways it doesn’t understand natively. We can also create an RBI file to help Sorbet understand dynamic definitions. Some of these files are autogenerated (see the next section) and some are manually written ([example]).
+[RBI files](https://sorbet.org/docs/rbi) help Sorbet learn about constants, ancestors and methods defined in ways it doesn't understand natively. We can also create an RBI file to help Sorbet understand dynamic definitions. Some of these files are automatically generated (see the next section) and some are manually written, e.g. [`extend/on_system.rbi`](https://github.com/Homebrew/brew/blob/975fe8a83fd57a8d8e790ec6fb10c2f13f705d02/Library/Homebrew/extend/on_system.rbi).
 
-There are also a very small number of files that Homebrew loads before sorbet-runtime, such as `utils/gems.rb`. Those files cannot have type signatures alongside the code itself, so RBI files are used there instead to retain static type checking.
-
-[example]: https://github.com/Homebrew/brew/blob/9d4000b15cb6ffa8c11f49372f7016d05aaa0851/Library/Homebrew/extend/ENV.rbi
+There are also a very small number of files that Homebrew loads before `sorbet-runtime`, such as `utils/gems.rb`. Those files cannot have type signatures alongside the code itself, so RBI files are used there instead to retain static type checking.
 
 ### The [`Library/Homebrew/sorbet`] directory
 
 [`Library/Homebrew/sorbet`]: https://github.com/Homebrew/brew/tree/master/Library/Homebrew/sorbet
 
-- The `rbi` directory contains all Ruby Interface (`.rbi`) files auto-generated by running `brew typecheck --update`:
+The `rbi` directory contains all Ruby Interface (`.rbi`) files auto-generated by running `brew typecheck --update`:
 
-  - `gems`: RBI files for all gems are generated using [Tapioca](https://github.com/Shopify/tapioca#tapioca).
-  - `dsl`: RBI files autogenerated by our [Tapioca compilers](https://github.com/Homebrew/brew/tree/master/Library/Homebrew/sorbet/tapioca/compilers).
-  - `upstream.rbi`: This file is not auto-generated and is a manually written file that contains temporary workarounds for upstream Sorbet issues. This file is typically empty.
+- `gems`: RBI files for all gems are generated using [Tapioca](https://github.com/Shopify/tapioca#tapioca).
+- `dsl`: RBI files auto-generated by our [Tapioca compilers](https://github.com/Homebrew/brew/tree/master/Library/Homebrew/sorbet/tapioca/compilers).
+- `upstream.rbi`: This file is manually written and contains temporary workarounds for upstream Sorbet issues. It is typically empty.
 
-- The `config` file is a newline-separated list of arguments to pass to `srb tc`, the same as if they’d been passed on the command line. Arguments in the config file are always passed first, followed by arguments provided on the command line. We use it to ignore Gem directories which we do not wish to type check.
+The `tapioca` directory contains configuration files and compilers for Tapioca, allowing Sorbet to type check the dynamically generated components of the codebase.
 
-- Every Ruby file in the codebase has a magic `# typed: ` comment at the top, where `` is one of [Sorbet's strictness levels], usually `false`, `true` or `strict`. The `false` files only report errors related to the syntax, constant resolution and correctness of the method signatures, but no type errors. Our long-term goal is to move all `false` files to `true` and start reporting type errors on those files as well. Therefore, when adding new files, you should ideally mark it with `# typed: true` and work out any resulting type errors.
-
-[Sorbet's strictness levels]: https://sorbet.org/docs/static#file-level-granularity-strictness-levels
+The `config` file is a newline-separated list of arguments to pass to `srb tc`, the same as if they'd been passed on the command line. Arguments in the config file are always passed first, followed by arguments provided on the command line. We use it to ignore e.g. gem directories which we do not wish to type check.
 
 ## Using `brew typecheck`
 
-When run without any arguments, `brew typecheck`, will run considering the strictness levels set in each of the individual Ruby files in the core Homebrew codebase. However, when it is run on a specific file or directory, more errors may show up since Sorbet cannot resolve constants defined outside the scope of the specified file. These problems can be solved with RBI files. Currently `brew typecheck` provides `--quiet`, `--file`, `--dir` and `--ignore` options but you can explore more options with `srb tc --help` and pass them with `srb tc`.
+Every Ruby file in the codebase has a magic `# typed: ` comment at the top, where `` is one of [Sorbet's strictness levels](https://sorbet.org/docs/static#file-level-granularity-strictness-levels), usually `false`, `true` or `strict`. The `false` files only report errors related to the syntax, constant resolution and correctness of the method signatures, but no type errors. Our long-term goal is to move all `false` files to `true` and start reporting type errors on those files as well. Therefore, when adding new files, you should ideally mark it with `# typed: true` and work out any resulting type errors.
+
+When run without any arguments, `brew typecheck` will run considering the strictness levels set in each of the individual Ruby files in the core Homebrew codebase. However, when run on a specific file or directory, more errors may show up since Sorbet cannot resolve constants defined outside the scope of the specified file. These problems can be solved with RBI files. Currently `brew typecheck` provides `--quiet`, `--file`, `--dir` and `--ignore` options, but you can explore more options with `srb tc --help` and pass them with `srb tc`.
 
 ## Resolving Type Errors
 
-Sorbet reports type errors along with an error reference code, which can be used to look up more information on how to debug the error, or what causes the error in the [Sorbet Documentation]. Here is how to debug some common type errors:
+Sorbet reports type errors along with an error reference code, which can be used to look up more information on how to debug the error, or what causes the error in the [Sorbet Documentation](https://sorbet.org/docs/overview). Here's how to debug some common type errors:
 
 - Using `T.reveal_type`: in files which are `true` or higher, by wrapping a variable or method call in `T.reveal_type`, Sorbet will show us what type it thinks that variable has in the output of `srb tc`. This is particularly useful when writing [method signatures](https://sorbet.org/docs/sigs) and debugging. Make sure to remove this line from your code before committing your changes, since this is just a debugging tool.
 
 - One of the most frequent errors that we've encountered is `7003: Method does not exist.` Since Ruby is a very dynamic language, methods can be defined in ways Sorbet cannot see statically. In such cases, check if the method exists at runtime; if not, then Sorbet has caught a future bug! But, it is also possible that even though a method exists at runtime, Sorbet cannot see it. In such cases, we use [`.rbi` files](#ruby-interface-files-rbi).
 
-- Since Sorbet does not automatically assume that Kernel is to be included in Modules, we may encounter many errors while trying to use methods like `puts`, `ohai`, `odebug` etc. There are generally two approaches to fixing this:
+- Since Sorbet does not automatically assume that `Kernel` is to be included in modules, we may encounter many errors while trying to use methods like `puts`, `ohai`, `odebug` etc. There are generally two approaches to fixing this:
 
-  - If you are using `module_function` but never run `include ModuleName` anywhere, remove the `module_definition` and convert all methods to class methods (prepend the name with `self.`)
-  - If you do include the module elsewhere, add a `requires_ancestor` to the module defining what types of classes this module can be included in. This may be as simple as a `requires_ancestor { Kernel }`, which most classes are a descendant from.
+  - If you are using `module_function` but never run `include ModuleName` anywhere, remove the `module_definition` and convert all methods to class methods (prepend the name with `self.`).
+  - If you do include the module elsewhere, add a `requires_ancestor` to the module defining what types of classes this module can be included in. This may be as simple as a `requires_ancestor { Kernel }`, which most classes are descended from.
 
 - The tips above are very generic and apply to lots of cases. For some common gotchas when using Sorbet, refer to the [Sorbet Error Reference](https://sorbet.org/docs/error-reference) and [FAQ](https://sorbet.org/docs/faq).
-
-[Sorbet Documentation]: https://sorbet.org/docs/overview
diff --git a/docs/vale-styles/Homebrew/README.md b/docs/vale-styles/Homebrew/README.md
index 1b087e5b53..12de474ec9 100644
--- a/docs/vale-styles/Homebrew/README.md
+++ b/docs/vale-styles/Homebrew/README.md
@@ -1,7 +1,7 @@
 ---
-last_review_date: "1970-01-01"
+last_review_date: 2025-05-22
 ---
 
 # Vale Styles
 
-Based on Homebrew's [Prose Style Guidelines](http://docs.brew.sh/Prose-Style-Guidelines.html).
+Based on Homebrew's [Prose Style Guidelines](/docs/Prose-Style-Guidelines.md).
diff --git a/manpages/brew.1 b/manpages/brew.1
index db1cb6c5a6..1d84a042df 100644
--- a/manpages/brew.1
+++ b/manpages/brew.1
@@ -169,13 +169,13 @@ Temporarily start services while running the \fBexec\fP or \fBsh\fP command\. Th
 \fBlist\fP all dependencies\.
 .TP
 \fB\-\-formula\fP
-\fBlist\fP or \fBdump\fP Homebrew formula dependencies\.
+\fBlist\fP, \fBdump\fP or \fBcleanup\fP Homebrew formula dependencies\.
 .TP
 \fB\-\-cask\fP
-\fBlist\fP or \fBdump\fP Homebrew cask dependencies\.
+\fBlist\fP, \fBdump\fP or \fBcleanup\fP Homebrew cask dependencies\.
 .TP
 \fB\-\-tap\fP
-\fBlist\fP or \fBdump\fP Homebrew tap dependencies\.
+\fBlist\fP, \fBdump\fP or \fBcleanup\fP Homebrew tap dependencies\.
 .TP
 \fB\-\-mas\fP
 \fBlist\fP or \fBdump\fP Mac App Store dependencies\.
@@ -184,7 +184,7 @@ Temporarily start services while running the \fBexec\fP or \fBsh\fP command\. Th
 \fBlist\fP or \fBdump\fP Whalebrew dependencies\.
 .TP
 \fB\-\-vscode\fP
-\fBlist\fP or \fBdump\fP VSCode (and forks/variants) extensions\.
+\fBlist\fP, \fBdump\fP or \fBcleanup\fP VSCode (and forks/variants) extensions\.
 .TP
 \fB\-\-no\-vscode\fP
 \fBdump\fP without VSCode (and forks/variants) extensions\. This is enabled by default if \fB$HOMEBREW_BUNDLE_DUMP_NO_VSCODE\fP is set\.
@@ -487,6 +487,9 @@ Print the verification and post\-install steps\.
 \fB\-n\fP, \fB\-\-dry\-run\fP
 Show what would be installed, but do not actually install anything\.
 .TP
+\fB\-\-ask\fP
+Ask for confirmation before downloading and installing formulae\. Print bottles and dependencies download size and install size\.
+.TP
 \fB\-\-formula\fP
 Treat all named arguments as formulae\.
 .TP
@@ -544,9 +547,6 @@ Create a Git repository, useful for creating patches to the software\.
 \fB\-\-overwrite\fP
 Delete files that already exist in the prefix while linking\.
 .TP
-\fB\-\-ask\fP
-Ask for confirmation before downloading and installing formulae\. Print bottles and dependencies download size and install size\.
-.TP
 \fB\-\-cask\fP
 Treat all named arguments as casks\.
 .TP
@@ -775,6 +775,9 @@ Install without checking for previously installed keg\-only or non\-migrated ver
 \fB\-v\fP, \fB\-\-verbose\fP
 Print the verification and post\-install steps\.
 .TP
+\fB\-\-ask\fP
+Ask for confirmation before downloading and upgrading formulae\. Print bottles and dependencies download size, install and net install size\.
+.TP
 \fB\-\-formula\fP
 Treat all named arguments as formulae\.
 .TP
@@ -796,9 +799,6 @@ Generate debug symbols on build\. Source will be retained in a cache directory\.
 \fB\-g\fP, \fB\-\-git\fP
 Create a Git repository, useful for creating patches to the software\.
 .TP
-\fB\-\-ask\fP
-Ask for confirmation before downloading and upgrading formulae\. Print bottles and dependencies download size, install and net install size\.
-.TP
 \fB\-\-cask\fP
 Treat all named arguments as casks\.
 .TP
@@ -902,7 +902,7 @@ Use the service file from this location to \fBstart\fP the service\.
 When run as root on macOS, run the service(s) as this user\.
 .TP
 \fB\-\-max\-wait\fP
-Wait at most this many seconds for \fBstop\fP to finish stopping a service\. Omit this flag or set this to zero (0) seconds to wait indefinitely\.
+Wait at most this many seconds for \fBstop\fP to finish stopping a service\. Defaults to 60\. Set this to zero (0) seconds to wait indefinitely\.
 .TP
 \fB\-\-all\fP
 Run \fIsubcommand\fP on all services\.
@@ -1045,6 +1045,9 @@ Print the verification and post\-install steps\.
 \fB\-n\fP, \fB\-\-dry\-run\fP
 Show what would be upgraded, but do not actually upgrade anything\.
 .TP
+\fB\-\-ask\fP
+Ask for confirmation before downloading and upgrading formulae\. Print bottles and dependencies download size, install and net install size\.
+.TP
 \fB\-\-formula\fP
 Treat all named arguments as formulae\. If no named arguments are specified, upgrade only outdated formulae\.
 .TP
@@ -1069,9 +1072,6 @@ Generate debug symbols on build\. Source will be retained in a cache directory\.
 \fB\-\-overwrite\fP
 Delete files that already exist in the prefix while linking\.
 .TP
-\fB\-\-ask\fP
-Ask for confirmation before downloading and upgrading formulae\. Print bottles and dependencies download size, install and net install size\.
-.TP
 \fB\-\-cask\fP
 Treat all named arguments as casks\. If no named arguments are specified, upgrade only outdated casks\.
 .TP
@@ -1525,6 +1525,9 @@ Generate a formula or, with \fB\-\-cask\fP, a cask for the downloadable file at
 \fB\-\-autotools\fP
 Create a basic template for an Autotools\-style build\.
 .TP
+\fB\-\-cabal\fP
+Create a basic template for a Cabal build\.
+.TP
 \fB\-\-cask\fP
 Create a basic template for a cask\.
 .TP
@@ -2922,7 +2925,7 @@ Homebrew\[u2019]s Project Leader is Mike McQuaid\.
 .P
 Homebrew\[u2019]s Project Leadership Committee is Colin Dean, Michka Popoff, Mike McQuaid, Patrick Linnane and Vanessa Gennarelli\.
 .P
-Homebrew\[u2019]s Technical Steering Committee is Bo Anderson, FX Coudert, Mike McQuaid and Rylan Polster\.
+Homebrew\[u2019]s Technical Steering Committee is Bo Anderson, Issy Long, Michael Cho, Mike McQuaid and Ruoyu Zhong\.
 .P
 Homebrew\[u2019]s maintainers are Alexander Bayandin, Bevan Kay, Bo Anderson, Branch Vincent, Caleb Xu, Carlo Cabrera, Daeho Ro, Douglas Eichelberger, Dustin Rodrigues, Eric Knibbe, FX Coudert, Issy Long, Justin Krehel, Klaus Hipp, Markus Reiter, Michael Cho, Michka Popoff, Mike McQuaid, Nanda H Krishna, Patrick Linnane, Rui Chen, Ruoyu Zhong, Rylan Polster, Sam Ford, Sean Molenaar, Štefan Baebler, Thierry Moisan, Timothy Sutton and William Woodruff\.
 .P
 |  |