skills/kmp/bill-kmp-code-review/SKILL.md
Use when conducting a thorough Android/KMP PR code review. Preserve mobile review depth by running the appropriate Kotlin baseline review layer first, then add Android/KMP-specific specialists such as UI and UX/accessibility. Produces a structured review with risk register and prioritized action items. Use when user mentions Android review, KMP review, mobile review, or asks to review Android/KMP changes.
npx skillsauth add sermilion/mobile-development-plugin bill-kmp-code-reviewInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are an experienced Android/KMP architect conducting a code review.
Your job is to preserve Android/KMP review depth without duplicating the shared Kotlin review logic.
If .agents/skill-overrides.md exists in the project root and contains a ## bill-kmp-code-review section, read that section and apply it as the highest-priority instruction for this skill. The matching section may refine or replace parts of the default workflow below.
If an AGENTS.md file exists in the project root, apply it as project-wide guidance.
Precedence for this skill: matching .agents/skill-overrides.md section > AGENTS.md > built-in defaults. Pass relevant project-wide guidance and matching per-skill overrides to every delegated or inline specialist review pass.
Determine the review scope:
git diff --cached; index only)git diff; working tree only)git diff --cached + git diff) only when the caller explicitly asks for all local changesResolve the scope before reviewing. If the caller asks for staged changes, inspect only the staged diff and keep unstaged edits out of findings except for repo markers needed for classification.
Inspect both the changed files and repo markers (build.gradle*, settings.gradle*, gradle/libs.versions.toml, pom.xml, source set layout, module names, imports).
When the caller already passed the detected stack, skip reading stack-routing.md. For standalone invocation, read it before classifying.
Before selecting KMP specialist review passes or formatting the final report, read review-orchestrator.md unless the caller already passed the shared review contract.
Before delegating baseline or KMP specialist review passes, read only your current runtime's section in review-delegation.md.
Classify the review as one of:
kmpmixed-kmpnot-kmpio.ktor.server, routing {}, Application.modulespring-boot, @RestController, @Controller, @Service, @Repository, @Transactionalapplication.yml, application.yaml, application.confbill-kotlin-code-review and stop instead of pretending mobile-specific coverage exists.bill-backend-kotlin-code-review as the baseline review layer so backend coverage is preserved before this skill adds mobile-specific specialists.After the stack is already classified as kmp, resolve governed add-ons before selecting KMP-specific specialists.
Selected add-ons: none.android-compose when the scoped diff contains Compose UI signals such as @Composable, Compose UI state, Modifier chains, previews, remember*, or Compose side effects.android-navigation when the scoped diff changes route models, NavHost/NavDisplay, deep links, multi-back-stack behavior, scene destinations, or Android navigation ownership.android-interop when the scoped diff mixes Compose with legacy Views, Fragments, ComposeView, AndroidView, AndroidViewBinding, or other Android host-boundary glue.android-design-system when the scoped diff changes Android theme layers, MaterialTheme, design tokens, styled components, or XML-theme-to-Compose translation.android-r8 when the scoped diff changes Android keep rules, shrinker config, proguardFiles, isMinifyEnabled, isShrinkResources, or release-only R8 settings.android-compose is selected, such as android-compose-edge-to-edge.md and android-compose-adaptive-layouts.md.android-navigation is selected.android-interop is selected.android-design-system is selected.android-r8 is selected.kmp route.Select inline or delegated using review-orchestrator.md.
inline only when the Android/KMP review scope stays small and low-risk under the shared execution-mode contractdelegated when the diff is large, mobile or backend specialist risk is present, mixed scope is meaningfully involved, or the safest choice is unclearUse the same scope to run exactly one baseline review layer:
bill-backend-kotlin-code-review when backend/server files or markers are meaningfully in scopebill-kotlin-code-reviewThat baseline review layer owns:
When invoking the baseline review in either execution mode:
If execution mode is inline, apply the selected baseline review inline in the current thread.
If execution mode is delegated, run the selected baseline review as a delegated subagent and use the runtime-specific delegation contract from review-delegation.md.
Keep the mobile triggers focused on what the baseline review does not cover:
| Signal in the diff | Specialist review to run |
|---------------------|--------------------------|
| @Composable functions, UI state classes, Modifier chains, remember, LaunchedEffect | bill-kmp-code-review-ui |
| User-facing UI changes, stringResource, accessibility attributes, navigation, error states, localization files | bill-kmp-code-review-ux-accessibility |
When execution mode is delegated, build a per-specialist file list before launching KMP specialist subagents:
This is a lightweight file-level classification (names + imports), not a full review.
If execution mode is inline:
If execution mode is delegated:
If no KMP-only triggers match but Android/KMP signals are clearly present, keep the baseline review output and state that no extra KMP-only specialist was needed for this scope.
Review session ID: <review-session-id>
Review run ID: <review-run-id>
Detected review scope: <staged changes / unstaged changes / working tree / commit range / PR diff / files>
Detected stack: <stack>
Selected add-ons: none | <add-on slugs>
Signals: <markers>
Execution mode: inline | delegated
Applied learnings: none | <learning references>
Specialist reviews: <selected specialists>
Reason: <why these specialists were selected>
Every finding in ### 2. Risk Register must use this exact bullet format (do NOT use markdown tables):
- [F-001] <Severity> | <Confidence> | <file:line> | <description>
Severity: Blocker | Major | Minor. Confidence: High | Medium | Low.
For telemetry ownership, triage ownership, and the orchestrated flag contract, follow telemetry-contract.md.
For action items, verdict format, merge rules, and review principles, follow review-orchestrator.md.
bill-feature-implement, bill-feature-verify, or another orchestration skill, do not pause for user selection. Return prioritized findings so the caller can auto-fix P0/P1 items and decide whether to carry Minor items forward.bill-quality-check as final verification when the project uses a routed quality-check path and this review is being run standalone.development
Use when running a governed editorial assignment desk from Readian recommendations through candidate selection and source-backed story packs.
testing
Use when reviewing unit tests in a file, current changes, or a commit to flag low-value, tautological, or coverage-only tests that do not validate real behavior. Use when user mentions check test quality, review tests, tautological tests, weak tests, or coverage-padding.
data-ai
Use when removing an existing skill or platform skill set and cleaning up agent installs, manifests, and supporting links.
development
Use when you want a generic quality-check entry point that detects the dominant stack in scope and delegates to the matching stack-specific quality-check skill. Use when user mentions run checks, validate, lint, format, quality check, or run quality.