docs/height-ownership.md
Height: does it belong to the World?
The test: if the renderer disappears, does height still exist?
tests/height-ownership.test.ts.
Measured
service height 15.80 → 30.20 (a real code-size measurement reaches it)
hall height when services are small: 30.02
hall height when a service is large: 57.38
observations about the hall itself: unchanged
City Hall's height nearly doubles when a different building grows. Its rule
is { kind: "orchestration", multiple: 1.9 } — tallest × 1.9 — so height is a
function of the set, not of the subject. Nothing observed about City Hall
changed.
That alone settles it. A world fact about a subject does not move when a neighbour is measured.
The correction
My hypothesis was that the magnitude is unrecoverable from the World once height is written. The test refuted it:
height 21.92 world units · magnitude 50000 code-size — both present
transform parameters (base, scale) in World: no
World.measurements carries the raw quantity. The World is not lossy here —
it keeps the measurement alongside the pre-computed height.
That is a stronger argument for moving height, not a weaker one. The World
already holds the input, so height is a premature projection sitting next to
its own source, and removing it would lose nothing. Had the magnitude been
absent, moving height would have required rescuing it first.
Second retraction in two rounds where the measurement improved the conclusion by refusing my framing.
Verdict
| Property a world fact would have | height |
|---|---|
| function of the subject alone | no — depends on the set |
| magnitude survives in the World | yes — in measurements |
| invertible from the mark alone | no — base/scale are not written |
| meaningful without a scene | no — world units are scene units |
code-size = 50000 bytessurvives any renderer.height = 21.92 world unitsdoes not.
Height belongs to projection. It was not moved: the jumpTo dependency in
WorldView:33 means the projection must expose a size to the camera, and that
interface is a design decision this measurement does not make.
Loss kinds — not every loss is equally bad
The audit's fourth column now carries a kind, because a uniform list of losses reads as uniformly damning and they are not. The discriminator is whether the discarded information changes the claim.
aggregation alert beacon and label colour
ambiguity district ring opacity
compression identity hue, co-change position
hidden-basis box emissive intensity, box height
irrelevant capacity readout, box footprint
- compression — a colour cannot encode an identity mapping. Expected of the channel; the claim is unaffected.
- aggregation —
max()keeps the worst incident. "Failing" stays true; the count does not survive. - ambiguity and hidden-basis are the two that change what the mark claims, and they are asserted as a set:
claim-changing loss: box emissive intensity · box height · district ring opacity
box height joins that set for a reason this round produced: its scale
parameters are not written, so a viewer sees a size whose normalisation is
unrecoverable — the same shape as activity's ceiling, in geometry rather than
light.
Standing
| Measurable defect exposed? | yes — height is set-dependent and scene-only |
| Measurable improvement? | none made — height not moved, deliberately |
| Hypothesis corrected by measurement? | yes — the magnitude does survive |
What is still not established
- Height was not moved.
WorldView:33passesb.heighttojumpTo, so the projection must expose a size to the camera. What that interface looks like is the open design question, and building it blind would produce the generic "projection blob" worth avoiding. orchestrationis one rule of four.fixed,loadandmeasuredo not depend on the set; only City Hall's does. The set-dependence finding is real and applies to one building.- Loss kinds are assigned by hand. The taxonomy discriminates — five kinds across eight channels — and nothing derives the assignment from the channel.
footprintis filedirrelevantbecause it carries nothing. That is accurate and slightly generous: a channel with no input has no loss, and it still occupies a visual dimension.
258 → 263 tests, 26 DOM, tsc clean.