sessions_per_weeknumber nullable required
active_hours_90dinteger nullable required
signal_key'in_app_now' | 'deposit_spike' | 'going_quiet' | 'dormant' | 'steady' required
Declared most-urgent first — position in this class IS the priority.
_derive_signal walks these rungs in order and returns the first
match, so each predicate is written assuming every rung above it
already failed (DORMANT is bare "silent 4d+" because reaching it
already means GOING_QUIET did not match).
last_action_atstring date-time nullable required
last_action_event_keystring nullable required
last_sent_atstring date-time nullable required
last_sent_channelstring nullable required
added_atstring date-time required
rollups_computed_atstring date-time nullable required
sends_used_monthinteger required
sends_month_labelstring required
suggested_send_atstring date-time nullable required
monetization_event_keystring nullable required
engagement_event_keystring nullable required