Crystal's annotation system lacked tight coupling between annotation types and their runtime representations. Framework authors building validation libraries, ORMs, or serialization tools had to maintain two separate type hierarchies:
- An annotation type for compile-time metadata
- A corresponding class/struct for runtime logic
This duplication was error-prone and verbose. Users couldn't easily convert annotations to runtime objects or leverage inheritance for annotation hierarchies.