The Click UI parity spec (packages/client/src/theme/themes/clickui.spec.ts) enforces only per-mode aggregate floors (parityFloors). A regression in one matched decision (for example the Switch knob color) still passes when another decision in the same kind starts matching, so a swap is invisible in CI; the per-decision table is printed only with CLICKUI_PARITY_REPORT.
Suggested fix: replace the counts with the set of decision names expected to match per mode and kind, and assert every probe without a deviation that is in the set still matches. Each stacked link that closes a gap then adds its decision name instead of raising a number.
Raised by the local cross-family review on LibreChat-AI#16481 (finding local:ce4115e:L-001) after the rebase onto canary. Outside LibreChat-AI#16481's scope: its contract covers control radii only, and the floors are raised by the stacked links LibreChat-AI#16486 and LibreChat-AI#16489, so the change has to land across the stack.
The Click UI parity spec (
packages/client/src/theme/themes/clickui.spec.ts) enforces only per-mode aggregate floors (parityFloors). A regression in one matched decision (for example the Switch knob color) still passes when another decision in the same kind starts matching, so a swap is invisible in CI; the per-decision table is printed only withCLICKUI_PARITY_REPORT.Suggested fix: replace the counts with the set of decision names expected to match per mode and kind, and assert every probe without a
deviationthat is in the set still matches. Each stacked link that closes a gap then adds its decision name instead of raising a number.Raised by the local cross-family review on LibreChat-AI#16481 (finding local:ce4115e:L-001) after the rebase onto canary. Outside LibreChat-AI#16481's scope: its contract covers control radii only, and the floors are raised by the stacked links LibreChat-AI#16486 and LibreChat-AI#16489, so the change has to land across the stack.