{
  "filename": "orders/confirmation.py",
  "rule": "- name: outbox-same-atomic-block\n  where: \"orders/confirmation.py\"\n  ensure: >-\n    OutboxEvent.objects.create must run inside the same transaction.atomic block as order.save. Moving event insertion after the atomic block breaks the rule.",
  "corrected": "from django.db import transaction\nfrom .models import Order, OutboxEvent\n\ndef confirm_order(actor, order_id):\n    with transaction.atomic():\n        order = (Order.objects.select_for_update()\n                 .get(pk=order_id, tenant_id=actor.tenant_id))\n        if order.status != \"pending\":\n            raise ValueError(\"Order already transitioned\")\n        order.status = \"confirmed\"\n        order.save(update_fields=[\"status\"])\n        OutboxEvent.objects.create(\n            event_key=f\"order-confirmed:{order.pk}\",\n            payload={\"order_id\": order.pk, \"tenant_id\": actor.tenant_id},\n        )\n    return order.pk\n",
  "broken": "from django.db import transaction\nfrom .models import Order, OutboxEvent\n\ndef confirm_order(actor, order_id):\n    with transaction.atomic():\n        order = (Order.objects.select_for_update()\n                 .get(pk=order_id, tenant_id=actor.tenant_id))\n        if order.status != \"pending\":\n            raise ValueError(\"Order already transitioned\")\n        order.status = \"confirmed\"\n        order.save(update_fields=[\"status\"])\n    OutboxEvent.objects.create(\n            event_key=f\"order-confirmed:{order.pk}\",\n            payload={\"order_id\": order.pk, \"tenant_id\": actor.tenant_id},\n        )\n    return order.pk\n",
  "regression": [
    "        OutboxEvent.objects.create(",
    "    OutboxEvent.objects.create("
  ],
  "test_scenarios": [
    [
      "Event insert succeeds",
      "Order and event commit"
    ],
    [
      "Event insert violates a constraint",
      "Order transition rolls back"
    ],
    [
      "Worker loses acknowledgement",
      "Delivery may repeat; consumer deduplicates"
    ],
    [
      "Another tenant submits the same id",
      "Scoped lookup rejects it"
    ]
  ],
  "test_source": null,
  "test_command": "python manage.py test orders.tests.test_outbox"
}