{
  "filename": "lua/reserve.lua",
  "rule": "- name: shared-stock-availability\n  where: \"lua/reserve.lua\"\n  ensure: >-\n    Inside the acquired inventory lock, reserve must reject available < quantity before changing the shared dictionary.",
  "corrected": "local resty_lock = require \"resty.lock\"\nlocal stock = ngx.shared.stock\n\nlocal function reserve(sku, quantity)\n    if type(quantity) ~= \"number\" or quantity <= 0 or quantity % 1 ~= 0 then\n        return nil, \"invalid quantity\"\n    end\n    local lock, err = resty_lock:new(\"inventory_locks\", {timeout=0.2, exptime=2})\n    if not lock then return nil, err end\n    local elapsed, lock_err = lock:lock(\"stock:\" .. sku)\n    if not elapsed then return nil, lock_err end\n    local ok, result, operation_err = pcall(function()\n        local available = stock:get(sku) or 0\n        if available < quantity then return nil, \"insufficient stock\" end\n        local saved, save_err = stock:set(sku, available - quantity)\n        if not saved then return nil, save_err end\n        return true\n    end)\n    lock:unlock()\n    if not ok then return nil, result end\n    return result, operation_err\nend\n\nreturn reserve\n",
  "broken": "local resty_lock = require \"resty.lock\"\nlocal stock = ngx.shared.stock\n\nlocal function reserve(sku, quantity)\n    if type(quantity) ~= \"number\" or quantity <= 0 or quantity % 1 ~= 0 then\n        return nil, \"invalid quantity\"\n    end\n    local lock, err = resty_lock:new(\"inventory_locks\", {timeout=0.2, exptime=2})\n    if not lock then return nil, err end\n    local elapsed, lock_err = lock:lock(\"stock:\" .. sku)\n    if not elapsed then return nil, lock_err end\n    local ok, result, operation_err = pcall(function()\n        local available = stock:get(sku) or 0\n        local saved, save_err = stock:set(sku, available - quantity)\n        if not saved then return nil, save_err end\n        return true\n    end)\n    lock:unlock()\n    if not ok then return nil, result end\n    return result, operation_err\nend\n\nreturn reserve\n",
  "regression": [
    "        if available < quantity then return nil, \"insufficient stock\" end\n",
    ""
  ],
  "test_scenarios": [
    [
      "Two workers reserve final unit",
      "One succeeds under lock"
    ],
    [
      "Insufficient stock",
      "No decrement"
    ],
    [
      "Shared-dict set fails",
      "Error returned, lock released"
    ],
    [
      "Operation throws",
      "pcall catches, unlock still runs"
    ]
  ],
  "test_source": null,
  "test_command": "resty tests/reserve_spec.lua"
}