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-carda 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 staticregenerated 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): fulld.labelrender, no substring/substr/slice on the label, label-x clamp present.TestRender_DomainBoxplotZeroMarker(S3): theboxplot-zero-markeris emitted, gated on a near-zero spread, nudged on-canvas.
Coordinator does the visual verification; no browser was run here.