{
  "id": "OPS-139",
  "slug": "ops-139",
  "title": "One number, one static route",
  "statement": "Each 10DLC, short code or toll-free number must use a single static route; dynamic routing is permitted only for major network outages.",
  "rationale": "Static routing is what makes traffic attributable — carriers trace a complaint back through the route, and a number whose path changes per message cannot be traced or trusted. Dynamic routing is also how grey routes get used without anybody choosing one, since a least-cost router will find them on its own.",
  "layer": "OPERATIONAL",
  "layerSlug": "operational",
  "object": "route configuration per number",
  "severity": "BLOCKING",
  "detectability": [
    "HUMAN"
  ],
  "failureClass": "TERMINAL_EXTERNAL",
  "authorities": [
    "T-Mobile",
    "AT&T",
    "Vonage",
    "Telnyx"
  ],
  "applicabilityText": "Applies to every 10DLC registration.",
  "universal": true,
  "remediation": "Pin each number to one authorised route and disable least-cost or failover routing except during a declared outage. Done when the path a message takes is the same one every time and you can name it.",
  "notes": "Carrier-side routing configuration. What the user has to ask their provider is whether least-cost routing is enabled on their account — it often is by default, and it is the mechanism behind the grey-route rule below.",
  "phase": "post",
  "automated": false,
  "attestation": {
    "question": "Is least-cost or failover routing enabled on your account — and can you name the single route each number takes?",
    "howToCheck": [
      "Ask your provider directly whether least-cost routing is on. It often is by default.",
      "Pin each number to one authorised route and disable failover except during a declared outage.",
      "Done when the path a message takes is the same one every time and you can name it."
    ],
    "failureLooksLike": "A least-cost router finds a grey route on its own, so nobody chose one and the traffic is on it anyway. A number whose path changes per message cannot be traced back from a complaint."
  },
  "url": "https://ekas.io/rules/10dlc/operational/ops-139/",
  "markdown": "https://ekas.io/rules/10dlc/operational/ops-139.md",
  "registry": "https://ekas.io/rules/10dlc/",
  "updated": "2026-07-25",
  "licence": "CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/"
}
