Agent skill

Understanding Stability Inference

by rosuH in rosuH/EasyWatermark

A skill your agent uses to explain why the Compose compiler classified a class or composable parameter as stable, runtime, unknown, or unstable.

Apache-2.0Auto-check passedMobile

Install Understanding Stability Inference

skills CLI
$ npx skills add rosuH/EasyWatermark --skill understanding-stability-inference -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install rosuH/EasyWatermark understanding-stability-inference --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/understanding-stability-inference .claude/skills/understanding-stability-inference && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
understanding-stability-inference
GitHub stars
1.9k
Used in
1 other repo
Token cost
~4.3k tokens
SKILL.md length
1,689 words
Files
3 (incl. references)
Skills in repo
28
Repo updated
First seen
Licence
Apache-2.0

At a glance

A skill your agent uses to explain why the Compose compiler classified a class or composable parameter as stable, runtime, unknown, or unstable.

  • Works in 12 steps: Phase 1 — primitive / String / function… → Phase 2 — type parameter substitution. → Phase 3 — nullable unwrap (Int? →… → …
  • Explain why the Compose compiler classified a class
  • SKILL.md covers When to use this skill, When NOT to use this skill, Prerequisites and Workflow — diagnostic question…, plus 6 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Understanding Stability Inference is an agent skill from rosuH/EasyWatermark. Use this skill to explain why the Compose compiler classified a class or composable parameter as stable, runtime, unknown, or unstable. Covers the 12-phase inference algorithm, the five compiler-level stability types (Certain / Runtime / Unknown / Parameter / Combined), the generic bitmask encoding (Pair=0b11, ImmutableList=0b1), the Known Stable Constructs registry, and the runtime $stable: Int field generated by @StabilityInferred. Use when the developer asks "why is X classified as Y?", when a stability report…

Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/bitmask-encoding.md` and `references/twelve-phase-algorithm.md`).

It sits in Mobile. The repository describes itself as: 🔒 🖼 Securely, easily add a watermark to your sensitive photos. 安全、简单地为你的敏感照片添加水印,防止被人泄露、利用. The licence is Apache-2.0.

When your agent uses it

  • Explain why the Compose compiler classified a class
  • Composable parameter as stable
  • The developer asks why is X classified as Y?
  • A stability report shows a surprising runtime stable

Example prompts

  • “why is X classified as Y?”
  • “the compiler thinks my class is unstable but it looks fine”
  • “/understanding-stability-inference”

Workflow steps

12 steps, taken from the first numbered list in SKILL.md.

  1. Phase 1 — primitive / String / function / Unit fast path → Stable.
  2. Phase 2 — type parameter substitution.
  3. Phase 3 — nullable unwrap (Int? → analyze Int).
  4. Phase 4 — inline class — check underlying type.
  5. Phase 5 — cycle detection (recursive trees → conservative UNSTABLE).
  6. Phase 6 — annotations check (@Stable, @Immutable, @StableMarker).
  7. Phase 7 — Known Stable Constructs registry hit (Pair / Triple / Result / ImmutableList / dagger.Lazy / ClosedRange / etc.).
  8. Phase 8 — external configuration match (stability_config.conf).
  9. Phase 9 — external module (@StabilityInferred annotation generated by separate compilation).
  10. Phase 10 — Java type (default UNSTABLE — fix via config file).
  11. Phase 11 — interface (UNKNOWN; runtime ===).
  12. Phase 12 — field-by-field analysis (the slow path)

What it can do on your machine

Read from SKILL.md and the folder at commit 61223db. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are kotlin).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • developer.android.com
    • medium.com
    • github.com
    • chrisbanes.me

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Understanding Stability Inference loads about 4.3k tokens when it runs, and up to ~9.4k if it reads all its reference files. Until then it costs about 215 tokens; SKILL.md has 1,689 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~215
When it runs · the whole SKILL.md, loaded when a task matches
~4.3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~9.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from rosuH/EasyWatermark at commit 61223db, republished under its Apache-2.0 licence (© rosuH). 1,689 words, ~4,269 tokens.

Download SKILL.mdSave it as .claude/skills/understanding-stability-inference/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
understanding-stability-inference
description
Use this skill to explain why the Compose compiler classified a class or composable parameter as stable, runtime, unknown, or unstable. Covers the 12-phase inference algorithm, the five compiler-level stability types (Certain / Runtime / Unknown / Parameter / Combined), the generic bitmask encoding (Pair=0b11, ImmutableList=0b1), the Known Stable Constructs registry, and the runtime `$stable: Int` field generated by `@StabilityInferred`. Use when the developer asks "why is X classified as Y?", when a stability report shows a surprising `runtime stable`, `unknown`, or `unstable` verdict, when generics, inheritance, cycles, interfaces, or cross-module classes are involved, or when the user mentions `$stable`, `@StabilityInferred`, separate compilation, or "the compiler thinks my class is unstable but it looks fine".
license
Apache-2.0. See LICENSE for complete terms.
metadata.author
Jaewoong Eum (skydoves)
metadata.keywords
jetpack-compose, performance, stability, stability-inference, compose-compiler, runtime-stability, stability-inferred, generics-stability…

Understanding Stability Inference — read the compiler's mind

Stability is decided by a 12-phase algorithm baked into the Compose compiler. This skill teaches Claude how the algorithm walks a type so it can explain why a report says what it says, and predict classifications before the report is even generated. Pair this with ../diagnosing-compose-stability/SKILL.md (which generates the report) and ../stabilizing-compose-types/SKILL.md (which fixes obvious unstable types). Reach for this skill when the simpler skills produce a verdict that surprises the developer.

When to use this skill

  • The developer asks "why is Foo classified as runtime stable and not stable?"
  • A report shows runtime or unknown for a class that "looks fine".
  • Generics involved: Box<T>, Wrapper<A, B>, Pair<String, Int>, ImmutableList<User>.
  • The class lives in another module and ships as a .class/.kotlin_metadata artifact.
  • The developer asks about the $stable: Int field, @StabilityInferred, or cross-module classification.
  • A self-referential type (class Node(val children: List<Node>)) is unstable for non-obvious reasons.
  • A Java type, an interface, or an abstract base appears in a parameter list and surprises the developer.

When NOT to use this skill

  • The fix is mechanical (var → val, List → ImmutableList, Flow parameter removal). Use ../stabilizing-compose-types/SKILL.md.
  • No report exists yet. Run ../diagnosing-compose-stability/SKILL.md first.
  • The developer wants CI enforcement of stability. Use ../enforcing-stability-in-ci/SKILL.md.

Prerequisites

  • Compose Compiler reports already generated, or at least one <module>-classes.txt and <module>-composables.txt available in build/compose_compiler/.
  • The developer understands the basic stability vocabulary: stable, unstable, skippable, restartable, @Stable, @Immutable.
  • Kotlin 2.0+ with the Compose compiler plugin (Strong Skipping default ON).

Workflow — diagnostic question and answer tree

Walk the type through the same 12 phases the compiler does. For each call site, ask the questions in order; the first matching phase wins.

The canonical phase order (used everywhere in this skill and matching references/twelve-phase-algorithm.md):

  1. Phase 1 — primitive / String / function / Unit fast path → Stable. The compiler returns immediately. No field analysis runs. Mention the fast path so the developer knows nothing else was inspected.
  2. Phase 2 — type parameter substitution. A bare type variable T becomes Stability.Parameter(T); resolution is deferred to the call site that substitutes it.
  3. Phase 3 — nullable unwrap (Int? → analyze Int). Nullability does not change stability; the algorithm strips the ? and recurses.
  4. Phase 4 — inline class — check underlying type. value class Wrapper(val raw: T) is exactly as stable as T.
  5. Phase 5 — cycle detection (recursive trees → conservative UNSTABLE). The algorithm bails on cycles to guarantee termination. The escape hatch is @Stable/@Immutable on the recursive class, which fires in phase 6 before phase 5 is reached.
  6. Phase 6 — annotations check (@Stable, @Immutable, @StableMarker). Yes → Stability.Certain (stable). @Immutable enables additional optimizations beyond @Stable because the compiler can promote reads of properties to static expressions and elide equality checks; @Stable only promises change notification.
  7. Phase 7 — Known Stable Constructs registry hit (Pair / Triple / Result / ImmutableList / dagger.Lazy / ClosedRange / etc.). Returns Stability.Parameter with the registry's bitmask. See references/bitmask-encoding.md for the full registry.
  8. Phase 8 — external configuration match (stability_config.conf). Returns Stability.Parameter with the bitmask declared in the config file.
  9. Phase 9 — external module (@StabilityInferred annotation generated by separate compilation). Returns Stability.Runtime. The compiler emits a $stable: Int field on the JVM (a mangled top-level property on Native/JS) that the runtime queries via Composer.changed. Tell the developer this is not a bug — runtime is the compiler saying "I cannot prove this at compile time, so I will check at runtime".
  10. Phase 10 — Java type (default UNSTABLE — fix via config file). Java final fields look like var to the inference because the algorithm has no Kotlin metadata to read. Fix via stabilityConfigurationFiles, not by editing the Java source.
  11. Phase 11 — interface (UNKNOWN; runtime ===). The compiler cannot enumerate implementations from a single call site; the runtime falls back to identity (===) for the equality probe.
  12. Phase 12 — field-by-field analysis (the slow path):
    • Walks the linearized class hierarchy so inherited fields participate. There is no separate "inheritance" phase — inheritance lives here.
    • Any var property → Unstable (mutation observed without Snapshot integration).
    • Any property whose type is Unstable → Unstable (Combined dominates).
    • Otherwise the class is Stable (Combined of all-stable fields collapses to Stable).

For full pseudocode of all 12 phases plus the field-by-field loop, see references/twelve-phase-algorithm.md.

Patterns

Pattern: "Why does Box<String> show as runtime stable?"
kotlin
// Source — the developer's class, in a library module
class Box<T>(val value: T)

// Call site, in app module
@Composable fun BoxRow(box: Box<String>) { Text(box.value) }

The compiler walks Box<T>:

  1. Phase 12 (field-by-field) inside the defining module finds one field value: T; recursion on T hits phase 2 (type parameter) → Stability.Parameter. Combined collapses to Stability.Parameter with bitmask 0b1 (the single type parameter affects stability).
  2. Because Box is consumed from a different module, the compiler emits @StabilityInferred(parameters = 0b1) on Box and a $stable: Int field initialized from T's stability at runtime. Downstream call sites pick this up via phase 9.
  3. Call-site substitution → T = String → String is Certain Stable → bit 0 satisfied.
  4. Final report line: runtime stable class Box<T> and at the call site BoxRow is skippable.
kotlin
// WRONG mental model
// "runtime stable means there is a runtime cost on every recomposition" — partly true but misleading
// WRONG because: the cost is one Int field load and a bitwise AND, performed once when the runtime
// computes the call-site stability. It is far cheaper than the unskipped recomposition it prevents.
kotlin
// RIGHT mental model
// runtime stable = "the compiler proved stability conditional on the type arguments, and emitted
// a $stable: Int field whose bits the runtime ANDs against the substituted argument stabilities".
// The skip decision is still made; it is just made at runtime instead of compile time.
Pattern: "Why does @Immutable data class Person(val name: String) enable more optimizations than @Stable?"

@Stable is a contract: "I will notify Compose of changes". @Immutable is a stronger contract: "I will never change". With @Immutable the compiler may promote reads of Person.name to static expressions and elide equality probes for nested usages; with @Stable it must still emit equality checks. Both classify as Stability.Certain, but the downstream optimizer treats @Immutable more aggressively.

kotlin
// WRONG
@Stable data class Coordinates(val lat: Double, val lng: Double)
// WRONG because: Coordinates never mutates after construction. @Stable understates the contract
// and forfeits static-expression promotion at every read site.
kotlin
// RIGHT
@Immutable data class Coordinates(val lat: Double, val lng: Double)
Pattern: "Why is my recursive tree unstable even though it looks fine?"
kotlin
data class Node(val id: String, val children: List<Node>)

Phase 5 (cycle detection) bails. The compiler does not attempt fixed-point analysis because it would have to assume the answer to prove the answer. The conservative verdict is Unstable. Even if every field is otherwise stable, the recursion through children returns Unstable to the parent call.

kotlin
// WRONG — adds @Stable to "force" stability
@Stable data class Node(val id: String, val children: List<Node>)
// WRONG because: List<Node> is a mutable interface backed by ArrayList in practice. The @Stable
// annotation tells the compiler to trust the contract, but the actual List instance can mutate
// between recompositions without notifying Compose, producing silent missed recompositions.
kotlin
// RIGHT
import kotlinx.collections.immutable.ImmutableList
@Immutable data class Node(val id: String, val children: ImmutableList<Node>)

ImmutableList is in the Known Stable Constructs registry (phase 7) with bitmask 0b1, so the recursion through children is permitted: cycle detection still triggers in phase 5, but the registry hit short-circuits the conservative verdict.

Pattern: "Why does Set<String> block skipping but ImmutableSet<String> doesn't?"

kotlin.collections.Set is an interface (phase 11 → Unknown) backed in practice by LinkedHashSet, which mutates. kotlinx.collections.immutable.ImmutableSet is in the Known Stable Constructs registry with bitmask 0b1, so it is Stability.Parameter and resolves to stable when the element type is stable.

kotlin
// WRONG
@Composable fun TagRow(tags: Set<String>) { /* ... */ }
// WRONG because: Set is an interface — phase 11 returns Unknown, the call site is non-skippable.
kotlin
// RIGHT
@Composable fun TagRow(tags: ImmutableSet<String>) { /* ... */ }
Show full SKILL.md (673 more words)Show less
Pattern: "Why is a class from another module runtime stable even when it has only vals?"

Separate compilation. At the time the call site compiles, the compiler does not have the full source AST of the dependency, only its .class files plus the metadata in @StabilityInferred(parameters = ...). Phase 9 reads that annotation; the runtime resolves the bitmask against actual type arguments via the generated $stable: Int field. The classification is correct — there is no extra work to do — but it must be deferred to runtime because cross-module compile-time analysis is impossible without the source.

Five compiler-level stability types

Cite these by name when answering "why" questions. The compiler stores stability as one of:

  • Stability.Certain — primitives, String, Unit, function types, enums, @Stable/@Immutable-annotated classes. Decision is final and compile-time.
  • Stability.Runtime — separately compiled class. Compile-time emits a $stable: Int field and @StabilityInferred; runtime ANDs the bits against actual type arguments.
  • Stability.Unknown — interface, abstract class without concrete analysis, or anything the compiler refuses to commit on. Runtime falls back to === identity for the equality probe.
  • Stability.Parameter — generic. Stability is a function of the type arguments via a bitmask.
  • Stability.Combined — aggregate of multiple components (fields of a class, or multiple type arguments). Unstable dominates — any single Unstable component poisons the whole.

Bitmask encoding (preview)

Container<T1, T2, T3> uses an Int bitmask where bit i set means Ti participates in stability:

TypeBitmaskReading
kotlin.Pair<A, B>0b11both A and B affect stability
kotlin.Triple<A, B, C>0b111all three affect stability
kotlinx.collections.immutable.ImmutableList<E>0b1only E affects stability
java.math.BigInteger0b0no parameters; classified as stable regardless of erased type arguments

The full rules — including how @StabilityInferred(parameters = ...) is generated for separately-compiled types and how the $stable: Int field is laid out on the JVM versus the mangled top-level property used on Kotlin/Native and Kotlin/JS — are in references/bitmask-encoding.md.

Mandatory rules

  • MUST teach the developer that runtime stable is not a bug or an unstable verdict — it is the compiler's way of saying "stability is conditional on type arguments and will be checked once at runtime via the $stable: Int field".
  • MUST NOT suggest structural changes (changing var to val, swapping collection types) before explaining why the current structure is unstable. Diagnosis before treatment.
  • MUST distinguish Stability.Unknown from Stability.Unstable when answering — Unknown means "cannot tell" and falls back to identity equality, Unstable means "proven unstable" and disables skipping outright.
  • MUST NOT tell the developer to add @Stable to a type whose contract they cannot guarantee. A stability annotation is a contract; breaking it produces silent missed recompositions, which is worse than a non-skippable composable.
  • PREFERRED: cite the Kotlin compiler source when depth helps. Concrete files: Stability.kt (the algebraic data type), KnownStableConstructs.kt (the registry), ClassStabilityTransformer.kt (the $stable field emission), and StabilityConfigParser.kt (the config-file reader).
  • PREFERRED: when explaining a generic, walk the bitmask explicitly: "bit 0 of Pair's bitmask is set, A=String is Certain Stable, satisfied; bit 1 is set, B=List is Unstable, fails — Combined collapses to Unstable".

Verification

  • Claude can predict, before running the report, whether a candidate type will be classified Certain, Runtime, Unknown, Parameter, or Combined.
  • Claude can name which of the 12 phases produced the verdict.
  • For a runtime stable class, Claude can explain that the compiler emitted @StabilityInferred(parameters = ...) on the class declaration and a $stable: Int field that the runtime ANDs against substituted type-argument stabilities.
  • Claude refuses to recommend @Stable or @Immutable on a type whose mutation contract is not guaranteed.
  • Claude correctly identifies Set<T>, List<T>, Map<K, V> as Unknown interfaces (not Unstable) when explaining why they block skipping.

References

Reference files
  • references/twelve-phase-algorithm.md — pseudocode walkthrough of all 12 phases plus the field-by-field analysis pseudocode.
  • references/bitmask-encoding.md — generic stability bitmask rules, the Known Stable Constructs registry, the @StabilityInferred(parameters = 0b1) annotation generated by the compiler, the runtime $stable: Int field on JVM, and the mangled top-level property approach on Native and JS.

© rosuH, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 2 other files (references) in .agents/skills/understanding-stability-inference of rosuH/EasyWatermark.

  • SKILL.md
  • references/bitmask-encoding.md
  • references/twelve-phase-algorithm.md

Open the folder on GitHubat commit 61223db

Used in 1 other repository

We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in rosuH/EasyWatermark, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Understanding Stability Inference next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Understanding Stability Inference compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Understanding Stability Inference this skillrosuH/EasyWatermark1.9k1 repos~4.3kAutomated safety check: PassApache-2.0
React Native Best Practicesvercel-labs/openreview1.7k17 repos~1.1kAutomated safety check: PassMIT
Swiftui Protwostraws/SwiftUI-Agent-Skill5.1k2 repos~1.5kAutomated safety check: PassMIT
Kortix Brandkortix-ai/suna20k—~4kAutomated safety check: PassCustom licence
Ip As LogoKartikLabhshetwar/better-shot2.4k1 repos~4.3kAutomated safety check: PassMIT
Compose Multiplatform Patternsmonta-app/ocpp-emulator1805 repos~2kAutomated safety check: PassApache-2.0

Similar skills

  • React Native Best Practices

    vercel-labs/openreview

    Official

    A prioritized rule set for React Native and Expo apps covering list performance, animation, navigation, UI patterns, state, rendering, monorepos and configuration.

    1.7k GitHub starsUsed in 17 repos~1.1k tokens
    MobileAuto-check passed
  • Swiftui Pro

    twostraws/SwiftUI-Agent-Skill

    Comprehensively reviews SwiftUI code for best practices on modern APIs, maintainability, and performance.

    5.1k GitHub starsUsed in 2 repos~1.5k tokens
    MobileAuto-check passed
  • Kortix Brand

    kortix-ai/suna

    Load FIRST for anything that carries the Kortix look or voice: product or mobile UI, copy of any kind, decks, social, images, email, CLI output, anything with the logo, and reviews of these.

    20k GitHub stars~4k tokensUpdated today
    MobileAuto-check passed
  • Ip As Logo

    KartikLabhshetwar/better-shot

    Generate extremely simple, cute, personified square character images with rounded heavy forms, two purposeful character colors, one solid background color, and a dominant lower-corner composition.

    2.4k GitHub starsUsed in 1 repo~4.3k tokens
    MobileAuto-check passed
  • Compose Multiplatform Patterns

    monta-app/ocpp-emulator

    Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI.

    180 GitHub starsUsed in 5 repos~2k tokens
    MobileAuto-check passed
  • Aso Appstore Screenshots

    adamlyttleapps/claude-skill-aso-appstore-screenshots

    Generate high-converting App Store screenshots by analyzing your app's codebase, discovering core benefits, and creating ASO-optimized screenshot images using Nano Banana Pro.

    1.8k GitHub starsUsed in 1 repo~9.6k tokens
    MobileAuto-check passed

More from rosuH/EasyWatermark

All 28 skills in this repo
  • Deferring State Reads

    rosuH/EasyWatermark

    A skill your agent uses to push frequently-changing Jetpack Compose state reads (scroll position, animation values, drag offsets) out of the Composition phase and down into Layout or Draw using…

    1.9k GitHub starsUsed in 1 repo~3.8k tokens
    Auto-check passed
  • Diagnosing Compose Stability

    rosuH/EasyWatermark

    A skill your agent uses to diagnose Jetpack Compose stability problems by enabling and reading the Compose Compiler Reports (classes.txt, composables.txt, composables.csv, module.json).

    1.9k GitHub starsUsed in 1 repo~3.3k tokens
    Auto-check passed
  • Generating Baseline Profiles

    rosuH/EasyWatermark

    A skill your agent uses to generate and measure Jetpack Compose Baseline Profiles end-to-end with the AGP 8.2+ Baseline Profile Generator module and the Macrobenchmark harness.

    1.9k GitHub starsUsed in 1 repo~5k tokens
    Auto-check passed
  • Migrating To Modifier Node

    rosuH/EasyWatermark

    A skill your agent uses to author new custom Jetpack Compose modifiers and migrate legacy ones from Modifier.composed { } to Modifier.Node + ModifierNodeElement<T.

    1.9k GitHub starsUsed in 1 repo~5k tokens
    Auto-check passed
  • ML Kit Genai Prompt API

    rosuH/EasyWatermark

    Analyzes Android codebases to implement ML Kit GenAI Prompt API.

    1.9k GitHub starsUsed in 1 repo~1k tokens
    Auto-check passed
  • Stabilizing Compose Types

    rosuH/EasyWatermark

    A skill your agent uses to fix unstable Jetpack Compose types once a stability diagnosis has identified them.

    1.9k GitHub starsUsed in 1 repo~4.4k tokens
    Auto-check passed

Categories

Questions about Understanding Stability Inference

What does Understanding Stability Inference do?

A skill your agent uses to explain why the Compose compiler classified a class or composable parameter as stable, runtime, unknown, or unstable. Understanding Stability Inference is an agent skill from rosuH/EasyWatermark. Use this skill to explain why the Compose compiler classified a class or composable parameter as stable, runtime, unknown, or unstable.

When should I use Understanding Stability Inference?

Understanding Stability Inference fits situations like: explain why the Compose compiler classified a class; composable parameter as stable; the developer asks why is X classified as Y?; A stability report shows a surprising runtime stable.

How do I install Understanding Stability Inference in Claude Code?

Run `npx skills add rosuH/EasyWatermark --skill understanding-stability-inference -a claude-code`. Or copy the skill folder (.agents/skills/understanding-stability-inference in rosuH/EasyWatermark) into .claude/skills/understanding-stability-inference in your project. Claude Code loads it when a task matches its description.

How do I install Understanding Stability Inference in Codex?

Run `npx skills add rosuH/EasyWatermark --skill understanding-stability-inference -a codex`. Or copy the skill folder (.agents/skills/understanding-stability-inference in rosuH/EasyWatermark) into .agents/skills/understanding-stability-inference in your project. Codex loads it when a task matches its description.

Can I use Understanding Stability Inference in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add rosuH/EasyWatermark --skill understanding-stability-inference -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/understanding-stability-inference, .gemini/skills/understanding-stability-inference, .github/skills/understanding-stability-inference and .opencode/skills/understanding-stability-inference in your project.

What does Understanding Stability Inference need to run?

SKILL.md names no scripts, command-line tools or credentials: Understanding Stability Inference is instructions for the agent only.

Does Understanding Stability Inference access the network?

SKILL.md names 4 domains. As links in the text: developer.android.com, medium.com, github.com and chrisbanes.me. This is read from the text; nothing was executed.

Is Understanding Stability Inference safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Understanding Stability Inference use?

Understanding Stability Inference is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Understanding Stability Inference use?

About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 5.1k tokens, read only when the agent opens those files.

What are the alternatives to Understanding Stability Inference?

Skills that share tags, products or a category with Understanding Stability Inference: React Native Best Practices (vercel-labs/openreview, 1.7k stars), Swiftui Pro (twostraws/SwiftUI-Agent-Skill, 5.1k stars), Kortix Brand (kortix-ai/suna, 20k stars) and Ip As Logo (KartikLabhshetwar/better-shot, 2.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Understanding Stability Inference?

rosuH (a GitHub user) maintains it in rosuH/EasyWatermark, which has 1,894 GitHub stars. The repository holds 28 skills in this directory. The repository was last updated on October 6, 2026.

Source: rosuH/EasyWatermark on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.