docs/footprint-and-convention.md
Footprint, and the evidence/convention channel
Two measurements. Neither field was moved — the audits are the deliverable.
tests/geometry-provenance.test.ts, tests/evidence-vs-convention.test.ts.
1. Footprint
The three questions, answered by measurement.
Does footprint represent a fact? No.
footprint literals in structure.ts: 11, 7, 6, 8
Four bare numbers, assigned per subtype. Nothing in core or
lib/world/facts.ts carries a footprint. height has a heightRule naming a
measurement; there is no footprintRule.
Does it represent a projection choice? Entirely. A file has no physical footprint. A database does not occupy more land than a component. Building shape is renderer vocabulary, and this is the field that admits it most plainly.
Does it encode subtype assumptions? Yes — and a test enshrines it.
footprint-identity.test.ts asserts that footprint must answer "what kind of
thing is this". After the kind split that means subtype, so the
invariant now reads: a projection choice must be constant per domain label.
That is a coherent rule for a renderer and a strange one for a canonical model.
The documentation contradicts the code
facts.ts:158 states the module's purpose:
"This is what removes hardcoded geometry. Structure declares which measurement drives a dimension ("footprint follows the
filesmetric")."
Footprint follows no metric. It is 11, 7, 6, 8. The claim is made in the
module whose stated job is eliminating exactly this, which is the same family as
the constants table nothing read — a declared authority and an actual authority,
with no arbitration — and stated more prominently than either.
And in a generated world it carries nothing
generated world: 10 buildings, 1 distinct footprint value
By this project's own condition 4 — a visual property that never varies with the
facts carries zero information and is decoration by definition — footprint is
decoration in every generated world. In the estate it carries at most
log₂(4) = 2 bits, and those two bits are a subtype label already carried by
subtype.
2. Evidence and convention on one channel
The adversarial experiment. activity is a measured count over a ceiling
declared assumed: true, and the renderer maps it to emissiveIntensity. One
channel, an evidence-warranted numerator and a convention-warranted
denominator, and the viewer sees only the quotient.
baseline (4 items, ceiling 8): emissive 0.545
A convention changed (4, ceiling 4): emissive 0.970
B evidence changed (8, ceiling 8): emissive 0.970
Bit-identical. In A the estate did not change — someone revised a guess. In B the estate's blocked work doubled. The city looks the same.
The inspector does not rescue it. Both read "Activity 100%". The evidence string differs in B ("8 blocked items" vs "4"), so the numerator is recoverable — the denominator never appears. A reader seeing "Activity 100% — 4 blocked items estate-wide" cannot tell whether four items is saturation because four is a lot, or because someone set the ceiling to four.
What this is, precisely
Not lost information. constitution.assumed(id) names the ceiling and
unverifiedAssumptions() lists it. The finding is narrower and sharper:
The information exists and the channel does not carry it. A single scalar cannot separate the two warrants that produced it.
This is the grammar question stated as a measurement: should a convention-warranted quantity be rendered with the same confidence as an observed one? Today it is rendered identically, and the answer is available to the renderer and unused.
Standing
| Measurable defect exposed? | yes, two — footprint is undeclared decoration; the activity channel merges warrants |
| Measurable improvement? | none made — measurement before repair |
| Fields moved? | none |
What is still not established
- Neither was repaired, deliberately. Footprint's repair is a projection decision (does the renderer choose shape, and from what?), and the activity repair is the open grammar question about rendering warrant.
- The height/
jumpToconstraint is unaddressed. The suggested split —Worldcarries magnitudes, projection owns scale, camera asks the projection — is not implemented, andWorldView:33is the site that shapes it. - The evidence/convention finding is demonstrated on
activity.heightnormalises againsttallestandfootprintagainst nothing; whether they merge warrants the same way was not measured. footprint-identity.test.tsstill asserts the per-subtype invariant. It is now documented as a renderer rule wearing a model rule's clothes, and left standing because removing it would delete a real regression guard before a replacement exists.
235 → 242 tests, 26 DOM, tsc clean.