verifying_compose_ui — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited verifying_compose_ui (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
IMPORTANT: `runComposeUiTest` and image capture methods (`node.captureToImage()`) are NOT supported on Android and CANNOT work.
The runComposeUiTest function requires a JVM-based test runtime with desktop Compose rendering (via Skiko on JVM/Desktop). Android's ART (Android Runtime) does not support the desktop Compose testing APIs, and image capture via captureToImage() relies on desktop-specific rendering pipelines that are fundamentally incompatible with Android.
For visual verification of Composables, you MUST use a JVM or Desktop target source set. This is not a workaround—it is the only supported method.
Recommended approach:
commonMain) that is shared across all targetsjvmMain, desktopMain) that depends on commonMainsourceSet: "jvmMain" or sourceSet: "jvmTest")This is the standard KMP pattern and allows you to verify your UI code without needing an Android device or emulator.
sourceSet: "androidMain"sourceSet: "androidTest"runComposeUiTest on AndroidcaptureToImage() on AndroidsourceSet: "jvmMain" or sourceSet: "jvmTest"sourceSet: "desktopMain" or sourceSet: "desktopTest"runComposeUiTest with captureToImage() on JVM/Desktop targetsVisually verifies and renders any @Composable or @Preview directly to high-quality images from the project-aware REPL for instant, authoritative visual feedback.
kotlin_repl to render Compose components instead of running the full application for visual checks.projectRoot.node.captureToImage() and responder.render(bitmap) to return the visual output.additionalDependencies if necessary.@Preview functions in the project source code before creating new ones.projectRoot is an absolute file system path for all kotlin_repl calls.androidx.compose.ui:ui-test-junit4) are on the classpath.runComposeUiTest.node.captureToImage() and responder.render(bitmap) to return the visual output.kotlin_repl currently only supports JVM-based source sets. ALWAYS select a JVM or Desktop target source set for visual checks.env: { envSource: "SHELL" } (REPL start) or invocationArguments: { envSource: "SHELL" } (Gradle tasks) if expected env vars (e.g., JAVA_HOME) are not found.@Preview functions.@Composable or @Preview function.grep_search(pattern="@Preview").test source set (preferred) or main with additionalDependencies.kotlin_repl(command="start").kotlin_repl(command="run") to execute the rendering script.runComposeUiTest to render and capture the component.import androidx.compose.ui.test.*
import com.example.ui.MyButton
runComposeUiTest {
setContent {
MyButton(text = "Click Me")
}
val node = onRoot()
responder.render(node.captureToImage())
}
// Reasoning: Using kotlin_repl to render a specific component and retrieve its visual representation via the responder API.import androidx.compose.ui.test.*
import com.example.ui.MyButtonPreview // Top-level preview function
runComposeUiTest {
setContent {
MyButtonPreview()
}
val node = onRoot()
responder.render(node.captureToImage())
}
// Reasoning: Reusing an existing authoritative preview function to verify its visual correctness.import androidx.compose.ui.test.*
import com.example.ui.MyCounter
import com.example.viewmodel.MyViewModel
runComposeUiTest {
val viewModel = MyViewModel()
setContent {
MyCounter(viewModel)
}
// Capture state before interaction
responder.render("State before: ${viewModel.count}")
responder.render(onRoot().captureToImage())
// Perform interaction
onNodeWithText("Increment").performClick()
// Capture state after interaction
responder.render("State after: ${viewModel.count}")
responder.render(onRoot().captureToImage())
}
// Reasoning: Capturing visual snapshots before and after an interaction to verify state-dependent UI changes.responder.render(bitmap).~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.