{
  "filename": "src/Service/ReserveOrder.php",
  "rule": "- name: failed-reservation-prevents-order\n  where: \"src/Service/ReserveOrder.php\"\n  ensure: >-\n    When the conditional inventory UPDATE changes no row, reserve must throw before inserting an order.",
  "corrected": "<?php\nnamespace App\\Service;\nuse Doctrine\\DBAL\\Connection;\n\nclass ReserveOrder {\n    public function __construct(private Connection $connection) {}\n    public function reserve(string $tenant, string $sku, int $quantity): void {\n        if ($quantity <= 0) throw new \\InvalidArgumentException('Positive quantity required');\n        $this->connection->transactional(function (Connection $tx) use ($tenant, $sku, $quantity) {\n            $changed = $tx->executeStatement(\n                'UPDATE inventory SET available=available-? WHERE tenant_id=? AND sku=? AND available>=?',\n                [$quantity, $tenant, $sku, $quantity]\n            );\n            if ($changed !== 1) throw new \\RuntimeException('Insufficient stock');\n            $tx->executeStatement('INSERT INTO orders (tenant_id, sku, quantity) VALUES (?, ?, ?)', [$tenant, $sku, $quantity]);\n        });\n    }\n}\n",
  "broken": "<?php\nnamespace App\\Service;\nuse Doctrine\\DBAL\\Connection;\n\nclass ReserveOrder {\n    public function __construct(private Connection $connection) {}\n    public function reserve(string $tenant, string $sku, int $quantity): void {\n        if ($quantity <= 0) throw new \\InvalidArgumentException('Positive quantity required');\n        $this->connection->transactional(function (Connection $tx) use ($tenant, $sku, $quantity) {\n            $changed = $tx->executeStatement(\n                'UPDATE inventory SET available=available-? WHERE tenant_id=? AND sku=? AND available>=?',\n                [$quantity, $tenant, $sku, $quantity]\n            );\n            $tx->executeStatement('INSERT INTO orders (tenant_id, sku, quantity) VALUES (?, ?, ?)', [$tenant, $sku, $quantity]);\n        });\n    }\n}\n",
  "regression": [
    "            if ($changed !== 1) throw new \\RuntimeException('Insufficient stock');\n",
    ""
  ],
  "test_scenarios": [
    [
      "Sufficient stock",
      "Decrement and order commit"
    ],
    [
      "Insufficient stock",
      "No order inserted"
    ],
    [
      "Order insert fails",
      "Decrement rolls back"
    ],
    [
      "Two concurrent reservations",
      "Conditional UPDATE enforces remaining availability"
    ]
  ],
  "test_source": null,
  "test_command": "php bin/phpunit tests/Service/ReserveOrderTest.php"
}