Use when a Kotlin, Android, or Jetpack Compose task is too broad for any single focused skill to obviously apply, especially for general review, refactor, architecture, state, performance, testing, or UI API design work.
| Task signal | Start with |
|---|---|
| Broad Compose screen review or refactor | compose-state-holder-ui-split, then add state, effects, layout, testing, or performance skills as needed |
Local Compose state, bare local var, remember { mutableStateOf(...) }, mutableStateListOf, or @ReadOnlyComposable | compose-state-authoring |
| Deciding whether state belongs locally, hoisted, in a plain state holder, or in a screen state holder | compose-state-hoisting |
| ViewModel, component, controller, navigation, Flow collection, or dependency wiring mixed with UI layout | compose-state-holder-ui-split |
LaunchedEffect, DisposableEffect, SideEffect, rememberCoroutineScope, rememberUpdatedState, navigation, snackbar, analytics, focus requests, or event Flow collection | compose-side-effects |
| Recomposition, jank, compiler reports, Layout Inspector counts, unstable params, scroll reads, animation reads, or back-writing state across phases | compose-recomposition-performance |
Known Compose stability or skippability question, compiler classes.txt / composables.txt, collection parameters, or strong skipping | compose-stability-diagnostics |
| Frame-rate state reads from scroll, animation, gestures, layout, or draw; value-form layout/draw modifiers; measurement state back-writing | compose-state-deferred-reads |
| Modifier parameters, root layout placement, hardcoded layout decisions, or modifier chain style | compose-modifier-and-layout-style |
| Reusable Compose component API with variable visual content, primitive content params, optional content params, or boolean shape flags | compose-slot-api-pattern |
| Compose visibility, value, color, size, transition, content swap, or choosing an animation API | compose-animations |
Keyboard, TV, desktop, D-pad, FocusRequester, focusProperties, key events, or initial focus behavior | compose-focus-navigation |
| Compose UI tests, screenshot tests, previews, semantics, fake image loading, keyboard input, focus assertions, or interaction state tests | compose-ui-testing-patterns |
Coroutine scope ownership, init { launch }, non-suspending APIs that launch work, runBlocking, or cancellation handling | kotlin-coroutines-structured-concurrency |
Kotlin branching, when expressions, guard conditions, sealed type exhaustiveness, smart casts, nullable branching, or complex if/else chains | kotlin-control-flow |
StateFlow, SharedFlow, Channel, stateIn, SharingStarted, .value, one-shot events, sentinel initial values, or expensive update blocks | kotlin-flow-state-event-modeling |
Kotlin Multiplatform platform APIs, source set boundaries, expect/actual, interfaces for platform services, permissions, files, sensors, native SDKs, or Compose Multiplatform interop | kotlin-multiplatform-expect-actual |
Single-field domain types, primitive obsession, or choosing @JvmInline value class vs data class | kotlin-types-value-class |
| Polling or shepherding PRs/MRs, triaging review comments, fixing CI failures, or keeping reviews moving | shepherd |
compose-state-holder-ui-split, compose-side-effects, and, if the event primitive matters, kotlin-flow-state-event-modeling.compose-recomposition-performance. It routes deeper to stability or deferred-read fixes.compose-animations together with compose-state-holder-ui-split; for frame-rate-driven animation values, also load compose-state-deferred-reads.compose-modifier-and-layout-style with compose-slot-api-pattern when both placement and content flexibility are in play.compose-focus-navigation first, then compose-ui-testing-patterns for test shape.kotlin-control-flow.