What problem does it solve? Deciding where state should live in a Compose component tree is a common source of untestable, hard-to-preview composables. This Skill provides clear rules for state hoisting in Compose Multiplatform so state ends up at the right level — not buried in leaf composables and not bloating ViewModels with ephemeral UI state. ## Core Features & Use Cases - Hoist-Until-Shared Rule: Move state to the lowest common ancestor of all consumers, with concrete examples for local, sibling-shared, and ViewModel-level state. - Controlled Component Pattern: Build stateless composables using the value + onValueChange contract so parents can validate, transform, and reset values. - Performance Guidance: Apply derivedStateOf for memoized derived state and @Stable/@Immutable annotations to enable recomposition skipping. - Use Case: You have a SearchBar composable with internal state that siblings also need. Apply the hoisting rule to lift the query state to the parent, making SearchBar stateless, previewable, and unit-testable without a ViewModel. ## Quick Start Ask the agent to refactor a stateful composable into a stateless one by hoisting its state to the appropriate ancestor.