Architectural Invariant Design: Kotlin Native and Swift Async/Await Memory & Coroutine Lifecycle Boundary Contract
Kotlin Native and Swift Async/Await Memory & Coroutine Lifecycle Boundary Contract defines an industrial-grade behavioral standard for mobile engineering. Enforces strict lifecycle-aware termination, cooperative cancellation, and ownership boundaries across the Apple ARC and Kotlin/Native Concurrent Garbage Collector (GC) interface. Prevents detached Task retain cycles, uncollected Job reference leaks, and worker thread deadlocks caused by bidirectional reference holding across asynchronous Swift-to-Kotlin bridges. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.
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 Mode | AI Symptom (The Anti-Pattern) | Severity | Production Impact & Remedy |
|---|---|---|---|
| AI Hallucination & Deprecation Drift | Bridging Kotlin Suspend Functions Directly to Swift Tasks Without Cooperative Cancellation and Scope Deallocation Handlers | Critical | 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 Inconsistency | AI 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. |
Step-by-Step Production Directives
Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:
Engineers MUST ALWAYS bridge Kotlin Flows using an explicit `Closeable` or `Disposable` handle that hooks into Swift's `withTaskCancellationHandler` to immediately cancel the underlying Kotlin `Job` upon Swift `Task` deallocation.
Engineers MUST ALWAYS bridge Kotlin Flows using an explicit `Closeable` or `Disposable` handle that hooks into Swift's `withTaskCancellationHandler` to immediately cancel the underlying Kotlin `Job` upon Swift `Task` deallocation.
Engineers MUST NOT expose naked global `CoroutineScope` instances (such as `GlobalScope`) or unbound singletons across the Objective-C/Swift export boundary.
Engineers MUST NOT expose naked global `CoroutineScope` instances (such as `GlobalScope`) or unbound singletons across the Objective-C/Swift export boundary.
Code MUST wrap native Swift closures interacting with long-running Kotlin suspend calls in `[weak self]` or pass decoupled immutable value types to prevent ARC strong reference cycles from escaping into the Kotlin Native heap root sets.
Code MUST wrap native Swift closures interacting with long-running Kotlin suspend calls in `[weak self]` or pass decoupled immutable value types to prevent ARC strong reference cycles from escaping into the Kotlin Native heap root sets.
Services MUST ensure that UI-bound Kotlin `ViewModel` or `Presenter` instances exposed to Swift implement an explicit `clear()` or `onCleared()` method invoked within the SwiftUI `.onDisappear` or UIKit `deinit` hooks.
Services MUST ensure that UI-bound Kotlin `ViewModel` or `Presenter` instances exposed to Swift implement an explicit `clear()` or `onCleared()` method invoked within the SwiftUI `.onDisappear` or UIKit `deinit` hooks.
Components NEVER bridge raw Objective-C completion handlers that capture strong references to Kotlin Coroutine `CancellableContinuation` without invoking completion exactly once during thread teardown, preventing native thread exhaustion.
Components NEVER bridge raw Objective-C completion handlers that capture strong references to Kotlin Coroutine `CancellableContinuation` without invoking completion exactly once during thread teardown, preventing native thread exhaustion.
Frequently Asked Technical Questions
Common questions developers face when configuring AI coding assistants for this stack:
Q:Why is Kotlin Native and Swift Async/Await Memory & Coroutine Lifecycle Boundary Contract critical for AI coding assistants?
Enforces strict lifecycle-aware termination, cooperative cancellation, and ownership boundaries across the Apple ARC and Kotlin/Native Concurrent Garbage Collector (GC) interface. Prevents detached Task retain cycles, uncollected Job reference leaks, and worker thread deadlocks caused by bidirectional reference holding across asynchronous Swift-to-Kotlin bridges. 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 (Bridging Kotlin Suspend Functions Directly to Swift Tasks Without Cooperative Cancellation and Scope Deallocation Handlers) 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.