- Reading progress bar on /blog/[slug]Thin top-of-viewport bar that fills brand-color โ amber as the reader scrolls through `.blog-prose`. Anchored to the article body (not the entire page) so the bar reads as the reader's progress through the essay, not their progress through the rev-102 related-posts grid + rev-103 CTA card. Hidden until the reader has actually scrolled into the article so the header reads clean on first paint; clamps to 100% at the bottom so the bar reads as a completion signal. Quality polish that signals 'this is a real publication' without competing with the rev-103 per-heading permalinks or the rev-102 per-post share affordances. Distinct from the rev-103 read-time chip in the author block (which scrolls offscreen the moment the reader starts reading) โ the progress bar stays load-bearing throughout the entire read.
- Scroll-to-top FAB on /blog/[slug]Mirrors the rev-38 dashboard `ScrollToTop` primitive at the blog axis. The blog has accumulated long-form posts (the rev-10 governance-first essay + rev-42 MCP announcement post both run 2,000+ words across 8+ sections; the rev-92 procurement-evidence posts go even longer) and operators finishing a long read had no quick path back to the rev-102 related-posts grid or the rev-103 CTA card without manual scrolling. Same 800px threshold as the dashboard variant so the visual vocabulary reads as siblings across the two surfaces. Distinct visual treatment (brand-amber gradient `#cf6c3a โ #b85723`, `ArrowUp` icon, soft shadow) so the blog FAB doesn't get confused with the dashboard FAB when a reader visits both surfaces in the same session.
- Print-friendly /blog/[slug] takeaway stylesheetCloses the procurement-takeaway-friendly gap on long-form blog posts. Mirrors the rev-92 share-page print rules + rev-93 work-log print + rev-94 timeline print at the /blog axis so all four reading surfaces print with one consistent vocabulary. Hides every navigation + interaction surface (top nav, share chips, scroll-to-top, reading progress bar, related-posts grid, bottom CTA, back-to-blog link, per-heading anchor chips) so the print reads as the essay alone. Title + author block + prose get clean print typography (26pt / 11pt / 1.55 line-height); external links print their full URL inline via `a[href^='http']::after` so the offline reader can trace every reference. Operators sharing the rev-13 ISO 42001 governance docs essay or the rev-10 governance-first category post with a procurement reviewer now get a clean PDF takeaway. The rev-92 print stylesheet's reach extends to its fourth surface โ load-bearing for SOC 2 / ISO 42001 procurement evidence packages.
- GET /api/v1/blog/categories โ third axis on the v1 blog clusterPublic read of the blog's category taxonomy on the v1 surface. Rev 102 added the listing endpoint, rev 103 added the per-post detail; rev 104 closes the third axis with a category list including the canonical key, human-readable name, accent colour, description, and post count for every category that has at least one post. MCP hosts rendering 'Loop Desk's blog by category' in their own UI now match the public site exactly without scraping the SSR'd category sections. No auth โ same model as the rev-102/103 endpoints + /badge.svg + /roadmap-* + /changelog. Cache-control public, max-age=300, s-maxage=1800. The v1 blog cluster (listing + detail + categories) is now functionally complete on the protocol-bound side, matching the depth of the rev-100/101 changelog cluster (listing + sinceRev) and the rev-98/99 roadmap cluster (planned + most-requested + trending). The MCP server (Q3 #1) gains one more pre-typed surface with nothing left to design on the blog axis.