What problem does it solve? Kotlin developers frequently misuse Flow primitives: SharedFlow events get silently dropped, StateFlow gets polluted with fake sentinel values like NoUser, stateIn() leaks sharing coroutines when called inside functions, and WhileSubscribed serves stale .value reads. This Skill provides concrete decision rules and code patterns to pick the right primitive and avoid these bugs. ## Core Features & Use Cases - Primitive selection guidance: Decision table mapping requirements (replay, fan-out, synchronous .value reads) to StateFlow, SharedFlow, Channel.receiveAsFlow(), or cold Flow. - Common bug detection: Identifies anti-patterns such as sentinel initial values, stateIn() inside functions, non-atomic read/modify/write on MutableStateFlow, and expensive work inside update { } blocks. - Use Case: While reviewing a ViewModel, you notice MutableSharedFlow used for navigation events and _state.value = _state.value.copy(...) mutations. The Skill flags the lossy event stream and non-atomic update, then shows the Channel(BUFFERED).receiveAsFlow() and update { } replacements. ## Quick Start Review this ViewModel's StateFlow and SharedFlow usage and tell me whether the event and state primitives are modeled correctly.