We have inherited lists with two hundred names where forty would do. The usual path is a heroic “migration sprint” that never quite finishes because the old names still fire in a forgotten screen. Taxonomy debt is not a moral story about sloppy engineers. It is what happens when product language changes faster than the SDK.
Net Mapcore’s working rule is written on the first worksheet of Signal Architecture. The event is an object and a verb a person would recognise: checkout_started, not newFlow3. Properties hold the variation: plan, source, screen. Screen names do not become events unless the screen itself is the action, which it almost never is. If you cannot say the event aloud in a stand-up without explaining an internal code, it is not ready.
Versioning belongs in a property or in a documented sunset, not in a twin event called checkout_started_v2 living forever beside the original. Contractors, especially, will fire both. We have watched a UK marketplace double-count add-to-basket for eleven weeks because two agencies were briefed on different lists.
Governance is a short council, not a committee. One person may mint a name; two people must sign a retirement. The retirement date is a real calendar day. After that day the old event is allowed to die in silence. Dashboards that still depend on it are the owners’ problem, which is the point: charts should feel the wound when language changes, or they will never move.
This discipline will annoy a team that likes shipping under a Friday flag. It is still cheaper than a year of mutually unintelligible funnels. If you want the live markup, the Event grammar module is where we do it; this letter is only the principle.