name: penpot-material-inspector
purpose: Verify the current Penpot Materials list and material-slot panel at its 620 px and 420 px Inspector reference widths with side-by-side design evidence.
preconditions: editor_scene contains primitive, static-mesh, and skinned-mesh material users; no editor process is running.
build_lane: dev
fixture: assets/materials/pebble_bricks.ron
steps:
  - Launch the editor on the real desktop and size the Inspector to the 620 px reference width.
  - Select a primitive, static mesh, and skinned mesh in turn and expand each material panel.
  - Compare Materials ownership, expanded slot header, PARAMETERS spine, Surface, six Inputs rows, UV, and Advanced geometry with the current Penpot reference.
  - Narrow the Inspector to the 420 px floor and verify every value, channel, texture, Locate, and Clear control reflows.
  - Open the material picker, dismiss it without selection, then assign a valid project Material and inspect inherited and direct states.
  - Drop a Texture onto the material assignment target and inspect the invalid state without assigning it.
  - Open Base Color and exercise Wheel, Sliders, Presets, Apply, Cancel, Escape, and outside dismissal.
  - Edit a scalar and color, release the controls, switch actors, then save and relaunch the editor.
  - Inspect imported-source, DefaultGrid, and broken-reference presentations through the available fixture states.
assertions:
  - The 620 px Inspector matches the current Penpot palette, Source Sans Pro typography, 32 px Materials heading, 82 px expanded slot header, 596 px slot, 569 px parameter body, six 30 px input rows, spacing, borders, and fixed property geometry without visible drift.
  - Primitive, static-mesh, and skinned-mesh slots use the same panel geometry and have no redundant second slot presentation.
  - At the 420 px Inspector floor, six 56 px input rows put paired texture controls on the second line with no horizontal scrolling, clipping, compressed labels, or missing actions.
  - Direct assignments have no Explicit badge; inherited, dirty, processing, failed, read-only, imported-source, and built-in states retain one header geometry.
  - Picker dismissal and invalid Texture drops make no assignment or source save; valid Material or Instance drops use the blue accent state.
  - Wheel, Sliders, and Presets preview live; Apply retains the dirty in-memory value and Cancel, Escape, or outside dismissal restores the exact pre-open value.
  - Material controls perform no pointer-release write or scalar/color processing job and keep the existing live GPU handle visible across actor selection.
  - Save and relaunch preserve the authored value, while broken explicit references retain failed identity and visible DefaultGrid fallback.
evidence: Font-faithful Penpot PNGs paired beside fresh target-window captures for 620 px primitive/static/skinned, 420 px reflow, component headers, renderer composition, color modes, invalid drop, dirty state, and relaunch plus hashes and a written delta matrix.
cleanup: Close the spawned editor and atomically restore pebble_bricks.ron from the runner snapshot.
invalidates: Design tokens, fonts, material panel geometry, material picker, color picker, authored documents, or material resolver changes.
