fix(dashboard): repair three UX defects on Gaps, About, and Groups

Repairs three BROKEN defects found in a dashboard UX review. The dashboard is the static D3.js app in internal/renderer/static/ (source in src/*.js, concatenated into assets/app.src.js).

Defects and fixes

B1 — Gaps doc link / row navigation. The "Do This Next" links and the gap-row click are now confirmed correct and locked: doc links open in a new tab (target="_blank" rel="noopener noreferrer") and a gap-row click switches tabs in place rather than navigating the dashboard away (02-health.js / 05-groups.js, 10-ui.js formatPlayLink). Added a fail-on-old structural test.

B2 — About version was blank. The About view rendered manifold . Dashboard generated <date> with an empty version (a bare period) because the binary version never reached the dashboard. Plumbed end to end: the analyzer stamps summary.build_version from internal/version (defaults to dev), and the dashboard renders the About + footer spans from it with a dev fallback so the line is never blank. (internal/schema/analyzer.go, internal/analyzer/summary.go, src/02-health.js)

B3 — Groups workshop card missing HEALTH IMPACT. Workshop cards dropped the HEALTH IMPACT stat when the projected delta was zero, breaking the three-stat layout (most visibly the "Connect to review and CI workflows" card). Now always renders the stat, showing +0 when the delta is zero. (src/05-groups.js)

Tests (fail-on-old, committed in internal/renderer and internal/analyzer)

  • TestRender_GapsDocLinkOpensNewTab — asserts the play link carries target="_blank" + rel="noopener noreferrer" and the row handler defers to anchor clicks.
  • TestRender_AboutVersionNeverBlank — asserts the bundle reads build_version with a dev fallback and writes the About + footer spans.
  • TestRender_WorkshopCardAlwaysHasHealthImpact — asserts the HEALTH IMPACT stat is emitted unconditionally (no projectedHealth > currentHealth guard).
  • TestComputeSummary_StampsBuildVersion / TestBuildVersion_FallsBackToDev — assert the analyzer stamps a non-empty version and falls back to dev.

Validation

  • make static regenerated assets/app.src.js (in sync with src/*.js).
  • go vet ./... clean, CGO_ENABLED=1 go test -race ./... pass, golangci-lint run 0 issues, coverage 69.9% (>= 65%).
  • Visual confirmation via headless browser against a synthetic fixture (manifold generate --users 200 -> analyze -> render). Screenshots: /tmp/manifold-ux-fixes/about.png (version line shows manifold v1.0.0-...), /tmp/manifold-ux-fixes/groups.png (all six cards show HEALTH IMPACT incl. the "Connect to review and CI workflows" card at +0), /tmp/manifold-ux-fixes/gaps.png (doc links present; DOM check confirmed target=_blank and that a row click stays on the dashboard).

Do not merge.

Merge request reports

Loading