perf: stop rebuilding per-frame work that nothing is reading

Three costs scaled with the whole document on every frame, whether or
not anything had changed.

The accessibility tree was walked, cloned into a fragment and assembled
into a TreeUpdate before update_if_active decided whether an assistive
technology was listening. The runner now tracks activation from the
accesskit events it already receives and tells the context, so a session
with no screen reader attached never builds the tree at all.

Test ids were republished every frame, allocating a String per id, for
a map only the test harnesses read. The real app turns them off.

end_frame compared the entire shape list against the previous frame and
deep-cloned it to keep the comparison going. The shape list is now
shared by Rc instead of cloned, and a frame that reported no damage is
known to have painted the same shapes, so the comparison is skipped
outright. A debug assertion keeps that invariant honest.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017FqS3Cpn9uRcrCwAABBq2p
b00ef680cdClaude committed on 9/20/2026, 1:42:57 AM· committed by pfgparentd1a067a
3 files changedLine totals unavailable