From e151a929b0cce13fed89339faf1d106b62e0a80f Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 11:20:28 -0500 Subject: [PATCH 01/15] feat: rework PR title validation (W-23251216) --- .github/workflows/validatePR.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index 1374a50..2d7bf74 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -5,20 +5,20 @@ jobs: if: ${{ !contains(github.event.pull_request.body, '[skip-validate-pr]') && !contains(github.event.pull_request.title, '[skip-validate-pr]') }} runs-on: "ubuntu-latest" steps: - - name: Find GUS Work Item in Title + - name: Validate Pull Request Title uses: kaisugi/action-regex-match@45cc5bacf016a4c0d2c3c9d0f8b7c2f1b79687b8 - id: regex-match-gus-wi-title + id: regex-match-pr-title with: text: ${{ github.event.pull_request.title }} - regex: 'W-\d{7,8}' + regex: '^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)\s?(\(.+\))?: .+ \(W-\d{7,}\)$' flags: gmi - - name: Find GUS Work Item in Body + - name: Validate Pull Request Body uses: kaisugi/action-regex-match@45cc5bacf016a4c0d2c3c9d0f8b7c2f1b79687b8 id: regex-match-gus-wi-body with: text: ${{ github.event.pull_request.body }} - regex: '@W-\d{7,8}@' + regex: '@W-\d{7,}@' flags: gmi # Disabling GHA Run and Github Issue (for now) due to E360 lookup @@ -43,10 +43,12 @@ jobs: if: | github.event.pull_request.user.login != 'dependabot[bot]' && (github.event.pull_request.user.login != 'SF-CLI-BOT' || github.event.pull_request.user.login != 'svc-cli-bot') && - (steps.regex-match-gus-wi-title.outputs.match == '' || steps.regex-match-gus-wi-body.outputs.match == '') + (steps.regex-match-pr-title.outputs.match == '' || steps.regex-match-gus-wi-body.outputs.match == '') run: | - echo "::warning::PRs need to reference a GUS Work Item in both the PR title AND body. More details in the logs above. - - PR titles should start with a Work Item followed by a description, ex: W-12345678: My PR title + echo "::warning::PR titles and bodies must meet the specified criteria. More details in the logs above. + - PR titles should be of the format \'(): (W-XXXXXXXX)\', + where is one of: feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert + ex: feat: add Angular template support (W-12345678); fix(auth): resolve token refresh issue (W-12345679) - PR bodies must include a Work Item wrapped in @s, ex: @W-12345678@ or [@W-12345678@](https://some-url) - If you absolutely must skip this validation, add [skip-validate-pr] to the PR title or body" exit 1 From 4898dcf5cf70a3a661358932692b1a8b8e2e5e96 Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 11:54:05 -0500 Subject: [PATCH 02/15] experimenting --- .github/workflows/validatePR.yml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index 2d7bf74..9c7d6c1 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -39,17 +39,15 @@ jobs: # regex: 'forcedotcom\/cli\/issues\/[0-9]+|forcedotcom\/salesforcedx-vscode\/issues\/[0-9]+' # flags: gm - - name: Fail if no Work Item references + - name: Fail if format requirements not met if: | github.event.pull_request.user.login != 'dependabot[bot]' && (github.event.pull_request.user.login != 'SF-CLI-BOT' || github.event.pull_request.user.login != 'svc-cli-bot') && (steps.regex-match-pr-title.outputs.match == '' || steps.regex-match-gus-wi-body.outputs.match == '') run: | - echo "::warning::PR titles and bodies must meet the specified criteria. More details in the logs above. - - PR titles should be of the format \'(): (W-XXXXXXXX)\', - where is one of: feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert - ex: feat: add Angular template support (W-12345678); fix(auth): resolve token refresh issue (W-12345679) - - PR bodies must include a Work Item wrapped in @s, ex: @W-12345678@ or [@W-12345678@](https://some-url) - - If you absolutely must skip this validation, add [skip-validate-pr] to the PR title or body" + MSG="PR title and body must match specified criteria" + [[ true ]] && TITLE_MET=$'\u2714' || TITLE_MET=NO + MSG="$MSG+ + - [$TITLE_MET] REQUIREMENTS FOR TITLE" + echo "::warning::$MSG" exit 1 - From 7000d1340fe0bd946c37665b98fdfcd4314375e5 Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 12:04:23 -0500 Subject: [PATCH 03/15] further experimenting --- .github/workflows/validatePR.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index 9c7d6c1..c0d95ce 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -15,7 +15,7 @@ jobs: - name: Validate Pull Request Body uses: kaisugi/action-regex-match@45cc5bacf016a4c0d2c3c9d0f8b7c2f1b79687b8 - id: regex-match-gus-wi-body + id: regex-match-pr-body with: text: ${{ github.event.pull_request.body }} regex: '@W-\d{7,}@' @@ -43,11 +43,13 @@ jobs: if: | github.event.pull_request.user.login != 'dependabot[bot]' && (github.event.pull_request.user.login != 'SF-CLI-BOT' || github.event.pull_request.user.login != 'svc-cli-bot') && - (steps.regex-match-pr-title.outputs.match == '' || steps.regex-match-gus-wi-body.outputs.match == '') + (steps.regex-match-pr-title.outputs.match == '' || steps.regex-match-pr-body.outputs.match == '') run: | - MSG="PR title and body must match specified criteria" - [[ true ]] && TITLE_MET=$'\u2714' || TITLE_MET=NO - MSG="$MSG+ - - [$TITLE_MET] REQUIREMENTS FOR TITLE" - echo "::warning::$MSG" + ${{ steps.regex-match-pr-title.outputs.match }} == '' && TITLE_STATE=$'\u2714' || TITLE_STATE=$'\u2715' + ${{ steps.regex-match-pr-body.outputs.match }} == '' && BODY_STATE=$'\u2714' || BODY_STATE=$'\u2715' + echo "::warning::PR titles and bodies must meet the specified criteria: + - [$TITLE_STATE] PR title should be of format '(): (W-XXXXXXX)' + where is one of: feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert + e.g., feat: add Angular template support (W-12345678); fix(auth): resolve token refresh issue (W-12345679) + - [$BODY_STATE] PR body must include a Work Item wrapped in @'s, ex: @W-12345678@ or [@W-12345678@](https://some-url) exit 1 From ae70eae4fc74bb968a81f5bf2de08a2bb70205d4 Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 12:06:12 -0500 Subject: [PATCH 04/15] fixing typo --- .github/workflows/validatePR.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index c0d95ce..56370ba 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -45,8 +45,8 @@ jobs: (github.event.pull_request.user.login != 'SF-CLI-BOT' || github.event.pull_request.user.login != 'svc-cli-bot') && (steps.regex-match-pr-title.outputs.match == '' || steps.regex-match-pr-body.outputs.match == '') run: | - ${{ steps.regex-match-pr-title.outputs.match }} == '' && TITLE_STATE=$'\u2714' || TITLE_STATE=$'\u2715' - ${{ steps.regex-match-pr-body.outputs.match }} == '' && BODY_STATE=$'\u2714' || BODY_STATE=$'\u2715' + '${{ steps.regex-match-pr-title.outputs.match }}' == '' && TITLE_STATE=$'\u2714' || TITLE_STATE=$'\u2715' + '${{ steps.regex-match-pr-body.outputs.match }}' == '' && BODY_STATE=$'\u2714' || BODY_STATE=$'\u2715' echo "::warning::PR titles and bodies must meet the specified criteria: - [$TITLE_STATE] PR title should be of format '(): (W-XXXXXXX)' where is one of: feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert From a3ace14aa678de6e61087a734f67a958e27af84f Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 12:07:50 -0500 Subject: [PATCH 05/15] more typos --- .github/workflows/validatePR.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index 56370ba..0acd236 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -45,8 +45,8 @@ jobs: (github.event.pull_request.user.login != 'SF-CLI-BOT' || github.event.pull_request.user.login != 'svc-cli-bot') && (steps.regex-match-pr-title.outputs.match == '' || steps.regex-match-pr-body.outputs.match == '') run: | - '${{ steps.regex-match-pr-title.outputs.match }}' == '' && TITLE_STATE=$'\u2714' || TITLE_STATE=$'\u2715' - '${{ steps.regex-match-pr-body.outputs.match }}' == '' && BODY_STATE=$'\u2714' || BODY_STATE=$'\u2715' + [[ '${{ steps.regex-match-pr-title.outputs.match }}' == '' ]] && TITLE_STATE=$'\u2714' || TITLE_STATE=$'\u2715' + [[ '${{ steps.regex-match-pr-body.outputs.match }}' == '' ]] && BODY_STATE=$'\u2714' || BODY_STATE=$'\u2715' echo "::warning::PR titles and bodies must meet the specified criteria: - [$TITLE_STATE] PR title should be of format '(): (W-XXXXXXX)' where is one of: feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert From 7f57c63c31e84b9766ddc85b4b696f79d332ba39 Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 12:18:56 -0500 Subject: [PATCH 06/15] typo --- .github/workflows/validatePR.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index 0acd236..e25bde6 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -44,10 +44,12 @@ jobs: github.event.pull_request.user.login != 'dependabot[bot]' && (github.event.pull_request.user.login != 'SF-CLI-BOT' || github.event.pull_request.user.login != 'svc-cli-bot') && (steps.regex-match-pr-title.outputs.match == '' || steps.regex-match-pr-body.outputs.match == '') + env: + TITLE_MATCH: ${{ run: | [[ '${{ steps.regex-match-pr-title.outputs.match }}' == '' ]] && TITLE_STATE=$'\u2714' || TITLE_STATE=$'\u2715' [[ '${{ steps.regex-match-pr-body.outputs.match }}' == '' ]] && BODY_STATE=$'\u2714' || BODY_STATE=$'\u2715' - echo "::warning::PR titles and bodies must meet the specified criteria: + echo "::warning::PR titles and bodies must meet the specified criteria. - [$TITLE_STATE] PR title should be of format '(): (W-XXXXXXX)' where is one of: feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert e.g., feat: add Angular template support (W-12345678); fix(auth): resolve token refresh issue (W-12345679) From 9c66497703f1489ef3ca6d7c724f24f24fa3e949 Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 12:19:52 -0500 Subject: [PATCH 07/15] typoo --- .github/workflows/validatePR.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index e25bde6..eccc216 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -53,5 +53,5 @@ jobs: - [$TITLE_STATE] PR title should be of format '(): (W-XXXXXXX)' where is one of: feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert e.g., feat: add Angular template support (W-12345678); fix(auth): resolve token refresh issue (W-12345679) - - [$BODY_STATE] PR body must include a Work Item wrapped in @'s, ex: @W-12345678@ or [@W-12345678@](https://some-url) + - [$BODY_STATE] PR body must include a Work Item wrapped in @'s, ex: @W-12345678@ or [@W-12345678@](https://some-url)" exit 1 From 234eff04ab4ea250119ef830b82b7fd96a07e158 Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 12:21:09 -0500 Subject: [PATCH 08/15] more typos --- .github/workflows/validatePR.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index eccc216..f00fd5e 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -44,8 +44,6 @@ jobs: github.event.pull_request.user.login != 'dependabot[bot]' && (github.event.pull_request.user.login != 'SF-CLI-BOT' || github.event.pull_request.user.login != 'svc-cli-bot') && (steps.regex-match-pr-title.outputs.match == '' || steps.regex-match-pr-body.outputs.match == '') - env: - TITLE_MATCH: ${{ run: | [[ '${{ steps.regex-match-pr-title.outputs.match }}' == '' ]] && TITLE_STATE=$'\u2714' || TITLE_STATE=$'\u2715' [[ '${{ steps.regex-match-pr-body.outputs.match }}' == '' ]] && BODY_STATE=$'\u2714' || BODY_STATE=$'\u2715' From 8795d57f81a8395f3cdc4b1e40455f72f0578278 Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 12:30:44 -0500 Subject: [PATCH 09/15] validating expectations --- .github/workflows/validatePR.yml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index f00fd5e..c3083c1 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -6,7 +6,7 @@ jobs: runs-on: "ubuntu-latest" steps: - name: Validate Pull Request Title - uses: kaisugi/action-regex-match@45cc5bacf016a4c0d2c3c9d0f8b7c2f1b79687b8 + uses: kaisugi/action-regex-match@main id: regex-match-pr-title with: text: ${{ github.event.pull_request.title }} @@ -14,13 +14,21 @@ jobs: flags: gmi - name: Validate Pull Request Body - uses: kaisugi/action-regex-match@45cc5bacf016a4c0d2c3c9d0f8b7c2f1b79687b8 + uses: kaisugi/action-regex-match@main id: regex-match-pr-body with: text: ${{ github.event.pull_request.body }} regex: '@W-\d{7,}@' flags: gmi + - name: echo match parts to double-check expectations + run: | + echo "title match: '${{ steps.regex-match-pr-title.outputs.match }}'" + echo "title group1: '${{ steps.regex-match-pr-title.outputs.group1 }}'" + echo "title group2: '${{ steps.regex-match-pr-title.outputs.group2 }}'" + echo "title group3: '${{ steps.regex-match-pr-title.outputs.group3 }}'" + echo "body match: '${{ steps.regex-match-pr-body.outputs.match }}'" + # Disabling GHA Run and Github Issue (for now) due to E360 lookup # - name: Find Github Action Run @@ -45,9 +53,11 @@ jobs: (github.event.pull_request.user.login != 'SF-CLI-BOT' || github.event.pull_request.user.login != 'svc-cli-bot') && (steps.regex-match-pr-title.outputs.match == '' || steps.regex-match-pr-body.outputs.match == '') run: | - [[ '${{ steps.regex-match-pr-title.outputs.match }}' == '' ]] && TITLE_STATE=$'\u2714' || TITLE_STATE=$'\u2715' - [[ '${{ steps.regex-match-pr-body.outputs.match }}' == '' ]] && BODY_STATE=$'\u2714' || BODY_STATE=$'\u2715' + [[ '${{ steps.regex-match-pr-title.outputs.match }}' != '' ]] && TITLE_STATE=$'\u2714' || TITLE_STATE=$'\u2715' + [[ '${{ steps.regex-match-pr-body.outputs.match }}' != '' ]] && BODY_STATE=$'\u2714' || BODY_STATE=$'\u2715' echo "::warning::PR titles and bodies must meet the specified criteria. + - PR should be of the format '(): (W-XXXXXXX)' + where - [$TITLE_STATE] PR title should be of format '(): (W-XXXXXXX)' where is one of: feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert e.g., feat: add Angular template support (W-12345678); fix(auth): resolve token refresh issue (W-12345679) From 072f5759bdd223559360d9c66d2238836ff457b3 Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 12:32:54 -0500 Subject: [PATCH 10/15] more validations --- .github/workflows/validatePR.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index c3083c1..b577b6d 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -10,7 +10,7 @@ jobs: id: regex-match-pr-title with: text: ${{ github.event.pull_request.title }} - regex: '^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)\s?(\(.+\))?: .+ \(W-\d{7,}\)$' + regex: '^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)\s?(\(.+\))?: .+ (\(W-\d{7,}\))$' flags: gmi - name: Validate Pull Request Body From 31b14d63177c03aeac099aaff786313f0736de52 Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 13:10:12 -0500 Subject: [PATCH 11/15] reworked criteria output --- .github/workflows/validatePR.yml | 62 ++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 19 deletions(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index b577b6d..187c10e 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -5,29 +5,44 @@ jobs: if: ${{ !contains(github.event.pull_request.body, '[skip-validate-pr]') && !contains(github.event.pull_request.title, '[skip-validate-pr]') }} runs-on: "ubuntu-latest" steps: - - name: Validate Pull Request Title + - name: Validate Overall PR Shape uses: kaisugi/action-regex-match@main - id: regex-match-pr-title + id: pr-title-shape-regex with: text: ${{ github.event.pull_request.title }} - regex: '^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)\s?(\(.+\))?: .+ (\(W-\d{7,}\))$' + regex: '^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)\s?(\(.+\))?: .+ \((W-\d{7,})\)$' + flags: gmi + + - name: Check Title for type + uses: kaisugi/action-regex-match@main + id: pr-title-type-subportion-regex + with: + text: ${{ github.event.pull_request.title }} + regex: '^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)' + flags: gmi + + - name: Check Title for Work Item + uses: kaisugi/action-regex-match@main + id: pr-title-work-item-subportion-regex + with: + text: ${{ github.event.pull_request.title }} + regex: ' \((W-\d{7,})\)$' flags: gmi - name: Validate Pull Request Body uses: kaisugi/action-regex-match@main - id: regex-match-pr-body + id: pr-body-work-item-subportion-regex with: text: ${{ github.event.pull_request.body }} - regex: '@W-\d{7,}@' + regex: '@(${{ steps.pr-title-work-item-subportion-regex }})@' flags: gmi - name: echo match parts to double-check expectations run: | - echo "title match: '${{ steps.regex-match-pr-title.outputs.match }}'" - echo "title group1: '${{ steps.regex-match-pr-title.outputs.group1 }}'" - echo "title group2: '${{ steps.regex-match-pr-title.outputs.group2 }}'" - echo "title group3: '${{ steps.regex-match-pr-title.outputs.group3 }}'" - echo "body match: '${{ steps.regex-match-pr-body.outputs.match }}'" + echo "title shape match: '${{ steps. pr-title-shape-regex.match }}'" + echo "title type match: '${{ steps.pr-title-type-subportion-regex.outputs.match }}'" + echo "title work item match: '${{ steps.pr-title-work-item-subportion-regex.outputs.match }}'" + echo "body work itme match: '${{ steps.pr-body-work-item-subportion-regex.outputs.match }}'" # Disabling GHA Run and Github Issue (for now) due to E360 lookup @@ -51,15 +66,24 @@ jobs: if: | github.event.pull_request.user.login != 'dependabot[bot]' && (github.event.pull_request.user.login != 'SF-CLI-BOT' || github.event.pull_request.user.login != 'svc-cli-bot') && - (steps.regex-match-pr-title.outputs.match == '' || steps.regex-match-pr-body.outputs.match == '') + (steps.pr-title-shape-regex.outputs.match == '' || steps.pr-body-work-item-subportion-regex.outputs.match == '') run: | - [[ '${{ steps.regex-match-pr-title.outputs.match }}' != '' ]] && TITLE_STATE=$'\u2714' || TITLE_STATE=$'\u2715' - [[ '${{ steps.regex-match-pr-body.outputs.match }}' != '' ]] && BODY_STATE=$'\u2714' || BODY_STATE=$'\u2715' + # Define a checkmark and an x-mark as variables. + PASS=$'\u2714' + FAIL=$'\u2715' + + # Determine which criteria were and were not met based on the outputs we captured + [[ '${{ steps.pr-title-shape-regex.outputs.match }}' == '' ]] && TITLE_SHAPE=$FAIL || TITLE_SHAPE=$PASS + [[ '${{ steps.pr-title-type-subportion-regex.outputs.match }}' == '' ]] && TITLE_TYPE=$FAIL || TITLE_TYPE=$PASS + [[ '${{ steps.pr-title-work-item-subportion-regex.outputs.match }}' == '' ]] && TITLE_WORK_ITEM=$FAIL || TITLE_WORK_ITEM=$PASS + [[ '${{ steps.pr-body-work-item-subportion-regex.outputs.match }}' == '' ]] && BODY_WORK_ITEM=$FAIL || BODY_WORK_ITEM=$PASS + + # Output the criteria summary echo "::warning::PR titles and bodies must meet the specified criteria. - - PR should be of the format '(): (W-XXXXXXX)' - where - - [$TITLE_STATE] PR title should be of format '(): (W-XXXXXXX)' - where is one of: feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert - e.g., feat: add Angular template support (W-12345678); fix(auth): resolve token refresh issue (W-12345679) - - [$BODY_STATE] PR body must include a Work Item wrapped in @'s, ex: @W-12345678@ or [@W-12345678@](https://some-url)" + - [$TITLE_SHAPE] PR title must be well-formed (i.e., match '(): (W-XXXXXXX)') + (example: feat: add Angular template support (W-12345678); fix(auth): resolve token refresh issue (W-12345678) + - [$TITLE_TYPE] subportion must be one of: feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert + - [$TITLE_WORK_ITEM] Must end with work item number wrapped in parentheses + - [$BODY_WORK_ITEM] PR body must include work item from title, wrapped in '@'s, ex: @W-1234567@ or [@W-1234567](https://some-url) + If you ABSOLUTELY MUST bypass these validations, include '[skip-validate-pr]' in the PR title or body" exit 1 From e704c90b5603afd7209d2ff899e856cac63e84b0 Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 13:12:15 -0500 Subject: [PATCH 12/15] yet more typos --- .github/workflows/validatePR.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index 187c10e..3b08ffd 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -39,7 +39,7 @@ jobs: - name: echo match parts to double-check expectations run: | - echo "title shape match: '${{ steps. pr-title-shape-regex.match }}'" + echo "title shape match: '${{ steps.pr-title-shape-regex.match }}'" echo "title type match: '${{ steps.pr-title-type-subportion-regex.outputs.match }}'" echo "title work item match: '${{ steps.pr-title-work-item-subportion-regex.outputs.match }}'" echo "body work itme match: '${{ steps.pr-body-work-item-subportion-regex.outputs.match }}'" From e666d26dbe2b77bb51bd97ded34008344c3be811 Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 13:13:31 -0500 Subject: [PATCH 13/15] yet more typos --- .github/workflows/validatePR.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index 3b08ffd..f5d4fa0 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -39,7 +39,7 @@ jobs: - name: echo match parts to double-check expectations run: | - echo "title shape match: '${{ steps.pr-title-shape-regex.match }}'" + echo "title shape match: '${{ steps.pr-title-shape-regex.outputs.match }}'" echo "title type match: '${{ steps.pr-title-type-subportion-regex.outputs.match }}'" echo "title work item match: '${{ steps.pr-title-work-item-subportion-regex.outputs.match }}'" echo "body work itme match: '${{ steps.pr-body-work-item-subportion-regex.outputs.match }}'" From f0e38e52a22a5e111d1f5b74f43436aaa4bb0854 Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 13:15:52 -0500 Subject: [PATCH 14/15] more typos --- .github/workflows/validatePR.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index f5d4fa0..c3fe563 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -34,7 +34,7 @@ jobs: id: pr-body-work-item-subportion-regex with: text: ${{ github.event.pull_request.body }} - regex: '@(${{ steps.pr-title-work-item-subportion-regex }})@' + regex: '@(${{ steps.pr-title-work-item-subportion-regex.outputs.match }})@' flags: gmi - name: echo match parts to double-check expectations From edd22e04112ee20d1d400fb1c58dbedf06acdb6e Mon Sep 17 00:00:00 2001 From: Jamie Feingold Date: Mon, 13 Jul 2026 13:21:15 -0500 Subject: [PATCH 15/15] cleaning up descriptions --- .github/workflows/validatePR.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validatePR.yml b/.github/workflows/validatePR.yml index c3fe563..487aff7 100644 --- a/.github/workflows/validatePR.yml +++ b/.github/workflows/validatePR.yml @@ -42,7 +42,7 @@ jobs: echo "title shape match: '${{ steps.pr-title-shape-regex.outputs.match }}'" echo "title type match: '${{ steps.pr-title-type-subportion-regex.outputs.match }}'" echo "title work item match: '${{ steps.pr-title-work-item-subportion-regex.outputs.match }}'" - echo "body work itme match: '${{ steps.pr-body-work-item-subportion-regex.outputs.match }}'" + echo "body work item match: '${{ steps.pr-body-work-item-subportion-regex.outputs.match }}'" # Disabling GHA Run and Github Issue (for now) due to E360 lookup