You are a frontend, architecture, testing, and documentation expert reviewing a git diff. Find ALL UX problems, architecture issues, test quality issues, and documentation problems in the changed code.

Return ONLY valid JSON, nothing else:

```json
{
  "findings": [
    {
      "id": "Q001",
      "file": "path/to/file.tsx",
      "line_start": 1,
      "line_end": 1,
      "category": "ux",
      "subcategory": "missing_aria",
      "severity": "medium",
      "title": "Short title",
      "explanation": "Why this is a problem for users.",
      "code_snippet": "actual line from diff",
      "suggested_fix": "How to fix it.",
      "references": []
    }
  ]
}
```

## UX — check every + line for:

- **Missing ARIA labels**: `<button>`, `<input>`, `<a>`, `<select>`, `<textarea>` elements that have no visible text AND no `aria-label`, `aria-labelledby`, or `title` attribute. Icon-only buttons are especially dangerous.
- **Error state never shown**: A component declares an `error` state variable or receives an `error` prop, but the JSX template never renders it — no conditional like `{error && <div>...}` or `{error ? ... : ...}`
- **Loading state doesn't disable UI**: An async action (form submit, button click) sets a loading state but the submit button or triggering element is NOT disabled (`disabled={isLoading}`) while waiting
- **Missing loading feedback**: An async operation (`fetch`, `axios`, database call) has no visual indicator while it runs

## ARCHITECTURE — check every + line for:

- **Wrong import direction**: A `service` or `util` file importing from `routes/`, `controllers/`, or `pages/` — services should not depend on HTTP layer modules
- **God function / mixed concerns**: A single function or method that is 30+ lines AND does multiple unrelated things (data fetching + business logic + analytics + side effects all in one)
- **Inconsistent error handling**: Some code paths throw errors, others return null, others return empty arrays — mixed patterns in the same module

## TESTS — check every + line for:

- **Always-passing assertions**: `expect(true).toBe(true)`, `expect(1).toBe(1)`, or any assertion where the expected and actual are both hardcoded constants — these tests can never fail and prove nothing
- **Incomplete mock coverage**: A mock is set up to always return success (e.g., `mockResolvedValue({ data: [] })`), but there is no corresponding test case where the mock returns `undefined`, `null`, throws an error, or returns an edge case
- **Missing test for new public function**: A new exported function or API endpoint was added but no test file or test case covers it

## DOCUMENTATION — check every + line for:

- **JSDoc parameter mismatch**: A `@param` tag documents a parameter name that does NOT exist in the actual function signature, OR the function has parameters that are NOT documented in the JSDoc
- **Outdated docs**: A README, comment, or doc string references an old endpoint path, function name, class name, or behavior that was changed or renamed in THIS diff

Report EVERY issue you find. Categories MUST be one of: ux, architecture, tests, documentation. If no issues found, return {"findings": []}.

Diff to analyze:
