This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
mobilecritical PriorityID: kmp-ktor-connection-pooling-tls-resumption

KMP Ktor Idle Connection Eviction & TLS 1.3 Session Resumption Guardrail

Enforces deterministic idle socket pool eviction and platform-specific TLS 1.3 session ticket persistence across Android (OkHttp) and iOS (Darwin) Ktor engines. Prevents mobile baseband radio wakelocks (RRC state thrashing) and eliminates redundant cryptographic handshakes on mobile radio transitions.

Prohibited Anti-Pattern: Ephemeral HttpClient instantiation with unbounded idle connection keep-alives and disabled TLS session caching

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: KMP Ktor Idle Connection Eviction & TLS 1.3 Session Resumption Guardrail - Enforces deterministic idle socket pool eviction and platform-specific TLS 1.3 session ticket persistence across Android (OkHttp) and iOS (Darwin) Ktor engines. Prevents mobile baseband radio wakelocks (RRC state thrashing) and eliminates redundant cryptographic handshakes on mobile radio transitions.
globs: **/commonMain/**/*.kt, **/androidMain/**/*.kt, **/iosMain/**/*.kt
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/kmp-ktor-connection-pooling-tls-resumption"
---

# KMP Ktor Idle Connection Eviction & TLS 1.3 Session Resumption Guardrail

> **Severity**: CRITICAL | **Category**: mobile
> **Anti-Pattern Warning**: Ephemeral HttpClient instantiation with unbounded idle connection keep-alives and disabled TLS session caching

## System Constraints
You are a Principal Mobile Network Architect enforcing deterministic socket lifecycle and TLS session management in Kotlin Multiplatform (KMP) applications using Ktor. Unbounded idle socket pools prevent mobile baseband radios from transitioning to low-power RRC IDLE state, degrading battery life and causing radio resource control battery drains. You must mandate strict engine-specific socket pool timeouts, proactive background connection purging, and persistent TLS 1.3 session ticket sharing across both OkHttp and Darwin engines.

## Strict Guidelines
- Engineers MUST ALWAYS instantiate HttpClient as a persistent singleton managed via DI (e.g., Koin, Kotlin Inject) and NEVER instantiate ephemeral clients per request.
- Engineers MUST configure Darwin engine NSURLSessionConfiguration with shared URLCache and TLS minimum protocol version TLSv13 with session resumption tickets enabled.
- Engineers MUST configure OkHttp engine with an explicit ConnectionPool restricting idle connections (max 5) and keep-alive duration to at most 15-30 seconds on mobile cellular networks.
- Engineers MUST hook app lifecycle events to proactively evict idle connections (e.g., OkHttpClient.connectionPool.evictAll()) when the application transitions to background.
- Engineers MUST NOT allow default unbounded keep-alive timeouts or default engine configurations that omit socket pool limits.
- Engineers MUST ensure pre-emptive connection timeouts (connect: 10s, socket/read: 15s) via HttpTimeout plugin to avoid prolonged cellular channel retention.

## Bad vs Good Implementations
### Configuring Unified Ktor Factory with Idle Eviction & TLS 1.3 Caching

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Creating ephemeral HttpClient instances forfeits connection pooling, creates orphaned sockets keeping the cellular baseband in high-power DCH/RRC state, and forces a full TLS handshake (2-RTT) on every request.
```kotlin
// ANTI-PATTERN: Ad-hoc client instantiation without engine connection pooling or TLS session management
class NetworkService {
    suspend fun fetchData(): String {
        // Spawns a new engine per request, creating unbounded socket leaks and continuous full TLS handshakes
        val client = HttpClient()
        val response = client.get("https://api.example.com/data")
        client.close()
        return response.bodyAsText()
    }
}
```

#### Production Standard (Correct)
> **Standard**: A singleton HttpClient utilizes platform-tailored connection pools: OkHttp bounds idle connections to 30s to permit baseband spin-down, and Darwin leverages shared session configurations preserving TLS 1.3 resumption tokens.
```kotlin
// PRODUCTION INVARIANT: Singleton client with platform engine pooling, short keep-alives, and TLS 1.3 session tickets
// commonMain
expect fun createPlatformEngine(): HttpClientEngineFactory<*>

val AppHttpClient: HttpClient by lazy {
    HttpClient(createPlatformEngine()) {
        install(HttpTimeout) {
            connectTimeoutMillis = 10_000
            requestTimeoutMillis = 15_000
            socketTimeoutMillis = 15_000
        }
    }
}

// androidMain
actual fun createPlatformEngine(): HttpClientEngineFactory<*> = OkHttp.config {
    config {
        connectionPool(okhttp3.ConnectionPool(5, 30, java.util.concurrent.TimeUnit.SECONDS))
        retryOnConnectionFailure(true)
    }
}

// iosMain
actual fun createPlatformEngine(): HttpClientEngineFactory<*> = Darwin.config {
    configureRequest {
        setAllowsCellularAccess(true)
    }
    configureSession {
        timeoutIntervalForResource = 30.0
        timeoutIntervalForRequest = 15.0
        // Shared session configuration retains TLS 1.3 session tickets across requests
        URLCache.sharedURLCache = URLCache(memoryCapacity = 4 * 1024 * 1024, diskCapacity = 20 * 1024 * 1024, diskPath = "ktor_tls_cache")
    }
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: KMP Ktor Idle Connection Eviction & TLS 1.3 Session Resumption Guardrail

KMP Ktor Idle Connection Eviction & TLS 1.3 Session Resumption Guardrail defines an industrial-grade behavioral standard for mobile engineering. Enforces deterministic idle socket pool eviction and platform-specific TLS 1.3 session ticket persistence across Android (OkHttp) and iOS (Darwin) Ktor engines. Prevents mobile baseband radio wakelocks (RRC state thrashing) and eliminates redundant cryptographic handshakes on mobile radio transitions. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Ephemeral HttpClient instantiation with unbounded idle connection keep-alives and disabled TLS session caching Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftEphemeral HttpClient instantiation with unbounded idle connection keep-alives and disabled TLS session cachingCritical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS instantiate HttpClient as a persistent singleton managed via DI (e.g., Koin, Kotlin Inject) and NEVER instantiate ephemeral clients per request.

Engineers MUST ALWAYS instantiate HttpClient as a persistent singleton managed via DI (e.g., Koin, Kotlin Inject) and NEVER instantiate ephemeral clients per request.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST configure Darwin engine NSURLSessionConfiguration with shared URLCache and TLS minimum protocol version TLSv13 with session resumption tickets enabled.

Engineers MUST configure Darwin engine NSURLSessionConfiguration with shared URLCache and TLS minimum protocol version TLSv13 with session resumption tickets enabled.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Engineers MUST configure OkHttp engine with an explicit ConnectionPool restricting idle connections (max 5) and keep-alive duration to at most 15-30 seconds on mobile cellular networks.

Engineers MUST configure OkHttp engine with an explicit ConnectionPool restricting idle connections (max 5) and keep-alive duration to at most 15-30 seconds on mobile cellular networks.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Engineers MUST hook app lifecycle events to proactively evict idle connections (e.g., OkHttpClient.connectionPool.evictAll()) when the application transitions to background.

Engineers MUST hook app lifecycle events to proactively evict idle connections (e.g., OkHttpClient.connectionPool.evictAll()) when the application transitions to background.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Engineers MUST NOT allow default unbounded keep-alive timeouts or default engine configurations that omit socket pool limits.

Engineers MUST NOT allow default unbounded keep-alive timeouts or default engine configurations that omit socket pool limits.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
6

Engineers MUST ensure pre-emptive connection timeouts (connect

Engineers MUST ensure pre-emptive connection timeouts (connect: 10s, socket/read: 15s) via HttpTimeout plugin to avoid prolonged cellular channel retention.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is KMP Ktor Idle Connection Eviction & TLS 1.3 Session Resumption Guardrail critical for AI coding assistants?

Enforces deterministic idle socket pool eviction and platform-specific TLS 1.3 session ticket persistence across Android (OkHttp) and iOS (Darwin) Ktor engines. Prevents mobile baseband radio wakelocks (RRC state thrashing) and eliminates redundant cryptographic handshakes on mobile radio transitions. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Ephemeral HttpClient instantiation with unbounded idle connection keep-alives and disabled TLS session caching) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

Related MOBILE Rules

View all rules →
1 Rule in Stack

KMP