engate-types — typed phase markers + traits for the engate attach
primitive. The actual attach machinery lives in engate-attach;
this crate is the small dependency-free contract so consumers can
depend on shapes without pulling in statig / typed-builder.
Why
The bug class engate kills: a producer (PTY, WS, MQ, network) emits data BEFORE a consumer subscribes; subscribe returns only NEW data; the consumer's local model stays empty even though the producer's state is full. Today's hand-wired attach paths in the pleme-io fleet (mado↔tear, kenshi↔testpod, hiroba clients, ayatsuri↔mado, namimado↔CDP) all suffer this class.
The fix: model attach as a 4-state typestate
(Spawned → Subscribed → Synced → Live) where the consumer can
only render from a Live value, Live can only be reached via
Synced.start_live(), Synced can only be reached via
Subscribed.replay(history), and history is a #[must_use]
linear-ish handle that cannot be dropped without being consumed.
Reaching the render path WITHOUT history is unrepresentable in
the type system.
See pleme-io/CLAUDE.md task tracker (#123-#129) for the full
M0-M6 roadmap.