Why
Closes #128. Both activity pages stopped at a fixed number of events: the repository feed was truncated at 100, and the instance feed merged 100 per repository and then took 200 before its pager. The instance pager ran out after four pages, and the repository feed had no pager at all. Now that issues, changes, comments and state changes are index rows (#113, #126), the whole feed can be read and paginated.
What changed
- The repository feed and the instance feed keep the whole sorted, filtered event list; both show 50 events per page.
- The repository feed gains a pager. Its links swap the
#activity-feedfragment over HTMX (like the chips and the filter form), and stay plain hrefs when JavaScript is not there. - The
kind,actorandassigneefilters travel through the page links, so paging never widens what the reader asked for; changing a filter starts at page one. - The feed reads comment summaries (parent, id, author, created) instead of every comment body, which it never rendered.
- The home rail still asks for a bounded feed (
homeEventLimit), so the landing page does not become a feed.
Behaviour
A repository with 55 events:
- page one shows 50, the newest, with
Showing 1–50 of 55; - page two shows the oldest 5, with
Showing 51–55 of 55; - the instance feed shows the same;
?kind=issues&actor=keenankeeps both filters in the next/previous links.
The test creates 55 issues directly on the metadata branch and reads both pages of both feeds, plus the filtered link.
Checks
gofmt, go vet ./..., python3 scripts/check-links.py, ./vole workflow check, and the full -race suite with GOFLAGS=-tags=sqlite_fts5.
Trade-off
The feed is assembled in memory per request, so a page costs O(history) rather than O(page). That is fine at this size; if a large history makes it visible, the follow-up is a SQL event stream (a UNION over the source tables) that paginates without materialising every event.