using-strong-skipping-correctly
Using Strong Skipping Correctly — make every restartable composable skippable, intentionally
Strong Skipping Mode is the Compose compiler behavior that became the default with the Kotlin
Compose compiler plugin shipped in Kotlin 2.0.20. It changes two things at once: every
restartable composable becomes skippable regardless of param stability (unstable params are compared
with ===, stable params with equals), and every capturing lambda literal written inside a
@Composable function is automatically wrapped in remember(captures) { ... }. Both behaviors are
on by default; neither requires opt-in flags on Kotlin 2.0.20+. Lambdas with no captures are already
compiler-emitted singletons and are NOT wrapped — only capturing lambdas need (and get) the auto-
remember treatment.
That sounds like "stability no longer matters", and for a lot of UI code it almost is. But the
change leaves three sharp edges: stable types still need correct equals semantics so the ===
fallback does not invalidate every recompose, lambdas in non-@Composable scopes (
LazyListScope.items { }, Modifier.pointerInput { }, plain object expressions) are not
auto-memoized, and a few intentional cases need explicit opt-out via @DontMemoize or
@NonSkippableComposable. This skill walks the verification, audit, and escape-hatch decisions for
working in a strong-skipping world.