The nightly UX audit found no light-mode chip catalog — all node type screenshots were rendered with darkTheme = true. As a result, any hardcoded Color(0x…) literals in chip/icon composables were never exercised against a light surface. The Project node icon used a dark teal-green Color(0xFF2A6B5A) (not in ChirpyDarkColorScheme or ChirpyLightColorScheme) and a bright mint ring Color(0xFF3DD9A0) for its accent border, both of which were dark-surface-first and would fail on a light background.
IconManager.kt getNodeStateColor() returned a hardcoded literal Color(0xFF2A6B5A) for KrillApp.Project nodes in EXECUTED/RESET/NONE states instead of using a colorScheme role. Similarly, the Project accent ring used Color(0xFF3DD9A0) (bright mint). Neither color exists in ChirpyDarkColorScheme or ChirpyLightColorScheme, making them unaudited and unsupported in any theme.
The chip catalog tests in NodeCatalogScreenshots.kt only rendered with darkTheme = true, so the light-surface failure mode was invisible in CI.
IconManager.kt getNodeStateColor(): replaced Color(0xFF2A6B5A) with colorScheme.tertiaryContainer, which distinguishes Project container nodes from leaf nodes (which use primaryContainer) in both dark and light themes.IconManager.kt Project ring: replaced Color(0xFF3DD9A0) with colorScheme.primary, providing a theme-aware blue ring accent that works on both dark and light surfaces.NodeCatalogScreenshots.kt: added captureNodeChipsLight() and captureNodeIconsLight() tests that render every catalog node type with darkTheme = false. Future hardcoded dark-first colors will appear as contrast failures in the light PNG.NodeStateColorTest.kt: added two tests asserting Project EXECUTED state returns tertiaryContainer (not the old teal) in both dark and light themes.Color(0x…) in a composable that renders on both themes is a latent light-mode bug. Route through colorScheme.* roles instead.captureNodeChipsLight, captureNodeIconsLight) now provides a visual canary: any new dark-first literal will immediately show as a low-contrast or invisible element in the light PNG, without requiring a manual audit run to detect it.getNodeStateColor() defaults should always use colorScheme roles; any per-type override must be justified and theme-tested.