Prevent join explosions and silent definition changes by adding key + rowcount assertions around merges.
Any time you change a join, filter, crosswalk, aggregation, or key definition.
stop(...) with a clear error.intersect(required_cols, names(dt)) + if (length(...)) { ... } else { fallback }.total_violations) when specific required columns are missing.Add (or reuse) tiny helpers in R/:
assert_unique(dt, keys, label)assert_row_change(n_before, n_after, upper_mult, label)summarize_join(left, right, keys, label)Always log:
If any of these happen, stop and ask the user: