.agents/skills/studio-perf/SKILL.md
Keep dependencies on the current frame as low in the component tree as possible.
Prefer imperative timeline state reads such as getCurrentFrame() over
Internals.Timeline.useTimelinePosition() for event handlers and other
on-demand logic.
Use useTimelinePosition() only in the smallest leaf component whose rendered
output must change with the frame. If a parent reads the frame only to pass it
to a child, extract a frame-subscribing child so the parent and its other
descendants stay stable.
Wrap components in React.memo() when they can safely skip parent-driven
renders. Confirm that their props remain referentially stable across frame
updates: newly created objects, callbacks, styles, or React nodes defeat shallow
memoization. Stabilize those props only where it is natural; avoid custom
comparators that ignore behaviorally relevant changes.
Context subscribers continue to update through memoized ancestors. Prefer a memoized stable parent with a small frame-subscribing leaf over making the whole subtree reactive to the current frame.