/** * theming-sentinel-exceptions — the written adjudications R-5.4 requires. * * A public token the sentinel reports as "no effect" is EITHER a lie (retire * it) OR its silence has a measured reason that lives here, one line per * token: the part is conditional and the demo does not mount it, the state * needs forcing, the consumer is a pseudo-element or a composed component the * instrument cannot read, the value sits behind a media query. "Forced → * reaches" means the adjudication PROVED the token alive by mounting what it * needs; an instrument-limit entry names the limit (they are also registered * in next-features §13). * * An entry whose token starts moving again is reported as STALE by the guard — * prune it (a stale exception is the same debt as a stale allowlist row). * * All entries below were measured during the F2-A adversarial review * (2026-08-21) unless dated otherwise. */ export const SENTINEL_EXCEPTIONS: Record> = { command: { 'focus-input-border': 'consumed only under :focus-visible, which the guard blurs away ON PURPOSE (the click-focus poisoning fix); focused by hand → reaches (rgb(9,9,9))', 'loading-height': 'the loading bar is conditional and the demo does not mount it', 'loading-fg': 'the loading bar is conditional and the demo does not mount it', 'viewport-padding': 'the non-ScrollArea viewport variant is not mounted in the demo', 'empty-padding-block': 'the empty state is conditional and not mounted at measurement', 'empty-fg': 'the empty state is conditional and not mounted at measurement' }, table: { 'header-z': 'consumed only under [data-sticky-header], which the demo does not set; forced → reaches (2 → 4321)', 'row-detail-fg': 'detail rows are closed (display:none) in the demo initial state; forced data-state=open → reaches (rgb(1,2,3))', 'row-detail-padding-block': 'detail rows are closed (display:none) in the demo initial state; forced data-state=open → reaches (12 → 1234)' }, 'media-player': { 'accent-strong': 'consumed by the live indicator, which only paints under [data-live]', track: 'forwarded into the composed Slider — paints on [data-slider-*] nodes, outside this component attribute space', 'buffered-bg': 'forwarded into the composed Slider (SecondaryRange) — outside this component attribute space', 'captions-bg': 'captions are conditional and the demo video carries no track', 'captions-fg': 'captions are conditional and the demo video carries no track', 'captions-radius': 'captions are conditional and the demo video carries no track', 'captions-padding-block': 'captions are conditional and the demo video carries no track', 'captions-padding-inline': 'captions are conditional and the demo video carries no track', 'captions-line-height': 'captions are conditional and the demo video carries no track', 'volume-vertical-length': 'the volume float is interaction-mounted; not open at measurement', 'volume-float-padding-block': 'the volume float is interaction-mounted; not open at measurement', 'volume-float-padding-inline': 'the volume float is interaction-mounted; not open at measurement', 'rate-button-min-width': 'the rate control is conditional and the demo does not mount it', 'audio-title-padding-block': 'audio variant — the video demo does not mount the audio title', 'audio-title-padding-inline': 'audio variant — the video demo does not mount the audio title' }, 'tree-grid': { 'header-z': 'consumed only under [data-sticky-header], which the demo does not set; forced → reaches (2 → 4321)', 'disabled-row-fg': 'no disabled row in the demo; forced data-disabled → reaches (rgb(1,2,3))' }, 'gradient-picker': { 'chip-radius': 'the swatch is a CLASS hook (.gradient-picker-trigger-swatch) outside the attribute-filtered node set; direct read → reaches (§13 class-hook debt)', 'chip-border': 'the swatch is a CLASS hook outside the attribute-filtered node set; direct read → reaches (§13 class-hook debt)', 'content-width-sm': "sized by data-picker-size (picker-shell's axis, not data-size); forced → reaches (288 → 512)", 'content-width-lg': "sized by data-picker-size (picker-shell's axis, not data-size); forced → reaches (352 → 512)", 'stoplist-max-block': "consumer node lives in the composed ScrollArea's attribute space (--scroll-area-auto-max-block on the viewport); direct read → reaches (132 → 1234)", 'stoplist-scrollbar-size': 'the design scrollbar only mounts on overflow; the demo list is short', 'stoplist-scrollbar-inset': "consumer node lives in the composed ScrollArea's attribute space; direct read → reaches (12 → 1234)", 'presets-panel-width': "the presets popover needs a second click the guard's open step does not perform; forced → reaches (240 → 1234)", 'presets-gap': 'presets popover not mounted by the open step; forced → reaches (8 → 1234)', 'presets-min-column': 'presets popover not mounted by the open step; forced → reaches (66px columns → 1234)', 'preset-height': 'presets popover not mounted by the open step; forced → reaches (32 → 1234)', 'preset-radius': 'presets popover not mounted by the open step; forced → reaches (6 → 1234)', 'preset-border': 'presets popover not mounted by the open step; forced → reaches (rgb(1,2,3))', 'hover-preset-border': 'presets popover not mounted by the open step; forced + real hover → reaches (rgb(1,2,3))', 'selected-preset-border': 'presets popover not mounted by the open step; forced data-selected → reaches (rgb(1,2,3))', 'selected-preset-outline-offset': 'presets popover not mounted by the open step; forced data-selected → reaches (2 → 1234)' }, listbox: { 'invalid-border': 'no invalid listbox in the demo; forced data-invalid → reaches (rgb(1,2,3))' }, carousel: { 'vertical-block-size': 'vertical orientation not mounted in the demo; forced → reaches (256 → 1234)' }, feed: { 'sentinel-spinner-size': 'the spinner only exists while [data-busy], and the guard WAITS for the busy window to close (the settle fix); measured live during the busy window (::before, 12 → 1234)', 'sentinel-spinner-width': 'the spinner only exists while [data-busy]; measured live during the busy window (::before border)', 'sentinel-spinner-gap': 'the spinner only exists while [data-busy]; measured live during the busy window (::before margin)', 'sentinel-spinner-duration': 'the spinner only exists while [data-busy]; measured live during the busy window (animation-duration 0.7s → 11.5s)', 'article-title-font-size-5': 'the demo mounts heading levels 3–4 only; forced aria-level=5 → reaches (14 → 1234)', 'article-title-font-size-6': 'the demo mounts heading levels 3–4 only; forced aria-level=6 → reaches (12 → 1234)', 'sentinel-spinner-reduced-duration': 'behind prefers-reduced-motion; emulated reduce context → reaches (4s → 11.5s)' }, 'drag-drop': { 'preview-padding-block': 'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (8 → 1234px)', 'preview-padding-inline': 'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (12 → 1235px)', 'preview-radius': 'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (6 → 1236px)', 'preview-border-width': 'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (1 → 9px)', 'preview-bg': 'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (rgb(1,2,3))', 'preview-fg': 'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (rgb(4,5,6))', 'preview-font-family': 'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (Zapfino)', 'preview-font-size': 'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (14 → 99px)', 'preview-shadow': 'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (0 0 0 7px rgb(7,8,9))', 'preview-z': 'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (100 → 4321)' }, link: { 'external-icon-size': 'the demo mounts no EXTERNAL link, so the glyph never renders (0 nodes, counted); forced → reaches (11.89 → 77px on both axes)', 'underline-width': "the demo link sits at data-underline='hover' with no pointer on it, so there IS no underline to move (text-decoration-line: none, thickness: auto). Forced 'always' → reaches (1 → 9px). textDecorationThickness was missing from the guard prop list and was added in the same pass", 'underline-offset': "same: no underline at rest under data-underline='hover'; forced → reaches (2 → 11px). textUnderlineOffset added to the guard prop list too" }, label: { 'disabled-fg': 'the demo mounts no disabled label (0 [data-disabled] nodes, counted); forced → reaches (rgb(1,2,3))' }, 'link-preview': { 'trigger-fg': 'the panel opens on HOVER, so measuring it REQUIRES the pointer on the trigger — and hover is exactly the state whose rule overrides the resting ink. Structural, not a demo gap: the hover token (`hover-trigger-fg`) reads live in the same run', 'trigger-underline': 'same structural conflict: the hover rule sets `text-decoration-color: currentColor` over the resting mix, and the panel cannot be opened without hovering' }, 'picker-shell': { 'section-gap-xs': 'its size axis is `data-picker-size` on the PORTALED [data-popover-content], not `data-size` on itself, and the guard only cycles `data-size`; the demo popover sits at md. Cycled by hand across the four picker-sizes 2026-08-21 → reaches (section/row/footer spacing follows the picker size)', 'section-gap-sm': 'its size axis is `data-picker-size` on the PORTALED [data-popover-content], not `data-size` on itself, and the guard only cycles `data-size`; the demo popover sits at md. Cycled by hand across the four picker-sizes 2026-08-21 → reaches (section/row/footer spacing follows the picker size)', 'section-gap-lg': 'its size axis is `data-picker-size` on the PORTALED [data-popover-content], not `data-size` on itself, and the guard only cycles `data-size`; the demo popover sits at md. Cycled by hand across the four picker-sizes 2026-08-21 → reaches (section/row/footer spacing follows the picker size)', 'row-spacing-xs': 'its size axis is `data-picker-size` on the PORTALED [data-popover-content], not `data-size` on itself, and the guard only cycles `data-size`; the demo popover sits at md. Cycled by hand across the four picker-sizes 2026-08-21 → reaches (section/row/footer spacing follows the picker size)', 'row-spacing-lg': 'its size axis is `data-picker-size` on the PORTALED [data-popover-content], not `data-size` on itself, and the guard only cycles `data-size`; the demo popover sits at md. Cycled by hand across the four picker-sizes 2026-08-21 → reaches (section/row/footer spacing follows the picker size)', 'footer-gap-xs': 'its size axis is `data-picker-size` on the PORTALED [data-popover-content], not `data-size` on itself, and the guard only cycles `data-size`; the demo popover sits at md. Cycled by hand across the four picker-sizes 2026-08-21 → reaches (section/row/footer spacing follows the picker size)', 'footer-gap-lg': 'its size axis is `data-picker-size` on the PORTALED [data-popover-content], not `data-size` on itself, and the guard only cycles `data-size`; the demo popover sits at md. Cycled by hand across the four picker-sizes 2026-08-21 → reaches (section/row/footer spacing follows the picker size)', 'header-font-size-xs': 'the date-picker demo renders no [data-picker-header] (0 nodes, counted) — picker-shell has no demo route of its own (404) and is measured inside a host picker; forced → reaches (12/14/16/16px → 102px, each in its own picker-size)', 'header-font-size-sm': 'the date-picker demo renders no [data-picker-header] (0 nodes, counted) — picker-shell has no demo route of its own (404) and is measured inside a host picker; forced → reaches (12/14/16/16px → 102px, each in its own picker-size)', 'header-font-size-md': 'the date-picker demo renders no [data-picker-header] (0 nodes, counted) — picker-shell has no demo route of its own (404) and is measured inside a host picker; forced → reaches (12/14/16/16px → 102px, each in its own picker-size)', 'header-font-size-lg': 'the date-picker demo renders no [data-picker-header] (0 nodes, counted) — picker-shell has no demo route of its own (404) and is measured inside a host picker; forced → reaches (12/14/16/16px → 102px, each in its own picker-size)', 'header-gap': 'the date-picker demo renders no [data-picker-header] (0 nodes, counted) — picker-shell has no demo route of its own (404) and is measured inside a host picker; forced → reaches (gap 8→1234px, fg → rgb(4,5,6), weight 500→123, line-height 20→60.32px)', 'header-fg': 'the date-picker demo renders no [data-picker-header] (0 nodes, counted) — picker-shell has no demo route of its own (404) and is measured inside a host picker; forced → reaches (gap 8→1234px, fg → rgb(4,5,6), weight 500→123, line-height 20→60.32px)', 'header-font-weight': 'the date-picker demo renders no [data-picker-header] (0 nodes, counted) — picker-shell has no demo route of its own (404) and is measured inside a host picker; forced → reaches (gap 8→1234px, fg → rgb(4,5,6), weight 500→123, line-height 20→60.32px)', 'header-line-height': 'the date-picker demo renders no [data-picker-header] (0 nodes, counted) — picker-shell has no demo route of its own (404) and is measured inside a host picker; forced → reaches (gap 8→1234px, fg → rgb(4,5,6), weight 500→123, line-height 20→60.32px)', 'time-row-gap': 'the time row is CLASS-hooked (.picker-time-row) and the date-picker demo does not render it; the guard filters nodes by attribute, so it cannot see it either way (§13 class-hook debt). Forced → reaches (gap/padding → 1234px, border 1→9px + rgb(7,8,9), label → rgb(10,11,12) / 99px)', 'time-row-padding-block-start': 'the time row is CLASS-hooked (.picker-time-row) and the date-picker demo does not render it; the guard filters nodes by attribute, so it cannot see it either way (§13 class-hook debt). Forced → reaches (gap/padding → 1234px, border 1→9px + rgb(7,8,9), label → rgb(10,11,12) / 99px)', 'time-row-padding-inline': 'the time row is CLASS-hooked (.picker-time-row) and the date-picker demo does not render it; the guard filters nodes by attribute, so it cannot see it either way (§13 class-hook debt). Forced → reaches (gap/padding → 1234px, border 1→9px + rgb(7,8,9), label → rgb(10,11,12) / 99px)', 'time-row-border-width': 'the time row is CLASS-hooked (.picker-time-row) and the date-picker demo does not render it; the guard filters nodes by attribute, so it cannot see it either way (§13 class-hook debt). Forced → reaches (gap/padding → 1234px, border 1→9px + rgb(7,8,9), label → rgb(10,11,12) / 99px)', 'time-row-border': 'the time row is CLASS-hooked (.picker-time-row) and the date-picker demo does not render it; the guard filters nodes by attribute, so it cannot see it either way (§13 class-hook debt). Forced → reaches (gap/padding → 1234px, border 1→9px + rgb(7,8,9), label → rgb(10,11,12) / 99px)', 'time-label-fg': 'the time row is CLASS-hooked (.picker-time-row) and the date-picker demo does not render it; the guard filters nodes by attribute, so it cannot see it either way (§13 class-hook debt). Forced → reaches (gap/padding → 1234px, border 1→9px + rgb(7,8,9), label → rgb(10,11,12) / 99px)', 'time-label-font-size-xs': 'the time row is CLASS-hooked (.picker-time-row) and the date-picker demo does not render it; the guard filters nodes by attribute, so it cannot see it either way (§13 class-hook debt). Forced → reaches (gap/padding → 1234px, border 1→9px + rgb(7,8,9), label → rgb(10,11,12) / 99px)', 'time-label-font-size-sm': 'the time row is CLASS-hooked (.picker-time-row) and the date-picker demo does not render it; the guard filters nodes by attribute, so it cannot see it either way (§13 class-hook debt). Forced → reaches (gap/padding → 1234px, border 1→9px + rgb(7,8,9), label → rgb(10,11,12) / 99px)', 'time-label-font-size-md': 'the time row is CLASS-hooked (.picker-time-row) and the date-picker demo does not render it; the guard filters nodes by attribute, so it cannot see it either way (§13 class-hook debt). Forced → reaches (gap/padding → 1234px, border 1→9px + rgb(7,8,9), label → rgb(10,11,12) / 99px)', 'time-label-font-size-lg': 'the time row is CLASS-hooked (.picker-time-row) and the date-picker demo does not render it; the guard filters nodes by attribute, so it cannot see it either way (§13 class-hook debt). Forced → reaches (gap/padding → 1234px, border 1→9px + rgb(7,8,9), label → rgb(10,11,12) / 99px)' }, skeleton: { 'line-radius': "only the `text` shape renders [data-skeleton-line]; the demo mounts `rect` (0 lines, counted). Forced shape='text' → reaches (4 → 1234px)" }, spinner: { 'bar-radius': "the demo mounts the RING variant only (0 bars, 0 dots, counted); forced variant='bars' → reaches (1234px)", 'label-font-size': 'the label is optional and the demo mounts none (0 nodes, counted); forced → reaches (1234px)', 'label-fg': 'the label is optional and the demo mounts none; forced → reaches (rgb(1,2,3))', 'track-opacity': 'its only declaration lives inside `prefers-reduced-motion`; emulated reduce context → reaches (0.6 → 0.123)' }, 'card-group': { 'title-fg': 'the STATIC heading form is not mounted in the demo (0 [data-static] nodes vs 1 [data-button], counted); forced → reaches (rgb(1,2,3))', 'title-font-family': 'static heading not mounted in the demo; forced → reaches (Instrument Sans → Zapfino)', 'title-font-size': 'static heading not mounted in the demo; forced → reaches (16 → 1234px)', 'title-line-height': 'static heading not mounted in the demo; forced → reaches (20px → 3.77em)', 'title-padding-block-end': 'static heading not mounted in the demo; forced → reaches (8 → 1234px)' }, code: { radius: 'the DEMO HARNESS wins: `[data-uix-docs] code` (uix.css, 0-1-1) beats the recipe base rule `[data-code]` (0-1-0) and sets border-radius/padding/font on the inline code — confirmed with CDP matched-rules. The variant rules (0,2,0) DO win, which is why only this base-rule token reads dead. Same harness rule that hides the
 of code-block (next-features §13)',
		'soft-bg':
			"the demo mounts the `plain` variant only (no chrome); forced variant='soft' → reaches (rgb(1,2,3))",
		'border-width':
			"the demo mounts `plain` only; forced variant='outline' → reaches (1 → 9px)",
		border: "the demo mounts `plain` only; forced variant='outline' → reaches (rgb(4,5,6))",
		'padding-inline':
			"only the chromed variants pad; forced → reaches (4.12 → 77px), and the variant rule (0,2,0) beats the harness",
		'padding-block': "only the chromed variants pad; forced → reaches (1.29 → 66px)"
	},
	'code-block': {
		'pre-padding':
			'the DEMO HARNESS outweighs the component: `[data-uix-docs] pre` (uix.css:801, 0-1-1) beats `[data-code-block-pre]` (0-1-0) and paints padding/border/radius/bg/font on the 
. Forced with !important → reaches (16px 20px → 12px). Seven properties measured, registered in next-features §13'
	},
	'tree-view': {
		'disabled-row-fg':
			'no disabled row in the demo (0 mounted, counted); forced data-disabled → reaches (oklch(0.61 0 0) → rgb(1,2,3))'
	},
	textarea: {
		'focus-input-border':
			'consumed only under [data-focused], which the guard blurs away ON PURPOSE (the click-focus poisoning fix); focused by hand with the pointer parked → reaches (rgb(4,5,6))',
		'invalid-input-border':
			'consumed only under [data-invalid]; the demo boots valid. Forced by hand 2026-08-21 → reaches (rgb(7,8,9))',
		'overflow-count-fg':
			'the count only carries [data-overflow] past maxLength (280 chars); forced → reaches (rgb(13,14,15))',
		'overflow-count-font-weight':
			'the count only carries [data-overflow] past maxLength (280 chars); forced → reaches (font-weight 333)'
	},
	'grid-list': {
		'invalid-border':
			'consumed only under [data-invalid]; the demo boots with its invalid control off, so the rule never matches at measurement. Toggled by hand 2026-08-21 → reaches (oklch(0.9555 0.0207 13.86) → rgb(1,2,3))'
	}
};