Live-query subscribable field. dependsOnFields defaults to
['quantity'] (descriptor name = source field name), so
FieldChangedEvent { field: 'quantity' } from setQuantity
triggers re-projection automatically.
One-time composition check, run by MixinApi.assertComposable
the first time a concrete class is registered.
Enforces:
Globbable ⊥ Container — globs aren't containers.Globbable ⊥ Singleton — singletons are one-instance-per-
templatePath; splitting would need a second instance at
the same path and StuffApi.clone would refuse it.globIdentityFields ⊂ persistentFields — identity fields
must survive save/load.
Subset of
persistentFieldsthat defines glob identity. Two stacks of the same templatePath merge iff every field listed here has equal values on both sides.Default
[]means strict template-fungibility — every instance of the host class merges with every other (modulo shadows / adornments).