{
  "filename": "src/useOrderSearch.js",
  "rule": "- name: obsolete-search-does-not-update\n  where: \"src/useOrderSearch.js\"\n  ensure: >-\n    The fulfilled search response must check obsolete before setting items, so a response for a previous query cannot replace the current result.",
  "corrected": "import { useEffect, useState } from \"react\";\n\nexport function useOrderSearch(query) {\n  const [state, setState] = useState({items:[],error:null});\n  useEffect(() => {\n    let obsolete = false;\n    const controller = new AbortController();\n    setState({items:[],error:null});\n    fetch(`/api/orders?q=${encodeURIComponent(query)}`, {signal:controller.signal})\n      .then(response => { if (!response.ok) throw new Error(\"Search failed\"); return response.json(); })\n      .then(items => { if (!obsolete) setState({items,error:null}); })\n      .catch(error => { if (!obsolete && error.name !== \"AbortError\") setState({items:[],error}); });\n    return () => { obsolete = true; controller.abort(); };\n  }, [query]);\n  return state;\n}\n",
  "broken": "import { useEffect, useState } from \"react\";\n\nexport function useOrderSearch(query) {\n  const [state, setState] = useState({items:[],error:null});\n  useEffect(() => {\n    let obsolete = false;\n    const controller = new AbortController();\n    setState({items:[],error:null});\n    fetch(`/api/orders?q=${encodeURIComponent(query)}`, {signal:controller.signal})\n      .then(response => { if (!response.ok) throw new Error(\"Search failed\"); return response.json(); })\n      .then(items => { setState({items,error:null}); })\n      .catch(error => { if (!obsolete && error.name !== \"AbortError\") setState({items:[],error}); });\n    return () => { obsolete = true; controller.abort(); };\n  }, [query]);\n  return state;\n}\n",
  "regression": [
    "if (!obsolete) setState({items,error:null});",
    "setState({items,error:null});"
  ],
  "test_scenarios": [
    [
      "Query A completes after query B",
      "Only B items shown"
    ],
    [
      "Component unmounts",
      "Abort and obsolete flag prevent later state writes"
    ],
    [
      "API returns 500",
      "Error state for current query only"
    ],
    [
      "Strict Mode setup/cleanup cycle",
      "No old effect updates visible data"
    ]
  ],
  "test_source": null,
  "test_command": "npx vitest run src/useOrderSearch.test.jsx"
}