What problem does it solve? Kotlin coroutines offer four stream types (Flow, StateFlow, SharedFlow, Channel) with subtle semantic differences, and choosing the wrong one causes dropped events, leaked callbacks, race conditions, and re-consumed one-shot UI events. This Skill audits existing flow code and enforces correct patterns for stream selection, collection, and error handling. ## Core Features & Use Cases - Stream Type Selection: Decision tables for cold vs hot streams, including when Channel(BUFFERED).receiveAsFlow() beats SharedFlow for single-consumer fire-once events like navigation and snackbars. - Pattern Enforcement: Rules for callback bridging (callbackFlow with awaitClose), lifecycle-safe collection (collectAsStateWithLifecycle, repeatOnLifecycle), StateFlow encapsulation, and operator selection (flatMapLatest, combine, stateIn). - Pitfall Detection: Flags common bugs such as swallowed CancellationException, side effects inside combine/map transforms, sentinel initial values, stateIn called inside functions, and manual Job cancellation that flatMapLatest should replace. - Use Case: While refactoring an Android ViewModel, the Skill detects a BroadcastChannel usage, migrates it to SharedFlow, converts a manual searchJob cancellation pattern to flatMapLatest with debounce, and wraps collection in repeatOnLifecycle. ## Quick Start Review my ViewModel's StateFlow and SharedFlow usage and fix any incorrect event handling or collection patterns.