{
  "filename": "app/services/reserve_stock.rb",
  "rule": "- name: locked-stock-availability\n  where: \"app/services/reserve_stock.rb\"\n  ensure: >-\n    Inside the row lock, available stock must be checked against quantity before it is decremented. Reject reservations that exceed the locked stock.",
  "corrected": "class ReserveStock\n  def self.call(inventory, quantity)\n    raise ArgumentError, \"positive integer required\" unless quantity.is_a?(Integer) && quantity > 0\n    inventory.with_lock do\n      raise \"insufficient stock\" if inventory.available < quantity\n      inventory.available -= quantity\n      inventory.save!\n    end\n    inventory.available\n  end\nend\n",
  "broken": "class ReserveStock\n  def self.call(inventory, quantity)\n    raise ArgumentError, \"positive integer required\" unless quantity.is_a?(Integer) && quantity > 0\n    inventory.with_lock do\n      inventory.available -= quantity\n      inventory.save!\n    end\n    inventory.available\n  end\nend\n",
  "regression": [
    "      raise \"insufficient stock\" if inventory.available < quantity\n",
    ""
  ],
  "test_scenarios": [
    [
      "One unit, two concurrent callers",
      "One successful reservation"
    ],
    [
      "Insufficient stock",
      "Exception and unchanged row"
    ],
    [
      "Negative quantity",
      "ArgumentError"
    ],
    [
      "Saving fails validation",
      "Transaction rolls back"
    ]
  ],
  "test_source": null,
  "test_command": "bin/rails test test/services/reserve_stock_test.rb"
}