gabriel / musehub public

MuseHub v0.2.0-nightly.4

v0.2.0-nightly.4 ⚠ Pre-release
Author G gabriel
Released Jul 9, 2026
Signature 🔒 Unverified
Status Pre-release
0 Downloads
0 Assets
0 Formats
Pre-release Channel
📋 Release Notes

MuseHub v0.2.0-nightly.4

Fourth nightly build, version-synced with muse. The headline is a real fix to the two-column scroll bug nightly.3 shipped — that fix worked for the one page it was built against, but broke on every other page with different chrome above the grid. Tonight replaces the whole approach with a structurally sound pattern instead of patching the formula a third time.

What changed

  • Two-column layout rebuilt as a viewport-locked flex shell, across all 9 pages that actually use it (issues list/detail, proposal detail, explore, MCP docs, muse dev docs, blame, repo home; blob's panel confirmed already correct and left alone). Nightly.3's fix used max-height: calc(100dvh - var(--sticky-offset) - ...) per column — --sticky-offset was a static guess that only accounted for the navbar
    • repo-tabs bar, so any page with more chrome above its grid (a toolbar, filter bar, hero) got a wrong height and either overlapped the footer or made content unreachable. Replaced with the same pattern Gmail/Slack/VS Code use: the body becomes a height: 100dvh flex column, every fixed-height sibling above the scrollable region is flex-shrink: 0, and the two-column grid is flex: 1; min-height: 0 — the browser computes "whatever's left" automatically, no calc(), no per-page offset to get wrong. Found and fixed two generic flex/grid gotchas along the way (align-items: stretch vs start on the grid; flex-shrink: 0 needed on a .card-style child with its own overflow: hidden) and one zoom-specific bug (zoom inflates an element's own rendered box ~25% beyond its layout box, so body { height: 100dvh } zoomed 1.25x was silently clipping the last ~20% of every app-shell page regardless of how far any column scrolled internally — fixed with a --zoom-factor custom property compensating the shell's height). Verified page-by-page with headless Chromium driving real mouse.wheel() events, not just DOM scrollTo or reading CSS — both prior "should work" theories turned out wrong or incomplete without that (musehub#139).
  • Footer no longer overlaps two-column page content — the specific regression that prompted tonight's rebuild; now structurally impossible rather than patched (part of musehub#139).
  • Dead CSS cleanup: deleted .layout-two-col/.layout-sidebar (confirmed zero templates ever used them) and its now-pointless test file. Left .graph-layout/.dag-* in place with a TODO instead of deleting — likely scaffolded ahead of the code-domain symbol-graph visualization, not actually dead.
  • aaronrene assigned musehub#129 (rich social preview cards — no og:image today) with a master work-queue tracker (musehub#138) for future hand-offs, plus the before/after Facebook-preview screenshots attached directly to the issue.

Follow-ups filed, not blocking this nightly

  • musehub#136 — investigate removing body { zoom: 1.25 } in favor of rem-based scaling; blocked on a spacing-token refactor.
  • musehub#137 — heading anchors (deep-link) for issue and proposal bodies, matching the existing README/mist behavior.
  • musehub#140 — duplicate issue numbers under concurrent creation (a real race condition, self-inflicted while generating test data for #139) cause a 500 on read/close for the affected numbers.
  • musehub#141/#142/#143 — CRUD/delete parity audit: issues and proposals have no delete concept at all today (only state), issue comments' soft-delete is the one entity that's fully wired end-to-end, and proposal comments have the is_deleted column but nothing uses it. Parent ticket (#141) covers a framework-wide soft+hard delete idiom; #142/#143 are the first two entities to bring up to that standard.
  • musehub#128 — release pruning's PEP 440-aware sort (phases 1–2, already live) is working correctly, but phase 3's live re-verification tonight found a different bug underneath it: a global "keep 3 newest by precedence" prune still deletes the current nightly whenever older rc builds exist in the same bucket, since a dev build is always lower PEP 440 precedence than any rc of the same base version. Needs per-channel retention, not global.

How the version number got picked

Every commit's sem_ver_bump is computed structurally from an AST-level diff of changed public symbols, not typed by hand — see docs/versioning.md. This nightly's structural changes classify as MINOR.

📦 Download Packages 0 available
📦 Source Full snapshot archive Not included in this release
📊 Metadata JSON: release metadata Not included in this release
📥 Assets 0
No additional assets attached to this release.