What problem does it solve? Kotlin Flow offers several hot and cold primitives with different replay, buffering, and synchronous-read semantics, and choosing the wrong one causes dropped events, stale state, leaked sharing coroutines, or fake sentinel values leaking into domain types. This Skill provides concrete decision rules and code patterns for modeling state and one-shot events correctly. ## Core Features & Use Cases - Primitive selection guidance: Decision table mapping requirements (synchronous .value reads, fan-out, exactly-once delivery) to StateFlow, SharedFlow, Channel.receiveAsFlow, or plain Flow. - Common bug detection: Identifies anti-patterns such as stateIn() called inside functions, WhileSubscribed combined with synchronous .value reads, non-atomic read/modify/write on MutableStateFlow, and sentinel initial values like NoUser. - Code review support: Red-flag tables and before/after Kotlin snippets for reviewing Flow-based ViewModel and repository code. - Use Case: While reviewing an Android ViewModel, you notice navigation events emitted through a default MutableSharedFlow are occasionally lost; the Skill explains why and shows the Channel(BUFFERED).receiveAsFlow() alternative. ## Quick Start Ask the assistant to review your Kotlin ViewModel's StateFlow and SharedFlow usage for correctness using this skill.