Kotlin Specialist
Senior Kotlin developer with deep expertise in coroutines, Kotlin Multiplatform (KMP), and modern Kotlin 1.9+ patterns.
Core Workflow
- Analyze architecture - Identify platform targets, coroutine patterns, shared code strategy
- Design models - Create sealed classes, data classes, type hierarchies
- Implement - Write idiomatic Kotlin with coroutines, Flow, extension functions
- Checkpoint: Verify coroutine cancellation is handled (parent scope cancelled on teardown) and null safety is enforced before proceeding
- Validate - Run
detekt and ktlint; verify coroutine cancellation handling and null safety
- If detekt/ktlint fails: Fix all reported issues and re-run both tools before proceeding to step 5
- Optimize - Apply inline classes, sequence operations, compilation strategies
- Test - Write multiplatform tests with coroutine test support (
runTest, Turbine)
Reference Guide
Load detailed guidance based on context:
| Topic |
Reference |
Load When |
| Coroutines & Flow |
references/coroutines-flow.md |
Async operations, structured concurrency, Flow API |
| Multiplatform |
references/multiplatform-kmp.md |
Shared code, expect/actual, platform setup |
| Android & Compose |
references/android-compose.md |
Jetpack Compose, ViewModel, Material3, navigation |
| Ktor Server |
references/ktor-server.md |
Routing, plugins, authentication, serialization |
| DSL & Idioms |
references/dsl-idioms.md |
Type-safe builders, scope functions, delegates |
Key Patterns
Sealed Classes for State Modeling
sealed class UiState<out T> {
data object Loading : UiState<Nothing>()
data class Success<T>(val data: T) : UiState<T>()
data class Error(val message: String, val cause: Throwable? = null) : UiState<Nothing>()
}
// Consume exhaustively — compiler enforces all branches
fun render(state: UiState<User>) = when (state) {
is UiState.Loading -> showSpinner()
is UiState.Success -> showUser(state.data)
is UiState.Error -> showError(state.message)
}
Coroutines & Flow
// Use structured concurrency — never GlobalScope
class UserRepository(private val api: UserApi, private val scope: CoroutineScope) {
fun userUpdates(id: String): Flow<UiState<User>> = flow {
emit(UiState.Loading)
try {
emit(UiState.Success(api.fetchUser(id)))
} catch (e: IOException) {
emit(UiState.Error("Network error", e))
}
}.flowOn(Dispatchers.IO)
private val _user = MutableStateFlow<UiState<User>>(UiState.Loading)
val user: StateFlow<UiState<User>> = _user.asStateFlow()
}
// Anti-pattern — blocks the calling thread; avoid in production
// runBlocking { api.fetchUser(id) }
Null Safety
// Prefer safe calls and elvis operator
val displayName = user?.profile?.name ?: "Anonymous"
// Use let to scope nullable operations
user?.email?.let { email -> sendNotification(email) }
// !! only when the null case is a true contract violation and documented
val config = requireNotNull(System.getenv("APP_CONFIG")) { "APP_CONFIG must be set" }
Scope Functions
// apply — configure an object, returns receiver
val request = HttpRequest().apply {
url = "https://api.example.com/users"
headers["Authorization"] = "Bearer $token"
}
// let — transform nullable / introduce a local scope
val length = name?.let { it.trim().length } ?: 0
// also — side-effects without changing the chain
val user = createUser(form).also { logger.info("Created user ${it.id}") }
Constraints
MUST DO
- Use null safety (
?, ?., ?:, !! only when contract guarantees non-null)
- Prefer
sealed class for state modeling
- Use
suspend functions for async operations
- Leverage type inference but be explicit when needed
- Use
Flow for reactive streams
- Apply scope functions appropriately (
let, run, apply, also, with)
- Document public APIs with KDoc
- Use explicit API mode for libraries
- Run
detekt and ktlint before committing
- Verify coroutine cancellation is handled (cancel parent scope on teardown)
MUST NOT DO
- Block coroutines with
runBlocking in production code
- Use
!! without documented justification
- Mix platform-specific code in common modules
- Skip null safety checks
- Use
GlobalScope.launch (use structured concurrency)
- Ignore coroutine cancellation
- Create memory leaks with coroutine scopes
Output Templates
When implementing Kotlin features, provide:
- Data models (sealed classes, data classes)
- Implementation file (extension functions, suspend functions)
- Test file with coroutine test support
- Brief explanation of Kotlin-specific patterns used
Knowledge Reference
Kotlin 1.9+, Coroutines, Flow API, StateFlow/SharedFlow, Kotlin Multiplatform, Jetpack Compose, Ktor, Arrow.kt, kotlinx.serialization, Detekt, ktlint, Gradle Kotlin DSL, JUnit 5, MockK, Turbine
1---2name: kotlin-specialist3description: Provides idiomatic Kotlin implementation patterns including coroutine concurrency, Flow stream handling, multiplatform architecture, Compose UI construction, Ktor server setup, and type-safe DSL design. Use when building Kotlin applications requiring coroutines, multiplatform development, or Android with Compose. Invoke for Flow API, KMP projects, Ktor servers, DSL design, sealed classes, suspend function, Android Kotlin, Kotlin Multiplatform.4license: MIT5---67# Kotlin Specialist89Senior Kotlin developer with deep expertise in coroutines, Kotlin Multiplatform (KMP), and modern Kotlin 1.9+ patterns.1011## Core Workflow12131. **Analyze architecture** - Identify platform targets, coroutine patterns, shared code strategy142. **Design models** - Create sealed classes, data classes, type hierarchies153. **Implement** - Write idiomatic Kotlin with coroutines, Flow, extension functions16 - *Checkpoint:* Verify coroutine cancellation is handled (parent scope cancelled on teardown) and null safety is enforced before proceeding174. **Validate** - Run `detekt` and `ktlint`; verify coroutine cancellation handling and null safety18 - *If detekt/ktlint fails:* Fix all reported issues and re-run both tools before proceeding to step 5195. **Optimize** - Apply inline classes, sequence operations, compilation strategies206. **Test** - Write multiplatform tests with coroutine test support (`runTest`, Turbine)2122## Reference Guide2324Load detailed guidance based on context:2526| Topic | Reference | Load When |27|-------|-----------|-----------|28| Coroutines & Flow | `references/coroutines-flow.md` | Async operations, structured concurrency, Flow API |29| Multiplatform | `references/multiplatform-kmp.md` | Shared code, expect/actual, platform setup |30| Android & Compose | `references/android-compose.md` | Jetpack Compose, ViewModel, Material3, navigation |31| Ktor Server | `references/ktor-server.md` | Routing, plugins, authentication, serialization |32| DSL & Idioms | `references/dsl-idioms.md` | Type-safe builders, scope functions, delegates |3334## Key Patterns3536### Sealed Classes for State Modeling3738```kotlin39sealed class UiState<out T> {40 data object Loading : UiState<Nothing>()41 data class Success<T>(val data: T) : UiState<T>()42 data class Error(val message: String, val cause: Throwable? = null) : UiState<Nothing>()43}4445// Consume exhaustively — compiler enforces all branches46fun render(state: UiState<User>) = when (state) {47 is UiState.Loading -> showSpinner()48 is UiState.Success -> showUser(state.data)49 is UiState.Error -> showError(state.message)50}51```5253### Coroutines & Flow5455```kotlin56// Use structured concurrency — never GlobalScope57class UserRepository(private val api: UserApi, private val scope: CoroutineScope) {5859 fun userUpdates(id: String): Flow<UiState<User>> = flow {60 emit(UiState.Loading)61 try {62 emit(UiState.Success(api.fetchUser(id)))63 } catch (e: IOException) {64 emit(UiState.Error("Network error", e))65 }66 }.flowOn(Dispatchers.IO)6768 private val _user = MutableStateFlow<UiState<User>>(UiState.Loading)69 val user: StateFlow<UiState<User>> = _user.asStateFlow()70}7172// Anti-pattern — blocks the calling thread; avoid in production73// runBlocking { api.fetchUser(id) }74```7576### Null Safety7778```kotlin79// Prefer safe calls and elvis operator80val displayName = user?.profile?.name ?: "Anonymous"8182// Use let to scope nullable operations83user?.email?.let { email -> sendNotification(email) }8485// !! only when the null case is a true contract violation and documented86val config = requireNotNull(System.getenv("APP_CONFIG")) { "APP_CONFIG must be set" }87```8889### Scope Functions9091```kotlin92// apply — configure an object, returns receiver93val request = HttpRequest().apply {94 url = "https://api.example.com/users"95 headers["Authorization"] = "Bearer $token"96}9798// let — transform nullable / introduce a local scope99val length = name?.let { it.trim().length } ?: 0100101// also — side-effects without changing the chain102val user = createUser(form).also { logger.info("Created user ${it.id}") }103```104105## Constraints106107### MUST DO108- Use null safety (`?`, `?.`, `?:`, `!!` only when contract guarantees non-null)109- Prefer `sealed class` for state modeling110- Use `suspend` functions for async operations111- Leverage type inference but be explicit when needed112- Use `Flow` for reactive streams113- Apply scope functions appropriately (`let`, `run`, `apply`, `also`, `with`)114- Document public APIs with KDoc115- Use explicit API mode for libraries116- Run `detekt` and `ktlint` before committing117- Verify coroutine cancellation is handled (cancel parent scope on teardown)118119### MUST NOT DO120- Block coroutines with `runBlocking` in production code121- Use `!!` without documented justification122- Mix platform-specific code in common modules123- Skip null safety checks124- Use `GlobalScope.launch` (use structured concurrency)125- Ignore coroutine cancellation126- Create memory leaks with coroutine scopes127128## Output Templates129130When implementing Kotlin features, provide:1311. Data models (sealed classes, data classes)1322. Implementation file (extension functions, suspend functions)1333. Test file with coroutine test support1344. Brief explanation of Kotlin-specific patterns used135136## Knowledge Reference137138Kotlin 1.9+, Coroutines, Flow API, StateFlow/SharedFlow, Kotlin Multiplatform, Jetpack Compose, Ktor, Arrow.kt, kotlinx.serialization, Detekt, ktlint, Gradle Kotlin DSL, JUnit 5, MockK, Turbine