code: def check_issue(data, problems):
      # all issues are closed
      if data["node"]["state"] != "CLOSED":
          problems.append(f"issue not closed: {description(data)}")
  
      # all issues have a reso: completed label
      labels = get_labels(data)
      if "reso: completed" not in labels:
          problems.append(
              f"issue missing resolution: {description(data)}"
          )
  
      # no issues have more than one reso: label
      if sum(1 for label in labels if label.startswith("reso:")) > 1:
          problems.append(
              f"issue has too many resolutions: {description(data)}"
          )
  
      # no issues have a status: label
      if any(label.startswith("status:") for label in labels):
          problems.append(f"issue has a status: {description(data)}")
  
      # no issues without a type: label
      num_types = sum(
          1 for label in labels if label.startswith("type:")
      )
      if num_types == 0:
          problems.append(
              f"issue does not have a type: {description(data)}"
          )
  
      # no issues with multiple type: labels
      if num_types > 1:
          problems.append(
              f"issue has multiple types: {description(data)}"
          )
  
      # no issues with invalid type: labels
      if any(
          label not in VALID_TYPES
          for label in labels
          if label.startswith("type:")
      ):
          problems.append(
              f"issue has an invalid type: {description(data)}"
          )
  
      # no issues with TRIAGE label
      if any(label == "TRIAGE" for label in labels):
          problems.append(f"issue is in triage: {description(data)}")
  
file_path: bokeh/scripts/milestone.py
imports: import datetime
  import logging
  import os
  import sys
  from itertools import groupby
  from pathlib import Path
  import click
  import requests
label_desc: Use image node_id 8 for calling a global function with example usage: check_issue(data, problems) without return types