The three reading surfaces, as the render layer names them.
⚠️ Declared here rather than imported from contracts/attributes.contract.ts,
where AttributeSurface says the same thing, because this module's stated
invariant is that it imports nothing — not core, not the field-renderer package,
not a sibling. The parity gate is what keeps the two lists equal; a shared import
would trade a checked duplication for a broken invariant.
The three reading surfaces, as the render layer names them.
⚠️ Declared here rather than imported from
contracts/attributes.contract.ts, whereAttributeSurfacesays the same thing, because this module's stated invariant is that it imports nothing — not core, not the field-renderer package, not a sibling. The parity gate is what keeps the two lists equal; a shared import would trade a checked duplication for a broken invariant.