{
  "filename": "lib/order_search.dart",
  "rule": "- name: search-generation-current\n  where: \"lib/order_search.dart\"\n  ensure: >-\n    In load, both the successful response and the caught-error path return before setState when requestGeneration differs from generation. Each completion path checks requestGeneration != generation together with !mounted. Checking only mounted permits an older request to overwrite the current state.",
  "corrected": "import 'package:flutter/widgets.dart';\n\nclass OrderSearch extends StatefulWidget {\n  final Future<List<String>> Function(String) search;\n  const OrderSearch({super.key, required this.search});\n  @override State<OrderSearch> createState() => OrderSearchState();\n}\n\nclass OrderSearchState extends State<OrderSearch> {\n  int generation = 0;\n  List<String> orders = [];\n  Object? failure;\n  Future<void> load(String query) async {\n    final requestGeneration = ++generation;\n    try {\n      final result = await widget.search(query);\n      if (!mounted || requestGeneration != generation) return;\n      setState(() { orders = result; failure = null; });\n    } catch (error) {\n      if (!mounted || requestGeneration != generation) return;\n      setState(() { failure = error; });\n    }\n  }\n  @override void didUpdateWidget(covariant OrderSearch oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.search != widget.search) { generation++; orders = []; failure = null; }\n  }\n  @override Widget build(BuildContext context) => Text(failure == null ? orders.join(', ') : 'Search failed');\n}\n",
  "broken": "import 'package:flutter/widgets.dart';\n\nclass OrderSearch extends StatefulWidget {\n  final Future<List<String>> Function(String) search;\n  const OrderSearch({super.key, required this.search});\n  @override State<OrderSearch> createState() => OrderSearchState();\n}\n\nclass OrderSearchState extends State<OrderSearch> {\n  int generation = 0;\n  List<String> orders = [];\n  Object? failure;\n  Future<void> load(String query) async {\n    final requestGeneration = ++generation;\n    try {\n      final result = await widget.search(query);\n      if (!mounted) return;\n      setState(() { orders = result; failure = null; });\n    } catch (error) {\n      if (!mounted) return;\n      setState(() { failure = error; });\n    }\n  }\n  @override void didUpdateWidget(covariant OrderSearch oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.search != widget.search) { generation++; orders = []; failure = null; }\n  }\n  @override Widget build(BuildContext context) => Text(failure == null ? orders.join(', ') : 'Search failed');\n}\n",
  "regression": [
    "    if (!mounted || requestGeneration != generation) return;",
    "    if (!mounted) return;"
  ],
  "test_scenarios": [
    [
      "A starts, B starts, B resolves then A",
      "Only B displayed"
    ],
    [
      "Widget disposed before result",
      "No setState"
    ],
    [
      "Mounted but old request completes",
      "Result ignored by generation"
    ],
    [
      "Current request fails",
      "Current error shown without stale results"
    ]
  ],
  "test_source": null,
  "test_command": "flutter test test/order_search_test.dart"
}