Efficiency gate: the shared ResizeObserver already delivers one batched callback per frame
per handler, and RO timing is exactly where layout is clean and the composer's
getBoundingClientRect reads are free. Deferring them to the next rAF made them forced reflows
whenever the DOM changed between frames and delayed the first --composer-height publish by a
frame on every mount. use-composer-metrics and lib/raf-coalesce return to main.