Skip to content

color-contrast still excludes /game/cod-skeleton for a WebGL render loop that no longer runs at load #793

Description

@TortoiseWolfe

tests/e2e/color-contrast.spec.ts:123 excludes /game/cod-skeleton from the AAA sweep, and
states its reason precisely:

'/game/cod-skeleton':
  'continuous WebGL render loop; the readiness wait cannot settle under software ' +
  'rendering (synchronous GPU readback, #719) — HUD chrome measured instead by ' +
  'cod-skeleton-hud-contrast.spec.ts',

That reason stopped being true when #757 landed. The scene is now gated behind an explicit
start, so at page load the route constructs no WebGLRenderer, runs no render loop, and
performs no GPU readback. Measured on a root build with SwiftShader forced, the route went
from 7.6s to 2.6s and reports canvas=0 until the start control is pressed.

The exclusion is therefore load-bearing for a condition that no longer exists.

Why this is worth doing rather than leaving

The exclusion comment is unusually honest about its own cost — "NOTE WHAT THIS COSTS: the
page's contrast is now genuinely unmeasured" — and routes that around to
cod-skeleton-hud-contrast.spec.ts, which measures the HUD chips only. The sweep would
measure the whole page: the <h1>, the breadcrumb, the descriptive paragraph, and now the
start placeholder's own text and button, none of which any contrast gate looks at today.

The placeholder in particular is new, visible to every visitor before anything else, and
currently unmeasured by any contrast gate
. It uses text-base-content on bg-base-200 and
text-base-content/85 for the hint — and CLAUDE.md records that base-200 is exactly the
surface where seven light-theme colours measured 6.4-6.5:1 against a 7:1 gate, and where
/80 and /85 opacity text fails AAA (#462). So there is a live reason to think this
placeholder needs measuring, not merely that it can be.

What to do

  1. Remove the /game/cod-skeleton entry from EXCLUDED and run the sweep against it.
  2. If it settles (expected), keep it and delete the exclusion comment.
  3. If it does not settle, restore the exclusion with a reason that describes the current
    failure rather than the old one — an exclusion whose stated cause has been fixed is worse
    than no comment, because it stops anyone re-testing it.
  4. Fix whatever the sweep then reports. Watch /85 on the hint text specifically; text-base-content/80 and /85: no surface is safe on any theme — 94 shipped instances to sweep #462 covers
    that class of failure and may fix it globally first.

Do not simply delete the exclusion without running it — the whole point of #396 is that a
coverage floor moves only with evidence.

Follows #757. Related: #715 (the HUD chips this exclusion routes around), #719 (the readback
freeze that caused it), #462 (/80 and /85 failing AAA on base-200).

Metadata

Metadata

Assignees

No one assigned

    Labels

    3dCesium/Three.js/diorama/twin 3D work — parked behind the enterprise arcbugSomething isn't workingpriority:p3Low — defer (heavy work, polish, nice-to-haves)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions