mcpsrv: a bad commit-log cursor is a miss, not a fault
web: link issue ids to the tracker that owns them
mcpsrv: answer what is ready across every tracker
browse: report an unparseable start hash as a missing ref
remoteapi: gofmt the integration test
doltsrht: serve /mcp on the web listener
mcpsrv: list the memories a tracker holds
web: drop the author from a memory's revision line
web: answer what is ready across every tracker
mcpsrv: add the beads tools
web: register the views in one explicit list
web: give bd memories their own view
mcpsrv: add the generic browse tools
web: offer the bd command for the issue on screen
db: list every database a viewer may see
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.
mcpsrv: serve a stateless read-only MCP surface
beads: add a one-column stream layout beside the board ?layout=stream renders the same filtered set, the same buckets and the same cards as one column of sections instead of four lanes side by side. It is a layout of the Beads view and not a fifth tab: filters, the ready toggle, the search box and ?issue= behave exactly as they do on the board. A column read top to bottom can afford one sort per section, because each section answers a different question: Rolling by started_at desc (what was picked up last is what is being worked on), Lined Up ready-first then priority then oldest, Stalled by blocker count (one blocker away is nearer than five), Past Stand by closed_at desc. started_at and closed_at join the card model as sort keys and are not displayed; a row missing one sorts last, because an unset timestamp is not a very old one. Past Stand opens collapsed in a <details> — the largest and least actionable section, closed without a line of JavaScript. The sections are derived from the finished lanes rather than bucketed again, so the section counts cannot drift from the marquee, and the lanes keep the board order the board renders. The Board/Stream toggle rebuilds the current query with layout replaced, via a new withQuery template func, so every active filter survives the switch.
docs: spec the MCP surface and the second round of beads views
beads: drop the Bead/Beads prefix from the moved types