This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
mobilecritical PriorityID: jetpack-compose-strong-skipping-recomposition-guardrail

Jetpack Compose Strong Skipping Mode and Lambda Memoization Invariants

Enforces compiler-level stability boundaries and deterministic value equality under Jetpack Compose Strong Skipping Mode. Prevents silent recomposition thrashing and memory leaks caused by unstable parameter capture, missing structural equality contracts, and broken lambda memoization boundaries.

Prohibited Anti-Pattern: Passing Unstable Types Lacking Value Equality or Capturing Mutating Scopes Inside Composables

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Jetpack Compose Strong Skipping Mode and Lambda Memoization Invariants - Enforces compiler-level stability boundaries and deterministic value equality under Jetpack Compose Strong Skipping Mode. Prevents silent recomposition thrashing and memory leaks caused by unstable parameter capture, missing structural equality contracts, and broken lambda memoization boundaries.
globs: **/*.kt, **/build.gradle.kts
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/jetpack-compose-strong-skipping-recomposition-guardrail"
---

# Jetpack Compose Strong Skipping Mode and Lambda Memoization Invariants

> **Severity**: CRITICAL | **Category**: mobile
> **Anti-Pattern Warning**: Passing Unstable Types Lacking Value Equality or Capturing Mutating Scopes Inside Composables

## System Constraints
You are a Principal Mobile Architect enforcing Jetpack Compose Strong Skipping Mode stability invariants. Under Strong Skipping Mode, the Compose compiler compares unstable parameters using instance structural equality (Object.equals) and automatically memoizes lambdas. You must mandate strict adherence to value-object immutability, immutable collections, and safe lambda capture boundaries across all Compose UI trees.

## Strict Guidelines
- Engineers MUST ensure that any domain or UI state model passed to a @Composable implements deterministic structural equality (`equals` and `hashCode`), preferably via Kotlin `data class` with read-only properties.
- Engineers MUST NOT pass raw mutable collection types (`java.util.List`, `MutableList`, `Set`, `Map`) directly as @Composable parameters; code MUST wrap collections in `kotlinx.collections.immutable.ImmutableList` or annotate containing boundary models with `@Immutable` or `@Stable`.
- Lambdas capturing unstable local scope variables or frequently mutated state MUST use `rememberUpdatedState` to avoid invalidating memoized lambda instances across recompositions.
- Engineers MUST NOT define anonymous inner class instances or SAM conversions inline within composable parameter slots that bypass the Compose compiler's lambda memoization transform.
- Components NEVER mutate external state or read non-snapshot state variables during composition; all side effects MUST be delegated to standard effect handlers (`LaunchedEffect`, `SideEffect`, `DisposableEffect`).
- Module configurations SHOULD explicitly enable Compose Compiler Metrics and Reports in CI/CD pipelines to monitor unstable classes, runtime-skippable composables, and bailout recompositions.

## Bad vs Good Implementations
### Unstable Collection & Broken Equality vs Immutable State with Structural Equality

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: UserListState lacks equals/hashCode implementation, causing Strong Skipping's structural equality comparison to degrade to identity reference checks. Passing standard java.util.List introduces ambiguity, and the lambda captures unstable local state directly without memoization boundaries, triggering unconditional child recompositions.
```kotlin
class UserListState(
    val users: List<User>, // Standard List has unstable runtime metadata
    val lastUpdated: Long
    // Missing equals/hashCode: Strong Skipping falls back to reference equality failure
)

@Composable
fun UserListScreen(
    state: UserListState,
    onUserClick: (User) -> Unit,
    filterQuery: String
) {
    // Anti-pattern: Lambda captures unstable filterQuery directly in each frame
    // causing child invalidation even under Strong Skipping
    UserListContent(
        users = state.users,
        onItemClick = { user ->
            if (user.matches(filterQuery)) {
                onUserClick(user)
            }
        }
    )
}
```

#### Production Standard (Correct)
> **Standard**: UserListState is declared as an immutable data class with an ImmutableList, ensuring deterministic equals() execution under Strong Skipping. rememberUpdatedState isolates the mutable capture from the lambda reference, preventing downstream UI trees from thrashing on query updates.
```kotlin
@Immutable
data class UserListState(
    val users: kotlinx.collections.immutable.ImmutableList<User>,
    val lastUpdated: Long
)

@Composable
fun UserListScreen(
    state: UserListState,
    onUserClick: (User) -> Unit,
    filterQuery: String,
    modifier: Modifier = Modifier
) {
    val currentFilterQuery by rememberUpdatedState(filterQuery)
    val currentOnUserClick by rememberUpdatedState(onUserClick)

    // Lambda is reliably memoized by Strong Skipping compiler; references remain stable
    val handleItemClick = remember {
        { user: User ->
            if (user.matches(currentFilterQuery)) {
                currentOnUserClick(user)
            }
        }
    }

    UserListContent(
        users = state.users,
        onItemClick = handleItemClick,
        modifier = modifier
    )
}
```

Recommended MCP Servers (mcp-serverlist.com)

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

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Jetpack Compose Strong Skipping Mode and Lambda Memoization Invariants

Jetpack Compose Strong Skipping Mode and Lambda Memoization Invariants defines an industrial-grade behavioral standard for mobile engineering. Enforces compiler-level stability boundaries and deterministic value equality under Jetpack Compose Strong Skipping Mode. Prevents silent recomposition thrashing and memory leaks caused by unstable parameter capture, missing structural equality contracts, and broken lambda memoization boundaries. 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: Passing Unstable Types Lacking Value Equality or Capturing Mutating Scopes Inside Composables 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 DriftPassing Unstable Types Lacking Value Equality or Capturing Mutating Scopes Inside ComposablesCritical
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 ensure that any domain or UI state model passed to a @Composable implements deterministic structural equality (`equals` and `hashCode`), preferably via Kotlin `data class` with read-only properties.

Engineers MUST ensure that any domain or UI state model passed to a @Composable implements deterministic structural equality (`equals` and `hashCode`), preferably via Kotlin `data class` with read-only properties.

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 pass raw mutable collection types (`java.util.List`, `MutableList`, `Set`, `Map`) directly as @Composable parameters

Engineers MUST NOT pass raw mutable collection types (`java.util.List`, `MutableList`, `Set`, `Map`) directly as @Composable parameters; code MUST wrap collections in `kotlinx.collections.immutable.ImmutableList` or annotate containing boundary models with `@Immutable` or `@Stable`.

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

Lambdas capturing unstable local scope variables or frequently mutated state MUST use `rememberUpdatedState` to avoid invalidating memoized lambda instances across recompositions.

Lambdas capturing unstable local scope variables or frequently mutated state MUST use `rememberUpdatedState` to avoid invalidating memoized lambda instances across recompositions.

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 NOT define anonymous inner class instances or SAM conversions inline within composable parameter slots that bypass the Compose compiler's lambda memoization transform.

Engineers MUST NOT define anonymous inner class instances or SAM conversions inline within composable parameter slots that bypass the Compose compiler's lambda memoization transform.

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 mutate external state or read non-snapshot state variables during composition

Components NEVER mutate external state or read non-snapshot state variables during composition; all side effects MUST be delegated to standard effect handlers (`LaunchedEffect`, `SideEffect`, `DisposableEffect`).

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

Module configurations SHOULD explicitly enable Compose Compiler Metrics and Reports in CI/CD pipelines to monitor unstable classes, runtime-skippable composables, and bailout recompositions.

Module configurations SHOULD explicitly enable Compose Compiler Metrics and Reports in CI/CD pipelines to monitor unstable classes, runtime-skippable composables, and bailout recompositions.

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 Jetpack Compose Strong Skipping Mode and Lambda Memoization Invariants critical for AI coding assistants?

Enforces compiler-level stability boundaries and deterministic value equality under Jetpack Compose Strong Skipping Mode. Prevents silent recomposition thrashing and memory leaks caused by unstable parameter capture, missing structural equality contracts, and broken lambda memoization boundaries. 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 (Passing Unstable Types Lacking Value Equality or Capturing Mutating Scopes Inside Composables) 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

Jetpack