/** * 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. */ const PLANE_SUPERSEDED = 'SUPERSEDED by the depth plane: the part carries data-depth=overlay, and [data-depth=overlay] declares this property at the same specificity (0,1,0) and LATER in the cascade, so the recipe key is bypassed (see next-features 12.9, measured on tooltip, popover and float-panel)'; export const SENTINEL_EXCEPTIONS: Record> = { background: { // 2026-08-23. Its parts are independent OPT-IN layers and only ONE pattern // renders at a time, so the default stage moved 3 of 37 tokens. The guard // now switches the scrim on and sweeps `data-pattern` (18/37); what is // left is measured here, forcing the attribute on the REAL layer — never // on a node built by hand. // // The mask: the guard does not read `mask-image`, so both read dead while // being perfectly alive (instrument gap, next-features §13). 'fade-size': 'the guard does not snapshot mask-image; measured by hand → reaches (the radial mask changes)', 'fade-at': 'the guard does not snapshot mask-image; measured by hand → reaches (at 50% 35% → at 11% 50%)', // The ink context: only under `on='dark'` / `on='light'`. 'scrim-fg-over-dark': "only under on='dark'; forced → reaches (the veil colour changes)", 'scrim-fg-over-light': "only under on='light'; forced → reaches (the veil colour changes)", // Two scales where only the step in force paints (the `section` / `qr-code` // class): every step measured one by one on the real scrim layer. 'scrim-blur-sm': 'only the step in force paints; forced data-blur=sm → reaches (4px → 33px)', 'scrim-blur-md': 'only the step in force paints; forced data-blur=md → reaches (8px → 33px)', 'scrim-blur-lg': 'only the step in force paints; forced data-blur=lg → reaches (12px → 33px)', 'scrim-blur-xxl': 'only the step in force paints; forced data-blur=xxl → reaches (24px → 33px)', 'scrim-strength-xs': 'only the step in force paints; forced data-strength=xs → reaches (alpha 0.08 → 0.9)', 'scrim-strength-sm': 'only the step in force paints; forced data-strength=sm → reaches (alpha 0.13 → 0.9)', 'scrim-strength-lg': 'only the step in force paints; forced data-strength=lg → reaches (alpha 0.4 → 0.9)', 'scrim-strength-xl': 'only the step in force paints; forced data-strength=xl → reaches (alpha 0.7 → 0.9)', // A gradient layer EXCLUDES a pattern layer, so the sweep cannot have both. 'gradient-drift-duration': 'the gradient layer is exclusive with the pattern one the sweep needs; forced data-kind=gradient → reaches (24s → 42s)', // The spotlight is off on the default stage and, once on, it repaints the // pattern layer it shares a node with — measured on its own pass. 'spotlight-size': 'spotlight is off in the demo; forced data-spotlight → reaches (40% 40% → 42px)', 'spotlight-strength': 'spotlight is off in the demo; forced data-spotlight → reaches (the mix stop moves)', 'spotlight-fg': 'spotlight is off AND the demo layer carries data-color, where --palette-solid wins by design; forced data-spotlight with no data-color → reaches', // Structural, not conditional: the travel only enters through the // scroll-linked `background-parallax` keyframes, which need a scroll // timeline the measured stage does not have. 'parallax-travel': 'the demo boots at speed 0, so no layer carries data-parallax; forced data-parallax + speed 1 on the real layer, the scroll-linked translate follows it (14.6 -> 60.5 px at the same scrollY). The guard would not see it anyway: translate / transform are not in its property snapshot (next-features 13)', // No node at all: the demo never mounts the pause control. 'pause-offset': 'the pause control is not mounted in the demo (0 nodes on the page)', 'pause-z': 'the pause control is not mounted in the demo (0 nodes on the page)' }, badge: { // 2026-08-23. The demo mounts ONE chip, and its `rounded` axis paints only // the step in force — measured forcing each on the real chip. 'radius-sm': 'only the step in force paints; forced data-rounded=sm → reaches (4px → 37px)', 'radius-lg': 'only the step in force paints; forced data-rounded=lg → reaches (10px → 37px)' }, 'color-swatch': { // 2026-08-23. The inset ring is OPT-IN (`bordered`, off by default) and NO // consumer in the repo passes it, so the `::after` that draws it exists on // no page. Forced `data-bordered` on a real chip of the gradient-builder // stage, transitions frozen: the ring appears and both tokens follow. 'border-width': 'the `bordered` ring is opt-in and no consumer mounts it; forced data-bordered on the real chip → reaches (inset 0 0 0 1px → 1234px)', 'border-fg': 'same opt-in ring; forced data-bordered on the real chip → reaches (oklch(0.931 0 0) → rgb(1, 2, 3))' }, form: { // 2026-08-23. 'grid-min': "only under [data-layout='grid'], and the computed template only CHANGES when the value alters the column count: forced the layout and 90px -> reaches (502px -> four 110.5px columns)", 'error-summary-list-indent': 'the summary renders EMPTY in the demo (no errors), so it has no