Skip to content

E2E health sweep — MessageFlow halo stability, lint, and local web launcher

Motivation

A large code update (MessageFlow constellation, energy particles, BLAST failure detail surfacing, auto-warmup toast, CI serialization) landed across backend, frontend, and dev tooling. A full local-safe validation sweep was run to confirm overall health and fix anything red.

The sweep surfaced three real defects (one user-visible, two developer-facing).

User-facing change

  • MessageFlow constellation — running/reducing job nodes are now click-stable. The breathing halo (.mf-halo) around an in-flight job previously animated transform: scale(1 → 1.35). Because the halo is a child of the interactive .mf-node <g>, the group's bounding box resized on every animation frame, so the job node was never geometrically "stable" — pointer actionability (e.g. Playwright clicks) timed out and the live hit region subtly reflowed. The pulse now animates opacity only (0.08 → 0.32), keeping the halo's geometry fixed. The breathing energy still reads, and prefers-reduced-motion already fell back to a static opacity, so that path is unchanged.

Developer-facing changes

  • useStickToBottom eslint gate fixed. A recent edit added an isFollowing() call inside a useEffect keyed only on [enabled], producing a react-hooks/exhaustive-deps warning that failed eslint --max-warnings 0. Fixed by reading the latest isFollowing through a ref (isFollowingRef), matching the file's existing requestScrollRef pattern — no re-subscription, no behaviour change.
  • Local web launcher no longer hangs on azd. scripts/dev/local-run.sh web called azd env get-values without the timeout / `