{ "id": "PR_kwDONovem85", "title": "feat(repo): add cached repository query for titlebar picker", "state": "OPEN", "is_draft": false, "created_at": "2026-05-03T07:40:00Z", "author": { "login": "kennethnym", "avatar_url": "https://avatars.githubusercontent.com/u/4242?v=4" }, "base_branch_name": "main", "base_repo_slug": "kennethnym/novem", "base_ref": "5e8745bfcc0c90c226d3c6af84226d6d4a5ec2d1", "head_branch_name": "feat/cached-repo-picker", "head_repo_slug": "kennethnym/novem", "head_ref": "13af7d0b48a6ce0b22d48c9b6c1c78dfcd94e6a0", "body": "## Summary\n\nIntroduces a cached repository query so the titlebar picker can switch context without hitting GitHub on every open.\n\n### Why\n- reduces flicker while the picker opens\n- keeps recent repositories visible during short reconnects\n- avoids duplicate requests when the titlebar rerenders\n\n### Cache rules\n- explicit refresh invalidates the cached list\n- fresh network data still wins when available\n- empty responses should not overwrite a warm cache\n\n**Fast path:** render the warm cache immediately with ![Warm cache badge](https://placehold.co/24x24.png?text=W) beside cached rows.\n*Background refresh* still reconciles stale rows.\n~~Empty refreshes~~ should never clear visible repositories.\n\n| Cache path | Expected behavior |\n| --- | --- |\n| Warm cache | Render repositories before the refresh finishes |\n| Refresh success | Replace cached rows with fresh network data |\n| Empty response | Keep the previous warm cache intact |\n\n### Screenshot\n![Repository picker showing warm cache while refresh runs](https://placehold.co/960x540.png?text=Repo+Picker+Cache)\n\n```text\nopen picker -> read cache -> render immediately -> refresh in background\n```\n\n### Follow-up\n1. Measure cache hit rate in debug builds.\n2. Add eviction telemetry.\n3. Consider persisting the last successful repository list across launches." }