{
  "filename": "Sources/App/confirm.swift",
  "rule": "- name: audit-uses-transaction-database\n  where: \"Sources/App/confirm.swift\"\n  ensure: >-\n    Both order.update and audit.create inside the transaction must use the database passed into the closure, not request.db for the audit.",
  "corrected": "import Vapor\nimport Fluent\n\nfunc confirm(_ request: Request, order: Order, actor: User) async throws {\n    guard order.tenantID == actor.tenantID else { throw Abort(.notFound) }\n    guard order.status == \"pending\" else { throw Abort(.conflict) }\n    try await request.db.transaction { database in\n        order.status = \"confirmed\"\n        try await order.update(on: database)\n        let audit = Audit(orderID: try order.requireID(), actorID: try actor.requireID())\n        try await audit.create(on: database)\n    }\n}\n",
  "broken": "import Vapor\nimport Fluent\n\nfunc confirm(_ request: Request, order: Order, actor: User) async throws {\n    guard order.tenantID == actor.tenantID else { throw Abort(.notFound) }\n    guard order.status == \"pending\" else { throw Abort(.conflict) }\n    try await request.db.transaction { database in\n        order.status = \"confirmed\"\n        try await order.update(on: database)\n        let audit = Audit(orderID: try order.requireID(), actorID: try actor.requireID())\n        try await audit.create(on: request.db)\n    }\n}\n",
  "regression": [
    "try await audit.create(on: database)",
    "try await audit.create(on: request.db)"
  ],
  "test_scenarios": [
    [
      "Both writes succeed",
      "One transaction commits"
    ],
    [
      "Audit validation/database failure",
      "Order write rolls back"
    ],
    [
      "Database adapter accidentally changed",
      "Integration test detects escaped transaction"
    ],
    [
      "Concurrent state transition",
      "Database-level lock/predicate rejects stale change"
    ]
  ],
  "test_source": null,
  "test_command": "swift test --filter ConfirmationTransactionTests"
}