c8b5acf6f0
The headless viewer suite covered only the DOT half (normalizeModel/ genDot); the tooltip half — INFO.B (collapsed), INFO.C (expanded cluster), INFO.P (ports), and md()'s markdown-to-HTML step — was asserted by no test. viewer_tooltip.mjs pins the current shapes; graph-viewer.js only hoists md() above the browser guard and exports it (location-only move, no behaviour change), so the pin can drive the real conversion headlessly. Surfaced by the grounding-check on the #125 composite-doc spec: its viewer assumptions had no current-behaviour pin. refs #125