docs/geometry-provenance.md
Audit: the geometry-driving fields
Item 1's remainder. Three questions per field, measured before anything moves — the discipline that made Item 1 small.
tests/geometry-provenance.test.ts.
The audit
| height | accent | activity | |
|---|---|---|---|
| who consumes it | WorldScene:294 box height · WorldView:33 camera framing · constitution:191 invariant |
CityMap ×8 (2-D view) · WorldScene emissive |
WorldScene:193,314 opacity + emissive · WorldView:251 displayed as % |
| observed or derived | derived — resolveHeight(heightRule, load, tallest, measure) |
derived — hueFor(id), a hash of identity |
derived — normalised against a ceiling |
| value or relation | relation. The claim is ordering; any monotone map preserves it | relation. The claim is distinctness; any injective map preserves it | relation, except WorldView shows the value |
| verdict | pre-derived geometry | realization choice, stored as a fact | pre-derived, and carrying a convention |
accent is the clearest case. The Information Ledger already declares
identity→hue as a projection (projection.ts:96). The World stores that
projection's output and calls it a field. It is a realization choice living
inside the canonical model.
height needs a value at exactly one non-geometry site — WorldView:33
passes it to jumpTo to frame the camera. That is a real dependency on the
number, not the ordering, and it is worth knowing before the field moves.
The defect the audit surfaced
Asking "is activity observed or derived?" led to the ceiling it is normalised against, and then to this:
4 activity ceilings, all assumed: hall=8, security=6, library=50, conference=3
declared ceilings unreferenced by id: 4/4
same values present as bare literals: 4/4
Every activity reading in the product divides by a number that is declared in
ASSUMED_CONSTANTS and read by nothing. The substrate divided by /50, /3,
/8, /6 as literals.
Article VI requires these to be named and their basis stated. They were — in a
table nothing read. Two authorities for one quantity, free to diverge, with
nothing detecting it: the same defect class as id duplicating factIdentity.
And the consequence reaches the screen. WorldView:251 renders
(building.activity * 100).toFixed(0) — "Activity 87%" — where the
denominator is assumed: true. A stipulation presented with the precision of a
measurement.
Repaired
constitution.assumed(id) is now the single source, and it throws on an
unknown id rather than returning a default — a silent fallback would
reintroduce the untraceable number it replaces.
declared ceilings unreferenced by id: 4/4 → 0/4
same values present as bare literals: 4/4 → 0/4
department-task-ceiling was unreferenced too and is now wired. Six call sites
across runtime.ts and telemetry.ts.
The percentage is still shown to two significant figures over an admitted guess. That was not repaired: the number is now traceable, and whether a convention-warranted value should be displayed with evidential precision is a presentation decision, not a correctness one.
Standing
| Measurable defect exposed? | yes — 4 declared constants read by nothing |
| Measurable improvement? | yes — 4/4 → 0/4, asserted against regression |
| Fields moved? | none — the audit is the deliverable |
What is still not established
- Nothing was moved out of
World. The audit saysaccentis a realization choice andheight/activityare pre-derived geometry; acting on that means the renderer computes them, andWorldView:33's dependency on the height value is the constraint to design around. activity's ceilings are still guesses. Wiring them changed traceability, not warrant. Four of the six constants remainassumed: true, correctly declared and still unmeasured.- The audit covers three fields.
footprintis also geometry and was not examined —tests/footprint-identity.test.tsasserts it answers "what kind of thing", which now meanssubtype, so it is likely a fourth realization choice.
231 → 235 tests, 26 DOM, 40 mutations, tsc clean.