ConstReadonlyCLASSIFICATIONS: "ifclite::classifications"Collab structured-branch carriers (#1031): the collab runtime keeps
classifications / materials / geometry refs as dedicated CRDT
branches; on the IFCX wire they travel as ordinary attributes under
these keys (psets/quantities use the bsi::ifc::v5a::<Set>::<Name>
convention instead, so merge component keys stay pset:/qset:).
ReadonlyDELETED: "ifclite::deleted"Tombstone opinion: true deletes the entity (and shadows all weaker
opinions for the path, including child paths); false resurrects it.
ReadonlyDERIVED: "ifclite::derived"Marks derived (cache) content excluded from canonical hashing.
ReadonlyGEOMETRY_REF: "ifclite::geometryRef"ReadonlyMATERIALS: "ifclite::materials"ReadonlyMETA: "ifclite::meta"Per-entity provenance carrier (createdBy / createdAt /
lastEditedBy / lastEditedAt / previousPath). IFCX nodes have
no provenance slot of their own, so without this key a snapshot
round trip loses whoever authored an entity — and the reader then
back-fills the FILE header's author and the read clock, which is
fabricated attribution wearing the shape of the real thing.
Every field carried here is written once, when the entity is
created, and never re-stamped — lastEditedBy / lastEditedAt
included (only promoteEntityType writes them, on the new entity).
That is load-bearing, not incidental: a field re-stamped on each
edit would make this attribute change whenever anything else on the
entity does, putting it in every minimal layer and handing the merge
engine a component that conflicts on every concurrent edit. If a
per-edit stamp is ever wanted, give it its own key rather than
adding it here.
IFClite extension attributes for layered change tracking (docs/architecture/layer-prs/). Tools unaware of the namespace ignore these and still get valid IFCX composition (modulo deletion overlays, which
bakeLayerscan materialize away for foreign tools).