The Node Catalog Screenshots workflow reported that recordRoborazziDesktop failed. All three screenshot test methods ran, but captureNodeChips threw java.lang.RuntimeException: Can't wrap nullptr inside Skiko’s Surface.makeImageSnapshot(), and EditLLM.kt had a compile-time Unresolved reference 'resourceName' error.
Two independent bugs introduced or uncovered by PR #308 (verb-driven LLM rewrite):
Missing import in EditLLM.kt: The rewrite used contextNode?.type?.resourceName() at line 166 to label selected context nodes. The resourceName() extension is defined in krill.zone.shared.feature (not krill.zone.shared), but the import import krill.zone.shared.* does not reach into sub-packages. This caused a compile error that aborted the entire compileKotlinDesktop task, preventing screenshots from being recorded at all.
Zero-height test surface in captureNodeChips: ROW-mode chip composables (DataPointView, LlmRow, etc.) use Modifier.fillMaxWidth() with no explicit height. In the headless runDesktopComposeUiTest scene, the chip’s natural width and height must be satisfied by its content. The captureScreen wrapper placed no size constraints on the composable, leaving the scene surface at zero area for composables that wrap to zero pixels in the test context. Skiko’s makeImageSnapshot() returns null for a zero-area surface, causing Image(nullptr) to throw. Icon captures succeeded because NodeCompoundImage uses Modifier.size(iconEnclosureSize) (a fixed physical size). Settings captures succeeded because NodeEditorContainer in EDIT mode uses Modifier.fillMaxSize() against the scene’s default viewport.
import krill.zone.shared.feature.resourceName to EditLLM.kt.NodeSummaryAndEditor(node, ViewMode.ROW) in Box(Modifier.size(width = 420.dp, height = 80.dp)) inside captureNodeChips. The fixed dimensions guarantee a non-zero surface for Roborazzi’s headless capture regardless of whether the chip composable’s intrinsic size collapses in the unbounded test context.fillMaxWidth() / fillMaxHeight() for its layout, always provide explicit size bounds when capturing it in a headless Compose Desktop test. Unbounded fill modifiers with no parent constraint produce zero-size surfaces that silently crash captureRoboImage.