Per-severity routing

When a rule is set with channel_routes, the dispatcher picks channels by severity:

{
  "critical": ["pagerduty-prod", "slack-incidents"],
  "warning": ["slack-monitoring"],
  "info": [],
  "default": ["slack-monitoring"]
}

Fallback chain

  1. routes[severity] if set
  2. routes["default"] if the previous is empty
  3. Legacy channel_ids if channel_routes is absent

Intentional silence

An empty array "info": [] is an explicit "don't notify on info". Don't confuse it with a missing key (then default kicks in).