Skip to content

feat(github): support user-defined PR labels - #15

Merged
kadams54 merged 1 commit into
mainfrom
kadams54/feat-user-defined-pr-labels
Jun 30, 2026
Merged

kadams54 merged 1 commit into
mainfrom
kadams54/feat-user-defined-pr-labels

Conversation

@kadams54

Copy link
Copy Markdown

Add a setting in the GitHub integration screen that lets the admin specify a label that should be applied to all Open Inspect-generated PRs. The use case here is tracking Open Inspect-generated PRs separately from the rest of the PRs (whether human or agent created). CompanyCam will use this label to track metrics on the quality of Open Inspect's PRs by looking at how many are merged without changes, how many are merged with changes, and how many are closed without merging.

@github-actions

Copy link
Copy Markdown

Terraform Validation Results

Step Status
Format ✅
Init ✅
Validate ✅

Pushed by: @kadams54, Action: pull_request

@github-actions

Copy link
Copy Markdown

Terraform Plan Results

Status: ✅ Success

Show Plan
terraform_data.access_control_gate: Refreshing state... [id=4f38135f-b85d-3c66-bc4d-62e6bd696d0f]
null_resource.slack_bot_build[0]: Refreshing state... [id=2492065972529226105]
null_resource.control_plane_build: Refreshing state... [id=4651496059502399833]
module.modal_app[0].null_resource.modal_secrets[0]: Refreshing state... [id=5762703892982030197]
null_resource.linear_bot_build[0]: Refreshing state... [id=2611314036903942774]
data.external.modal_source_hash[0]: Reading...
module.linear_kv[0].cloudflare_workers_kv_namespace.this: Refreshing state... [id=03d1b14a4d12477f81cfcc3e4af77cf9]
module.slack_kv[0].cloudflare_workers_kv_namespace.this: Refreshing state... [id=b9e2c38df71f4855be972c58b6a1ee8d]
cloudflare_d1_database.main: Refreshing state... [id=f39968f8-149f-4efd-ba33-ba502ffd6f9d]
module.session_index_kv.cloudflare_workers_kv_namespace.this: Refreshing state... [id=58ad1907c80c44b1b2ecbdfe268bcac5]
cloudflare_r2_bucket.media: Refreshing state... [id=open-inspect-media-contractor]
data.external.modal_source_hash[0]: Read complete after 0s [id=-]
module.modal_app[0].null_resource.modal_deploy: Refreshing state... [id=7520787001111393755]
module.web_app[0].vercel_project.this: Refreshing state... [id=prj_0jIgFgS1feKoUhF8wrcP4TtVTPuM]
module.slack_bot_worker[0].cloudflare_worker.this: Refreshing state... [id=393472842b684911bc95603990b37de0]
module.linear_bot_worker[0].cloudflare_worker.this: Refreshing state... [id=437dba8e03dd48cbbf55638723ad9074]
null_resource.d1_migrations: Refreshing state... [id=4884201322476132031]
module.slack_bot_worker[0].cloudflare_worker_version.this: Refreshing state... [id=c4d7d2e8-a28b-403a-a0af-cfb307c5f3d0]
module.linear_bot_worker[0].cloudflare_worker_version.this: Refreshing state... [id=9cc19869-c660-496b-a6fd-5c8ca5b836ab]
module.web_app[0].vercel_project_environment_variable.env[13]: Refreshing state... [id=BQ6FduHlAYzIYzLE]
module.web_app[0].vercel_project_environment_variable.env[16]: Refreshing state... [id=bjIku856byjGpqDu]
module.web_app[0].vercel_project_environment_variable.env[4]: Refreshing state... [id=XMc4F44ltfL3QK3t]
module.web_app[0].vercel_project_environment_variable.env[17]: Refreshing state... [id=7nrNLHbYGvbPQPgC]
module.web_app[0].vercel_project_environment_variable.env[10]: Refreshing state... [id=sqeMnRMF0xd8CIRe]
module.web_app[0].vercel_project_environment_variable.env[12]: Refreshing state... [id=Ap5I5tGTeNlwbrsh]
module.web_app[0].vercel_project_environment_variable.env[7]: Refreshing state... [id=phHvYylvduIAtRD9]
module.web_app[0].vercel_project_environment_variable.env[6]: Refreshing state... [id=T8zVCcakiFWjGZBZ]
module.web_app[0].vercel_project_environment_variable.env[5]: Refreshing state... [id=LO7XAE8j1pNTY7Jd]
module.web_app[0].vercel_project_environment_variable.env[0]: Refreshing state... [id=7aTLYrxQVXP0SSTu]
module.web_app[0].vercel_project_environment_variable.env[2]: Refreshing state... [id=TYuSgPHntfm46xtc]
module.web_app[0].vercel_project_environment_variable.env[15]: Refreshing state... [id=c9JZitmNRb7At0uS]
module.web_app[0].vercel_project_environment_variable.env[18]: Refreshing state... [id=gx7cq4XYtx7XFyxH]
module.web_app[0].vercel_project_environment_variable.env[8]: Refreshing state... [id=9WvoP0YuLFeFgkd0]
module.web_app[0].vercel_project_environment_variable.env[9]: Refreshing state... [id=KcvEppk5QtWTRvpH]
module.web_app[0].vercel_project_environment_variable.env[14]: Refreshing state... [id=lNKiGcjHdNjbHB4E]
module.web_app[0].vercel_project_environment_variable.env[1]: Refreshing state... [id=qCP45SaeSAHKBDwG]
module.web_app[0].vercel_project_environment_variable.env[11]: Refreshing state... [id=DrDtGPyyny9UCMp4]
module.web_app[0].vercel_project_environment_variable.env[3]: Refreshing state... [id=5nuLo1tvZdpqcXJR]
module.linear_bot_worker[0].cloudflare_workers_deployment.this: Refreshing state... [id=5d77d833-0559-4b6b-9a9b-05b435bae338]
module.slack_bot_worker[0].cloudflare_workers_deployment.this: Refreshing state... [id=0c535c04-a136-49c5-a490-3b3102e793de]
module.control_plane_worker.cloudflare_worker.this: Refreshing state... [id=fd3805c0f7cb454e8165d9959be40dad]
module.control_plane_worker.cloudflare_worker_version.this: Refreshing state... [id=b019a7f5-10d5-41b7-b3b3-c0e112d7739f]
module.control_plane_worker.cloudflare_workers_deployment.this: Refreshing state... [id=94fce760-3239-45e9-a91f-a14beebadb8a]
module.control_plane_worker.cloudflare_workers_cron_trigger.this[0]: Refreshing state... [id=open-inspect-control-plane-contractor]

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  ~ update in-place
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # null_resource.control_plane_build must be replaced
-/+ resource "null_resource" "control_plane_build" {
      ~ id       = "4651496059502399833" -> (known after apply)
      ~ triggers = { # forces replacement
          ~ "always_run" = "2026-06-30T18:33:23Z" -> (known after apply)
        }
    }

  # null_resource.linear_bot_build[0] must be replaced
-/+ resource "null_resource" "linear_bot_build" {
      ~ id       = "2611314036903942774" -> (known after apply)
      ~ triggers = { # forces replacement
          ~ "always_run" = "2026-06-30T18:33:23Z" -> (known after apply)
        }
    }

  # null_resource.slack_bot_build[0] must be replaced
-/+ resource "null_resource" "slack_bot_build" {
      ~ id       = "2492065972529226105" -> (known after apply)
      ~ triggers = { # forces replacement
          ~ "always_run" = "2026-06-30T18:33:23Z" -> (known after apply)
        }
    }

  # module.control_plane_worker.cloudflare_worker.this will be updated in-place
  ~ resource "cloudflare_worker" "this" {
        id             = "fd3805c0f7cb454e8165d9959be40dad"
        name           = "open-inspect-control-plane-contractor"
      ~ observability  = {
          ~ logs               = {
              + destinations       = (known after apply)
                # (4 unchanged attributes hidden)
            }
          ~ traces             = {
              + destinations       = (known after apply)
                # (3 unchanged attributes hidden)
            }
            # (2 unchanged attributes hidden)
        }
      ~ references     = {
          ~ dispatch_namespace_outbounds = [] -> (known after apply)
          ~ domains                      = [] -> (known after apply)
          ~ durable_objects              = [
              - {
                  - namespace_id   = "e84875aa1fef447bb067596a2dbba9d6" -> null
                  - namespace_name = "open-inspect-control-plane-contractor_SessionDO" -> null
                  - worker_id      = "fd3805c0f7cb454e8165d9959be40dad" -> null
                  - worker_name    = "open-inspect-control-plane-contractor" -> null
                },
              - {
                  - namespace_id   = "a4717e3e330545deab51e1c9b65d7c83" -> null
                  - namespace_name = "open-inspect-control-plane-contractor_SchedulerDO" -> null
                  - worker_id      = "fd3805c0f7cb454e8165d9959be40dad" -> null
                  - worker_name    = "open-inspect-control-plane-contractor" -> null
                },
            ] -> (known after apply)
          ~ queues                       = [] -> (known after apply)
          ~ workers                      = [
              - {
                  - id   = "393472842b684911bc95603990b37de0" -> null
                  - name = "open-inspect-slack-bot-contractor" -> null
                },
              - {
                  - id   = "437dba8e03dd48cbbf55638723ad9074" -> null
                  - name = "open-inspect-linear-bot-contractor" -> null
                },
            ] -> (known after apply)
        } -> (known after apply)
        tags           = []
      ~ updated_on     = "2026-06-30T18:33:30Z" -> (known after apply)
        # (6 unchanged attributes hidden)
    }

  # module.control_plane_worker.cloudflare_worker_version.this must be replaced
-/+ resource "cloudflare_worker_version" "this" {
      ~ annotations         = {
          + workers_message      = (known after apply)
          + workers_tag          = (known after apply)
          ~ workers_triggered_by = "create_version_api" -> (known after apply)
        } -> (known after apply)
      ~ bindings            = (sensitive value) # forces replacement
      ~ created_on          = "2026-06-30T18:33:31Z" -> (known after apply)
      ~ id                  = "b019a7f5-10d5-41b7-b3b3-c0e112d7739f" -> (known after apply)
      + limits              = (known after apply)
      + main_script_base64  = (known after apply)
      ~ migration_tag       = "v1" -> (known after apply)
      ~ modules             = [
          - { # forces replacement
              - content_file   = "../../..//packages/control-plane/dist/index.js" -> null
              - content_sha256 = "379033a7a7491f66f63f38457ccb41f946a18b7c66c9143c0ec07662f73aa3ba" -> null
              - content_type   = "application/javascript+module" -> null
              - name           = "index.js" -> null
            },
          + { # forces replacement
              + content_file   = "../../..//packages/control-plane/dist/index.js"
              + content_sha256 = "2458cefe96118df3fc1e41a6be46df2645eaeb41233d8862961585025380a11f"
              + content_type   = "application/javascript+module"
              + name           = "index.js"
            },
        ]
      ~ number              = 30 -> (known after apply)
      ~ source              = "terraform" -> (known after apply)
      ~ startup_time_ms     = 20 -> (known after apply)
      ~ urls                = [] -> (known after apply)
        # (6 unchanged attributes hidden)
    }

  # module.control_plane_worker.cloudflare_workers_deployment.this must be replaced
-/+ resource "cloudflare_workers_deployment" "this" {
      ~ annotations  = {
          + workers_message      = (known after apply)
          ~ workers_triggered_by = "deployment" -> (known after apply)
        } -> (known after apply)
      ~ author_email = "kyle.adams.ic@companycam.com" -> (known after apply)
      ~ created_on   = "2026-06-30T18:33:32Z" -> (known after apply)
      ~ id           = "94fce760-3239-45e9-a91f-a14beebadb8a" -> (known after apply)
      ~ source       = "terraform" -> (known after apply)
      ~ versions     = [ # forces replacement
          ~ {
              ~ version_id = "b019a7f5-10d5-41b7-b3b3-c0e112d7739f" -> (known after apply)
                # (1 unchanged attribute hidden)
            },
        ]
        # (3 unchanged attributes hidden)
    }

  # module.linear_bot_worker[0].cloudflare_worker.this will be updated in-place
  ~ resource "cloudflare_worker" "this" {
        id             = "437dba8e03dd48cbbf55638723ad9074"
        name           = "open-inspect-linear-bot-contractor"
      ~ observability  = {
          ~ logs               = {
              + destinations       = (known after apply)
                # (4 unchanged attributes hidden)
            }
          ~ traces             = {
              + destinations       = (known after apply)
                # (3 unchanged attributes hidden)
            }
            # (2 unchanged attributes hidden)
        }
      ~ references     = {
          ~ dispatch_namespace_outbounds = [] -> (known after apply)
          ~ domains                      = [] -> (known after apply)
          ~ durable_objects              = [] -> (known after apply)
          ~ queues                       = [] -> (known after apply)
          ~ workers                      = [
              - {
                  - id   = "fd3805c0f7cb454e8165d9959be40dad" -> null
                  - name = "open-inspect-control-plane-contractor" -> null
                },
            ] -> (known after apply)
        } -> (known after apply)
        tags           = []
      ~ updated_on     = "2026-06-30T18:33:24Z" -> (known after apply)
        # (6 unchanged attributes hidden)
    }

  # module.linear_bot_worker[0].cloudflare_worker_version.this must be replaced
-/+ resource "cloudflare_worker_version" "this" {
      ~ annotations         = {
          + workers_message      = (known after apply)
          + workers_tag          = (known after apply)
          ~ workers_triggered_by = "create_version_api" -> (known after apply)
        } -> (known after apply)
      ~ bindings            = (sensitive value) # forces replacement
      ~ created_on          = "2026-06-30T18:33:24Z" -> (known after apply)
      ~ id                  = "9cc19869-c660-496b-a6fd-5c8ca5b836ab" -> (known after apply)
      + limits              = (known after apply)
      + main_script_base64  = (known after apply)
      + migration_tag       = (known after apply)
      ~ number              = 30 -> (known after apply)
      ~ source              = "terraform" -> (known after apply)
      ~ startup_time_ms     = 22 -> (known after apply)
      ~ urls                = [
          - "https://9cc19869-open-inspect-linear-bot-contractor.companycam.workers.dev",
        ] -> (known after apply)
        # (7 unchanged attributes hidden)
    }

  # module.linear_bot_worker[0].cloudflare_workers_deployment.this must be replaced
-/+ resource "cloudflare_workers_deployment" "this" {
      ~ annotations  = {
          + workers_message      = (known after apply)
          ~ workers_triggered_by = "deployment" -> (known after apply)
        } -> (known after apply)
      ~ author_email = "kyle.adams.ic@companycam.com" -> (known after apply)
      ~ created_on   = "2026-06-30T18:33:25Z" -> (known after apply)
      ~ id           = "5d77d833-0559-4b6b-9a9b-05b435bae338" -> (known after apply)
      ~ source       = "terraform" -> (known after apply)
      ~ versions     = [ # forces replacement
          ~ {
              ~ version_id = "9cc19869-c660-496b-a6fd-5c8ca5b836ab" -> (known after apply)
                # (1 unchanged attribute hidden)
            },
        ]
        # (3 unchanged attributes hidden)
    }

  # module.slack_bot_worker[0].cloudflare_worker.this will be updated in-place
  ~ resource "cloudflare_worker" "this" {
        id             = "393472842b684911bc95603990b37de0"
        name           = "open-inspect-slack-bot-contractor"
      ~ observability  = {
          ~ logs               = {
              + destinations       = (known after apply)
                # (4 unchanged attributes hidden)
            }
          ~ traces             = {
              + destinations       = (known after apply)
                # (3 unchanged attributes hidden)
            }
            # (2 unchanged attributes hidden)
        }
      ~ references     = {
          ~ dispatch_namespace_outbounds = [] -> (known after apply)
          ~ domains                      = [] -> (known after apply)
          ~ durable_objects              = [] -> (known after apply)
          ~ queues                       = [] -> (known after apply)
          ~ workers                      = [
              - {
                  - id   = "fd3805c0f7cb454e8165d9959be40dad" -> null
                  - name = "open-inspect-control-plane-contractor" -> null
                },
            ] -> (known after apply)
        } -> (known after apply)
        tags           = []
      ~ updated_on     = "2026-06-30T18:33:24Z" -> (known after apply)
        # (6 unchanged attributes hidden)
    }

  # module.slack_bot_worker[0].cloudflare_worker_version.this must be replaced
-/+ resource "cloudflare_worker_version" "this" {
      ~ annotations         = {
          + workers_message      = (known after apply)
          + workers_tag          = (known after apply)
          ~ workers_triggered_by = "create_version_api" -> (known after apply)
        } -> (known after apply)
      ~ bindings            = (sensitive value) # forces replacement
      ~ created_on          = "2026-06-30T18:33:24Z" -> (known after apply)
      ~ id                  = "c4d7d2e8-a28b-403a-a0af-cfb307c5f3d0" -> (known after apply)
      + limits              = (known after apply)
      + main_script_base64  = (known after apply)
      + migration_tag       = (known after apply)
      ~ number              = 30 -> (known after apply)
      ~ source              = "terraform" -> (known after apply)
      ~ startup_time_ms     = 40 -> (known after apply)
      ~ urls                = [
          - "https://c4d7d2e8-open-inspect-slack-bot-contractor.companycam.workers.dev",
        ] -> (known after apply)
        # (7 unchanged attributes hidden)
    }

  # module.slack_bot_worker[0].cloudflare_workers_deployment.this must be replaced
-/+ resource "cloudflare_workers_deployment" "this" {
      ~ annotations  = {
          + workers_message      = (known after apply)
          ~ workers_triggered_by = "deployment" -> (known after apply)
        } -> (known after apply)
      ~ author_email = "kyle.adams.ic@companycam.com" -> (known after apply)
      ~ created_on   = "2026-06-30T18:33:25Z" -> (known after apply)
      ~ id           = "0c535c04-a136-49c5-a490-3b3102e793de" -> (known after apply)
      ~ source       = "terraform" -> (known after apply)
      ~ versions     = [ # forces replacement
          ~ {
              ~ version_id = "c4d7d2e8-a28b-403a-a0af-cfb307c5f3d0" -> (known after apply)
                # (1 unchanged attribute hidden)
            },
        ]
        # (3 unchanged attributes hidden)
    }

Plan: 9 to add, 3 to change, 9 to destroy.

─────────────────────────────────────────────────────────────────────────────

Saved the plan to: tfplan

To perform exactly these actions, run the following command to apply:
    terraform apply "tfplan"

Pushed by: @kadams54

@kadams54
kadams54 merged commit e6af225 into main Jun 30, 2026
17 checks passed
@kadams54
kadams54 deleted the kadams54/feat-user-defined-pr-labels branch June 30, 2026 19:02
@kadams54
kadams54 restored the kadams54/feat-user-defined-pr-labels branch June 30, 2026 19:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant