Skip to content

chore(deps): update stabilityanalyzer to v0.10.0#208

Open
renovate[bot] wants to merge 1 commit into
developfrom
renovate/stabilityanalyzer
Open

chore(deps): update stabilityanalyzer to v0.10.0#208
renovate[bot] wants to merge 1 commit into
developfrom
renovate/stabilityanalyzer

Conversation

@renovate

@renovate renovate Bot commented May 29, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Age Confidence
com.github.skydoves.compose.stability.analyzer 0.6.40.10.0 age confidence

Release Notes

skydoves/compose-stability-analyzer (com.github.skydoves.compose.stability.analyzer)

v0.10.0

Compare Source

Added
  • Stability Doctor (IDE plugin) — a ranked, quantified "what to fix first" list that combines the static stability verdict, the downstream cascade blast radius, and measured runtime waste (Reality Check) into prioritized prescriptions. Scores are ESTIMATED (static only, works with no device) or MEASURED (backed by live heatmap data; measured waste always outranks estimates). Each prescription shows its problem parameters with static reasons, runtime grades, and value provenance, plus one-click fixes: change varval (aborts if write usages exist), annotate with @Immutable/@Stable, add the type to the stability configuration file, and wrap call-site arguments in remember(keys) { ... } for silent-waste parameters (guarded by conservative safety rules and a preview dialog). New Doctor tool-window tab, Code → Run Stability Doctor action, and a settings group.
  • Trace-All mode (Gradle + compiler + runtime) — opt-in module-wide auto-instrumentation: every restartable composable is traced as if it carried @TraceRecomposition, so the Live Heatmap, Reality Check, and Stability Doctor get module-wide runtime data without manual annotations.
    composeStabilityAnalyzer {
      traceAll {
        enabled.set(true)             // default: false (opt-in)
        threshold.set(2)              // default: 2 — skips the initial-composition burst
        variants.set(listOf("debug")) // default: ["debug"]; never applies to tests
      }
    }
    Explicit @TraceRecomposition annotations keep their own tag/threshold; previews, inline/readonly/non-restartable composables, and property getters are excluded automatically.
  • Fully qualified names in recomposition logs — log headers now carry trailing (fq: com.example.UserProfile) and (auto) tokens (backward compatible with older parsers), so the IDE attributes runtime data precisely even when composables share a simple name across packages. RecompositionEvent gains additive fqName and isAutoTraced fields.
Fixed
  • Android Studio freeze when starting the heatmap on large projects (#​168) — the typealias-resolution fallback iterated and parsed every Kotlin file in the project, and the heatmap inlay refresh ran analysis on the EDT. Lookups now use stub indexes, and the refresh computes on a background thread (the EDT only applies inlay mutations).
  • AGP 9 no longer leaks to consumers (#​165, thanks to @​valeriopilo-tomtom) — the Gradle plugin depends on gradle-api as compileOnly and isolates all AGP types behind an Android-only registrar, so KMP/JVM projects without AGP work and AGP 8.x projects no longer get AGP 9 on their buildscript classpath.
  • Nullable types now match the stability configuration file (#​166, thanks to @​xplayerCZ) — kotlinx.datetime.LocalTime? matches a kotlinx.datetime.LocalTime config entry.
Changed
  • Runtime disabled-path hardening — with ComposeStabilityAnalyzer.setEnabled(false), trackers allocate nothing (early exits before any event construction); the tracker cache is thread-safe and keyed by fully qualified name to avoid cross-package collisions.

v0.9.0

Compare Source

Added
  • ParameterStability.UNKNOWN — a fourth stability value for types whose stability cannot be determined statically (interfaces and non-final classes). Mirrors the Compose 2.4.0 compiler's Stability.Unknown.
Changed
  • Bumped Kotlin to 2.4.0 (from 2.3.21). The compiler plugin, runtime, Gradle plugin, Lint rules, and IntelliJ plugin all build against Kotlin 2.4.0.
    • K2 FIR extension registration migrated off the removed IntelliJ ProjectExtensionDescriptor mechanism (KT-83341); the deprecated IrPluginContext.referenceClass/referenceFunctions were replaced with the finderForSource API.
  • New UNKNOWN stability ruleinterfaces and non-final (open/abstract) classes now report UNKNOWN instead of RUNTIME/UNSTABLE, matching the Compose 2.4.0 compiler. This includes any kotlin.Any? parameter (since Any is open). Skippability is unchanged (these types were already non-skippable), but the rule will produce diffs in committed .stability baselines — run ./gradlew stabilityDump to refresh them. A STABLE → UNKNOWN transition is reported as a regression by stabilityCheck.

v0.8.0

Compare Source

Added
  • Stability Reality Check (IDE plugin) — reconciles the compiler's static stability prediction with live runtime recomposition data and grades each parameter as confirmed / false alarm / silent waste / justified. It surfaces the strong-skipping gap: a parameter flagged "unstable" that actually skips fine at runtime (false alarm) versus one that recomposes on a fresh-but-equals-equal instance every frame (silent waste). Grades appear in editor inlays, hover tooltips (predicted vs. actual), and a new Reality tool-window tab with a wasted-recomposition tally.
  • Recomposition Blame (IDE plugin + runtime) — traces a recomposition back to its cause in two ways:
    • State write-site (runtime, Android/JVM): with @TraceRecomposition(traceStates = true), a Compose Snapshot write observer records where each internal state was mutated, e.g. [state] counter: Int changed (0 → 1) ← onClick (Screen.kt:42).
    • Parameter provenance (IDE): right-click a @ComposableBlame this Recomposition to walk the reverse call graph and see where each argument's value originates, in a new Blame tool-window tab.
  • ParameterChange.referenceChanged (runtime API) — distinguishes an equals-equal value delivered as a new instance (a strong-skipping === miss) from a genuine value change; this powers the Reality Check.
Changed
  • stability-runtime now declares a compileOnly dependency on the Compose runtime for its Android/JVM source sets (used only by the state-write observer); all other Kotlin Multiplatform targets remain Compose-free via no-op actuals.
  • Kotlin remains 2.3.21.

v0.7.5

Compare Source

Added
  • allowIncrementalDisabling configuration switch (Issue #​156, #​158)
    • New stabilityValidation.allowIncrementalDisabling property (default: true) to control whether the plugin may disable Kotlin's incremental compilation when stability validation tasks are in the build graph
    • Set to false to opt out and keep incremental compilation enabled even when running stabilityDump/stabilityCheck
Changed
  • Bumped Kotlin to 2.3.21 along with related toolchain upgrades:
    • Compose BOM 2026.04.01, Android Gradle Plugin 8.13.2, Lint API 32.1.1
    • Dokka 2.2.0, kotlinx.serialization 1.11.0, Spotless 7.0.2, Nexus publish plugin 0.36.0, androidx Activity 1.13.0, runtime annotation 1.11.0
  • Per-compilation stability output directory (#​154) — each KotlinCompile-dependent task now writes to a dedicated build/stability/<name>/ directory to prevent cross-variant clobbering. Consumers (Stability Explorer, stabilityDump/stabilityCheck) read from both the new and legacy layouts for backward compatibility.
Fixed
  • Incremental compilation now disabled when stability tasks run (Issue #​156, #​157) — Kotlin's incremental compiler could skip recompiling files when dependency changes were binary-compatible, even though stability could still change (e.g. valvar). The plugin now disables incremental compilation while stabilityDump/stabilityCheck are in the task graph so stability results stay accurate (can be opted out via allowIncrementalDisabling).

v0.7.4

Compare Source

Added
  • Recomposition Profiler: Timing measurement (Issue #​89)
    • @TraceRecomposition now measures composable recomposition duration via System.nanoTime() IR injection
    • Duration displayed in logcat output: [Recomposition #&#8203;3] UserCard (2.30ms)
    • Compiler plugin wraps composable body in try-finally for accurate timing even on exceptions
    • RecompositionEvent.durationNanos field added for custom logger consumption
    • KMP-compatible via expect/actual currentNanoTime() (Android/JVM supported, other platforms gracefully skip)
  • Heatmap Tooltip — Hover over recomposition count inlay in the editor to see:
    • Last recomposition duration
    • Parameter changes with old/new values
    • State changes with old/new values
    • Unstable parameter summary
    • Cumulative total recomposition count and duration
  • Heatmap logcat parser updates — Parses [param] and [state] prefixed lines and duration from log output
Changed
  • Shadow plugin upgraded to 9.0.0-beta12 for Gradle 9.x compatibility (plugin ID changed from com.github.johnrengelman.shadow to com.gradleup.shadow)

v0.7.3

Compare Source

Added
  • Stability configuration file support for stabilityDump (Issue #​130, PR #​105)
    • stabilityConfigurationFiles now applies to both stabilityDump and stabilityCheck tasks
    • Types matching configuration patterns are overridden to STABLE in the baseline file
    • Composable skippable flag is recalculated based on resolved parameter stability
  • unstableOnly option for stability baseline (Issue #​128)
    • New unstableOnly option: when enabled, only unstable composables are included in the baseline file
    • Reduces baseline file size in large projects and focuses on stability issues
  • New composable diff now includes parameter-level stability details (PR #​105)
    • stabilityCheck output for new composables shows each parameter's stability status
  • Internal state change tracking for @TraceRecomposition (Issue #​89)
    • New traceStates annotation parameter: @TraceRecomposition(traceStates = true)
    • Tracks mutableStateOf, mutableIntStateOf, derivedStateOf and other Compose state changes
    • Compiler plugin detects delegated state variables via IrLocalDelegatedProperty IR analysis
    • Logs state changes with [state] prefix, parameter changes with [param] prefix
    • Only changed states are logged to reduce noise
Fixed
  • ignoredPackages now consistently respected during stabilityCheck (Issue #​129)
    • Previously, composables in ignored packages were excluded from stabilityDump but still detected as "new composable" during stabilityCheck
    • Now both tasks apply the same package/class filtering
  • @Optional annotation added to stabilityConfigurationFiles task input (PR #​105)
    • Prevents Gradle task validation failure when configuration files are not set
  • ADB not found on Windows (Issue #​139)
    • Fixed adb.exe detection on Windows for the Heatmap feature
    • Added Windows default SDK path (%LOCALAPPDATA%\Android\Sdk)
    • Uses where command instead of which on Windows for PATH lookup
Changed
  • Tool window actions always visible — Toggle Heatmap, Clear Data, Settings, and GitHub icons moved from hover-only title bar to content toolbar across all tabs
  • Tool window icon updated — Changed from monochrome gray to blue color matching the plugin icon
  • Stability comparison logic extracted to StabilityComparison.kt (PR #​105)
  • Stability configuration parser added as StabilityConfigParser.kt (PR #​105)

v0.7.2

Compare Source

[0.7.2] - 2026-04-02

Added
  • Stability configuration file support for stabilityDump (Issue #​130, PR #​105)
    • stabilityConfigurationFiles now applies to both stabilityDump and stabilityCheck tasks
    • Types matching configuration patterns are overridden to STABLE in the baseline file
    • Composable skippable flag is recalculated based on resolved parameter stability
  • unstableOnly option for stability baseline (Issue #​128)
    • New unstableOnly option: when enabled, only unstable composables are included in the baseline file
    • Reduces baseline file size in large projects and focuses on stability issues
  • New composable diff now includes parameter-level stability details (PR #​105)
    • stabilityCheck output for new composables shows each parameter's stability status
Fixed
  • ignoredPackages now consistently respected during stabilityCheck (Issue #​129)
    • Previously, composables in ignored packages were excluded from stabilityDump but still detected as "new composable" during stabilityCheck
    • Now both tasks apply the same package/class filtering
  • @Optional annotation added to stabilityConfigurationFiles task input (PR #​105)
    • Prevents Gradle task validation failure when configuration files are not set
  • ADB not found on Windows (Issue #​139)
    • Fixed adb.exe detection on Windows for the Heatmap feature
    • Added Windows default SDK path (%LOCALAPPDATA%\Android\Sdk)
    • Uses where command instead of which on Windows for PATH lookup
Changed
  • Tool window actions always visible — Toggle Heatmap, Clear Data, Settings, and GitHub icons moved from hover-only title bar to content toolbar across all tabs
  • Tool window icon updated — Changed from monochrome gray to blue color matching the plugin icon
  • Stability comparison logic extracted to StabilityComparison.kt (PR #​105)
  • Stability configuration parser added as StabilityConfigParser.kt (PR #​105)

v0.7.1

Compare Source

Fixed
  • Fixed Kotlin 2.3.20 compatibility (Issue #​133)
    • Resolved NoSuchMethodError for IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB and DEFINED constants
    • Used reflection-based origin lookups to support Kotlin's changed return types in 2.3.20
    • Migrated ComposableStabilityChecker from FirSimpleFunctionChecker to FirCallableDeclarationChecker to handle FirSimpleFunctionFirNamedFunction rename
Changed
  • Upgraded to Kotlin 2.3.20

v0.7.0

Compare Source

Added
  • Recomposition Cascade Visualizer (PR #​119)
    • Right-click any @Composable function and select "Analyze Recomposition Cascade" to trace downstream composables affected by recomposition
    • Tree view showing each downstream composable with stability status (skippable vs. non-skippable)
    • Summary statistics: total downstream count, skippable/unskippable counts, and max depth
    • Cycle detection and configurable depth limits (max 10) prevent infinite analysis
    • Double-click any node to navigate directly to its source code
    • Available via editor right-click context menu
    • New "Cascade" tab in the Compose Stability Analyzer tool window
  • Live Recomposition Heatmap (PR #​120, #​121)
    • Real-time recomposition counts from a connected device overlaid directly above composable functions in the editor
    • Reads @TraceRecomposition events from ADB logcat and aggregates per-composable data
    • Color-coded severity: green (< 10 recompositions), yellow (10-50), red (50+)
    • Click any recomposition count to open the Heatmap tab with detailed event logs and parameter change history
    • Start/Stop toggle button in the tool window title bar and Code menu
    • Multi-device support with device picker when multiple ADB devices are connected
    • Flicker-free rendering using deterministic pre-baked inlay renderers
    • Heatmap enabled by default in plugin settings
    • Configurable severity thresholds in Settings > Tools > Compose Stability Analyzer
    • New "Heatmap" tab in the Compose Stability Analyzer tool window
  • Plugin Verifier integration (PR #​118)
    • Extended IDE compatibility to build 261 (IntelliJ IDEA 2026.1)
    • Added runPluginVerifier task for automated compatibility testing
Improved
  • Tool window now has three tabs: Explorer, Cascade, and Heatmap
  • Start/Stop Recomposition Heatmap button moved to tool window title bar for visibility across all tabs
  • K2-safe reference resolution using runCatching pattern in cascade analyzer
  • Cancellation support in cascade background analysis via ProgressIndicator.checkCanceled()

v0.6.7

Compare Source

Added
  • Android variant-specific stability tasks (Issue #​85, PR #​101)
    • Gradle plugin now creates per-variant tasks (e.g., debugStabilityDump, releaseStabilityCheck) for Android projects
    • Allows running stability analysis on a single variant without compiling others
    • Aggregate tasks (stabilityDump, stabilityCheck) still available for all variants
    • Improved build cache compatibility for Kotlin compile output registration
  • Non-regressive change filtering for stability validation (Issue #​82, PR #​104)
    • New ignoreNonRegressiveChanges option: only flag stability regressions, ignore non-regressive changes (e.g., new stable parameters)
    • New allowMissingBaseline option: allow stability checks to run even without an existing baseline file
    • With both flags enabled, the Gradle plugin reports all unstable composables found in the module
  • Stability configuration file wildcard support (Issue #​108, PR #​110)
    • Implemented stabilityPatternToRegex to support * and ** wildcard syntax in stability configuration files
    • Matches the format used by the official Compose compiler stability configuration
    • Example: com.datalayer.*, com.example.**
Fixed
  • @StabilityInferred annotation now supported in Gradle plugin (Issue #​102, PR #​112)
    • Immutable classes from other modules annotated with @StabilityInferred(parameters=0) are now correctly treated as stable during stabilityDump/stabilityCheck
    • Previously, cross-module classes with @StabilityInferred were incorrectly marked as UNSTABLE
    • Aligns Gradle plugin behavior with the IDEA plugin, which already handled this correctly
  • Skip analysis for @NonRestartableComposable and @NonSkippableComposable (Issue #​103, PR #​111)
    • Composable functions annotated with @NonRestartableComposable or @NonSkippableComposable are now excluded from stability analysis
    • These functions are not subject to recomposition skipping, so stability analysis is not applicable
  • Improved typealias handling in IDEA plugin (Issue #​16, PR #​106)
    • Parameters using a typealias to a function type (e.g., typealias ComposableAction = @&#8203;Composable () -> Unit) are now correctly recognized as stable
    • Added typealias expansion support across PSI fallback, K1, and K2 analysis paths
    • Includes circular alias recursion guard to prevent infinite loops
Improved
  • Replaced internal nj2k.descendantsOfType with stable PsiTreeUtil API (PR #​109)
    • Implemented intelligent caching mechanism for typealias resolution with automatic expiration
    • Streamlined function-type detection and composability checking logic
    • Improved IDE responsiveness during analysis

v0.6.6

Compare Source

Fixed
  • Fixed stabilityDump task incorrectly marked as UP-TO-DATE
    • Task now properly tracks the stability-info.json input file for up-to-date checks
    • Changed from @Internal to @InputFiles annotation on input file property
    • Ensures stability files are regenerated when compiler output changes
    • Fixes issue where running ./gradlew stabilityDump would skip execution even when stability files were missing
    • Task now correctly runs after clean or when stability output is deleted

v0.6.5

Compare Source

Added
  • Quiet mode for stability validation (Issue #​83)
    • New quietCheck: Boolean = false option in stabilityValidation configuration
    • Suppresses "✅ Stability check passed." messages for modules that pass checks
    • Reduces log noise in multi-module projects where many modules pass validation
    • Errors and warnings still shown normally
    • Example: stabilityValidation { quietCheck.set(true) }
Changed
  • Upgraded to Kotlin 2.3.0

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Android CI Summary

Step Results:

  • Debug Build: ⏭️ Skipped (0s)
  • Code Style Check: ❌ Failure (0s)
  • Compose Stability: ⏭️ Skipped (0s)

Total Time: 0s

⚠️ Warning: The following steps failed: Debug Build, Code Style Check, Compose Stability
See the Actions Log for details.

@renovate renovate Bot changed the title chore(deps): update dependency com.github.skydoves.compose.stability.analyzer to v0.8.0 chore(deps): update stabilityanalyzer to v0.8.0 Jun 2, 2026
@renovate renovate Bot force-pushed the renovate/stabilityanalyzer branch from c9869c3 to 2ca3d1f Compare June 4, 2026 11:31
@renovate renovate Bot changed the title chore(deps): update stabilityanalyzer to v0.8.0 chore(deps): update stabilityanalyzer to v0.9.0 Jun 4, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Android CI Summary

Step Results:

  • Debug Build: ⏭️ Skipped (0s)
  • Code Style Check: ❌ Failure (0s)
  • Compose Stability: ⏭️ Skipped (0s)

Total Time: 0s

⚠️ Warning: The following steps failed: Debug Build, Code Style Check, Compose Stability
See the Actions Log for details.

@renovate renovate Bot force-pushed the renovate/stabilityanalyzer branch from 2ca3d1f to c7faf8b Compare June 11, 2026 12:01
@renovate renovate Bot changed the title chore(deps): update stabilityanalyzer to v0.9.0 chore(deps): update stabilityanalyzer to v0.10.0 Jun 11, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Android CI Summary

Step Results:

  • Debug Build: ❌ Failure (0s)
  • Code Style Check: ✅ Success (2m 31s)
  • Compose Stability: ⏭️ Skipped (0s)

Total Time: 2m 31s

⚠️ Warning: The following steps failed: Debug Build, Compose Stability
See the Actions Log for details.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants