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.