What each geometry type does — the one table to read.
Behaviour written once per type drifts. Points and Lines lacked the
sorted-append hold GSplats had; a Lines ladder picked against the wrong
index space; a mesh ladder silently dropped its texture; a bare GSplats leaf
was refused a colormap its wrapper offered. Each was a cell of this table
that nobody had written down, so nothing could notice it was empty.
Every row is one behaviour; every column is a contract geometry type. A
cell is either 'yes' or an Absent that names WHY the type does not
do it, HOW that is enforced, and WHERE the decision is written. Keyed by
GeometryTypeName, so adding a type to the format contract is a compile
error here until every row has decided what the new type does.
Each row names the test file that probes it (probedIn). That file calls
defineBehaviourConformance (./define-behaviour-conformance.ts) with the row's id and a per-type probe,
which runs every cell against real code: a 'yes' cell asserts the
behaviour, an absent cell asserts its declared enforcement. So a cell that
claims 'yes' but silently does nothing fails, and so does an absent cell
whose type quietly started doing the thing — the table cannot rot in either
direction. tests/unit/conformance/geometry-behaviours.test.ts checks the
table itself: every row probed exactly once, where it says; every spec
reference resolvable; the capability rows equal to GEOMETRY_CAPABILITIES.
Deliberate asymmetries are as much a part of this table as the symmetries.
Mesh is a connected, shaded, indexed surface rather than a set of
independent emissive instances, so most of its absent cells trace back to
MESH_NODE_SPEC.md §2 (the storage layer does not transfer) and §9
(explicitly out of scope).
What each geometry type does — the one table to read.
Behaviour written once per type drifts. Points and Lines lacked the sorted-append hold GSplats had; a Lines ladder picked against the wrong index space; a mesh ladder silently dropped its texture; a bare GSplats leaf was refused a colormap its wrapper offered. Each was a cell of this table that nobody had written down, so nothing could notice it was empty.
Every row is one behaviour; every column is a contract geometry type. A cell is either
'yes'or an Absent that names WHY the type does not do it, HOW that is enforced, and WHERE the decision is written. Keyed byGeometryTypeName, so adding a type to the format contract is a compile error here until every row has decided what the new type does.Each row names the test file that probes it (
probedIn). That file callsdefineBehaviourConformance(./define-behaviour-conformance.ts) with the row's id and a per-type probe, which runs every cell against real code: a'yes'cell asserts the behaviour, an absent cell asserts its declared enforcement. So a cell that claims'yes'but silently does nothing fails, and so does an absent cell whose type quietly started doing the thing — the table cannot rot in either direction.tests/unit/conformance/geometry-behaviours.test.tschecks the table itself: every row probed exactly once, where it says; every spec reference resolvable; the capability rows equal toGEOMETRY_CAPABILITIES.Deliberate asymmetries are as much a part of this table as the symmetries. Mesh is a connected, shaded, indexed surface rather than a set of independent emissive instances, so most of its
absentcells trace back toMESH_NODE_SPEC.md§2 (the storage layer does not transfer) and §9 (explicitly out of scope).