Surface / Surface and Bundle
What each one is made of
A Surface, built from the Model's own Schema so it cannot name a missing
field: a name, optional params, a Projection of what it reads, and the
Messages it may send. App.surface('TodoList', …) is plain data — inspectable
without running anything, renderable, usable as an agent's context, and
collected by Module next to contracts.
A Bundle, built from its own Model/Message Schemas: the child's transition
parts in one value, plus args. Bundle.declare(MediaQuery, 'dark') gives the
placement its Model field and its wrapper variant; Page.at(…) places it;
Page.assemble(…) derives the parent's update, init, Subscriptions, and
checks. The child's Messages travel wrapped (GotDarkMessage), so two
placements of one bundle never claim the same tag.