Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

Full release history for the Compose Skill Suite. The newest release is summarised under **What's new** in the [README](./README.md).

### 4.3.2 — 2026-07-07

**Patch — one missed Strong Skipping caveat.**

- **`jetpack-compose-audit/scoring.md`.** The 4.3.1 sweep removed `@NonSkippableComposable` from the lambda-memoization exceptions everywhere except one caveat sentence (it read "opt-out path", so the sweep's string match skipped it). Fixed: `@NonSkippableComposable` opts a *composable* out of skipping but does **not** disable lambda memoization — only `@DontMemoize` (or SSM-off) does. Now consistent across the file.
- **Versions.** `compose-agent` → `4.3.2`, `jetpack-compose-audit` → `4.3.2` (kept in lockstep).

### 4.3.1 — 2026-07-06

**`compose-agent` authoring guidance for cross-phase back-writes + false leads, plus a suite-wide Strong Skipping correctness fix.**
Expand Down
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
<img alt="Claude Code plugin" src="https://img.shields.io/badge/Claude%20Code-plugin-111827">
</p>

**`compose-agent` 4.3.1 · 2026-07-06** — Authoring guidance so the coding-agent skill *warns while you write*: **Never Back-Write Across Phases** (layout callbacks / snapshot-collection mutation feeding composition) and **Optimizations That Do Nothing** (the false leads). The 4.3.0 audit catches these after the fact; 4.3.1 stops you writing them.
**`compose-agent` 4.3.2 · 2026-07-07** — Authoring guidance so the coding-agent skill *warns while you write*: **Never Back-Write Across Phases** (layout callbacks / snapshot-collection mutation feeding composition) and **Optimizations That Do Nothing** (the false leads). The 4.3.0 audit catches these after the fact; 4.3.1 stops you writing them.

**`jetpack-compose-audit` 4.3.1 · 2026-07-06** — Cross-phase back-write detection (axis 3: layout callbacks writing state read in composition), a related composition-phase self-invalidation check (snapshot collections mutated in a composable body), and a **False Leads** scoring guard so the auditor stops crediting no-op "recomposition fixes." Adapted from [`chrisbanes/skills`](https://github.com/chrisbanes/skills) (Apache-2.0).
**`jetpack-compose-audit` 4.3.2 · 2026-07-07** — Cross-phase back-write detection (axis 3: layout callbacks writing state read in composition), a related composition-phase self-invalidation check (snapshot collections mutated in a composable body), and a **False Leads** scoring guard so the auditor stops crediting no-op "recomposition fixes." Adapted from [`chrisbanes/skills`](https://github.com/chrisbanes/skills) (Apache-2.0).

**Version 4.2.0 · 2026-06-17** — Paging 3 in Compose: new `paging.md` reference (LLM guardrails, not API tour), audit hooks under existing Performance/State categories, planning doc at [`docs/paging-skill-plan.md`](./docs/paging-skill-plan.md). Validated through multi-agent cross-review. Both skills ship as `4.2.0`.

Expand All @@ -31,6 +31,10 @@ Authored and cross-reviewed with every frontier model — Claude Opus 4.8, GPT-5

## What's new

### 4.3.2 — 2026-07-07

**Patch.** Fixed one Strong Skipping caveat in `jetpack-compose-audit/scoring.md` that the 4.3.1 sweep missed (its "opt-out path" wording dodged the string match): `@NonSkippableComposable` opts a composable out of *skipping* but does not disable *lambda memoization* — only `@DontMemoize` / SSM-off does. Both skills → `4.3.2`.

### 4.3.1 — 2026-07-06

**`compose-agent` — authoring guidance for cross-phase back-writes + false leads.**
Expand Down
2 changes: 1 addition & 1 deletion docs/release-notes-4.3.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ A guard table in `scoring.md` Performance: plausible "recomposition fixes" that
- Identity/instance caches for read-only derived maps (use `remember(keys)`).
- Layout modifiers on both the measured and the sibling row (the sibling still reads size in composition).
- `assertRecompositionCount(Exactly(1))` forced on both rows when one correctly recomposes 0 times.
- Under **Strong Skipping**, manually `remember`-ing a callback the compiler already auto-memoizes — that lever only applies SSM-off or on `@NonSkippableComposable` / `@DontMemoize` paths. (Historical note: 4.3.0 also listed "or when the lambda captures an unstable value" — **corrected in 4.3.1**; SSM memoizes lambdas even with unstable captures.)
- Under **Strong Skipping**, manually `remember`-ing a callback the compiler already auto-memoizes — that lever only applies SSM-off or on a `@DontMemoize` path. (Historical note: 4.3.0 also listed "or when the lambda captures an unstable value" and `@NonSkippableComposable` here — **corrected in 4.3.1 / 4.3.2**; SSM memoizes lambdas even with unstable captures, and `@NonSkippableComposable` opts a composable out of skipping, not lambda memoization.)

The guard verifies against runtime recomposition counts / compiler reports rather than the presence of a pattern.

Expand Down
4 changes: 2 additions & 2 deletions docs/release-notes-4.3.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ Follow-up to 4.3.0. That release taught the **audit** to catch cross-phase back-

## `jetpack-compose-audit` — Strong Skipping correctness fix

The 4.3.0 false-lead guard said manual callback `remember` could still matter "when the lambda captures an unstable value." That contradicts the official [Strong Skipping docs](https://developer.android.com/develop/ui/compose/performance/stability/strongskipping): SSM memoizes lambdas **even with unstable captures**, so the carve-out could still bless the exact no-op the guard forbids. Removed from `scoring.md` in all four places; the only remaining exception is SSM-off or a `@DontMemoize` / `@NonSkippableComposable` path.
The 4.3.0 false-lead guard said manual callback `remember` could still matter "when the lambda captures an unstable value." That contradicts the official [Strong Skipping docs](https://developer.android.com/develop/ui/compose/performance/stability/strongskipping): SSM memoizes lambdas **even with unstable captures**, so the carve-out could still bless the exact no-op the guard forbids. Removed from `scoring.md`; the only remaining exception is SSM-off or a `@DontMemoize` path. (4.3.1 initially still paired `@NonSkippableComposable` here — **corrected in 4.3.2**: that annotation opts a composable out of skipping, not lambda memoization.)

The same correction lands in `compose-agent/performance.md`: the *Strong Skipping baseline*, *Lambdas In Composables*, and *Optimizations That Do Nothing* sections now agree. The old "lambdas passed across module boundaries to generic composables can miss memoization" bullet was dropped — under SSM, lambda memoization happens at the caller's compilation regardless of the callee's module/generics, so that case is obsolete; the real exceptions are SSM-off / `@DontMemoize` / `@NonSkippableComposable`.
The same correction lands in `compose-agent/performance.md`: the *Strong Skipping baseline*, *Lambdas In Composables*, and *Optimizations That Do Nothing* sections now agree. The old "lambdas passed across module boundaries to generic composables can miss memoization" bullet was dropped — under SSM, lambda memoization happens at the caller's compilation regardless of the callee's module/generics, so that case is obsolete; the real exceptions are SSM-off / `@DontMemoize`.

## Eval coverage

Expand Down
2 changes: 1 addition & 1 deletion skills/compose-agent/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "compose-agent",
"version": "4.3.1",
"version": "4.3.2",
"description": "Agent skill that helps AI coding assistants write modern Jetpack Compose: correct state, effects, performance-aware modifiers, Navigation 3, Paging 3 in Compose, coroutines on lifecycle, animations, UI tests, focus/keyboard navigation, Compose Multiplatform boundaries, Android launch resources, and idiomatic Kotlin. Targets the mistakes LLMs actually make in Compose code.",
"author": {
"name": "Ivan Morgillo"
Expand Down
2 changes: 1 addition & 1 deletion skills/compose-agent/.cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "compose-agent",
"version": "4.3.1",
"version": "4.3.2",
"description": "Agent skill that helps AI coding assistants write modern Jetpack Compose: correct state, effects, performance-aware modifiers, Navigation 3, Paging 3 in Compose, coroutines on lifecycle, animations, UI tests, focus/keyboard navigation, Compose Multiplatform boundaries, Android launch resources, and idiomatic Kotlin. Targets the mistakes LLMs actually make in Compose code.",
"author": {
"name": "Ivan Morgillo"
Expand Down
2 changes: 1 addition & 1 deletion skills/compose-agent/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ allowed-tools: Read, Glob, Grep, Edit, Write, Bash
argument-hint: "[focus area, e.g. 'state', 'effects', 'navigation', 'paging', 'lifecycle', 'animation', 'testing', 'focus', 'kmp']"
metadata:
author: Ivan Morgillo
version: "4.3.1"
version: "4.3.2"
---

# Compose Agent
Expand Down
2 changes: 1 addition & 1 deletion skills/jetpack-compose-audit/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "jetpack-compose-audit",
"version": "4.3.1",
"version": "4.3.2",
"description": "Strict, evidence-based audit for Android Jetpack Compose repositories. Produces a 0-100 score, per-category 0-10 scores, a COMPOSE-AUDIT-REPORT.md with every deduction cited against developer.android.com, and coverage notes for animation performance, paging list correctness, UI tests, focus/keyboard, Compose Multiplatform, and Android launch UX surfaces.",
"author": {
"name": "Ivan Morgillo"
Expand Down
2 changes: 1 addition & 1 deletion skills/jetpack-compose-audit/.cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "jetpack-compose-audit",
"version": "4.3.1",
"version": "4.3.2",
"description": "Strict, evidence-based audit for Android Jetpack Compose repositories. Produces a 0-100 score, per-category 0-10 scores, a COMPOSE-AUDIT-REPORT.md with every deduction cited against developer.android.com, and coverage notes for animation performance, paging list correctness, UI tests, focus/keyboard, Compose Multiplatform, and Android launch UX surfaces.",
"author": {
"name": "Ivan Morgillo"
Expand Down
2 changes: 1 addition & 1 deletion skills/jetpack-compose-audit/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ argument-hint: "[repo path or module path]"

This skill audits Android Jetpack Compose repositories with a strict, evidence-based report.

**Skill version:** 4.3.1 — released 2026-07-06. **Compose track:** Kotlin 2.0.20+ / Compose Compiler 1.5.4+ (Strong Skipping Mode default). See the README changelog for what changed.
**Skill version:** 4.3.2 — released 2026-07-07. **Compose track:** Kotlin 2.0.20+ / Compose Compiler 1.5.4+ (Strong Skipping Mode default). See the README changelog for what changed.

It is intentionally focused on four categories:

Expand Down
2 changes: 1 addition & 1 deletion skills/jetpack-compose-audit/references/scoring.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ Changes that *look* like recomposition fixes but do not reduce recomposition cou
| Forcing `assertRecompositionCount(Exactly(1))` on **both** rows in a focus-move / selection test | One row often *correctly* recomposes 0 times; the assertion encodes a wrong expectation, not a fix | Assert the count each row should actually have; investigate only rows that exceed it |
| Manually `remember`-ing callbacks **under Strong Skipping** (Kotlin 2.0.20+ default) to "stabilize" them | SSM auto-memoizes lambdas already — *including those with unstable captures*; wrapping them in `remember` adds bookkeeping for no skipping benefit | Nothing — SSM has it covered. Only matters SSM-**off** or on a `@DontMemoize` path: then hoist **and** stabilize, or pass a method reference |

**Strong Skipping caveat for the last row:** the "fresh lambda defeats skipping" reasoning only holds when SSM is **off**, or the lambda sits on a `@DontMemoize` / `@NonSkippableComposable` opt-out path. On the default SSM track, manual `remember` on the callback is itself the no-op — SSM memoizes lambdas *even with unstable captures*, so do not recommend it, and do not deduct for its absence. Decide which compiler track applies (see the Strong Skipping Mode Check) before scoring this one.
**Strong Skipping caveat for the last row:** the "fresh lambda defeats skipping" reasoning only holds when SSM is **off**, or the lambda sits on a `@DontMemoize` opt-out path. (`@NonSkippableComposable` opts the *composable* out of skipping but does **not** disable lambda memoization — do not list it here.) On the default SSM track, manual `remember` on the callback is itself the no-op — SSM memoizes lambdas *even with unstable captures*, so do not recommend it, and do not deduct for its absence. Decide which compiler track applies (see the Strong Skipping Mode Check) before scoring this one.

Route: the cross-phase and stability *detectors* live in the search playbook; this false-lead guard lives here in scoring and gates what those detectors are allowed to recommend. Before crediting any "we optimized recomposition here" claim, confirm it is not one of the above — prefer runtime recomposition counts or compiler reports as proof over the presence of the pattern.

Expand Down
Loading