From PR #111 review (Low, unreachable on current code): lib/mob/sender.ex:187-197 and :221-223 — activate_frame replaces the gate, but the legacy activate/2 call and test-only set_active/1 clear reserved_transition while leaving activation_gate intact. During a hot-code DOWNGRADE mid-navigation a stranded gate would silently drop that ref's future untokened renders (frozen screen until the next activate_frame). One-line fix: reset activation_gate: nil in both handlers. Also from the same review, doc nits to fold in: add Mob.Test.switch_tab/3 to guides/testing.md's navigation-helper list; restore a reworded MOB-115 known-gap note to navigation.md (scope: :stack still does not re-derive the destination's stack — only scope: :all does); consider accepting explicit transition: :none on switch_tab/3 since it's the documented default; component_server could stop with :shutdown instead of the dead screen's exit reason to cut crash-report noise.
From PR #111 review (Low, unreachable on current code): lib/mob/sender.ex:187-197 and :221-223 — activate_frame replaces the gate, but the legacy activate/2 call and test-only set_active/1 clear reserved_transition while leaving activation_gate intact. During a hot-code DOWNGRADE mid-navigation a stranded gate would silently drop that ref's future untokened renders (frozen screen until the next activate_frame). One-line fix: reset activation_gate: nil in both handlers. Also from the same review, doc nits to fold in: add Mob.Test.switch_tab/3 to guides/testing.md's navigation-helper list; restore a reworded MOB-115 known-gap note to navigation.md (scope: :stack still does not re-derive the destination's stack — only scope: :all does); consider accepting explicit transition: :none on switch_tab/3 since it's the documented default; component_server could stop with :shutdown instead of the dead screen's exit reason to cut crash-report noise.