{
  "filename": "src/main/scala/ReadOrder.scala",
  "rule": "- name: http-response-resource-release\n  where: \"src/main/scala/ReadOrder.scala\"\n  ensure: >-\n    read must consume the response through Resource.use, or otherwise guarantee its release after success, failure, and cancellation. Ignoring the release returned by allocated breaks this requirement.",
  "corrected": "import cats.effect.IO\nimport org.http4s.Request\nimport org.http4s.client.Client\nimport org.http4s.implicits._\n\nobject ReadOrder {\n  def read(client: Client[IO], request: Request[IO]): IO[String] =\n    client.run(request).use { response =>\n      if (response.status.isSuccess) response.as[String]\n      else IO.raiseError(new RuntimeException(\"Upstream failed\"))\n    }\n}\n",
  "broken": "import cats.effect.IO\nimport org.http4s.Request\nimport org.http4s.client.Client\nimport org.http4s.implicits._\n\nobject ReadOrder {\n  def read(client: Client[IO], request: Request[IO]): IO[String] =\n    client.run(request).allocated.flatMap { case (response, ignoredRelease) =>\n      if (response.status.isSuccess) response.as[String]\n      else IO.raiseError(new RuntimeException(\"Upstream failed\"))\n    }\n}\n",
  "regression": [
    "    client.run(request).use { response =>",
    "    client.run(request).allocated.flatMap { case (response, ignoredRelease) =>"
  ],
  "test_scenarios": [
    [
      "Successful body decode",
      "Response resource released"
    ],
    [
      "Decoding raises",
      "Finalizer still runs"
    ],
    [
      "Task canceled during read",
      "Resource finalizer runs"
    ],
    [
      "Allocated finalizer ignored",
      "Pool-retention regression exposed"
    ]
  ],
  "test_source": null,
  "test_command": "sbt \"testOnly ReadOrderResourceSuite\""
}