Architectural Invariant Design: KMP Shared StateFlow Darwin Main-Thread Affinity Guardrail
KMP Shared StateFlow Darwin Main-Thread Affinity Guardrail defines an industrial-grade behavioral standard for mobile engineering. Enforces strict main-thread confinement for Kotlin Multiplatform StateFlow emissions bound for Darwin targets. Prevents off-main-thread UI state bridging, race conditions, and purple runtime warnings in SwiftUI and UIKit by requiring explicit dispatcher affinity at the KMP/Native boundary. 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 | Unconfined Coroutine StateFlow Bridging Directly to Darwin UI Surfaces | 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 confine StateFlow emissions bridged to Darwin UI collectors to Dispatchers.Main.immediate within the shared Kotlin domain or view model layer.
Engineers MUST ALWAYS confine StateFlow emissions bridged to Darwin UI collectors to Dispatchers.Main.immediate within the shared Kotlin domain or view model layer.
Engineers MUST NOT expose unconfined SharedFlow or StateFlow instances directly to Darwin callers without SKIE @MainActor annotation or a thread-safe Darwin main-queue adapter.
Engineers MUST NOT expose unconfined SharedFlow or StateFlow instances directly to Darwin callers without SKIE @MainActor annotation or a thread-safe Darwin main-queue adapter.
Shared ViewModels bridging to SwiftUI MUST guarantee that value mutation triggers on iOS occur exclusively on the Main Actor to avoid CoreAnimation hitching and Thread 1 runtime assertion crashes.
Shared ViewModels bridging to SwiftUI MUST guarantee that value mutation triggers on iOS occur exclusively on the Main Actor to avoid CoreAnimation hitching and Thread 1 runtime assertion crashes.
Kotlin side transformations before emission SHOULD execute on Dispatchers.Default, but the terminal StateFlow exposed across the cinterop boundary MUST switch to Dispatchers.Main.immediate via stateIn.
Kotlin side transformations before emission SHOULD execute on Dispatchers.Default, but the terminal StateFlow exposed across the cinterop boundary MUST switch to Dispatchers.Main.immediate via stateIn.
SwiftUI bindings MUST NOT consume raw Kotlin Flows inside detached Tasks or background Swift Concurrency Tasks
SwiftUI bindings MUST NOT consume raw Kotlin Flows inside detached Tasks or background Swift Concurrency Tasks; collectors must be isolated using @MainActor or .task { @MainActor in }.
Frequently Asked Technical Questions
Common questions developers face when configuring AI coding assistants for this stack:
Q:Why is KMP Shared StateFlow Darwin Main-Thread Affinity Guardrail critical for AI coding assistants?
Enforces strict main-thread confinement for Kotlin Multiplatform StateFlow emissions bound for Darwin targets. Prevents off-main-thread UI state bridging, race conditions, and purple runtime warnings in SwiftUI and UIKit by requiring explicit dispatcher affinity at the KMP/Native boundary. 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 (Unconfined Coroutine StateFlow Bridging Directly to Darwin UI Surfaces) 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.