Propagate a role table through a ShapeEvolution record.
Returns a new RoleTable with hashes updated according to the evolution.
Deleted faces: hash dropped (role removed once all its hashes are gone).
Modified faces: hash replaced by all successor hashes — so a 1→many
split keeps every fragment, and resolveRef disambiguates among them.
Unchanged faces: hash preserved.
Note: evolution.generated is intentionally not consumed here — on the OCCT
kernels its hashes refer to an intermediate shape, not the final result, so
naming generated faces produces roles that never resolve (verified: 0 live
generated hashes across cut/fuse on occt-wasm). Stable names for generated
geometry (fillet rounds, boolean seams) need history-fidelity work tracked
separately.
Propagate a role table through a ShapeEvolution record. Returns a new RoleTable with hashes updated according to the evolution.
resolveRefdisambiguates among them.Note:
evolution.generatedis intentionally not consumed here — on the OCCT kernels its hashes refer to an intermediate shape, not the final result, so naming generated faces produces roles that never resolve (verified: 0 live generated hashes across cut/fuse on occt-wasm). Stable names for generated geometry (fillet rounds, boolean seams) need history-fidelity work tracked separately.