Architectural Invariant Design: Deterministic 120Hz Surface Sync and Teardown Synchronization in KMP Compose
Deterministic 120Hz Surface Sync and Teardown Synchronization in KMP Compose defines an industrial-grade behavioral standard for mobile engineering. Enforces synchronous lifecycle fencing and atomic frame pacing between Compose Multiplatform render loops and native display surfaces (Android SurfaceView/Choreographer and iOS CAMetalLayer/CADisplayLink). Prevents BufferQueue abandonment, SIGSEGV crashes on invalidated ANativeWindow handles, and CAMetalLayer presentation on detached layers during 120Hz ProMotion transitions. 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 | Asynchronous surface release racing against active frame-pacing threads during composition teardown | 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 implement a synchronous hardware fence in surfaceDestroyed (Android) and viewWillDisappear/deinit (iOS) that joins or halts the render loop BEFORE the native surface is freed by the platform windowing subsystem.
Engineers MUST ALWAYS implement a synchronous hardware fence in surfaceDestroyed (Android) and viewWillDisappear/deinit (iOS) that joins or halts the render loop BEFORE the native surface is freed by the platform windowing subsystem.
Engineers MUST NOT issue GPU commands or enqueue buffer swap requests against an ANativeWindow or CAMetalLayer without first holding a non-blocking read-lock on the surface lifecycle token.
Engineers MUST NOT issue GPU commands or enqueue buffer swap requests against an ANativeWindow or CAMetalLayer without first holding a non-blocking read-lock on the surface lifecycle token.
Code SHOULD dynamically configure CADisplayLink (iOS) with CAFrameRateRange(minimum = 60.0, preferred = 120.0, maximum = 120.0) and link Choreographer.FrameCallback (Android) to the Window's preferredDisplayModeId to maintain variable refresh rate (VRR) alignment.
Code SHOULD dynamically configure CADisplayLink (iOS) with CAFrameRateRange(minimum = 60.0, preferred = 120.0, maximum = 120.0) and link Choreographer.FrameCallback (Android) to the Window's preferredDisplayModeId to maintain variable refresh rate (VRR) alignment.
Services MUST atomically transition the rendering state machine to `TornDown` prior to detaching native surface buffers, rejecting any pending or in-flight composition frames deterministically.
Services MUST atomically transition the rendering state machine to `TornDown` prior to detaching native surface buffers, rejecting any pending or in-flight composition frames deterministically.
Components NEVER execute native buffer swaps or call eglSwapBuffers/commitCommandBuffer inside asynchronous Coroutine dispatchers that lack cancellation coordination with the platform VSYNC callback.
Components NEVER execute native buffer swaps or call eglSwapBuffers/commitCommandBuffer inside asynchronous Coroutine dispatchers that lack cancellation coordination with the platform VSYNC callback.
Frequently Asked Technical Questions
Common questions developers face when configuring AI coding assistants for this stack:
Q:Why is Deterministic 120Hz Surface Sync and Teardown Synchronization in KMP Compose critical for AI coding assistants?
Enforces synchronous lifecycle fencing and atomic frame pacing between Compose Multiplatform render loops and native display surfaces (Android SurfaceView/Choreographer and iOS CAMetalLayer/CADisplayLink). Prevents BufferQueue abandonment, SIGSEGV crashes on invalidated ANativeWindow handles, and CAMetalLayer presentation on detached layers during 120Hz ProMotion 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 (Asynchronous surface release racing against active frame-pacing threads during composition teardown) 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.