One emission’s call-site descriptor. Built by the record! macro
from the Event constructor + builder calls and consumed by the layer.
Everything is by-value; the macro takes &Event to keep call sites
non-moving.
Closed event.action taxonomy. Adding a verb requires extending
this enum — no Other(&str) escape hatch on purpose. The snake_case
form of each variant is the on-disk event.action string, derived
via strum::IntoStaticStr.
Plain alias-bound attribution fields. Adding to this list is the ONLY
per-field change needed — Layer/reader/gateway/UI all read this list
at runtime instead of hardcoding the per-field plumbing.
Composite alias-bound prefixes. Each prefix gets three on-disk keys:
<prefix> (full <type>.<alias>), <prefix>_type, <prefix>_alias.
Adding to this list propagates to every consumer the same way as
ATTRIBUTION_FIELDS.