0553a06728
The monolithic if/else-if dispatcher becomes nine modules by event family. The routing preamble runs once, then each handler consumes its own types and reports whether it did, so dispatch stops at the first taker. Families are mutually exclusive by type, so ordering between them is inert; ordering within a family is unchanged. Restores two things the extraction dropped against a moving base: the layout.apply handler, and the multi-question clarify.request path. A batch clarify was consumed and never parked, so the agent blocked on clarify.respond with no card rendered — the existing tests passed because they assert "exactly one clarify card", which is also true when the request is dropped and only the tool.start row exists.