What problem does it solve? Jetpack Compose UI tests fail with "no node matched", "found N nodes", or confusing merged vs unmerged tree errors, and developers often respond with Thread.sleep, which never fixes a structural finder problem. This Skill teaches a deterministic diagnosis workflow: dump the actual semantics tree and read the framework's built-in hints. ## Core Features & Use Cases - Semantics tree dumping: Use printToLog(tag, maxDepth) and printToString(maxDepth) on onRoot() or any finder to see the real node hierarchy, including the full output grammar (bounds, sorted config, Actions, Unit-valued flags, MergeDescendants, ClearAndSetSemantics). - Merged vs unmerged diagnosis: Interpret the framework's "found in the unmerged tree" hint and fix finders by flipping useUnmergedTree = true, e.g. for an Icon collapsed into a Button. - Custom matcher support: Use fetchSemanticsNode / fetchSemanticsNodes with meaningful error messages for direct SemanticsNode introspection, and disambiguate "found N nodes" failures via dumps plus filterToOne / hasAnyAncestor. - Use Case: A test fails with "Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'submit')". Add rule.onRoot(useUnmergedTree = true).printToLog("DEBUG"), read the logcat dump, discover the tag lives on a merged-away child, and fix the finder instead of adding sleep. ## Quick Start Ask the agent to debug the failing Compose test by dumping the semantics tree with rule.onRoot(useUnmergedTree = true).printToLog("DEBUG") and interpreting the output.