Empty subclasses that encode a type code without behavior; the agent navigating the hierarchy traverses indirection for what could be a field.
The variant becomes a field on the parent; the agent reads variants as data instead of navigating a hierarchy.
Before the refactoring
class Person {}class Female extends Person {}class Male extends Person {}
After the refactoring
class Person {constructor(gender) { this.gender = gender; }}
Every new variant is a new file the agent must create; the hierarchy ceremony costs reasoning without behavior payoff.
If the subclass is referenced by name elsewhere (factories, registries, type-tests), removing it silently breaks those references the agent must find and update.
Smaller hierarchy; new variants are field values not new files; the agent reasons about variability as data.
Removing subclasses referenced by factories, registries, or type-tests breaks those references — the agent must find every such consumer before deletion.