[
  {
    "slug": "availability-set",
    "resourceType": "Availability set",
    "category": "Compute",
    "provider": "Microsoft.Compute/availabilitySets",
    "abbreviation": "avail",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "compute-gallery",
    "resourceType": "Compute gallery",
    "category": "Compute",
    "provider": "Microsoft.Compute/galleries",
    "abbreviation": "gal",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "_",
    "allowHyphens": false,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.]*[A-Za-z0-9])?$",
    "charSet": "Alphanumerics, underscores, and periods. No hyphens. Start and end with alphanumeric.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Hyphens aren't allowed, unlike almost every other compute resource. Use underscores as the separator.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "disk-encryption-set",
    "resourceType": "Disk encryption set",
    "category": "Compute",
    "provider": "Microsoft.Compute/diskEncryptionSets",
    "abbreviation": "des",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z0-9_-]{1,80}$",
    "charSet": "Alphanumerics, underscores, and hyphens.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "managed-disk",
    "resourceType": "Managed disk",
    "category": "Compute",
    "provider": "Microsoft.Compute/disks",
    "abbreviation": "disk",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z0-9_-]{1,80}$",
    "charSet": "Alphanumerics, underscores, and hyphens.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "OS disks created with a VM get an automatic name (<vm>_OsDisk_1_<guid>) unless you set one. Don't deny non-matching disk names, or VM deployments that rely on the default will fail.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "snapshot",
    "resourceType": "Snapshot",
    "category": "Compute",
    "provider": "Microsoft.Compute/snapshots",
    "abbreviation": "snap",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "virtual-desktop-application-group",
    "resourceType": "Virtual desktop application group",
    "category": "Compute",
    "provider": "Microsoft.DesktopVirtualization/applicationGroups",
    "abbreviation": "vdag",
    "minLength": 3,
    "maxLength": 64,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{3,64}$)[A-Za-z0-9][A-Za-z0-9_.-]*[A-Za-z0-9_]$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with a letter or number; end with a letter, number, or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "virtual-desktop-host-pool",
    "resourceType": "Virtual desktop host pool",
    "category": "Compute",
    "provider": "Microsoft.DesktopVirtualization/hostPools",
    "abbreviation": "vdpool",
    "minLength": 3,
    "maxLength": 64,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{3,64}$)[A-Za-z0-9][A-Za-z0-9_.-]*[A-Za-z0-9_]$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with a letter or number; end with a letter, number, or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "virtual-desktop-workspace",
    "resourceType": "Virtual desktop workspace",
    "category": "Compute",
    "provider": "Microsoft.DesktopVirtualization/workspaces",
    "abbreviation": "vdws",
    "minLength": 3,
    "maxLength": 64,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{3,64}$)[A-Za-z0-9][A-Za-z0-9_.-]*[A-Za-z0-9_]$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with a letter or number; end with a letter, number, or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "virtual-machine",
    "resourceType": "Virtual machine",
    "category": "Compute",
    "provider": "Microsoft.Compute/virtualMachines",
    "abbreviation": "vm",
    "minLength": 1,
    "maxLength": 64,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,64}$)[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?$",
    "charSet": "Letters, numbers, and hyphens. No underscores or periods. Can't start or end with a hyphen.",
    "guestNameMaxLength": 15,
    "guestNameLabel": "Windows host name",
    "gotcha": "The resource name can be up to 64 characters, but the host name is capped at 15 on Windows (no periods) and 64 on Linux, and underscores and periods aren't allowed. The portal uses one value for both, so keep VM names host-name safe and 15 characters or less for Windows.",
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "virtual-machine-scale-set",
    "resourceType": "Virtual machine scale set",
    "category": "Compute",
    "provider": "Microsoft.Compute/virtualMachineScaleSets",
    "abbreviation": "vmss",
    "minLength": 1,
    "maxLength": 64,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,64}$)[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?$",
    "charSet": "Letters, numbers, and hyphens. No underscores or periods. Can't end with a period or hyphen.",
    "guestNameMaxLength": 15,
    "guestNameLabel": "Windows host name",
    "gotcha": "Instance host names are derived from the scale set's computer-name prefix, and Windows host names are capped at 15 characters. AKS creates its own scale sets (aks-<pool>-<id>-vmss) in the node resource group, so don't enforce a vmss prefix there.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "app-service",
    "resourceType": "App Service",
    "category": "Web",
    "provider": "Microsoft.Web/sites",
    "abbreviation": "app",
    "minLength": 2,
    "maxLength": 60,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{2,60}$)[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Can't start or end with a hyphen.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Globally unique across azurewebsites.net. Function apps are the same resource type (Microsoft.Web/sites) with kind 'functionapp', so a naming policy has to tell them apart by kind.",
    "policyEnforceable": true,
    "policyConditions": [
      {
        "field": "kind",
        "notContains": "functionapp"
      }
    ]
  },
  {
    "slug": "app-service-plan",
    "resourceType": "App Service plan",
    "category": "Web",
    "provider": "Microsoft.Web/serverFarms",
    "abbreviation": "asp",
    "minLength": 1,
    "maxLength": 60,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z0-9-]{1,60}$",
    "charSet": "Alphanumerics and hyphens (Unicode that maps to Punycode is also accepted).",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "function-app",
    "resourceType": "Function app",
    "category": "Web",
    "provider": "Microsoft.Web/sites",
    "abbreviation": "func",
    "minLength": 2,
    "maxLength": 60,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{2,60}$)[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Can't start or end with a hyphen.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "The host ID is the app name truncated to 32 characters. Two function apps sharing a storage account and the same first 32 characters collide, so keep names unique within 32 characters.",
    "policyEnforceable": true,
    "policyConditions": [
      {
        "field": "kind",
        "contains": "functionapp"
      },
      {
        "field": "kind",
        "notContains": "workflowapp"
      }
    ]
  },
  {
    "slug": "aks-cluster",
    "resourceType": "AKS cluster",
    "category": "Containers",
    "provider": "Microsoft.ContainerService/managedClusters",
    "abbreviation": "aks",
    "minLength": 1,
    "maxLength": 63,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,63}$)[A-Za-z0-9](?:[A-Za-z0-9_-]*[A-Za-z0-9])?$",
    "charSet": "Alphanumerics, underscores, and hyphens. Start and end with alphanumeric.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "AKS creates a node resource group named MC_<rg>_<cluster>_<region> (80-character limit). Long cluster and resource group names push that derived name over its limit.",
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "aks-node-pool",
    "resourceType": "AKS node pool",
    "category": "Containers",
    "provider": "Microsoft.ContainerService/managedClusters/agentPools",
    "abbreviation": "np",
    "minLength": 1,
    "maxLength": 12,
    "scope": "Parent",
    "lowercase": true,
    "separator": "",
    "allowHyphens": false,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,12}$)[a-z][a-z0-9]*$",
    "charSet": "Lowercase letters and numbers. Can't start with a number. 12 characters on Linux, 6 on Windows.",
    "guestNameMaxLength": 6,
    "guestNameLabel": "Windows node pool",
    "gotcha": "The tightest limit in Azure: 12 characters for Linux pools and 6 for Windows pools, lowercase, no separators. A full abbreviation-workload-environment-region name never fits, so name pools by purpose (npsystem, npgpu, npwin1).",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "container-app",
    "resourceType": "Container app",
    "category": "Containers",
    "provider": "Microsoft.App/containerApps",
    "abbreviation": "ca",
    "minLength": 2,
    "maxLength": 32,
    "scope": "ResourceGroup",
    "lowercase": true,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{2,32}$)[a-z][a-z0-9-]*[a-z0-9]$",
    "charSet": "Lowercase letters, numbers, and hyphens. Start with a letter; end with a letter or number.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Only 32 characters and lowercase only. Region and instance tokens eat the budget quickly.",
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "container-instance",
    "resourceType": "Container instance",
    "category": "Containers",
    "provider": "Microsoft.ContainerInstance/containerGroups",
    "abbreviation": "ci",
    "minLength": 1,
    "maxLength": 63,
    "scope": "ResourceGroup",
    "lowercase": true,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,63}$)(?!.*--)[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
    "charSet": "Lowercase letters, numbers, and hyphens. Can't start or end with a hyphen; no consecutive hyphens.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "container-registry",
    "resourceType": "Container registry",
    "category": "Containers",
    "provider": "Microsoft.ContainerRegistry/registries",
    "abbreviation": "cr",
    "minLength": 5,
    "maxLength": 50,
    "scope": "Global",
    "lowercase": false,
    "separator": "",
    "allowHyphens": false,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z0-9]{5,50}$",
    "charSet": "Alphanumerics only. No hyphens or underscores.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Globally unique and no separators at all, so the tokens run together. The login server is always lowercase, so use lowercase names to avoid confusion.",
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "application-gateway",
    "resourceType": "Application gateway",
    "category": "Networking",
    "provider": "Microsoft.Network/applicationGateways",
    "abbreviation": "agw",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "application-security-group",
    "resourceType": "Application security group",
    "category": "Networking",
    "provider": "Microsoft.Network/applicationSecurityGroups",
    "abbreviation": "asg",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "azure-bastion",
    "resourceType": "Azure Bastion",
    "category": "Networking",
    "provider": "Microsoft.Network/bastionHosts",
    "abbreviation": "bas",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Needs a subnet named exactly AzureBastionSubnet.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "azure-firewall",
    "resourceType": "Azure Firewall",
    "category": "Networking",
    "provider": "Microsoft.Network/azureFirewalls",
    "abbreviation": "afw",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Needs a subnet named exactly AzureFirewallSubnet.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "connection",
    "resourceType": "Connection",
    "category": "Networking",
    "provider": "Microsoft.Network/connections",
    "abbreviation": "con",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "dns-private-resolver",
    "resourceType": "DNS private resolver",
    "category": "Networking",
    "provider": "Microsoft.Network/dnsResolvers",
    "abbreviation": "dnspr",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_-]*[A-Za-z0-9])?$",
    "charSet": "Alphanumerics, underscores, and hyphens. Start and end with alphanumeric.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "firewall-policy",
    "resourceType": "Firewall policy",
    "category": "Networking",
    "provider": "Microsoft.Network/firewallPolicies",
    "abbreviation": "afwp",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "front-door-profile",
    "resourceType": "Front Door profile",
    "category": "Networking",
    "provider": "Microsoft.Cdn/profiles",
    "abbreviation": "afd",
    "minLength": 1,
    "maxLength": 260,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,260}$)[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?$",
    "charSet": "Alphanumerics and hyphens. Start and end with alphanumeric.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "The profile name is scoped to the resource group, but its endpoints (<endpoint>-<hash>.z01.azurefd.net) are global.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "load-balancer-external",
    "resourceType": "Load balancer (external)",
    "category": "Networking",
    "provider": "Microsoft.Network/loadBalancers",
    "abbreviation": "lbe",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "load-balancer-internal",
    "resourceType": "Load balancer (internal)",
    "category": "Networking",
    "provider": "Microsoft.Network/loadBalancers",
    "abbreviation": "lbi",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "AKS creates load balancers named 'kubernetes' and 'kubernetes-internal' in the node resource group.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "local-network-gateway",
    "resourceType": "Local network gateway",
    "category": "Networking",
    "provider": "Microsoft.Network/localNetworkGateways",
    "abbreviation": "lgw",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "network-interface",
    "resourceType": "Network interface",
    "category": "Networking",
    "provider": "Microsoft.Network/networkInterfaces",
    "abbreviation": "nic",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "The portal names NICs automatically (<vm><random number>). Denying non-matching NIC names breaks portal VM creation.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "network-security-group",
    "resourceType": "Network security group",
    "category": "Networking",
    "provider": "Microsoft.Network/networkSecurityGroups",
    "abbreviation": "nsg",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "The portal creates <vm>-nsg automatically when you create a VM with a basic NSG.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "network-watcher",
    "resourceType": "Network Watcher",
    "category": "Networking",
    "provider": "Microsoft.Network/networkWatchers",
    "abbreviation": "nw",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Azure creates NetworkWatcher_<region> in NetworkWatcherRG automatically when you create a VNet. Exempt it from naming policy.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "private-endpoint",
    "resourceType": "Private endpoint",
    "category": "Networking",
    "provider": "Microsoft.Network/privateEndpoints",
    "abbreviation": "pep",
    "minLength": 2,
    "maxLength": 64,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{2,64}$)[A-Za-z0-9][A-Za-z0-9_.-]*[A-Za-z0-9_]$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Each private endpoint also creates a NIC (<endpoint>.nic.<guid>) unless you set a custom NIC name.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "public-ip-address",
    "resourceType": "Public IP address",
    "category": "Networking",
    "provider": "Microsoft.Network/publicIPAddresses",
    "abbreviation": "pip",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Load balancers, gateways, and Bastion created in the portal often create their own public IPs with generated names.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "route-table",
    "resourceType": "Route table",
    "category": "Networking",
    "provider": "Microsoft.Network/routeTables",
    "abbreviation": "rt",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "subnet",
    "resourceType": "Subnet",
    "category": "Networking",
    "provider": "Microsoft.Network/virtualNetworks/subnets",
    "abbreviation": "snet",
    "minLength": 1,
    "maxLength": 80,
    "scope": "Parent",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Some services require fixed subnet names: AzureFirewallSubnet, AzureBastionSubnet, GatewaySubnet, RouteServerSubnet. Those can't follow your convention.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "traffic-manager-profile",
    "resourceType": "Traffic Manager profile",
    "category": "Networking",
    "provider": "Microsoft.Network/trafficManagerProfiles",
    "abbreviation": "traf",
    "minLength": 1,
    "maxLength": 63,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,63}$)[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?$",
    "charSet": "Alphanumerics and hyphens. Start and end with alphanumeric. No periods.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "virtual-network",
    "resourceType": "Virtual network",
    "category": "Networking",
    "provider": "Microsoft.Network/virtualNetworks",
    "abbreviation": "vnet",
    "minLength": 2,
    "maxLength": 64,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{2,64}$)[A-Za-z0-9][A-Za-z0-9_.-]*[A-Za-z0-9_]$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "virtual-network-gateway",
    "resourceType": "Virtual network gateway",
    "category": "Networking",
    "provider": "Microsoft.Network/virtualNetworkGateways",
    "abbreviation": "vgw",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Needs a subnet named exactly GatewaySubnet.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "virtual-wan",
    "resourceType": "Virtual WAN",
    "category": "Networking",
    "provider": "Microsoft.Network/virtualWans",
    "abbreviation": "vwan",
    "minLength": 1,
    "maxLength": 80,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,80}$)[A-Za-z0-9](?:[A-Za-z0-9_.-]*[A-Za-z0-9_])?$",
    "charSet": "Alphanumerics, underscores, periods, and hyphens. Start with alphanumeric; end with alphanumeric or underscore.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "backup-vault",
    "resourceType": "Backup vault",
    "category": "Storage",
    "provider": "Microsoft.DataProtection/backupVaults",
    "abbreviation": "bvault",
    "minLength": 2,
    "maxLength": 50,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z][A-Za-z0-9-]{1,49}$",
    "charSet": "Alphanumerics and hyphens. Start with a letter.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "file-share",
    "resourceType": "File share",
    "category": "Storage",
    "provider": "Microsoft.Storage/storageAccounts/fileServices/shares",
    "abbreviation": "share",
    "minLength": 3,
    "maxLength": 63,
    "scope": "Parent",
    "lowercase": true,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{3,63}$)(?!.*--)[a-z0-9][a-z0-9-]*[a-z0-9]$",
    "charSet": "Lowercase letters, numbers, and hyphens. Can't start or end with a hyphen; no consecutive hyphens.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "recovery-services-vault",
    "resourceType": "Recovery Services vault",
    "category": "Storage",
    "provider": "Microsoft.RecoveryServices/vaults",
    "abbreviation": "rsv",
    "minLength": 2,
    "maxLength": 50,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z][A-Za-z0-9-]{1,49}$",
    "charSet": "Alphanumerics and hyphens. Start with a letter.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Azure Backup creates AzureBackupRG_<region>_1 for restore point collections. Exempt it from naming policy.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "storage-account",
    "resourceType": "Storage account",
    "category": "Storage",
    "provider": "Microsoft.Storage/storageAccounts",
    "abbreviation": "st",
    "minLength": 3,
    "maxLength": 24,
    "scope": "Global",
    "lowercase": true,
    "separator": "",
    "allowHyphens": false,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[a-z0-9]{3,24}$",
    "charSet": "Lowercase letters and numbers only. No hyphens, underscores, or uppercase.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Globally unique across all of Azure and no separators allowed, so the tokens run together. Easiest name to collide on. Portal-created function apps, Cloud Shell, and diagnostics create storage accounts with generated names.",
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "azure-cache-for-redis",
    "resourceType": "Azure Cache for Redis",
    "category": "Databases",
    "provider": "Microsoft.Cache/Redis",
    "abbreviation": "redis",
    "minLength": 1,
    "maxLength": 63,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,63}$)(?!.*--)[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?$",
    "charSet": "Alphanumerics and hyphens. Start and end with alphanumeric; no consecutive hyphens.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "cosmos-db-account",
    "resourceType": "Cosmos DB account",
    "category": "Databases",
    "provider": "Microsoft.DocumentDB/databaseAccounts",
    "abbreviation": "cosno",
    "minLength": 3,
    "maxLength": 44,
    "scope": "Global",
    "lowercase": true,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[a-z0-9][a-z0-9-]{2,43}$",
    "charSet": "Lowercase letters, numbers, and hyphens. Start with a letter or number.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Only 44 characters and globally unique. The prefix depends on the API, so a single naming policy can't check it reliably.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "mysql-flexible-server",
    "resourceType": "MySQL flexible server",
    "category": "Databases",
    "provider": "Microsoft.DBforMySQL/flexibleServers",
    "abbreviation": "mysql",
    "minLength": 3,
    "maxLength": 63,
    "scope": "Global",
    "lowercase": true,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{3,63}$)[a-z0-9][a-z0-9-]*[a-z0-9]$",
    "charSet": "Lowercase letters, numbers, and hyphens. Can't start or end with a hyphen.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "postgresql-flexible-server",
    "resourceType": "PostgreSQL flexible server",
    "category": "Databases",
    "provider": "Microsoft.DBforPostgreSQL/flexibleServers",
    "abbreviation": "psql",
    "minLength": 3,
    "maxLength": 63,
    "scope": "Global",
    "lowercase": true,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{3,63}$)[a-z0-9][a-z0-9-]*[a-z0-9]$",
    "charSet": "Lowercase letters, numbers, and hyphens. Can't start or end with a hyphen.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "sql-database",
    "resourceType": "SQL database",
    "category": "Databases",
    "provider": "Microsoft.Sql/servers/databases",
    "abbreviation": "sqldb",
    "minLength": 1,
    "maxLength": 128,
    "scope": "Parent",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,128}$)[^<>*%&:\\\\/?]*[^<>*%&:\\\\/?. ]$",
    "charSet": "Any characters except < > * % & : \\ / ? and control characters. Can't end with a period or space.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "sql-elastic-pool",
    "resourceType": "SQL elastic pool",
    "category": "Databases",
    "provider": "Microsoft.Sql/servers/elasticPools",
    "abbreviation": "sqlep",
    "minLength": 1,
    "maxLength": 128,
    "scope": "Parent",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,128}$)[^<>*%&:\\\\/?]*[^<>*%&:\\\\/?. ]$",
    "charSet": "Any characters except < > * % & : \\ / ? and control characters. Can't end with a period or space.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "sql-managed-instance",
    "resourceType": "SQL Managed Instance",
    "category": "Databases",
    "provider": "Microsoft.Sql/managedInstances",
    "abbreviation": "sqlmi",
    "minLength": 1,
    "maxLength": 63,
    "scope": "Global",
    "lowercase": true,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,63}$)[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
    "charSet": "Lowercase letters, numbers, and hyphens. Can't start or end with a hyphen.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "sql-server",
    "resourceType": "SQL server",
    "category": "Databases",
    "provider": "Microsoft.Sql/servers",
    "abbreviation": "sql",
    "minLength": 1,
    "maxLength": 63,
    "scope": "Global",
    "lowercase": true,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,63}$)[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
    "charSet": "Lowercase letters, numbers, and hyphens. Can't start or end with a hyphen.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Lowercase only and globally unique. Uppercase in a token is lowercased, so encode that in the convention.",
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "api-management",
    "resourceType": "API Management",
    "category": "Integration",
    "provider": "Microsoft.ApiManagement/service",
    "abbreviation": "apim",
    "minLength": 1,
    "maxLength": 50,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,50}$)[A-Za-z](?:[A-Za-z0-9-]*[A-Za-z0-9])?$",
    "charSet": "Alphanumerics and hyphens. Start with a letter; end with alphanumeric.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "app-configuration-store",
    "resourceType": "App Configuration store",
    "category": "Integration",
    "provider": "Microsoft.AppConfiguration/configurationStores",
    "abbreviation": "appcs",
    "minLength": 5,
    "maxLength": 50,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{5,50}$)(?!.*---)[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Can't start or end with a hyphen or contain more than two hyphens in a row.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "data-factory",
    "resourceType": "Data factory",
    "category": "Integration",
    "provider": "Microsoft.DataFactory/factories",
    "abbreviation": "adf",
    "minLength": 3,
    "maxLength": 63,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{3,63}$)[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Start and end with alphanumeric.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "event-grid-domain",
    "resourceType": "Event Grid domain",
    "category": "Integration",
    "provider": "Microsoft.EventGrid/domains",
    "abbreviation": "evgd",
    "minLength": 3,
    "maxLength": 50,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z0-9-]{3,50}$",
    "charSet": "Alphanumerics and hyphens.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "event-hub",
    "resourceType": "Event hub",
    "category": "Integration",
    "provider": "Microsoft.EventHub/namespaces/eventhubs",
    "abbreviation": "evh",
    "minLength": 1,
    "maxLength": 256,
    "scope": "Parent",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,256}$)[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?$",
    "charSet": "Alphanumerics, periods, hyphens, and underscores. Start and end with a letter or number.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "event-hubs-namespace",
    "resourceType": "Event Hubs namespace",
    "category": "Integration",
    "provider": "Microsoft.EventHub/namespaces",
    "abbreviation": "evhns",
    "minLength": 6,
    "maxLength": 50,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{6,50}$)[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Start with a letter; end with a letter or number.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Shares the servicebus.windows.net DNS space with Service Bus, so the two can't use the same name.",
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "logic-app",
    "resourceType": "Logic app",
    "category": "Integration",
    "provider": "Microsoft.Logic/workflows",
    "abbreviation": "logic",
    "minLength": 1,
    "maxLength": 43,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z0-9_.()-]{1,43}$",
    "charSet": "Alphanumerics, hyphens, underscores, periods, and parentheses.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Only 43 characters. Logic Apps Standard is a Microsoft.Web/sites app instead and follows App Service rules.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "service-bus-namespace",
    "resourceType": "Service Bus namespace",
    "category": "Integration",
    "provider": "Microsoft.ServiceBus/namespaces",
    "abbreviation": "sbns",
    "minLength": 6,
    "maxLength": 50,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{6,50}$)[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Start with a letter; end with a letter or number.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Minimum 6 characters, which is unusual. Short workload names can fall below it.",
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "service-bus-queue",
    "resourceType": "Service Bus queue",
    "category": "Integration",
    "provider": "Microsoft.ServiceBus/namespaces/queues",
    "abbreviation": "sbq",
    "minLength": 1,
    "maxLength": 260,
    "scope": "Parent",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,260}$)[A-Za-z0-9](?:[A-Za-z0-9._/-]*[A-Za-z0-9])?$",
    "charSet": "Alphanumerics, periods, hyphens, underscores, and slashes. Start and end with alphanumeric.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "service-bus-topic",
    "resourceType": "Service Bus topic",
    "category": "Integration",
    "provider": "Microsoft.ServiceBus/namespaces/topics",
    "abbreviation": "sbt",
    "minLength": 1,
    "maxLength": 260,
    "scope": "Parent",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,260}$)[A-Za-z0-9](?:[A-Za-z0-9._/-]*[A-Za-z0-9])?$",
    "charSet": "Alphanumerics, periods, hyphens, underscores, and slashes. Start and end with alphanumeric.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "signalr",
    "resourceType": "SignalR",
    "category": "Integration",
    "provider": "Microsoft.SignalRService/signalR",
    "abbreviation": "sigr",
    "minLength": 3,
    "maxLength": 63,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{3,63}$)[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Start with a letter; end with a letter or number.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "key-vault",
    "resourceType": "Key vault",
    "category": "Security",
    "provider": "Microsoft.KeyVault/vaults",
    "abbreviation": "kv",
    "minLength": 3,
    "maxLength": 24,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z](?!.*--)[A-Za-z0-9-]{1,22}[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Start with a letter, end with a letter or digit, no consecutive hyphens.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Globally unique, and the 24-character ceiling is tight: long workload names plus region rarely fit. Soft-deleted vaults keep their name reserved until purged.",
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "managed-identity",
    "resourceType": "Managed identity",
    "category": "Security",
    "provider": "Microsoft.ManagedIdentity/userAssignedIdentities",
    "abbreviation": "id",
    "minLength": 3,
    "maxLength": 128,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{3,128}$)[A-Za-z0-9][A-Za-z0-9_-]*$",
    "charSet": "Alphanumerics, hyphens, and underscores. Start with a letter or number.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "action-group",
    "resourceType": "Action group",
    "category": "Management",
    "provider": "Microsoft.Insights/actionGroups",
    "abbreviation": "ag",
    "minLength": 1,
    "maxLength": 260,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,260}$)[^:<>+/&%\\\\?|]*[^:<>+/&%\\\\?|. ]$",
    "charSet": "Any characters except : < > + / & % \\ ? | and control characters. Can't end with a space or period.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "The short name used in SMS and email is a separate field limited to 12 characters.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "application-insights",
    "resourceType": "Application Insights",
    "category": "Management",
    "provider": "Microsoft.Insights/components",
    "abbreviation": "appi",
    "minLength": 1,
    "maxLength": 260,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^(?=.{1,260}$)[^%&\\\\?/]*[^%&\\\\?/. ]$",
    "charSet": "Any characters except % & \\ ? / and control characters. Can't end with a space or period.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "automation-account",
    "resourceType": "Automation account",
    "category": "Management",
    "provider": "Microsoft.Automation/automationAccounts",
    "abbreviation": "aa",
    "minLength": 6,
    "maxLength": 50,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{6,50}$)[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Start with a letter; end with alphanumeric.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Names must be unique per resource group and region, and the minimum is 6 characters.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "log-analytics-workspace",
    "resourceType": "Log Analytics workspace",
    "category": "Management",
    "provider": "Microsoft.OperationalInsights/workspaces",
    "abbreviation": "log",
    "minLength": 4,
    "maxLength": 63,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{4,63}$)[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Start and end with alphanumeric.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Defender for Cloud and other services can create DefaultWorkspace-<subscription>-<region> in DefaultResourceGroup-<region>.",
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "management-group",
    "resourceType": "Management group",
    "category": "Management",
    "provider": "Microsoft.Management/managementGroups",
    "abbreviation": "mg",
    "minLength": 1,
    "maxLength": 90,
    "scope": "Tenant",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z0-9][A-Za-z0-9_().-]{0,88}[A-Za-z0-9_()-]$|^[A-Za-z0-9]$",
    "charSet": "Alphanumerics, hyphens, underscores, periods, and parentheses. Start with a letter or number; can't end with a period.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "The ID can't be changed after creation, only the display name. Pick IDs you can live with.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "resource-group",
    "resourceType": "Resource group",
    "category": "Management",
    "provider": "Microsoft.Resources/resourceGroups",
    "abbreviation": "rg",
    "minLength": 1,
    "maxLength": 90,
    "scope": "Subscription",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": true,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z0-9_().-]{1,89}[A-Za-z0-9_()-]$",
    "charSet": "Alphanumerics, underscores, parentheses, hyphens, and periods. Can't end with a period.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Very permissive (90 characters), which tempts inconsistency. Platform services create their own groups (MC_*, ME_*, NetworkWatcherRG, DefaultResourceGroup-*, databricks-rg-*), so exempt those from naming policy.",
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "ai-search",
    "resourceType": "AI Search",
    "category": "AI & data",
    "provider": "Microsoft.Search/searchServices",
    "abbreviation": "srch",
    "minLength": 2,
    "maxLength": 60,
    "scope": "Global",
    "lowercase": true,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{2,60}$)(?!.*--)[a-z0-9][a-z0-9-]*[a-z0-9]$",
    "charSet": "Lowercase letters, numbers, and hyphens. Can't start or end with a hyphen; no consecutive hyphens.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": true,
    "policyConditions": []
  },
  {
    "slug": "azure-openai",
    "resourceType": "Azure OpenAI",
    "category": "AI & data",
    "provider": "Microsoft.CognitiveServices/accounts",
    "abbreviation": "oai",
    "minLength": 2,
    "maxLength": 64,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{2,64}$)[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Start and end with alphanumeric.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "The account name is scoped to the resource group, but the custom subdomain (<name>.openai.azure.com) is global and usually equals the name. Deleted accounts keep the subdomain until purged.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "data-explorer-cluster",
    "resourceType": "Data Explorer cluster",
    "category": "AI & data",
    "provider": "Microsoft.Kusto/clusters",
    "abbreviation": "dec",
    "minLength": 4,
    "maxLength": 22,
    "scope": "Global",
    "lowercase": true,
    "separator": "",
    "allowHyphens": false,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[a-z][a-z0-9]{3,21}$",
    "charSet": "Lowercase letters and numbers. Start with a letter.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "4 to 22 lowercase characters and no separators. One of the tightest global names.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "databricks-workspace",
    "resourceType": "Databricks workspace",
    "category": "AI & data",
    "provider": "Microsoft.Databricks/workspaces",
    "abbreviation": "dbw",
    "minLength": 3,
    "maxLength": 64,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z0-9_-]{3,64}$",
    "charSet": "Alphanumerics, underscores, and hyphens.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Databricks deploys VMs, disks, VNets, and storage with generated names into a managed resource group (databricks-rg-*). Naming and tagging deny policies there break cluster start-up.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "foundry-account",
    "resourceType": "Foundry account",
    "category": "AI & data",
    "provider": "Microsoft.CognitiveServices/accounts",
    "abbreviation": "aif",
    "minLength": 2,
    "maxLength": 64,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?=.{2,64}$)[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Start and end with alphanumeric.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": "Same as Azure OpenAI: the custom subdomain is global and stays reserved after soft delete until purged.",
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "iot-hub",
    "resourceType": "IoT hub",
    "category": "AI & data",
    "provider": "Microsoft.Devices/IotHubs",
    "abbreviation": "iot",
    "minLength": 3,
    "maxLength": 50,
    "scope": "Global",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z0-9-]{2,49}[A-Za-z0-9]$",
    "charSet": "Alphanumerics and hyphens. Can't end with a hyphen.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "machine-learning-workspace",
    "resourceType": "Machine Learning workspace",
    "category": "AI & data",
    "provider": "Microsoft.MachineLearningServices/workspaces",
    "abbreviation": "mlw",
    "minLength": 3,
    "maxLength": 33,
    "scope": "ResourceGroup",
    "lowercase": false,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": true,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^[A-Za-z0-9_-]{3,33}$",
    "charSet": "Alphanumerics, hyphens, and underscores.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  },
  {
    "slug": "synapse-workspace",
    "resourceType": "Synapse workspace",
    "category": "AI & data",
    "provider": "Microsoft.Synapse/workspaces",
    "abbreviation": "synw",
    "minLength": 1,
    "maxLength": 50,
    "scope": "Global",
    "lowercase": true,
    "separator": "-",
    "allowHyphens": true,
    "allowUnderscores": false,
    "allowPeriods": false,
    "allowNumbers": true,
    "validationPattern": "^(?!.*-ondemand)(?=.{1,50}$)[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
    "charSet": "Lowercase letters, numbers, and hyphens. Start and end with a letter or number; can't contain '-ondemand'.",
    "guestNameMaxLength": null,
    "guestNameLabel": null,
    "gotcha": null,
    "policyEnforceable": false,
    "policyConditions": []
  }
]