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
beads: extract the projection out of web/ web/beads.go held the one reading of the beads schema — the table fingerprint, the lane bucketing, the ready rule, the status categories, the transitive dependency walk, the event humanizer, the filter model and the milestone rollup — where a second consumer could not reach it. The MCP surface and the cross-database ready page both need it. Move it to a new root package beads/ that depends on browse/ and the standard library only: rows in, view model out, no net/http, no html/template, no core. The BrowseSession seam is declared consumer-side there and names the one method the projections call, so web's larger BrowseSession satisfies it structurally and a session passes straight through. web/beads.go and web/milestones.go keep only their View adapters — slug, label, template, Applies, and the hand-off of ref and query. The templates are unchanged: the moved types keep their names and their display methods, so every dot still resolves. Pure move plus the beadsMax -> beads.Max export rename. The projection tests move with the code and become testify; the render tests stay in web/ unchanged. Same 63 tests pass before and after.
authn: gofmt the test files