fix(dashboard): UX polish pass 3 for the stakeholder demo

Final cosmetic cleanup for the stakeholder demo. Adoption and Trends only.

Per item

  • S1 (fixed) Archetype Relationships force-graph node labels truncated ("Solo Contrib"). The label render already emits the full name with no substring; the clip came from the centered text overflowing the SVG edge when a node clamped near a side. Now each label's x is clamped to its half-width on the force tick so the full name stays inside the chart, and the font is reduced to 9.5px. src/03-adoption.js.
  • S2 (fixed) Isolated node (Dormant Expert, no shared-team edges) drifted to a corner and left a large empty gap. The chart already clamped node positions to bounds; the gap came from the weak centering pull letting the node rest against a bound. Increased forceX/forceY strength 0.06 to 0.12 so disconnected nodes settle nearer the cluster. The link force still governs the connected cluster. src/03-adoption.js.
  • S3 (fixed) Domain Score Distribution boxplot, Security row near-invisible at ~0%. Verified: when the whole distribution sits at 0% the box, whiskers, and median line stack on the left axis and partly clip, so the row reads as blank. Added a small minimum-visible dot (gated on a near-zero whisker span, nudged fully on-canvas) so the row reads as "0%, present". src/04-gaps.js.
  • S4 (fixed, minor) Trends empty-state whitespace. Verified: the no-data card is top-anchored, leaving a large dead band below (same pattern as the Teams empty state). Gave .empty-state-card a min-height and vertically centered its content, which improves both the Trends and Teams empty states. assets/style.css.

Out of scope (left untouched): the About pipeline banner jump-links enhancement; anything outside Adoption + Trends.

Validation

  • make static regenerated the bundle (assets/app.src.js).
  • make check (go vet + no-race test): pass.
  • CGO_ENABLED=1 go test -race ./...: pass.
  • golangci-lint run: 0 issues.
  • Coverage: 69.9% (threshold 65%).

Tests

Two structural regression tests in internal/renderer/render_test.go, both fail on the pre-fix bundle:

  • TestRender_ArchetypeNetworkLabelsNotTruncated (S1): full d.label render, no substring/substr/slice on the label, label-x clamp present.
  • TestRender_DomainBoxplotZeroMarker (S3): the boxplot-zero-marker is emitted, gated on a near-zero spread, nudged on-canvas.

Coordinator does the visual verification; no browser was run here.

🤖 Generated with Claude Code

Merge request reports

Loading