What problem does it solve? Testing Kotlin Flows with flow.toList() hangs forever on hot flows like StateFlow and SharedFlow because they never complete, and raw collection cannot express assertions like "no more events" or "the next event is an error". This Skill teaches how to use Cash App Turbine to assert Flow emissions one at a time with built-in cancellation and timeout handling. ## Core Features & Use Cases - Flow assertion API: Covers flow.test { }, awaitItem, awaitComplete, awaitError, expectMostRecentItem, skipItems, expectNoEvents, and the non-suspending takeItem/takeComplete/takeError variants. - Hot vs cold flow contract: Explains why StateFlow emits its seed value first (replay = 1), why SharedFlow never completes, and why every hot-flow test must end with cancel() or cancelAndIgnoreRemainingEvents(). - Multi-flow and callback testing: Uses turbineScope/testIn for interleaved assertions across multiple flows, and the standalone Turbine<T> channel to verify non-Flow callbacks and listeners. - Use Case: A ViewModel exposes uiState: StateFlow<UiState> and events: SharedFlow<Event>. Use this Skill to write a runTest that asserts the seed state, triggers login(), and verifies the Loading → Success state sequence plus the LoggedIn event without hanging. ## Quick Start Use the testing-flows-with-turbine skill to write a Turbine test that asserts my ViewModel's StateFlow emissions.