web: the milestones page says when its rollup is partial MilestoneView has carried the clip since ebbd30f and list_milestones has reported it since a419499; milestones.html rendered nothing, so the page was the last surface presenting a partial rollup as whole-tracker arithmetic. Every number on it is a rollup — "1/4 done", "1995 of 2000 issues carry no milestone label" — and arithmetic over the rows that were read renders exactly like arithmetic over the tracker. The notice is the detail pane's, word for word and class for class: it is the same fact about the same read, and a second phrasing for it would be a second style. It sits above the rollup and outside the milestones/no-milestones branch, because "No milestones." over a clipped read is the reading most easily mistaken for a fact about the tracker. A milestone can lose members here rather than merely undercount them — membership comes from labels — so the fixture makes that concrete: m1 has five members, one of them past the cap, and the page counts four while saying why.
web: show how fresh a beads view is handleView now reads the head commit of the rendered ref onto the envelope (Head *browse.CommitInfo), and the beads and milestones headers carry a shared beadsHead partial: <branch> · last commit <relative> · <short hash>, the hash linking to the commit page and the exact stamp in the title. The read is decoration on top of an answer: a database with no commits, or a Log that fails, renders the page without the line rather than 500ing. The relative time is a new ago func rather than chrome's reltime — it is past-facing (clock skew reads as "just now", never "in 3 minutes") and reads a package clock a test can pin.
feat(web/beads): hierarchy in the milestone view Arrange each milestone as a shallow hierarchy instead of a flat list. - Put the milestone-typed issue(s) on top as the milestone's heads. - Nest tasks under their epics via parent-child dependency edges, with a done/total rollup on the epic row; membership stays label-based. - Keep remaining members as a loose tail; blocks edges are ignored. - Read the dependencies table optionally, degrading to a flat list. - Extend fixtures and real-data logging to cover the hierarchy.
feat(web/beads): promote milestones to their own view/tab Move the milestone rollup off the board and into a dedicated "Milestones" tab (a registered View, companion to Beads via the same fingerprint). The tab is richer than the old board panel: per-milestone progress bar, done/open/in-progress counts, and the issue list under each milestone (open-work first, closed struck through), each linking to its beads detail. Issues with no milestone label are summarized in a footnote. A beads DB with no milestone labels still gets the tab, showing an empty-state hint. Removes the board's inline milestone panel and the collectMilestones/BeadMilestone helpers it used; the grouping now lives in the milestones view.