A shape describes which values are allowed. Int is a shape; so is Int & >= 18 (the integers from 18 up), :standard | :premium (one of two atoms), and {name: String, age: Int & >= 0} (a record with two fields).
A shape with named fields is a structural shape; the others are atomic. Giving a structural shape a name makes a structural type.
Shapes are values. You can bind one with let, return it from a function, and combine shapes with unification (&):
bondy
let adult = Int & >= 18
age & adult %% the age if it is 18 or more; a failure saying why, if notNot to be confused with a role (relation, constraint, event, fluent): a shape says which values are allowed, a role says what those values are doing.