[ { "id": 9001, "node_id": "PR_kwDONovem84", "url": "https://api.github.com/repos/kennethnym/novem/issues/84", "repository_url": "https://api.github.com/repos/kennethnym/novem", "labels_url": "https://api.github.com/repos/kennethnym/novem/issues/84/labels{/name}", "comments_url": "https://api.github.com/repos/kennethnym/novem/issues/84/comments", "events_url": "https://api.github.com/repos/kennethnym/novem/issues/84/events", "html_url": "https://github.com/kennethnym/novem/pull/84", "number": 84, "state": "open", "state_reason": null, "title": "feat(dashboard): hydrate issue pane from cached query state", "body": "## Summary\n\nHydrates the dashboard issue pane from cached query state so selection and scroll position stay stable during refetches.\n\n### Changes\n- reuse the cached query result before the network request resolves\n- keep the selected issue id pinned across list refreshes\n- fall back to the first visible item when the cached selection disappears\n\n### Behavior matrix\n| Case | Expected behavior |\n| --- | --- |\n| Cache hit | Keep the current selection pinned |\n| Cache miss | Fall back to the first visible item |\n| Refetch in flight | Preserve scroll position |\n\n### Follow-up\n- mirror the same cache behavior in the pull request detail pane\n- add a smoke test for refetch during keyboard navigation", "body_text": "Wires the dashboard issue list to the query store and keeps selection stable while refetching.", "body_html": null, "user": { "login": "kennethnym", "id": 4242, "avatar_url": "https://avatars.githubusercontent.com/u/4242?v=4", "html_url": "https://github.com/kennethnym", "name": "Kenneth Ng", "email": "kenneth@example.com" }, "labels": [ { "id": 11001, "node_id": "LA_kwDONovem_feature", "url": "https://api.github.com/repos/kennethnym/novem/labels/feature", "name": "feature", "description": "New product capability.", "color": "0E8A16", "default": false }, { "id": 11002, "node_id": "LA_kwDONovem_dashboard", "url": "https://api.github.com/repos/kennethnym/novem/labels/dashboard", "name": "dashboard", "description": "Dashboard experience.", "color": "1D76DB", "default": false } ], "assignee": null, "assignees": [], "milestone": null, "locked": false, "active_lock_reason": null, "comments": 3, "pull_request": { "url": "https://api.github.com/repos/kennethnym/novem/pulls/84", "html_url": "https://github.com/kennethnym/novem/pull/84", "diff_url": "https://github.com/kennethnym/novem/pull/84.diff", "patch_url": "https://github.com/kennethnym/novem/pull/84.patch", "merged_at": null }, "closed_at": null, "created_at": "2026-05-01T09:12:00Z", "updated_at": "2026-05-05T02:40:00Z", "closed_by": null, "author_association": "OWNER", "draft": false, "timeline_url": "https://api.github.com/repos/kennethnym/novem/issues/84/timeline", "repository": { "id": 101, "node_id": "R_kgDONovem", "name": "novem", "full_name": "kennethnym/novem", "owner": { "login": "kennethnym", "id": 4242, "avatar_url": "https://avatars.githubusercontent.com/u/4242?v=4", "html_url": "https://github.com/kennethnym", "name": "Kenneth Ng", "email": "kenneth@example.com" }, "private": false, "html_url": "https://github.com/kennethnym/novem", "description": "Desktop workspace for triaging GitHub work.", "fork": false, "url": "https://api.github.com/repos/kennethnym/novem" }, "performed_via_github_app": null, "reactions": null, "pinned_comment": null, "type": null, "sub_issues_summary": null }, { "id": 9005, "node_id": "PR_kwDOSprint62", "url": "https://api.github.com/repos/kennethnym/sprint-planner/issues/62", "repository_url": "https://api.github.com/repos/kennethnym/sprint-planner", "labels_url": "https://api.github.com/repos/kennethnym/sprint-planner/issues/62/labels{/name}", "comments_url": "https://api.github.com/repos/kennethnym/sprint-planner/issues/62/comments", "events_url": "https://api.github.com/repos/kennethnym/sprint-planner/issues/62/events", "html_url": "https://github.com/kennethnym/sprint-planner/pull/62", "number": 62, "state": "closed", "state_reason": "completed", "title": "feat(calendar): ship release handoff checklist in weekly planner", "body": "## Release handoff checklist\n\nAdds the release checklist views and closes the loop for the May rollout.\n\n### Included\n- launch readiness checklist for QA, docs, and release engineering\n- handoff status badges in the weekly planner\n- empty-state copy for weeks without a scheduled release\n\n| Stage | Owner | Status |\n| --- | --- | --- |\n| QA sign-off | `@mariahops` | Done |\n| Docs publish | `@rorycraft` | Done |\n| Release window confirm | `@kennethnym` | Done |\n\n### Verification\n1. Open a release week and confirm checklist sections render in order.\n2. Mark each handoff item complete and confirm the summary badge updates.\n3. Review the planner on a narrow viewport.\n\n```text\nrelease_week -> handoff_panel -> checklist_sections\n```", "body_text": "Adds the release checklist views and marks the handoff flow complete for the May rollout.", "body_html": null, "user": { "login": "rorycraft", "id": 7171, "avatar_url": "https://avatars.githubusercontent.com/u/7171?v=4", "html_url": "https://github.com/rorycraft", "name": "Rory Craft", "email": "rory@example.com" }, "labels": [ { "id": 14001, "node_id": "LA_kwDOSprint_release_blocker", "url": "https://api.github.com/repos/kennethnym/sprint-planner/labels/release-blocker", "name": "release-blocker", "description": "Required before the next release can ship.", "color": "B60205", "default": false }, { "id": 14002, "node_id": "LA_kwDOSprint_planning", "url": "https://api.github.com/repos/kennethnym/sprint-planner/labels/planning", "name": "planning", "description": "Roadmap and planning workflow.", "color": "0E8A16", "default": false }, { "id": 14003, "node_id": "LA_kwDOSprint_tests", "url": "https://api.github.com/repos/kennethnym/sprint-planner/labels/tests", "name": "tests", "description": "Verification and test coverage.", "color": "FBCA04", "default": false } ], "assignee": { "login": "kennethnym", "id": 4242, "avatar_url": "https://avatars.githubusercontent.com/u/4242?v=4", "html_url": "https://github.com/kennethnym", "name": "Kenneth Ng", "email": "kenneth@example.com" }, "assignees": [ { "login": "kennethnym", "id": 4242, "avatar_url": "https://avatars.githubusercontent.com/u/4242?v=4", "html_url": "https://github.com/kennethnym", "name": "Kenneth Ng", "email": "kenneth@example.com" }, { "login": "mariahops", "id": 6161, "avatar_url": "https://avatars.githubusercontent.com/u/6161?v=4", "html_url": "https://github.com/mariahops", "name": "Maria Hops", "email": "maria@example.com" } ], "milestone": null, "locked": false, "active_lock_reason": null, "comments": 12, "pull_request": { "url": "https://api.github.com/repos/kennethnym/sprint-planner/pulls/62", "html_url": "https://github.com/kennethnym/sprint-planner/pull/62", "diff_url": "https://github.com/kennethnym/sprint-planner/pull/62.diff", "patch_url": "https://github.com/kennethnym/sprint-planner/pull/62.patch", "merged_at": "2026-05-04T18:10:00Z" }, "closed_at": "2026-05-04T18:15:00Z", "created_at": "2026-04-28T10:20:00Z", "updated_at": "2026-05-05T01:10:00Z", "closed_by": { "login": "kennethnym", "id": 4242, "avatar_url": "https://avatars.githubusercontent.com/u/4242?v=4", "html_url": "https://github.com/kennethnym", "name": "Kenneth Ng", "email": "kenneth@example.com" }, "author_association": "MEMBER", "draft": false, "timeline_url": "https://api.github.com/repos/kennethnym/sprint-planner/issues/62/timeline", "repository": { "id": 104, "node_id": "R_kgDOSprint", "name": "sprint-planner", "full_name": "kennethnym/sprint-planner", "owner": { "login": "kennethnym", "id": 4242, "avatar_url": "https://avatars.githubusercontent.com/u/4242?v=4", "html_url": "https://github.com/kennethnym", "name": "Kenneth Ng", "email": "kenneth@example.com" }, "private": false, "html_url": "https://github.com/kennethnym/sprint-planner", "description": "Weekly planning board and release calendar.", "fork": false, "url": "https://api.github.com/repos/kennethnym/sprint-planner" }, "performed_via_github_app": null, "reactions": null, "pinned_comment": null, "type": null, "sub_issues_summary": null }, { "id": 9004, "node_id": "PR_kwDONovem85", "url": "https://api.github.com/repos/kennethnym/novem/issues/85", "repository_url": "https://api.github.com/repos/kennethnym/novem", "labels_url": "https://api.github.com/repos/kennethnym/novem/issues/85/labels{/name}", "comments_url": "https://api.github.com/repos/kennethnym/novem/issues/85/comments", "events_url": "https://api.github.com/repos/kennethnym/novem/issues/85/events", "html_url": "https://github.com/kennethnym/novem/pull/85", "number": 85, "state": "open", "state_reason": null, "title": "feat(repo): add cached repository query for titlebar picker", "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 available during short reconnects\n- avoids duplicate requests when the titlebar rerenders\n\n### Notes\n- cache invalidates on explicit refresh\n- fresh network data still wins when available\n- follow up with eviction metrics\n\n**Fast path:** render the warm cache immediately.\n*Background refresh* still reconciles stale rows.\n~~Empty refreshes~~ should never clear visible repositories.\n\n### Cache paths\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 |", "body_text": "Introduces a repository list query so the titlebar can switch context without hitting GitHub repeatedly.", "body_html": null, "user": { "login": "kennethnym", "id": 4242, "avatar_url": "https://avatars.githubusercontent.com/u/4242?v=4", "html_url": "https://github.com/kennethnym", "name": "Kenneth Ng", "email": "kenneth@example.com" }, "labels": [ { "id": 11003, "node_id": "LA_kwDONovem_performance", "url": "https://api.github.com/repos/kennethnym/novem/labels/performance", "name": "performance", "description": "Performance-sensitive change.", "color": "5319E7", "default": false }, { "id": 11004, "node_id": "LA_kwDONovem_cache", "url": "https://api.github.com/repos/kennethnym/novem/labels/cache", "name": "cache", "description": "Caching and persistence work.", "color": "0052CC", "default": false }, { "id": 11005, "node_id": "LA_kwDONovem_needs_review", "url": "https://api.github.com/repos/kennethnym/novem/labels/needs-review", "name": "needs-review", "description": "Awaiting reviewer attention.", "color": "FBCA04", "default": false } ], "assignee": { "login": "leaferiksen", "id": 5151, "avatar_url": "https://avatars.githubusercontent.com/u/5151?v=4", "html_url": "https://github.com/leaferiksen", "name": "Leaf Eriksen", "email": "leaf@example.com" }, "assignees": [ { "login": "leaferiksen", "id": 5151, "avatar_url": "https://avatars.githubusercontent.com/u/5151?v=4", "html_url": "https://github.com/leaferiksen", "name": "Leaf Eriksen", "email": "leaf@example.com" } ], "milestone": null, "locked": false, "active_lock_reason": null, "comments": 2, "pull_request": { "url": "https://api.github.com/repos/kennethnym/novem/pulls/85", "html_url": "https://github.com/kennethnym/novem/pull/85", "diff_url": "https://github.com/kennethnym/novem/pull/85.diff", "patch_url": "https://github.com/kennethnym/novem/pull/85.patch", "merged_at": null }, "closed_at": null, "created_at": "2026-05-03T07:40:00Z", "updated_at": "2026-05-05T00:15:00Z", "closed_by": null, "author_association": "OWNER", "draft": false, "timeline_url": "https://api.github.com/repos/kennethnym/novem/issues/85/timeline", "repository": { "id": 101, "node_id": "R_kgDONovem", "name": "novem", "full_name": "kennethnym/novem", "owner": { "login": "kennethnym", "id": 4242, "avatar_url": "https://avatars.githubusercontent.com/u/4242?v=4", "html_url": "https://github.com/kennethnym", "name": "Kenneth Ng", "email": "kenneth@example.com" }, "private": false, "html_url": "https://github.com/kennethnym/novem", "description": "Desktop workspace for triaging GitHub work.", "fork": false, "url": "https://api.github.com/repos/kennethnym/novem" }, "performed_via_github_app": null, "reactions": null, "pinned_comment": null, "type": null, "sub_issues_summary": null }, { "id": 9002, "node_id": "PR_kwDOAgent47", "url": "https://api.github.com/repos/kennethnym/agent-tooling/issues/47", "repository_url": "https://api.github.com/repos/kennethnym/agent-tooling", "labels_url": "https://api.github.com/repos/kennethnym/agent-tooling/issues/47/labels{/name}", "comments_url": "https://api.github.com/repos/kennethnym/agent-tooling/issues/47/comments", "events_url": "https://api.github.com/repos/kennethnym/agent-tooling/issues/47/events", "html_url": "https://github.com/kennethnym/agent-tooling/pull/47", "number": 47, "state": "open", "state_reason": null, "title": "feat(prompts): split context loading from execution workers", "body": "## Goal\n\nSeparates prompt packing from worker orchestration to make delegation easier to reason about.\n\n### What changed\n- `ContextLoader` now owns repository and file hydration\n- workers receive a normalized prompt payload\n- retry handling stays at the orchestration layer\n\n### Boundaries\n| Boundary | Responsibility |\n| --- | --- |\n| `ContextLoader` | Hydrate repository and file context |\n| `PromptAssembler` | Build compact worker payloads |\n| `WorkerRunner` | Apply retry policy and collect results |\n\n### Open questions\n- should prompt packing expose token counts in debug builds?\n- should draft workers emit a dry-run preview?\n\n> Keeps the worker boundary small enough to test in isolation.", "body_text": "Separates prompt packing from worker orchestration to make delegation easier to reason about.", "body_html": null, "user": { "login": "leaferiksen", "id": 5151, "avatar_url": "https://avatars.githubusercontent.com/u/5151?v=4", "html_url": "https://github.com/leaferiksen", "name": "Leaf Eriksen", "email": "leaf@example.com" }, "labels": [ { "id": 12001, "node_id": "LA_kwDOAgent_dx", "url": "https://api.github.com/repos/kennethnym/agent-tooling/labels/developer-experience", "name": "developer-experience", "description": "Improves contributor ergonomics.", "color": "7057FF", "default": false }, { "id": 12002, "node_id": "LA_kwDOAgent_prompts", "url": "https://api.github.com/repos/kennethnym/agent-tooling/labels/prompts", "name": "prompts", "description": "Prompt and agent coordination.", "color": "1D76DB", "default": false } ], "assignee": { "login": "kennethnym", "id": 4242, "avatar_url": "https://avatars.githubusercontent.com/u/4242?v=4", "html_url": "https://github.com/kennethnym", "name": "Kenneth Ng", "email": "kenneth@example.com" }, "assignees": [ { "login": "kennethnym", "id": 4242, "avatar_url": "https://avatars.githubusercontent.com/u/4242?v=4", "html_url": "https://github.com/kennethnym", "name": "Kenneth Ng", "email": "kenneth@example.com" } ], "milestone": null, "locked": false, "active_lock_reason": null, "comments": 1, "pull_request": { "url": "https://api.github.com/repos/kennethnym/agent-tooling/pulls/47", "html_url": "https://github.com/kennethnym/agent-tooling/pull/47", "diff_url": "https://github.com/kennethnym/agent-tooling/pull/47.diff", "patch_url": "https://github.com/kennethnym/agent-tooling/pull/47.patch", "merged_at": null }, "closed_at": null, "created_at": "2026-04-30T14:22:00Z", "updated_at": "2026-05-04T23:10:00Z", "closed_by": null, "author_association": "COLLABORATOR", "draft": true, "timeline_url": "https://api.github.com/repos/kennethnym/agent-tooling/issues/47/timeline", "repository": { "id": 102, "node_id": "R_kgDOAgent", "name": "agent-tooling", "full_name": "kennethnym/agent-tooling", "owner": { "login": "kennethnym", "id": 4242, "avatar_url": "https://avatars.githubusercontent.com/u/4242?v=4", "html_url": "https://github.com/kennethnym", "name": "Kenneth Ng", "email": "kenneth@example.com" }, "private": false, "html_url": "https://github.com/kennethnym/agent-tooling", "description": "Experiments for agent-driven developer workflows.", "fork": false, "url": "https://api.github.com/repos/kennethnym/agent-tooling" }, "performed_via_github_app": null, "reactions": null, "pinned_comment": null, "type": null, "sub_issues_summary": null } ]