This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
mobilecritical PriorityID: kmp-zero-copy-pinned-buffer-invariant

KMP Zero-Copy Direct Pinned Buffer Invariant for High-Throughput Streams

Enforces deterministic zero-copy memory transfers between native C/POSIX/Apple APIs and Kotlin Multiplatform runtimes without triggering garbage collection pressure or cross-heap allocations. Mandates scoped memory pinning using `usePinned` or direct non-managed arena buffers for high-frequency media and sensor streaming. Prohibits converting native byte buffers into intermediary managed `ByteArray` instances within tight processing loops.

Prohibited Anti-Pattern: Intermediary Managed ByteArray Allocations in High-Frequency C-Interop Pipelines

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: KMP Zero-Copy Direct Pinned Buffer Invariant for High-Throughput Streams - Enforces deterministic zero-copy memory transfers between native C/POSIX/Apple APIs and Kotlin Multiplatform runtimes without triggering garbage collection pressure or cross-heap allocations. Mandates scoped memory pinning using `usePinned` or direct non-managed arena buffers for high-frequency media and sensor streaming. Prohibits converting native byte buffers into intermediary managed `ByteArray` instances within tight processing loops.
globs: **/src/nativeMain/**/*.kt, **/src/appleMain/**/*.kt, **/src/posixMain/**/*.kt, **/src/commonMain/**/*Native*.kt, **/cinterop/**/*.def
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/kmp-zero-copy-pinned-buffer-invariant"
---

# KMP Zero-Copy Direct Pinned Buffer Invariant for High-Throughput Streams

> **Severity**: CRITICAL | **Category**: mobile
> **Anti-Pattern Warning**: Intermediary Managed ByteArray Allocations in High-Frequency C-Interop Pipelines

## System Constraints
You are a Principal Mobile Architect specializing in Kotlin Multiplatform (KMP) native runtimes, POSIX interop, and native memory management. Enforce strict zero-copy and pinned buffer invariants when bridging native C/Darwin platform APIs with Kotlin. Every high-throughput sensor or media processing pipeline must eliminate dynamic managed allocations in favor of direct pinned buffers (`usePinned`), direct arena allocations, or shared unmanaged buffers.

## Strict Guidelines
- Engineers MUST ALWAYS scope access to managed byte arrays passed to native C functions via `ByteArray.usePinned { pinned -> ... }` to guarantee stable physical memory addresses without copying.
- Engineers MUST NOT convert native pointers (`CPointer<ByteVar>`) to managed Kotlin byte arrays (`readBytes()`) in streaming, per-frame, or high-frequency sensor loops.
- Engineers MUST pass direct C pointers (`pinned.addressOf(0)`) or wrap native buffers with non-allocating abstractions (such as custom zero-copy direct buffer view interfaces) when interacting with C-interop APIs.
- Engineers MUST explicitly manage life-cycles of off-heap buffers using `memScoped` or unmanaged `nativeHeap.allocArray` paired with deterministic deallocation in a `try-finally` block for buffers living beyond single lexical scopes.
- Components NEVER hold long-term references to `Pinned<T>` beyond the immediate execution block; unpinning MUST occur deterministically to avoid pinning down the Kotlin/Native GC compaction passes.

## Bad vs Good Implementations
### High-Throughput Native Audio/Sensor Ingestion Pipeline

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Calling `readBytes(length)` performs a heap-allocated memory copy from native memory to the Kotlin/Native GC-managed heap on every invocation. At high frame rates (e.g., 60-120 FPS camera frames or 48kHz audio buffers), this floods the native GC with transient allocations, spiking memory pressure and triggering compaction pauses.
```kotlin
import kotlinx.cinterop.*

// ANTI-PATTERN: Copies unmanaged C buffer to managed Kotlin heap on every frame
fun processSensorFrame(nativeBuffer: CPointer<ByteVar>, length: Int) {
    // Allocates a brand new managed ByteArray on every incoming sample/frame!
    // Induces severe GC pauses and throughput degradation at 60Hz-120Hz/Audio rates.
    val heapArray = nativeBuffer.readBytes(length)
    dispatchToProcessors(heapArray)
}

fun dispatchToProcessors(data: ByteArray) {
    // Consuming data as managed array
}
```

#### Production Standard (Correct)
> **Standard**: Encapsulates native memory inside a direct non-copying view interface (`DirectBufferView`) allowing zero-overhead reads from the unmanaged C pointer. When writing to native sinks from managed memory, `usePinned` fixes the memory address deterministically with scoped unpinning, ensuring zero transient allocations and zero GC pressure.
```kotlin
import kotlinx.cinterop.*

interface DirectBufferView {
    val pointer: CPointer<ByteVar>
    val length: Int
    fun get(index: Int): Byte = pointer[index]
}

class NativeDirectBufferView(
    override val pointer: CPointer<ByteVar>,
    override val length: Int
) : DirectBufferView

// PRODUCTION FIX: Zero-copy direct pointer encapsulation and scoped pinned writing
fun processSensorFrame(nativeBuffer: CPointer<ByteVar>, length: Int) {
    // Zero-allocation: Pass direct buffer view without heap copying
    val bufferView = NativeDirectBufferView(nativeBuffer, length)
    dispatchZeroCopy(bufferView)
}

fun dispatchZeroCopy(view: DirectBufferView) {
    // Direct pointer operations without intermediate copies
}

// For scenarios requiring native calls from pre-allocated Kotlin ByteArrays:
fun transmitSampleData(preallocatedBuffer: ByteArray, targetOffset: Int, targetLength: Int, nativeSink: CPointer<ByteVar>) {
    // Fix native memory address deterministically during C write without GC relocation
    preallocatedBuffer.usePinned { pinned ->
        val rawSourcePointer: CPointer<ByteVar> = pinned.addressOf(targetOffset)
        platform.posix.memcpy(nativeSink, rawSourcePointer, targetLength.convert())
    }
}
```

Recommended Agent Skills (askills.dev)

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

Architectural Specification & Invariant Rationale

Architectural Invariant Design: KMP Zero-Copy Direct Pinned Buffer Invariant for High-Throughput Streams

KMP Zero-Copy Direct Pinned Buffer Invariant for High-Throughput Streams defines an industrial-grade behavioral standard for mobile engineering. Enforces deterministic zero-copy memory transfers between native C/POSIX/Apple APIs and Kotlin Multiplatform runtimes without triggering garbage collection pressure or cross-heap allocations. Mandates scoped memory pinning using `usePinned` or direct non-managed arena buffers for high-frequency media and sensor streaming. Prohibits converting native byte buffers into intermediary managed `ByteArray` instances within tight processing loops. 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: Intermediary Managed ByteArray Allocations in High-Frequency C-Interop Pipelines 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 DriftIntermediary Managed ByteArray Allocations in High-Frequency C-Interop PipelinesCritical
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 scope access to managed byte arrays passed to native C functions via `ByteArray.usePinned { pinned -> ... }` to guarantee stable physical memory addresses without copying.

Engineers MUST ALWAYS scope access to managed byte arrays passed to native C functions via `ByteArray.usePinned { pinned -> ... }` to guarantee stable physical memory addresses without copying.

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 NOT convert native pointers (`CPointer<ByteVar>`) to managed Kotlin byte arrays (`readBytes()`) in streaming, per-frame, or high-frequency sensor loops.

Engineers MUST NOT convert native pointers (`CPointer<ByteVar>`) to managed Kotlin byte arrays (`readBytes()`) in streaming, per-frame, or high-frequency sensor loops.

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 pass direct C pointers (`pinned.addressOf(0)`) or wrap native buffers with non-allocating abstractions (such as custom zero-copy direct buffer view interfaces) when interacting with C-interop APIs.

Engineers MUST pass direct C pointers (`pinned.addressOf(0)`) or wrap native buffers with non-allocating abstractions (such as custom zero-copy direct buffer view interfaces) when interacting with C-interop APIs.

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 explicitly manage life-cycles of off-heap buffers using `memScoped` or unmanaged `nativeHeap.allocArray` paired with deterministic deallocation in a `try-finally` block for buffers living beyond single lexical scopes.

Engineers MUST explicitly manage life-cycles of off-heap buffers using `memScoped` or unmanaged `nativeHeap.allocArray` paired with deterministic deallocation in a `try-finally` block for buffers living beyond single lexical scopes.

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

Components NEVER hold long-term references to `Pinned<T>` beyond the immediate execution block

Components NEVER hold long-term references to `Pinned<T>` beyond the immediate execution block; unpinning MUST occur deterministically to avoid pinning down the Kotlin/Native GC compaction passes.

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 Zero-Copy Direct Pinned Buffer Invariant for High-Throughput Streams critical for AI coding assistants?

Enforces deterministic zero-copy memory transfers between native C/POSIX/Apple APIs and Kotlin Multiplatform runtimes without triggering garbage collection pressure or cross-heap allocations. Mandates scoped memory pinning using `usePinned` or direct non-managed arena buffers for high-frequency media and sensor streaming. Prohibits converting native byte buffers into intermediary managed `ByteArray` instances within tight processing loops. 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 (Intermediary Managed ByteArray Allocations in High-Frequency C-Interop Pipelines) 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