Not in the top 1,000 by GitHub stars

hamen/compose_skill

A strict, evidence-based audit skill for Android Jetpack Compose repositories.

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

skills/compose-agent/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

f815c31d6cc1 → f815c31d6cc1

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → f815c31d6cc1

No earlier version was observed for comparison.

Compare on GitHub

skills/jetpack-compose-audit/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

f815c31d6cc1 → f815c31d6cc1

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → f815c31d6cc1

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit f815c31d6cc1a4af4ce2796d08eb7d8b506785c9

git clone --filter=blob:none --no-checkout https://github.com/hamen/compose_skill.git .hotskills/hamen-compose_skill && git -C .hotskills/hamen-compose_skill checkout --detach f815c31d6cc1a4af4ce2796d08eb7d8b506785c9 # Copy each selected skill directory from .hotskills/hamen-compose_skill into .claude/skills/<skill-name>/
379GitHub stars
3stars in 7 days
2skills in this repository
0commits in 30 days

Heat

4.4
  • Star growth, last 7 daysNot available
  • Star growth, last 24 hoursNot available
  • Rank movement, last 7 daysNot available
  • Commits, last 30 daysNot available
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekNot available

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Oct 25, 2026Nov 5, 2026379

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

compose-agent

When your agent uses it

Helps AI coding assistants write modern Jetpack Compose: correct state, side effects, performance-aware modifiers, Navigation 3, Paging 3 in Compose, coroutines on lifecycle, animations, UI tests, focus/keyboard navigation, Compose Multiplatform boundaries, idiomatic Kotlin, and well-shaped composable APIs. Targets the mistakes LLMs actually make in Compose code. Use when reading, writing, or reviewing Compose projects.

What it loads into context

Frontmatter

174 tokens

Always available to the agent

SKILL.md

3,784 tokens

When the skill is activated

Reference documents

42,280 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Review Process
  2. Core Instructions
  3. Output Format (review mode)
  4. Authoring Mode
  5. What This Skill Does Not Cover
  6. References
  7. Acceptance Evals
  8. Primary Sources

Scripts executed separately

  • ../../bin/ci

Files

  • ../../.claude-plugin/marketplace.jsonasset1,845 bytes
  • ../../bin/ciruns11,395 bytes
  • .claude-plugin/plugin.jsonasset834 bytes
  • .cursor-plugin/plugin.jsonasset834 bytes
  • SKILL.mdcore16,281 bytes
  • evals/evals.jsonasset6,853 bytes
  • references/animation.mddoc19,185 bytes
  • references/api.mddoc14,452 bytes
  • references/component-api.mddoc13,791 bytes
  • references/concurrency.mddoc9,529 bytes
  • references/effects.mddoc13,670 bytes
  • references/flows.mddoc24,470 bytes
  • references/focus.mddoc4,471 bytes
  • references/kmp.mddoc5,060 bytes
  • references/kotlin.mddoc8,307 bytes
  • references/modifiers.mddoc7,903 bytes
  • references/navigation.mddoc13,698 bytes
  • references/paging.mddoc13,781 bytes
  • references/performance.mddoc17,897 bytes
  • references/state.mddoc12,019 bytes
  • references/testing.mddoc4,430 bytes
  • ../jetpack-compose-audit/.claude-plugin/plugin.jsonasset827 bytes
Read SKILL.md

# Compose Agent

Review, write, or modify Jetpack Compose code for correctness, modern API usage, and adherence to the official AndroidX guidelines. Report only genuine problems — do not nitpick or invent issues.

**Target track (unless the repo says otherwise):**

- Kotlin `2.0.20+` with Compose Compiler `1.5.4+` (Strong Skipping Mode on by default).
- Jetpack Compose BOM current, Material 3, `androidx.lifecycle` with `collectAsStateWithLifecycle()`.
- Navigation 3 (`androidx.navigation3`) when the project can adopt it; otherwise Navigation 2.8+.
- Coroutines + Flow as the async primitives. Do not reach for RxJava or blocking I/O.

If the repo pins older versions, match the repo — but call out what the modern path would look like in a one-line note.

## Review Process
View the complete source on GitHub

Skills included

  • compose-agent
  • jetpack-compose-audit

Repository facts

License
MIT
Created
Apr 13, 2026
Last pushed
Jul 15, 2026
Forks
21
Open issues
0
Project activity
Slowing

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 6, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 8 notes
  • skills/jetpack-compose-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/jetpack-compose-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/jetpack-compose-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/jetpack-compose-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/jetpack-compose-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/jetpack-compose-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/jetpack-compose-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/jetpack-compose-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 387 signals by file

.claude-plugin/marketplace.json

  • Network accessline 1
    {   "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
  • Network accessline 2
    "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
  • Network accessline 14
    "source": {         "source": "git-subdir",         "url": "https://github.com/hamen/compose_skill.git",
  • Network accessline 15
    "source": "git-subdir",         "url": "https://github.com/hamen/compose_skill.git",         "path": "skills/compose-agent"
  • Network accessline 16
    "url": "https://github.com/hamen/compose_skill.git",
  • Network accessline 26
    "source": {         "source": "git-subdir",         "url": "https://github.com/hamen/compose_skill.git",
  • Network accessline 27
    "source": "git-subdir",         "url": "https://github.com/hamen/compose_skill.git",         "path": "skills/jetpack-compose-audit"
  • Network accessline 28
    "url": "https://github.com/hamen/compose_skill.git",

bin/ci

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Network accessline 106
    !/static splash icon may render blurry/i.test(auditDocs) ||   !/non-scored|not score/i.test(auditDocs) ||   !auditDocs.includes('https://issuetracker.google.com/issues/520672537')
  • Network accessline 107
    !/non-scored|not score/i.test(auditDocs) ||   !auditDocs.includes('https://issuetracker.google.com/issues/520672537') ) {
  • Network accessline 108
    !auditDocs.includes('https://issuetracker.google.com/issues/520672537')
  • Dangerous shell operationline 190
    throw new Error(`${evalFile} eval ${item.id} is missing a non-empty "${field}"`);
  • Dangerous shell operationline 194
    throw new Error(`${evalFile} eval ${item.id} must have a "files" array`);
  • Dangerous shell operationline 197
    throw new Error(`${evalFile} eval ${item.id} must have a non-empty "expectations" array`);
  • Dangerous shell operationline 200
    throw new Error(`${evalFile} eval ${item.id} expectations must all be non-empty strings`);

skills/compose-agent/.claude-plugin/plugin.json

  • Network accessline 6
    "name": "Ivan Morgillo"   },   "repository": "https://github.com/hamen/compose_skill",
  • Network accessline 7
    },   "repository": "https://github.com/hamen/compose_skill",   "license": "MIT",
  • Network accessline 8
    "repository": "https://github.com/hamen/compose_skill",

skills/compose-agent/.cursor-plugin/plugin.json

  • Network accessline 6
    "name": "Ivan Morgillo"   },   "repository": "https://github.com/hamen/compose_skill",
  • Network accessline 7
    },   "repository": "https://github.com/hamen/compose_skill",   "license": "MIT",
  • Network accessline 8
    "repository": "https://github.com/hamen/compose_skill",

skills/compose-agent/SKILL.md

  • Broad permissionsline 1
    Read, Glob, Grep, Edit, Write, Bash
  • Network accessline 87
    <https://developer.android.com/topic/architecture/ui-layer/state-production#continuous-vs-discrete>
  • Network accessline 111
    <https://developer.android.com/develop/ui/compose/api-guidelines#naming-modifiers>
  • Network accessline 125
    <https://developer.android.com/develop/ui/compose/performance/bestpractices#defer-reads-as-long-as-possible>
  • Network accessline 189
    - `https://developer.android.com/develop/ui/compose` and its subpages
  • Network accessline 190
    - `https://developer.android.com/kotlin/style-guide`
  • Network accessline 191
    - `https://kotlinlang.org/docs/coding-conventions.html`
  • Network accessline 192
    - `https://www.jetbrains.com/help/kotlin-multiplatform-dev/`
  • Network accessline 193
    - `https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-api-guidelines.md`
  • Network accessline 194
    - `https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelines.md`

skills/compose-agent/references/animation.md

  • Network accessline 42
    <https://developer.android.com/develop/ui/compose/animation/choose-api>
  • Network accessline 58
    <https://developer.android.com/develop/ui/compose/animation/value-based#animatable>
  • Network accessline 79
    <https://developer.android.com/develop/ui/compose/animation/value-based#animatable>
  • Network accessline 104
    <https://developer.android.com/develop/ui/compose/animation/value-based#updatetransition>
  • Network accessline 127
    <https://developer.android.com/develop/ui/compose/animation/customize#animationspec>
  • Network accessline 141
    <https://developer.android.com/develop/ui/compose/tooling/animation-preview>
  • Network accessline 166
    <https://developer.android.com/develop/ui/compose/performance/bestpractices#defer-reads>
  • Network accessline 191
    <https://developer.android.com/develop/ui/compose/animation/composables-modifiers#animatedcontent>
  • Network accessline 206
    <https://developer.android.com/develop/ui/compose/animation/composables-modifiers#animatedvisibility>
  • Network accessline 218
    <https://developer.android.com/develop/ui/compose/animation/composables-modifiers#animatedcontentsize>
  • Network accessline 234
    <https://developer.android.com/develop/ui/compose/lists#item-animations>
  • Network accessline 245
    <https://developer.android.com/develop/ui/compose/animation/value-based#rememberinfinitetransition>
  • Network accessline 279
    <https://developer.android.com/develop/ui/compose/animation/value-based#animatable>
  • Network accessline 298
    <https://developer.android.com/reference/kotlin/androidx/compose/ui/MotionDurationScale>
  • Network accessline 317
    - <https://developer.android.com/develop/ui/compose/animation/choose-api>
  • Network accessline 318
    - <https://developer.android.com/develop/ui/compose/animation/value-based>
  • Network accessline 319
    - <https://developer.android.com/develop/ui/compose/animation/customize>
  • Network accessline 320
    - <https://developer.android.com/develop/ui/compose/animation/composables-modifiers>
  • Network accessline 321
    - <https://developer.android.com/develop/ui/compose/performance/bestpractices#defer-reads>
  • Network accessline 322
    - <https://developer.android.com/develop/ui/compose/lists#item-animations>
  • Network accessline 323
    - <https://developer.android.com/reference/kotlin/androidx/compose/ui/MotionDurationScale>

skills/compose-agent/references/api.md

  • Network accessline 137
    Per the AOSP source quoted in the platform issue (`https://issuetracker.google.com/issues/520672537`), there are two render paths:
  • Network accessline 155
    <!-- res/drawable/ic_splash_logo.xml — the REAL artwork; the only copy of the paths. --> <vector xmlns:android="http://schemas.android.com/apk/res/android"
  • Network accessline 156
    <vector xmlns:android="http://schemas.android.com/apk/res/android"
  • Network accessline 164
    <!-- res/drawable/ic_splash.xml — what the theme points at. No animators. --> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
  • Network accessline 165
    <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
  • Network accessline 220
    - `https://developer.android.com/develop/ui/compose` (canonical Compose)
  • Network accessline 221
    - `https://developer.android.com/jetpack/androidx/releases/compose-material3` (M3 changelog)
  • Network accessline 222
    - `https://google.github.io/accompanist/` (marks each library's migration target)
  • Network accessline 223
    - `https://developer.android.com/develop/ui/compose/performance/bestpractices` (deferred reads)
  • Network accessline 224
    - `https://developer.android.com/develop/ui/views/launch/splash-screen`
  • Network accessline 225
    - `https://developer.android.com/reference/androidx/core/splashscreen/SplashScreen`

skills/compose-agent/references/component-api.md

  • Network accessline 275
    - `https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelines.md`
  • Network accessline 276
    - `https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-api-guidelines.md`
  • Network accessline 277
    - `https://developer.android.com/develop/ui/compose/api-guidelines`
  • Network accessline 278
    - `https://developer.android.com/develop/ui/compose/compositionlocal`

skills/compose-agent/references/concurrency.md

  • Network accessline 157
    - `https://developer.android.com/topic/libraries/architecture/coroutines`
  • Network accessline 158
    - `https://developer.android.com/topic/architecture/ui-layer/state-production`
  • Network accessline 159
    - `https://developer.android.com/kotlin/coroutines/coroutines-best-practices`
  • Network accessline 160
    - `https://kotlinlang.org/docs/flow.html`
  • Network accessline 161
    - `https://developer.android.com/reference/kotlin/androidx/lifecycle/compose/package-summary` (`collectAsStateWithLifecycle`)

skills/compose-agent/references/effects.md

  • Network accessline 266
    - `https://developer.android.com/develop/ui/compose/side-effects`
  • Network accessline 267
    - `https://developer.android.com/develop/ui/compose/lifecycle`
  • Network accessline 268
    - `https://developer.android.com/topic/architecture/ui-layer/state-production`

skills/compose-agent/references/flows.md

  • Network accessline 353
    - `https://kotlinlang.org/docs/flow.html`
  • Network accessline 354
    - `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-state-flow/`
  • Network accessline 355
    - `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-shared-flow/`
  • Network accessline 356
    - `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/state-in.html`
  • Network accessline 357
    - `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/share-in.html`
  • Network accessline 358
    - `https://developer.android.com/kotlin/flow`
  • Network accessline 359
    - `https://developer.android.com/topic/architecture/ui-layer/state-production`
  • Network accessline 360
    - `https://elizarov.medium.com/cold-flows-hot-channels-d74769805f9` (Roman Elizarov — cold flows, hot channels)

skills/compose-agent/references/focus.md

  • Network accessline 125
    - `https://developer.android.com/develop/ui/compose/touch-input/focus`
  • Network accessline 126
    - `https://developer.android.com/develop/ui/compose/touch-input/keyboard-input`
  • Network accessline 127
    - `https://developer.android.com/develop/ui/compose/testing`
  • Network accessline 128
    - `https://developer.android.com/develop/ui/compose/accessibility`

skills/compose-agent/references/kmp.md

  • Network accessline 110
    - `https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-expect-actual.html`
  • Network accessline 111
    - `https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform.html`
  • Network accessline 112
    - `https://developer.android.com/develop/ui/compose/migrate/multiplatform`
  • Network accessline 113
    - `https://developer.android.com/develop/ui/compose/interop`

skills/compose-agent/references/kotlin.md

  • Network accessline 174
    - `https://kotlinlang.org/docs/coding-conventions.html` — Kotlin coding conventions.
  • Network accessline 175
    - `https://developer.android.com/kotlin/style-guide` — Android Kotlin style guide.
  • Network accessline 176
    - `https://developer.android.com/kotlin/interop` — Kotlin ↔ Java interop rules for public APIs.

skills/compose-agent/references/modifiers.md

  • Network accessline 159
    - `https://developer.android.com/develop/ui/compose/modifiers`
  • Network accessline 160
    - `https://developer.android.com/develop/ui/compose/custom-modifiers`
  • Network accessline 161
    - `https://developer.android.com/develop/ui/compose/graphics/draw/modifiers`

skills/compose-agent/references/navigation.md

  • Network accessline 5
    > Navigation 3 (`androidx.navigation3`) is still in **alpha** (`1.x-alpha`) — it is what Android recommends for new Compose navigation, but pin the version and expect some API churn. The shapes below are verified against the official [nav3-
  • Network accessline 28
    <https://developer.android.com/guide/navigation/navigation-3>
  • Network accessline 141
    - `https://developer.android.com/guide/navigation/navigation-3/basics` — Nav3 basics (`NavDisplay`, `entryProvider`, back stack as state)
  • Network accessline 142
    - `https://developer.android.com/guide/navigation/navigation-3/save-state` — `rememberNavBackStack`, `NavKey` + `@Serializable`, the `rememberSaveableStateHolderNavEntryDecorator` / `rememberViewModelStoreNavEntryDecorator` decorators
  • Network accessline 143
    - `https://developer.android.com/guide/navigation/navigation-3/scenes` — scene strategies (`SinglePaneSceneStrategy`, `ListDetailSceneStrategy`); they group entries by window size, they do not register deep links
  • Network accessline 144
    - `https://developer.android.com/guide/navigation/use-graph/navigate#type-safe` — Nav2 type-safe destinations
  • Network accessline 145
    - `https://developer.android.com/develop/ui/compose/navigation` — Compose + Nav2
  • Network accessline 146
    - `https://github.com/android/nav3-recipes` — official Nav3 sample recipes (basic, saveable, DSL, per-entry ViewModel, list-detail scenes, results via `ResultEventBus`, deep links). The shapes in this reference are checked against these.

skills/compose-agent/references/paging.md

  • Network accessline 29
    <https://developer.android.com/topic/libraries/architecture/paging/v3-compose>
  • Network accessline 100
    <https://developer.android.com/topic/libraries/architecture/paging/v3-compose#collect-lazyPagingItems>
  • Network accessline 127
    <https://developer.android.com/reference/kotlin/androidx/paging/compose/LazyPagingItems#itemKey(kotlin.Function1)>
  • Network accessline 156
    <https://developer.android.com/reference/kotlin/androidx/paging/compose/LazyPagingItems>
  • Network accessline 212
    - <https://developer.android.com/topic/libraries/architecture/paging/v3-compose>
  • Network accessline 213
    - <https://developer.android.com/topic/libraries/architecture/paging/v3-overview>
  • Network accessline 214
    - <https://developer.android.com/reference/kotlin/androidx/paging/compose/package-summary>
  • Network accessline 215
    - <https://developer.android.com/develop/ui/compose/lists> — lazy list keys (applies to paging items)

skills/compose-agent/references/performance.md

  • Network accessline 228
    - `https://developer.android.com/develop/ui/compose/performance/bestpractices`
  • Network accessline 229
    - `https://developer.android.com/develop/ui/compose/performance/stability`
  • Network accessline 230
    - `https://developer.android.com/develop/ui/compose/performance/stability/strongskipping`
  • Network accessline 231
    - `https://developer.android.com/develop/ui/compose/performance/phases`
  • Network accessline 232
    - `https://developer.android.com/develop/ui/compose/lists` (keys and contentType)
  • Network accessline 233
    - `https://developer.android.com/develop/ui/compose/performance/baseline-profiles`

skills/compose-agent/references/state.md

  • Network accessline 264
    - `https://developer.android.com/develop/ui/compose/state`
  • Network accessline 265
    - `https://developer.android.com/develop/ui/compose/state-hoisting`
  • Network accessline 266
    - `https://developer.android.com/develop/ui/compose/architecture`
  • Network accessline 267
    - `https://developer.android.com/topic/architecture/ui-layer/state-production`
  • Network accessline 268
    - `https://developer.android.com/develop/ui/compose/state-saving`

skills/compose-agent/references/testing.md

  • Network accessline 109
    - `https://developer.android.com/develop/ui/compose/testing`
  • Network accessline 110
    - `https://developer.android.com/develop/ui/compose/testing/apis`
  • Network accessline 111
    - `https://developer.android.com/develop/ui/compose/tooling/previews`
  • Network accessline 112
    - `https://developer.android.com/develop/ui/compose/accessibility`

skills/jetpack-compose-audit/.claude-plugin/plugin.json

  • Network accessline 6
    "name": "Ivan Morgillo"   },   "repository": "https://github.com/hamen/compose_skill",
  • Network accessline 6
    "name": "Ivan Morgillo"   },   "repository": "https://github.com/hamen/compose_skill",
  • Network accessline 7
    },   "repository": "https://github.com/hamen/compose_skill",   "license": "MIT",
  • Network accessline 7
    },   "repository": "https://github.com/hamen/compose_skill",   "license": "MIT",
  • Network accessline 8
    "repository": "https://github.com/hamen/compose_skill",
  • Network accessline 8
    "repository": "https://github.com/hamen/compose_skill",

skills/jetpack-compose-audit/.cursor-plugin/plugin.json

  • Network accessline 6
    "name": "Ivan Morgillo"   },   "repository": "https://github.com/hamen/compose_skill",
  • Network accessline 7
    },   "repository": "https://github.com/hamen/compose_skill",   "license": "MIT",
  • Network accessline 8
    "repository": "https://github.com/hamen/compose_skill",

skills/jetpack-compose-audit/SKILL.md

  • Broad permissionsline 1
    Read, Glob, Grep, Write, Bash, Agent
  • Network accessline 21
    This skill does **not** score design or Material 3 compliance in v1. If the audit surfaces likely design-system problems, recommend a follow-up audit with the `material-3` skill (reference implementation: <https://github.com/hamen/material-
  • Network accessline 149
    Report it as **Android Launch UX: Android 12+ static splash icon may render blurry**, not as a Compose score deduction. Evidence should include the theme item, the resolved drawable file, and whether the `res/drawable-v31` animated-vector o

skills/jetpack-compose-audit/references/canonical-sources.md

  • Network accessline 9
    - Android Developers: `Follow best practices`     `https://developer.android.com/develop/ui/compose/performance/bestpractices`
  • Network accessline 10
    `https://developer.android.com/develop/ui/compose/performance/bestpractices`
  • Network accessline 11
    - Android Developers: `Jetpack Compose Performance`     `https://developer.android.com/develop/ui/compose/performance` - Android Developers: `Compose phases`
  • Network accessline 12
    `https://developer.android.com/develop/ui/compose/performance`
  • Network accessline 13
    - Android Developers: `Compose phases`     `https://developer.android.com/develop/ui/compose/performance/phases` - Android Developers: `Stability`
  • Network accessline 14
    `https://developer.android.com/develop/ui/compose/performance/phases`
  • Network accessline 15
    - Android Developers: `Stability`     `https://developer.android.com/develop/ui/compose/performance/stability` - Android Developers: `Diagnose stability problems`
  • Network accessline 16
    `https://developer.android.com/develop/ui/compose/performance/stability`
  • Network accessline 17
    - Android Developers: `Diagnose stability problems`     `https://developer.android.com/develop/ui/compose/performance/stability/diagnose` - Android Developers: `Fix stability issues`
  • Network accessline 18
    `https://developer.android.com/develop/ui/compose/performance/stability/diagnose`
  • Network accessline 19
    - Android Developers: `Fix stability issues`     `https://developer.android.com/develop/ui/compose/performance/stability/fix` - Android Developers: `Strong Skipping Mode`
  • Network accessline 20
    `https://developer.android.com/develop/ui/compose/performance/stability/fix`
  • Network accessline 21
    - Android Developers: `Strong Skipping Mode`     `https://developer.android.com/develop/ui/compose/performance/stability/strongskipping` - Android Developers: `Performance tooling` (Compose Compiler reports / metrics)
  • Network accessline 22
    `https://developer.android.com/develop/ui/compose/performance/stability/strongskipping`
  • Network accessline 23
    - Android Developers: `Performance tooling` (Compose Compiler reports / metrics)     `https://developer.android.com/develop/ui/compose/performance/tooling` - Android Developers: `Baseline profiles`
  • Network accessline 24
    `https://developer.android.com/develop/ui/compose/performance/tooling`
  • Network accessline 26
    `https://developer.android.com/develop/ui/compose/performance/baseline-profiles`
  • Network accessline 43
    - Android Developers: `Animations in Compose`     `https://developer.android.com/develop/ui/compose/animation/introduction`
  • Network accessline 44
    `https://developer.android.com/develop/ui/compose/animation/introduction`
  • Network accessline 45
    - Android Developers: `Value-based animations` (`animate*AsState`, `Animatable`, `updateTransition`, `rememberInfiniteTransition`)     `https://developer.android.com/develop/ui/compose/animation/value-based` - Android Developers: `Customize
  • Network accessline 46
    `https://developer.android.com/develop/ui/compose/animation/value-based`
  • Network accessline 48
    `https://developer.android.com/develop/ui/compose/animation/customize`
  • Network accessline 61
    - Android Developers: `Paging 3 with Compose`   `https://developer.android.com/topic/libraries/architecture/paging/v3-compose`
  • Network accessline 62
    `https://developer.android.com/topic/libraries/architecture/paging/v3-compose`
  • Network accessline 63
    - Android Developers: `Paging 3 overview`   `https://developer.android.com/topic/libraries/architecture/paging/v3-overview` - Android Developers: `androidx.paging.compose` reference
  • Network accessline 64
    `https://developer.android.com/topic/libraries/architecture/paging/v3-overview`
  • Network accessline 66
    `https://developer.android.com/reference/kotlin/androidx/paging/compose/package-summary`
  • Network accessline 77
    - Android Developers: `State and Jetpack Compose`     `https://developer.android.com/develop/ui/compose/state`
  • Network accessline 78
    `https://developer.android.com/develop/ui/compose/state`
  • Network accessline 79
    - Android Developers: `State hoisting`     `https://developer.android.com/develop/ui/compose/state-hoisting` - Android Developers: `Architecting your Compose UI`
  • Network accessline 80
    `https://developer.android.com/develop/ui/compose/state-hoisting`
  • Network accessline 81
    - Android Developers: `Architecting your Compose UI`     `https://developer.android.com/develop/ui/compose/architecture` - Android Developers: `Lists and grids` (lazy keys, `contentType`)
  • Network accessline 82
    `https://developer.android.com/develop/ui/compose/architecture`
  • Network accessline 84
    `https://developer.android.com/develop/ui/compose/lists`
  • Network accessline 99
    - Android Developers: `Side-effects in Compose`\   `https://developer.android.com/develop/ui/compose/side-effects`
  • Network accessline 100
    `https://developer.android.com/develop/ui/compose/side-effects`
  • Network accessline 102
    `https://developer.android.com/kotlin/coroutines/coroutines-best-practices`
  • Network accessline 117
    - Android Developers: `Style guidelines for Jetpack Compose APIs`     `https://developer.android.com/develop/ui/compose/api-guidelines`
  • Network accessline 118
    `https://developer.android.com/develop/ui/compose/api-guidelines`
  • Network accessline 119
    - AndroidX component guidelines: `API Guidelines for @Composable components in Jetpack Compose`     `https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelines.md` - AndroidX g
  • Network accessline 120
    `https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelines.md`
  • Network accessline 121
    - AndroidX general guidelines: `API Guidelines for Jetpack Compose`     `https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-api-guidelines.md` - Android Developers: `Custom modifiers` (`Modifie
  • Network accessline 122
    `https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-api-guidelines.md`
  • Network accessline 123
    - Android Developers: `Custom modifiers` (`Modifier.Node`, `composed { }` discouraged)     `https://developer.android.com/develop/ui/compose/custom-modifiers` - Android Developers: `Locally scoped data with CompositionLocal`
  • Network accessline 124
    `https://developer.android.com/develop/ui/compose/custom-modifiers`
  • Network accessline 125
    - Android Developers: `Locally scoped data with CompositionLocal`     `https://developer.android.com/develop/ui/compose/compositionlocal` - Android Developers: `Navigation with Compose` (Nav2)
  • Network accessline 126
    `https://developer.android.com/develop/ui/compose/compositionlocal`
  • Network accessline 127
    - Android Developers: `Navigation with Compose` (Nav2)   `https://developer.android.com/develop/ui/compose/navigation` - Android Developers: `Navigation 3`
  • Network accessline 128
    `https://developer.android.com/develop/ui/compose/navigation`
  • Network accessline 129
    - Android Developers: `Navigation 3`   `https://developer.android.com/guide/navigation/navigation-3` - nav3-recipes (official sample repo, verified API shapes)
  • Network accessline 130
    `https://developer.android.com/guide/navigation/navigation-3`
  • Network accessline 132
    `https://github.com/android/nav3-recipes`
  • Network accessline 148
    - Android Developers: `Splash screens`   `https://developer.android.com/develop/ui/views/launch/splash-screen`
  • Network accessline 149
    `https://developer.android.com/develop/ui/views/launch/splash-screen`
  • Network accessline 150
    - AndroidX API reference: `SplashScreen`   `https://developer.android.com/reference/androidx/core/splashscreen/SplashScreen` - Android API reference: `AnimatedVectorDrawable`
  • Network accessline 151
    `https://developer.android.com/reference/androidx/core/splashscreen/SplashScreen`
  • Network accessline 153
    `https://developer.android.com/reference/android/graphics/drawable/AnimatedVectorDrawable`
  • Network accessline 166
    Use the platform issue `https://issuetracker.google.com/issues/520672537` as the bug/workaround evidence for the static splash icon blur problem (it quotes the AOSP `ImmobileIconDrawable` source). Cite at least one official Android URL alon
  • Network accessline 172
    - `https://github.com/skydoves/compose-performance`
  • Network accessline 173
    - `https://medium.com/@idaoskooei/building-better-uis-with-jetpack-compose-best-practices-and-techniques-a1c8953bc5b8`
  • Network accessline 177
    This skill intentionally pairs well with the `material-3` skill, which covers Material 3 design and design-system audit concerns. The reference implementation lives at `https://github.com/hamen/material-3-skill`, but recommend it by skill n

skills/jetpack-compose-audit/references/diagnostics.md

  • Network accessline 9
    **Reference:** <https://developer.android.com/develop/ui/compose/performance/tooling>, <https://developer.android.com/develop/ui/compose/performance/stability/diagnose>
  • Network accessline 51
    **Reference:** <https://developer.android.com/develop/ui/compose/performance/stability/fix>
  • Network accessline 79
    **Reference:** <https://developer.android.com/develop/ui/compose/performance/baseline-profiles>, <https://developer.android.com/topic/performance/baselineprofiles/overview>
  • Network accessline 136
    **Reference:** <https://developer.android.com/develop/ui/compose/performance> ("Run in Release Mode with R8")
  • Network accessline 165
    **Reference:** <https://developer.android.com/develop/ui/compose/performance/stability/strongskipping>

skills/jetpack-compose-audit/references/report-template.md

  • Network accessline 39
    - Evidence: `path/a.kt:42`, `path/b.kt:117`    - Fix direction: [brief recommendation]    - References: <https://developer.android.com/develop/ui/compose/performance/bestpractices>
  • Network accessline 41
    - References: <https://developer.android.com/develop/ui/compose/performance/bestpractices>
  • Network accessline 51
    - Finding, if risky: **Android 12+ static splash icon may render blurry** because the API 31+ resource resolves to a static `<vector>` / `<adaptive-icon>` / bitmap / layer-list instead of an `<animated-vector>` wrapper. - Fix direction: kee
  • Network accessline 53
    - References: <https://developer.android.com/develop/ui/views/launch/splash-screen>, <https://developer.android.com/reference/androidx/core/splashscreen/SplashScreen>, <https://issuetracker.google.com/issues/520672537>
  • Network accessline 95
    - `path/to/file1.kt:LL` — [brief reason] · References: <https://developer.android.com/...>
  • Network accessline 96
    - `path/to/file2.kt:LL` — [brief reason] · References: <https://developer.android.com/...>
  • Network accessline 117
    - `path/to/file1.kt:LL` — [brief reason] · References: <https://developer.android.com/...>
  • Network accessline 118
    - `path/to/file2.kt:LL` — [brief reason] · References: <https://developer.android.com/...>
  • Network accessline 143
    - `path/to/file1.kt:LL` — [brief reason] · References: <https://developer.android.com/...>
  • Network accessline 144
    - `path/to/file2.kt:LL` — [brief reason] · References: <https://developer.android.com/...>
  • Network accessline 159
    - `path/to/file1.kt:LL` — [brief reason] · References: <https://developer.android.com/...>
  • Network accessline 160
    - `path/to/file2.kt:LL` — [brief reason] · References: <https://developer.android.com/...>

skills/jetpack-compose-audit/references/scoring.md

  • Network accessline 74
    - expensive calculations cached with `remember(keys)` or moved out of composition → [docs](https://developer.android.com/develop/ui/compose/performance/bestpractices)
  • Network accessline 75
    - stable `key =` in lazy layouts where list identity matters → [docs](https://developer.android.com/develop/ui/compose/lists)
  • Network accessline 76
    - `contentType` on heterogeneous lazy lists, so Compose can reuse compositions only between items of the same type → [docs](https://developer.android.com/develop/ui/compose/lists)
  • Network accessline 77
    - `derivedStateOf` used for state that changes faster than its observable output (e.g. scroll position → "show button" boolean) → [docs](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 78
    - deferred reads via lambda modifiers (`Modifier.offset { … }`, `Modifier.graphicsLayer { … }`, `Modifier.drawBehind { … }`) → [docs](https://developer.android.com/develop/ui/compose/performance/bestpractices), [phases](https://developer.an
  • Network accessline 79
    - absence of backwards writes (writing to state that has already been read in the same composition) → [docs](https://developer.android.com/develop/ui/compose/performance/bestpractices)
  • Network accessline 80
    - absence of cross-phase back-writes — measured size/position from a layout callback consumed in layout/draw (`Modifier.layout { }` / `Modifier.drawBehind { }`) rather than round-tripped through composition-read state → [phases](https://dev
  • Network accessline 81
    - stability hygiene: `@Stable` / `@Immutable` on data classes used as composable params → [docs](https://developer.android.com/develop/ui/compose/performance/stability)
  • Network accessline 82
    - `kotlinx.collections.immutable` (`ImmutableList`, `PersistentList`) for collection params — earns a skip when Strong Skipping is off, and under Strong Skipping still pays off via stable `equals()` / `hashCode()` (making the instance-equal
  • Network accessline 83
    - `compose_compiler_config.conf` used to mark third-party types stable → [fix](https://developer.android.com/develop/ui/compose/performance/stability/fix)
  • Network accessline 84
    - typed state factories (`mutableIntStateOf`, `mutableLongStateOf`, `mutableFloatStateOf`, `mutableDoubleStateOf`) for primitives instead of boxed `mutableStateOf<Int>` → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 85
    - `@ReadOnlyComposable` / `@NonRestartableComposable` used deliberately on hot-path helpers → [strong skipping](https://developer.android.com/develop/ui/compose/performance/stability/strongskipping)
  • Network accessline 86
    - evidence of Strong Skipping Mode awareness (Kotlin 2.0.20+ / Compose Compiler 1.5.4+); opt-outs (`@NonSkippableComposable`, `@DontMemoize`) used only with justification → [strong skipping](https://developer.android.com/develop/ui/compose/
  • Network accessline 87
    - evidence of performance-aware configuration such as baseline profiles, R8 / minify enabled in release, or `ProfileInstaller` setup → [baseline profiles](https://developer.android.com/develop/ui/compose/performance/baseline-profiles)
  • Network accessline 88
    - `ReportDrawnWhen { ... }` used to signal first-meaningful-content for accurate TTID/TTFD metrics → [tooling](https://developer.android.com/develop/ui/compose/performance/tooling)
  • Network accessline 89
    - edge-to-edge opt-in via `enableEdgeToEdge()` (first-party) rather than `accompanist-systemuicontroller` on projects that support it → [lists](https://developer.android.com/develop/ui/compose/lists)
  • Network accessline 90
    - evidence the team uses Compose Compiler reports / metrics to verify skippability → [tooling](https://developer.android.com/develop/ui/compose/performance/tooling), [diagnose](https://developer.android.com/develop/ui/compose/performance/st
  • Network accessline 91
    - animated values read through lambda modifiers (`Modifier.graphicsLayer { ... }`, `Modifier.offset { ... }`, `Modifier.drawBehind { ... }`) so per-frame updates stay in the layout/draw phase and skip recomposition → [phases](https://develo
  • Network accessline 92
    - `Animatable` held in `remember { Animatable(...) }` and driven from a `LaunchedEffect` — state survives recomposition, animation is cancelled on dispose → [animation](https://developer.android.com/develop/ui/compose/animation/value-based)
  • Network accessline 93
    - `AnimatedContent` used when the call site needs custom enter/exit or size-aware content transforms, while `Crossfade` is used for standard fade-only content swaps → [animation](https://developer.android.com/develop/ui/compose/animation/in
  • Network accessline 94
    - multiple properties that animate off the same state change share one `updateTransition` instead of independent `animate*AsState` calls that can drift out of sync → [animation](https://developer.android.com/develop/ui/compose/animation/val
  • Network accessline 98
    - non-trivial work in composable bodies — collection transforms (`filter` / `sortedBy` / `groupBy` / `sumOf`), O(N) string ops (`split`, `lines`, `lineSequence`, `replace`, `format`), `Regex(...)` constructed or executed inline, hashing or 
  • Network accessline 99
    - lazy list items without stable keys when identity/moves matter → [lists](https://developer.android.com/develop/ui/compose/lists)
  • Network accessline 100
    - heterogeneous lazy lists missing `contentType` → [lists](https://developer.android.com/develop/ui/compose/lists)
  • Network accessline 101
    - reading rapidly changing state too high in the tree → [phases](https://developer.android.com/develop/ui/compose/performance/phases), [bestpractices](https://developer.android.com/develop/ui/compose/performance/bestpractices)
  • Network accessline 102
    - frequent-state values passed to non-lambda modifiers when a layout/draw-phase alternative exists → [bestpractices](https://developer.android.com/develop/ui/compose/performance/bestpractices)
  • Network accessline 103
    - backwards writes — writing to state already read in the same composition body → [bestpractices](https://developer.android.com/develop/ui/compose/performance/bestpractices)
  • Network accessline 104
    - cross-phase back-writes (axis 3) — a **layout-phase** callback (`onSizeChanged` / `onGloballyPositioned` / `onPlaced`) writing state that a sibling **reads in composition** (measure → write → recompose loop). Deduct when a composition-pha
  • Network accessline 105
    - composition-phase self-invalidation — a `SnapshotStateMap` / `SnapshotStateList` mutated (`putAll` / `put` / `add` / `addAll` / `remove` / `clear` / `[k] =` / `+=` / `-=`) inside a `@Composable` body that also reads it. This overlaps the 
  • Network accessline 106
    - repeated broad recomposition smells across screens/components → [stability](https://developer.android.com/develop/ui/compose/performance/stability)
  • Network accessline 107
    - raw `List`/`Map`/`Set` parameters on widely reused composables when the rest of the codebase has the immutable-collections dependency available — deduct when Strong Skipping is OFF (unstable params block skipping outright), or when Strong
  • Network accessline 108
    - unstable composable params whose `equals()` is expensive, allocating, or semantically broken — for example, a plain `class Foo(...)` with identity equality passed to a reusable composable, a `data class` wrapping a large collection (deep 
  • Network accessline 109
    - instance-recreation churn in source: `listOf(...)` / `mapOf(...)` / `setOf(...)` / anonymous `object` literals / `MyParams(...)` allocated inside a hot composable body and passed as a param. The value is `!=` to the prior recomposition's 
  • Network accessline 110
    - `mutableStateOf<Int|Long|Float|Double>` where the typed factory exists (autoboxing) → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 111
    - `derivedStateOf { ... }` whose block does not actually read any `State` object (meaning it will never invalidate, and the overhead of `derivedStateOf` is wasted) → [side-effects](https://developer.android.com/develop/ui/compose/side-effec
  • Network accessline 112
    - `@NonSkippableComposable` / `@DontMemoize` opt-outs without a justifying comment → [strong skipping](https://developer.android.com/develop/ui/compose/performance/stability/strongskipping)
  • Network accessline 113
    - if the project is on a Compose Compiler track older than 1.5.4 / Kotlin 2.0.20, stability matters more than the rules above assume — note this in the report and weight unstable-param findings more heavily → [strong skipping](https://devel
  • Network accessline 114
    - `remember { … }` whose body reads `LocalConfiguration`, `LocalDensity`, or `LocalLayoutDirection` without declaring those values as keys — the cached value silently goes stale on rotation / foldable posture / font-scale changes → [state](
  • Network accessline 115
    - `indexOf()` / `lastIndexOf()` / `indexOfFirst { }` called inside a `LazyListScope` item factory — O(n²) scroll cost and crash risk when identity moves; use `itemsIndexed` instead → [lists](https://developer.android.com/develop/ui/compose/
  • Network accessline 116
    - `animateItemPlacement()` on Compose 1.7+ — replaced by `Modifier.animateItem()` → [lists](https://developer.android.com/develop/ui/compose/lists)
  • Network accessline 117
    - Accompanist libraries where first-party replacements exist: `accompanist-pager` (→ `HorizontalPager`), `accompanist-swiperefresh` (→ `PullToRefreshBox`), `accompanist-flowlayout` (→ `FlowRow` / `FlowColumn`), `accompanist-systemuicontroll
  • Network accessline 118
    - `Canvas` / `Spacer` with only `Modifier.fillMaxSize()` and no explicit height or aspect ratio — may enter draw with `Size.Zero`, producing `NaN` math and Skia-pipeline crashes. Require `Modifier.size(...)`, `Modifier.height(...)`, or `Mod
  • Network accessline 119
    - lazy-list `key = { ... }` computed from a source that cannot guarantee uniqueness (merged flows, paginated streams, `hashCode()` on non-`data class`) — `IllegalArgumentException: Key ... was already used` crashes production. Verify with t
  • Network accessline 120
    - `Animatable(...)` created inside a composable body without `remember { Animatable(...) }` (and not hoisted from a state holder) — the animation state is rebuilt on recomposition, which restarts the animation and drops in-flight velocity/t
  • Network accessline 121
    - per-frame animated values read in the composition body and piped into non-lambda modifiers (`Modifier.offset(x.value.dp)`, `Modifier.alpha(alpha.value)`, `Modifier.rotate(rot.value)`). Every frame triggers recomposition of the caller inst
  • Network accessline 122
    - `rememberInfiniteTransition()` hosted in a composable that stays in composition while offscreen (e.g. inside a `Scaffold` content that does not unmount on tab switch) — the animation keeps running until the host is removed from compositio
  • Network accessline 123
    - several `animate*AsState` calls in the same composable all keyed off the same boolean/enum when `updateTransition` would keep them synchronized — light deduction when the drift is user-visible (alpha/scale/color finishing at different tim
  • Network accessline 127
    - `LazyPagingItems` rendered with `items(count = …)` but **missing `key =`** or using **index-only keys** on a paginated/merged feed — reorder, refresh, and prepend can crash or thrash compositions → [paging compose](https://developer.andro
  • Network accessline 128
    - treating `LazyPagingItems` like a materialized list (`itemSnapshotList` primary UI path, `forEach` into a nested lazy list) instead of the supported `items(count = …)` integration → [paging compose](https://developer.android.com/topic/lib
  • Network accessline 205
    - clear single source of truth → [architecture](https://developer.android.com/develop/ui/compose/architecture)
  • Network accessline 206
    - correct hoisting to the lowest common reader / highest writer → [state hoisting](https://developer.android.com/develop/ui/compose/state-hoisting)
  • Network accessline 207
    - related state hoisted together when driven by the same events → [state hoisting](https://developer.android.com/develop/ui/compose/state-hoisting)
  • Network accessline 208
    - stateless reusable composables with stateful wrappers where useful → [state hoisting](https://developer.android.com/develop/ui/compose/state-hoisting)
  • Network accessline 209
    - `rememberSaveable` for UI state that should survive recreation → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 210
    - custom `Saver` / `mapSaver` / `listSaver` / `@Parcelize` for non-bundleable types in `rememberSaveable` → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 211
    - `collectAsStateWithLifecycle()` in Android UI code → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 212
    - observable immutable state instead of mutable non-observable containers → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 213
    - correct observable collections via `mutableStateListOf` / `mutableStateMapOf` instead of wrapping `mutableListOf`/`mutableMapOf` in a `MutableState` → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 214
    - typed state factories (`mutableIntStateOf` and friends) — cross-listed with Performance because the failure mode is autoboxing → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 215
    - plain state-holder classes when screen logic grows; idiomatic shape is `@Stable class FooState(...)` paired with a `@Composable fun rememberFooState(...): FooState` factory → [architecture](https://developer.android.com/develop/ui/compose
  • Network accessline 216
    - ViewModel used as the source of truth for screen-level state, scoped at the screen level (not deep in the tree, not inside reusable components) → [architecture](https://developer.android.com/develop/ui/compose/architecture), [state](https
  • Network accessline 217
    - ViewModel-exposed flows converted with `.stateIn(scope, SharingStarted.WhileSubscribed(5_000), initial)` — survives configuration changes without restarting upstream work → [architecture](https://developer.android.com/develop/ui/compose/a
  • Network accessline 218
    - `remember(key)` invalidation when cached values depend on inputs → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 222
    - duplicated or split ownership of state → [state hoisting](https://developer.android.com/develop/ui/compose/state-hoisting)
  • Network accessline 223
    - under-hoisted shared state → [state hoisting](https://developer.android.com/develop/ui/compose/state-hoisting)
  • Network accessline 224
    - reusable components with unnecessary internal state → [state hoisting](https://developer.android.com/develop/ui/compose/state-hoisting)
  • Network accessline 225
    - misuse of `remember` where `rememberSaveable` is more appropriate → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 226
    - non-observable mutable collections or mutable data holders used as state (`mutableListOf` held in a `var`, `ArrayList` mutated in place) → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 227
    - `mutableListOf` / `mutableMapOf` wrapped in a `MutableState` where `mutableStateListOf` / `mutableStateMapOf` would correctly observe element changes → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 228
    - Android flows collected in UI without lifecycle awareness when the code is Android-specific (skip on Compose Multiplatform code paths) → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 229
    - state scattered across multiple sibling composables without a clear owner → [state hoisting](https://developer.android.com/develop/ui/compose/state-hoisting)
  • Network accessline 230
    - `remember { computeFromInput(x) }` with no `key` — stale cached value when `x` changes → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 231
    - `viewModel()` invoked deep in a composable tree (rather than at the screen entry point) or ViewModels passed via `CompositionLocal` → [architecture](https://developer.android.com/develop/ui/compose/architecture), [compositionlocal](https:
  • Network accessline 232
    - `rememberSaveable { mutableStateOf(SomeNonBundleable(...)) }` without a `Saver` — restoration silently fails after process death → [state](https://developer.android.com/develop/ui/compose/state)
  • Network accessline 233
    - string-based navigation routes (`composable("home")`, `navigate("profile/$id")`) on Navigation Compose 2.8+ where type-safe `@Serializable` routes are available — loses compile-time checking and encourages argument-encoding bugs → [naviga
  • Network accessline 234
    - `mutableStateOf` held in a `ViewModel` instead of `StateFlow` / `MutableStateFlow` — couples the ViewModel to the Compose runtime and hurts testability. App-level teams may accept this tradeoff deliberately; note the tradeoff rather than 
  • Network accessline 235
    - ViewModel-to-UI events modeled only as `Channel` / `SharedFlow` when the outcome must survive lifecycle gaps (snackbars, validation messages, navigation decisions). Prefer durable UI state with an acknowledgement callback for must-deliver
  • Network accessline 236
    - `rememberSaveable` used inside a `LazyListScope` item factory (per-item expansion state, per-item form fields) — each entry is serialized into the saved-state `Bundle` which is capped at ~1 MB; large lists trigger `TransactionTooLargeExce
  • Network accessline 237
    - paging UI that ignores `LazyPagingItems.loadState` — blank screen during initial refresh, stuck spinner, or silent failure with no `retry()` path → [paging compose](https://developer.android.com/topic/libraries/architecture/paging/v3-comp
  • Network accessline 238
    - duplicate manual loading flags (`mutableStateOf(isLoading)`) shadowing `loadState` on paging screens — two sources of truth for the same UX → [paging compose](https://developer.android.com/topic/libraries/architecture/paging/v3-compose)
  • Network accessline 239
    - `loadState.append is LoadState.Error` handled only as a spinner or not at all — append failures leave the user with no way to resume the feed; an append-error footer must offer `retry()` → [paging compose](https://developer.android.com/to
  • Network accessline 240
    - `lazyPagingItems[index]!!` (or assuming every slot is non-null) — with `PagingConfig.enablePlaceholders = true`, slots are `null` while a page loads and `!!` NPE-crashes; the dual smell is a placeholder branch that can never run because p
  • Network accessline 241
    - `loadState.refresh is LoadState.Error -> FullScreenError()` with **no `itemCount == 0` guard** — a transient pull-to-refresh failure then wipes an already-loaded feed and replaces it with a full-screen error. Full-screen error should gate
  • Network accessline 247
    When Nav3 is detected (see playbook section 2b), also deduct for: - `entryDecorators` list supplied without re-adding `rememberSaveableStateHolderNavEntryDecorator()` — `rememberSaveable` inside entries silently stops persisting state → [Na
  • Network accessline 248
    - `entryDecorators` list supplied without re-adding `rememberSaveableStateHolderNavEntryDecorator()` — `rememberSaveable` inside entries silently stops persisting state → [Nav3 save state](https://developer.android.com/guide/navigation/navi
  • Network accessline 249
    - Anonymous or non-top-level `NavKey` destination types — breaks process-death restore and `rememberSaveable` for that entry → [Nav3](https://developer.android.com/guide/navigation/navigation-3)
  • Network accessline 250
    - Feature/screen ViewModel owns or mutates the back stack directly — navigation lifecycle coupled to ViewModel, defeats predictive back and scene strategies → [Nav3](https://developer.android.com/guide/navigation/navigation-3)
  • Network accessline 251
    - `ResultEventBus` / `conflateAsState` result treated as surviving process death — result is only available within the current navigation lifetime; persist in `SavedStateHandle` if survival is required → [Nav3 save state](https://developer.
  • Network accessline 264
    All citations in this category point to the canonical [Side-effects in Compose](https://developer.android.com/develop/ui/compose/side-effects) page unless noted. The official docs put `derivedStateOf` and `snapshotFlow` under side-effects. 
  • Network accessline 268
    - side-effect-free composition → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 269
    - correct use of `LaunchedEffect`, `DisposableEffect`, `SideEffect`, `rememberUpdatedState`, and `produceState` → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 270
    - effects keyed to the right lifecycle inputs → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 271
    - cleanup for listeners, observers, and subscriptions → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 272
    - stale callback capture avoided with `rememberUpdatedState` when needed → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 273
    - `snapshotFlow { … }` collected from inside a `LaunchedEffect` for Compose-state → Flow conversions → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 274
    - `rememberCoroutineScope()` used only for event-driven work (button taps, gesture handlers); long-lived/keyed work lives in `LaunchedEffect` → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 275
    - navigation, snackbar, analytics, and repository calls live in event handlers or `LaunchedEffect`, never in the composition body → [side-effects](https://developer.android.com/develop/ui/compose/side-effects), [navigation](https://develope
  • Network accessline 276
    - image loading delegated to threading-aware loaders (Coil, Glide) via their Compose integration APIs (`AsyncImage`, `rememberAsyncImagePainter`) — these manage the threading contract correctly and are the accepted carve-out from "no IO in 
  • Network accessline 277
    - suspending UI / ViewModel paths preserve structured cancellation: broad catches and `runCatching` rethrow `CancellationException` before converting failures into UI state → [coroutines](https://developer.android.com/kotlin/coroutines/coro
  • Network accessline 278
    - `Animatable.animateTo(...)` / `snapTo(...)` driven from a `LaunchedEffect(key)` so the animation cancels on key change and on composition exit → [animation](https://developer.android.com/develop/ui/compose/animation/value-based), [side-ef
  • Network accessline 279
    - declarative targets use `animate*AsState` and leave coroutine management to Compose; manual `rememberCoroutineScope().launch { ... }` is reserved for event-driven or gesture-driven animation → [animation](https://developer.android.com/dev
  • Network accessline 283
    - launching threads, coroutines, navigation, or external work directly in composition → [side-effects](https://developer.android.com/develop/ui/compose/side-effects) - **strictly forbidden IO in a composable body** — never appears in compos
  • Network accessline 284
    - **strictly forbidden IO in a composable body** — never appears in composition regardless of how it is wrapped (`remember` does not redeem it, since the work still runs on the composition thread on first composition and on every key change
  • Network accessline 285
    - wrong effect API choice → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 286
    - incorrect or missing effect keys → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 287
    - stale captures in long-lived effects → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 288
    - empty or suspicious `onDispose` → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 289
    - listeners or observers registered without cleanup → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 290
    - `snapshotFlow { … }` invoked outside an effect, or used to compute values that `derivedStateOf` would handle more cheaply → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 291
    - `rememberCoroutineScope()` used to launch work that should live in a keyed `LaunchedEffect` (manual cancellation, lifecycle handling reinvented) → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 292
    - `derivedStateOf { a + b }`-style misuse where inputs change as often as outputs — pure overhead per the official guidance → [side-effects](https://developer.android.com/develop/ui/compose/side-effects)
  • Network accessline 293
    - `LaunchedEffect(Unit)` / `LaunchedEffect(true)` flagged only when the body captures parameter or state values that may change without being keyed or wrapped in `rememberUpdatedState`. The "run once on enter" pattern itself is idiomatic; d
  • Network accessline 294
    - `rememberUpdatedState` read eagerly inside `remember { ... }` and assigned to a captured local before invocation — the remembered object keeps the initial callback/value forever. Read the `State.value` at invocation time or key the rememb
  • Network accessline 295
    - `runCatching { ... }`, `catch (Exception)`, or `catch (Throwable)` around suspend calls without rethrowing `CancellationException` — cancellation is converted into an error state instead of propagating through the coroutine hierarchy → [c
  • Network accessline 296
    - `navController.navigate(...)` invoked from the composition body instead of an event handler or effect → [navigation](https://developer.android.com/develop/ui/compose/navigation)
  • Network accessline 297
    - `rememberCoroutineScope().launch { animatable.animateTo(target) }` where a `LaunchedEffect(target) { animatable.animateTo(target) }` would more clearly express target-driven animation — prefer `LaunchedEffect(target)` when restart semanti
  • Network accessline 298
    - `Animatable.animateTo(...)` invoked from the composition body (not from inside an effect) — runs on every recomposition and never cancels → [animation](https://developer.android.com/develop/ui/compose/animation/value-based), [side-effects
  • Network accessline 299
    - unconditional `lazyPagingItems.refresh()` / `retry()` from the composable body or bare `LaunchedEffect(Unit)` without a documented one-shot reason — initial load belongs to `PagingData`; refresh is user-driven → [paging compose](https://d
  • Network accessline 305
    When Nav3 is detected (see playbook section 2b), also deduct for: - `backStack.add` / `backStack.removeLastOrNull` called directly in the composition body instead of inside an event handler or `LaunchedEffect` — navigation fires on every re
  • Network accessline 306
    - `backStack.add` / `backStack.removeLastOrNull` called directly in the composition body instead of inside an event handler or `LaunchedEffect` — navigation fires on every recomposition → [Nav3](https://developer.android.com/guide/navigatio
  • Network accessline 307
    - Tap handler missing `dropUnlessResumed { backStack.add(...) }` — a queued tap can navigate from a screen already in exit animation, duplicating the back-stack entry → [Nav3](https://developer.android.com/guide/navigation/navigation-3)
  • Network accessline 322
    This category is lighter-touch for app repositories. Focus on shared internal components, UI kits, and reusable building blocks. The two authoritative sources are the [Compose API guidelines](https://developer.android.com/develop/ui/compose
  • Network accessline 326
    - reusable components expose `modifier: Modifier = Modifier` → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelines.md)
  • Network accessline 327
    - `modifier` is the first optional parameter and applied once as the first link in the chain on the root-most UI node → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-compon
  • Network accessline 328
    - parameter order is sensible: required, `modifier`, optional, trailing content lambda → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelines.md)
  • Network accessline 329
    - defaults are meaningful and not hidden behind nullable sentinel behavior; defaults exposed through a `ComponentDefaults` object → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/co
  • Network accessline 330
    - explicit parameters preferred over component-specific `CompositionLocal` indirection. `CompositionLocal` is appropriate for *tree-scoped* data with sensible defaults (theme tokens like `LocalContentColor`, `LocalTextStyle`); not appropria
  • Network accessline 331
    - components are focused and layered instead of multipurpose grab-bags → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelines.md)
  • Network accessline 332
    - slot APIs (`content: @Composable RowScope.() -> Unit`) used for flexible composition; receiver scopes (`RowScope`, `ColumnScope`, `BoxScope`) applied where they guide layout → [component API](https://android.googlesource.com/platform/fram
  • Network accessline 333
    - `Basic*` naming for unstyled / minimal variants alongside the opinionated public version (e.g. `BasicTextField` ↔ `TextField`) → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/com
  • Network accessline 334
    - distinct components for visual variants (`ContainedButton`, `OutlinedButton`, `TextButton`) instead of a single component with a `style` enum → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/c
  • Network accessline 335
    - `@Composable` functions are PascalCase and Unit-returning where they emit UI → [api-guidelines](https://developer.android.com/develop/ui/compose/api-guidelines)
  • Network accessline 336
    - UI-emitting composables either emit UI or report via callbacks/state holders, but do not also return handles or computed values → [api-guidelines](https://developer.android.com/develop/ui/compose/api-guidelines)
  • Network accessline 337
    - reusable content composables emit a cohesive root node, or explicitly declare a parent-layout scope when they intentionally emit multiple siblings → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-m
  • Network accessline 338
    - event callbacks are named and positioned as events (`onClick`, `onValueChange`) while trailing lambdas are reserved for composable content slots → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-mai
  • Network accessline 339
    - custom modifiers built with `Modifier.Node` rather than the discouraged `composed { }` factory → [custom modifiers](https://developer.android.com/develop/ui/compose/custom-modifiers)
  • Network accessline 340
    - `movableContentOf` / `movableContentWithReceiverOf` used to preserve slot-content lifecycle when content moves between containers → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/
  • Network accessline 341
    - reusable APIs prefer `value: T` (immediate read) or `value: () -> T` (deferred read) plus `onValueChange: (T) -> Unit` over `MutableState<T>` parameters → [component API](https://android.googlesource.com/platform/frameworks/support/+/andr
  • Network accessline 342
    - isolated components define `@Preview` configurations to prove they render stateless → [tooling](https://developer.android.com/develop/ui/compose/tooling/previews)
  • Network accessline 343
    - reusable animated components expose `animationSpec: AnimationSpec<T> = spring()` (or another appropriate default) when callers may reasonably need timing control, and use meaningful labels on shared/tooling-visible animations → [animation
  • Network accessline 347
    - shared components missing `modifier` → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelines.md)
  • Network accessline 348
    - multiple modifier params or modifier applied to the wrong child (anywhere other than the root-most emitted layout) → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-compone
  • Network accessline 349
    - hardcoded strings in UI elements (e.g. `Text("Share with friends")` instead of `stringResource(id = R.string...)`) which break i18n support and create brittle tests → [resources](https://developer.android.com/develop/ui/compose/resources)
  • Network accessline 350
    - hardcoded magic numbers like `.padding(12.dp)` or `.size(24.sp)` or explicit `Color(0xFF...)` instead of routing through `MaterialTheme` tokens or `dimensionResource`. A clean theme is vital for dark mode and accessibility → [theming](htt
  • Network accessline 351
    - no `@Preview` coverage for extracted UI chunks. If a component is reusable, it should have a preview proving it has no hidden ambient dependencies → [tooling](https://developer.android.com/develop/ui/compose/tooling/previews)
  • Network accessline 352
    - `modifier` with a non-no-op default like `Modifier.padding(8.dp)` (caller's modifier silently loses the padding) → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component
  • Network accessline 353
    - parameter ordering that makes APIs awkward or misleading → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelines.md)
  • Network accessline 354
    - nullable params used only as "use internal default" signals — expose the default explicitly via a `ComponentDefaults` object instead → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/do
  • Network accessline 355
    - passing raw network models, database entities, or complex domain objects directly into UI components instead of mapping them to stable, UI-specific presentation models (UiState). This leaks backend structure into the presentation tier, en
  • Network accessline 356
    - `MutableState<T>` or `State<T>` params in reusable APIs when avoidable; the official replacement is `value: T` or `value: () -> T` plus `onValueChange: (T) -> Unit` → [component API](https://android.googlesource.com/platform/frameworks/su
  • Network accessline 357
    - giant multipurpose components that should be split or wrapped → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelines.md)
  • Network accessline 358
    - UI-emitting composables that return non-`Unit` values or handles. Report state via callbacks / state holders; keep value-returning composables value-only → [api-guidelines](https://developer.android.com/develop/ui/compose/api-guidelines)
  • Network accessline 359
    - reusable content composables that emit multiple sibling roots without an explicit parent scope such as `RowScope` or `ColumnScope`; wrap in a cohesive root layout or make the scope contract explicit → [component API](https://android.googl
  • Network accessline 360
    - pure helpers marked `@Composable` even though they neither read composition data nor emit UI, or `@ReadOnlyComposable` applied to functions that emit UI / launch effects / mutate state → [api-guidelines](https://developer.android.com/deve
  • Network accessline 361
    - event callbacks placed as the trailing lambda so call sites read like content slots, or callbacks named as past-tense notifications when Compose-style `onXxx` event names would make the contract clearer → [component API](https://android.g
  • Network accessline 362
    - behavior added as parameters that should be modifiers (`onClick`, `clipToCircle`) → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelines.md)
  • Network accessline 363
    - style/configuration objects passed to a single component instead of distinct components per variant → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-component-api-guidelin
  • Network accessline 364
    - non-Compose lifecycles attached to composables — for example, an `onClick` callback on a layout component when `Modifier.clickable` would do → [component API](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/co
  • Network accessline 365
    - modifier ordering that quietly changes semantics in shared components (e.g. `Modifier.padding(...).clickable {}` extends the click region into the padding; `Modifier.clickable {}.padding(...)` does not). Flag when the choice looks acciden
  • Network accessline 366
    - hardcoded `dp`, `sp`, or explicit `Color` constructs in reusable components instead of using `MaterialTheme.colorScheme`, `MaterialTheme.typography`, or dimension resources; this destroys dark mode compliance and accessible font scaling →
  • Network accessline 367
    - `CompositionLocal` used for component-specific configuration (vs. truly tree-scoped data); ViewModels stored in `CompositionLocal`; locals with no sensible default → [compositionlocal](https://developer.android.com/develop/ui/compose/comp
  • Network accessline 368
    - custom modifiers built with `Modifier.composed { }` when `Modifier.Node` would do — `composed { }` is officially discouraged for performance → [custom modifiers](https://developer.android.com/develop/ui/compose/custom-modifiers)
  • Network accessline 369
    - `Scaffold { innerPadding -> ... }` content that does not apply `innerPadding` to its root child (or consume it via `consumeWindowInsets`) — content draws behind the `TopAppBar` / `BottomAppBar` / system bars → [component API](https://andr
  • Network accessline 370
    - highly reusable animated composables that hard-code `tween(N)` / specific `spring()` stiffness in the signature when callers would reasonably need control over timing — consider exposing `animationSpec: AnimationSpec<T>` instead → [animat
  • Network accessline 371
    - shared/tooling-visible `animate*AsState` / `updateTransition` call sites missing a meaningful `label` parameter — reduces clarity in Animation Preview and other Android Studio tooling; treat as a light deduction, not a hard failure → [ani

skills/jetpack-compose-audit/references/search-playbook.md

  • Network accessline 118
    - Evidence: theme file line, referenced resource, resolved drawable file, and missing/present `drawable-v31` override. - Fix direction: keep the same `@drawable/name` in the theme and make it resolve to an `<animated-vector>` on API 31+ tha
  • Network accessline 120
    - References: `https://developer.android.com/develop/ui/views/launch/splash-screen`, `https://developer.android.com/reference/androidx/core/splashscreen/SplashScreen`, and the platform issue `https://issuetracker.google.com/issues/520672537
  • Network accessline 446
    Severity: **Should-fix**, promoted to a **Critical Finding** when the loop is per-frame (resize/scroll/animation-driven) or spans reused lazy items. For shape 1, cite the writer's `file:line` and the reader's `file:line`. Docs: [phases](htt

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Signal confidence: 364 facts

and 314 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativeManifest .claude-plugin/marketplace.json.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md skills/compose-agent/SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md skills/compose-agent/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md skills/compose-agent/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md skills/compose-agent/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md skills/compose-agent/SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.