{
  "filename": "src/useOrders.js",
  "rule": "- name: watcher-registers-cleanup\n  where: \"src/useOrders.js\"\n  ensure: >-\n    The tenant watcher must register onCleanup to abort its request and mark its results obsolete before starting asynchronous completion handlers.",
  "corrected": "import { ref, watch } from \"vue\";\n\nexport function useOrders(tenantId) {\n  const orders = ref([]);\n  const error = ref(null);\n  watch(tenantId, (id, _oldId, onCleanup) => {\n    const controller = new AbortController();\n    let obsolete = false;\n    onCleanup(() => { obsolete = true; controller.abort(); });\n    orders.value = [];\n    error.value = null;\n    fetch(`/api/tenants/${encodeURIComponent(id)}/orders`, {signal:controller.signal})\n      .then(response => { if (!response.ok) throw new Error(\"Fetch failed\"); return response.json(); })\n      .then(value => { if (!obsolete) orders.value = value; })\n      .catch(failure => { if (!obsolete && failure.name !== \"AbortError\") error.value = failure; });\n  }, {immediate:true});\n  return {orders,error};\n}\n",
  "broken": "import { ref, watch } from \"vue\";\n\nexport function useOrders(tenantId) {\n  const orders = ref([]);\n  const error = ref(null);\n  watch(tenantId, (id, _oldId, onCleanup) => {\n    const controller = new AbortController();\n    let obsolete = false;\n    orders.value = [];\n    error.value = null;\n    fetch(`/api/tenants/${encodeURIComponent(id)}/orders`, {signal:controller.signal})\n      .then(response => { if (!response.ok) throw new Error(\"Fetch failed\"); return response.json(); })\n      .then(value => { if (!obsolete) orders.value = value; })\n      .catch(failure => { if (!obsolete && failure.name !== \"AbortError\") error.value = failure; });\n  }, {immediate:true});\n  return {orders,error};\n}\n",
  "regression": [
    "    onCleanup(() => { obsolete = true; controller.abort(); });\n",
    ""
  ],
  "test_scenarios": [
    [
      "Tenant changes before response",
      "Prior request aborted and ignored"
    ],
    [
      "Old promise resolves anyway",
      "Obsolete guard stops state update"
    ],
    [
      "Component unmounts",
      "Watcher cleanup runs"
    ],
    [
      "Current request fails",
      "Current error exposed without old tenant data"
    ]
  ],
  "test_source": null,
  "test_command": "npx vitest run src/useOrders.test.js"
}