{
  "filename": "inventory.h",
  "rule": "- name: reservation-checks-locked-stock\n  where: \"inventory.h\"\n  ensure: >-\n    reserve must reject quantity greater than available while holding the mutex, before decrementing stock.",
  "corrected": "#pragma once\n#include <QMutex>\n#include <QMutexLocker>\n\nclass Inventory {\n    QMutex mutex;\n    int available;\npublic:\n    explicit Inventory(int count): available(count) {}\n    bool reserve(int quantity) {\n        QMutexLocker<QMutex> guard(&mutex);\n        if (quantity <= 0 || available < quantity) return false;\n        available -= quantity;\n        return true;\n    }\n    int remaining() {\n        QMutexLocker<QMutex> guard(&mutex);\n        return available;\n    }\n};\n",
  "broken": "#pragma once\n#include <QMutex>\n#include <QMutexLocker>\n\nclass Inventory {\n    QMutex mutex;\n    int available;\npublic:\n    explicit Inventory(int count): available(count) {}\n    bool reserve(int quantity) {\n        QMutexLocker<QMutex> guard(&mutex);\n        if (quantity <= 0) return false;\n        available -= quantity;\n        return true;\n    }\n    int remaining() {\n        QMutexLocker<QMutex> guard(&mutex);\n        return available;\n    }\n};\n",
  "regression": [
    "        if (quantity <= 0 || available < quantity) return false;",
    "        if (quantity <= 0) return false;"
  ],
  "test_scenarios": [
    [
      "Two threads reserve one final unit",
      "Exactly one success"
    ],
    [
      "Negative or zero quantity",
      "Rejected without mutation"
    ],
    [
      "Early rejection",
      "Mutex released"
    ],
    [
      "Concurrent remaining calls",
      "Synchronized reads, no data race"
    ]
  ],
  "test_source": null,
  "test_command": "ctest --test-dir build --output-on-failure"
}