Skip to content

ci: add release Slack summary caller workflow - #38717

Draft
vpintorico wants to merge 5 commits into
mainfrom
cursor/release-slack-summaries-3d48
Draft

vpintorico wants to merge 5 commits into
mainfrom
cursor/release-slack-summaries-3d48

Conversation

@vpintorico

@vpintorico vpintorico commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Description

Adds .github/workflows/release-slack-summaries.yml, the MetaMask Mobile caller for MCRM-155. Zapier Zaps 596 (release blocker summary) and 597 (release validation summary, including the release PR body sign-off rewrite) are moving to GitHub Actions. The summary logic lives in MetaMask/github-tools/.github/actions/release-slack-summaries (draft PR 306). This repo only gets the thin caller.

Mode and safety flags are resolved by .github/scripts/release-slack-summaries-flags.sh. The caller:

  • Runs 16 10 * * 1-5 UTC as blocker-summary and 21 10 * * 1-5 UTC as release-validation, plus workflow_dispatch (mode, dry-run default true, test-channel).
  • Uses job environment release-notifications and permissions id-token: write plus contents: read on that job (contents: read is also the workflow default).
  • Exchanges two short-lived tokens via MetaMask/github-tools/.github/actions/get-token@v1. Every run, including blocker-summary and dry runs, requests pull_requests: write for this repo. MetaMask/MetaMask-planning is contents: read. No personal access tokens. A read-only pull request token was not requested: policy PR 221 was specified with pull_requests: write for this workflow, and a narrower request was not confirmed as allowed.
  • Pins the shared action to commit f99347bfb23bbbd352d199be7b58b3d7cb9f9bb9 (cursor/release-slack-summaries-a324, github-tools#306) and passes the same SHA as github-tools-ref.
  • Passes platform: mobile, the existing SLACK_BOT_TOKEN secret (the one slack-rc-notification.yml uses), and JIRA_EMAIL / JIRA_API_TOKEN from the environment.
  • Does not send built-in Jira queries on a live post. A live run that is not a dry run reads vars.RELEASE_SUMMARY_BLOCKER_JQL and vars.RELEASE_SUMMARY_REGRESSION_JQL and fails unless both are set. Dry runs and non-live runs may use preview defaults when those variables are empty. The preview defaults are not the MCRM-155 queries. The action still appends its own version custom fields to the base it receives.
  • Strips Unicode whitespace and U+FEFF, U+200B, U+2060, and U+180E from the test channel before any emptiness, dry-run, or PR-write decision. A supplied channel that becomes empty fails the job. CR or LF in the channel or in either JQL variable fails the job, and a JQL newline writes nothing to GITHUB_OUTPUT. Safety outputs are written after the JQL lines.
  • While GA_MODE is not exactly live:
    • #release-* and release-* names are rejected.
    • A C…/G… id is accepted only when it equals the validated RELEASE_SUMMARY_TEST_CHANNEL. Any other id is rejected.
    • The dispatch test-channel input replaces the variable when it is non-empty. If neither is set, the run dry-runs and posts nothing.
  • Sets allow-pr-write only when GA_MODE is exactly live, mode is release-validation, dry-run is false, and no test channel is set. A test channel blocks the PR rewrite even in live mode, because Zap 597 still rewrites the release PR body during the parallel run. github-tools#306 deviation 3 is not followed.
  • Gives the 10:16 and 10:21 crons separate concurrency groups, keyed by mode.

This repo's default branch is main, which matches the token-exchange policy ref refs/heads/main.

Prerequisites

  • Token-exchange policy: https://github.com/consensys-vertical-apps/token-exchange-service/pull/221 must be merged. It allows exactly .github/workflows/release-slack-summaries.yml@refs/heads/main in environment release-notifications.
  • Add release-slack-summaries action for Zaps 596 and 597 github-tools#306 must be merged, and the TODO(MCRM-155) pin must move from f99347bfb23bbbd352d199be7b58b3d7cb9f9bb9 to the merged commit SHA or release tag. github-tools-ref must move with it.
  • GitHub environment release-notifications must exist on this repo. Scheduled runs need to be allowed through without a manual approval gate.
  • Secrets JIRA_EMAIL and JIRA_API_TOKEN are added to that environment by the owner later. This PR does not create secrets. SLACK_BOT_TOKEN is the existing secret. TOKEN_EXCHANGE_URL is the existing repository variable used by the other get-token callers.
  • Repository variable GA_MODE should stay unset or test until go-live. RELEASE_SUMMARY_TEST_CHANNEL must be set before a non-live run is expected to post. A C…/G… id is allowed on that path only when it is this variable.
  • The owner must set RELEASE_SUMMARY_BLOCKER_JQL and RELEASE_SUMMARY_REGRESSION_JQL once version scoping is confirmed, or once github-tools#306 can substitute labels = "regression-RC-{V}". A live post stays blocked until both variables are set. The same variable names are used by metamask-extension#47572.

Open items

  • The uses pin is the reviewed github-tools#306 head, not the merge commit. Move it, and github-tools-ref, after that PR merges. Do not set GA_MODE=live until that pin is the merged revision and both JQL variables are set.
  • The action still appends cf[14565] = "V" and cf[16946] = "V" to the caller base. It does not substitute regression-RC-{V}. cf[16946] is marked open to confirm in that action, and Release Number cf[14565] is piloted in ASSETS only (MCRM-154). This caller does not invent those clauses.
  • workflow_dispatch from any branch other than main will fail token exchange, because policy PR 221 pins refs/heads/main.
  • Depends on github-tools#306, not changed here: the action logs the full Slack message to the job log even on dry-run (run.mjs), and it does not implement the ticket's team-* labels, Exalate-as-unassigned, or the GitHub-issue merge.
  • Nothing reaches a real release Slack channel unless GA_MODE is exactly live and no test channel is set, or the owner set RELEASE_SUMMARY_TEST_CHANNEL to that channel's id. Nothing rewrites a release PR body unless GA_MODE is exactly live, mode is release-validation, the run is not a dry run, and no test channel is set.

Code owners for .github/workflows/ are MetaMask/devops and MetaMask/mobile-platform. No CODEOWNERS edit: the existing workflows rule already covers this file.

Run the resolver tests with node --test .github/scripts/release-slack-summaries-flags.test.mjs. CI unit tests run .github/**/*.test.ts only, so this .test.mjs is not on that job.

Changelog

CHANGELOG entry: null

Related issues

Refs: MCRM-155

Manual testing steps

N/A for the product app. This is a GitHub Actions caller and must not be dispatched until the prerequisites above are done. A live dispatch stays failed until both JQL repository variables are set.

After those land, and with GA_MODE unset or test and RELEASE_SUMMARY_TEST_CHANNEL set to a non-release #name or to the id that should be allowed:

Feature: release Slack summary caller

  Scenario: manual dry run posts nothing
    Given GA_MODE is unset or test
    And RELEASE_SUMMARY_TEST_CHANNEL is allowed
    When the workflow is dispatched on main with dry-run true
    Then the job summary shows dry-run true and allow-pr-write false
    And no Slack message is posted and no release PR body is edited

  Scenario: manual test post stays on the configured channel
    Given GA_MODE is unset or test
    When the workflow is dispatched on main with dry-run false and an empty test-channel
    Then the message is posted only to RELEASE_SUMMARY_TEST_CHANNEL
    And allow-pr-write is false

  Scenario: a release name or a different channel id is rejected while not live
    Given GA_MODE is unset or test
    When the workflow is dispatched on main with test-channel #release-mobile-7-60-0 or with a C id other than RELEASE_SUMMARY_TEST_CHANNEL
    Then the job fails before posting or writing

Screenshots/Recordings

N/A. Workflow-only change, no UI.

Before

N/A

After

N/A

Pre-merge author checklist

Performance checks (if applicable)

  • I've tested on Android
    • Ideally on a mid-range device; emulator is acceptable
  • I've tested with a power user scenario
    • Use these power-user SRPs to import wallets with many accounts and tokens
  • I've instrumented key operations with Sentry traces for production performance metrics

For performance guidelines and tooling, see the Performance Guide.

Pre-merge reviewer checklist

  • I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed).
  • I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.
Open in Web Open in Cursor 

Call the shared github-tools release-slack-summaries action on weekday
schedules and manual dispatch. Real Slack channels and PR writes stay
off unless GA_MODE is live.

Co-authored-by: Victor Pinto <vpintorico@users.noreply.github.com>
@github-actions github-actions Bot added the size-M label Nov 3, 2026
@metamask-ci metamask-ci Bot added the team-delivery Release delivery team label Nov 3, 2026
cursoragent and others added 2 commits November 3, 2026 08:31
Follow the input names and PR-write rule from github-tools#306, and
reference branch cursor/release-slack-summaries-a324 until it merges.

Co-authored-by: Victor Pinto <vpintorico@users.noreply.github.com>
allow-pr-write is armed only for a live release-validation run that is
not a dry run and has no test channel. Zap 597 still rewrites the
release PR body during the parallel run.

Co-authored-by: Victor Pinto <vpintorico@users.noreply.github.com>

Copy link
Copy Markdown
Contributor Author

Automated adversarial review (Warden), not a human review

Head: aa723af · Verdict: blocked · Fix round: 0

New findings

  • F1 (major, Breaker + Spec checker) .github/workflows/release-slack-summaries.yml:130, 142. A test channel made only of spaces, tabs or NBSP gets past the "non-live with no test channel forces dry-run" guard and posts to the real release-mobile-x-y-z channel. The value can come from vars.RELEASE_SUMMARY_TEST_CHANNEL (every weekday cron while GA_MODE is unset/test), or from the dispatch input once F2 is fixed. Evidence: if [[ "$live" == "false" && -z "$test_channel" ]] (:130) is false for " ", and only CR/LF are refused (:142). The shared action then does const override = (testChannel || '').trim(); return override || slackChannelName; (github-tools lib/gates.mjs:67-68). The PR write stays off.
  • F2 (major, Spec checker + Breaker) .github/workflows/release-slack-summaries.yml:84, 127. A manual run can never turn dry-run off. inputs.dry-run is a boolean, so ${{ inputs.dry-run || '' }} turns false into '', and "$INPUT_DRY_RUN" != "false" then forces dry_run=true. This fails closed, but it breaks the PR's own documented "manual test post stays off real channels" step and any on-demand or live re-run. Nothing tests the resolver step (:77-171).
  • F3 (major, Spec checker + Breaker) .github/workflows/release-slack-summaries.yml:208, 210. The caller doesn't pass the Jira queries MCRM-155 asks for. jira-release-blocker-jql: '' means the action never queries blockers ("Skipping the blocker section. Blocker issues are not queried.", run.mjs:194). jira-regression-jql: '' falls back to the Found-in/project-list default (jira.mjs:21-22) instead of the ticket's type = Bug AND labels = "regression-RC-{V}" AND statusCategory != Done. The ticket's open decisions list only the host repo and the Jira token. Nothing in the caller stops GA_MODE=live while these are empty, so a live run can post :white_check_mark: *No remaining bugs* (craft-596.mjs:127-128) while blockers are still open.
  • F4 (major, Warden judge, same issue as extension #47572 F2) .github/workflows/release-slack-summaries.yml:196. The workflow calls the shared action at the movable, unprotected branch @cursor/release-slack-summaries-a324, and the inner checkout follows github.action_ref (action.yml:92, 101). "Do not set GA_MODE=live on that branch" (:192) doesn't stop a merge. After a merge, the non-live weekday crons on main would already run whatever is on that branch, with SLACK_BOT_TOKEN, the Jira credentials and a pull_requests: write token. It also breaks when the branch is deleted. Pin a full commit SHA (fix android build on MacOS #306's head is f99347bf…).
  • F5 (minor, Breaker) .github/workflows/release-slack-summaries.yml:58-60. A single fixed concurrency group with cancel-in-progress: false keeps only one pending run. If a dispatch arrives while the 10:16 run is still running, it replaces the pending 10:21 release-validation run, so that day's post is silently dropped. Left for the owner's decision.
  • F6 (minor, Breaker) .github/workflows/release-slack-summaries.yml:178-179. Every run mints pull_requests: write, including blocker-summary and dry runs, but action.yml:19-21 says read is enough for blocker-summary. Left for the owner's decision.
  • F7 (minor, Warden judge, same issue as extension #47572 F7) .github/workflows/release-slack-summaries.yml:15, 116-117. The header and PR body say unset or test GA_MODE posts "only to vars.RELEASE_SUMMARY_TEST_CHANNEL". In fact a dispatch test-channel replaces it with any channel, a real release-mobile-* channel included, without GA_MODE=live. Left for the owner's decision.

Other bots

  • sonarqubecloud[bot]: Quality Gate passed, 0 new issues (issuecomment-6599202503) -> nothing to triage.
  • zizmor (code scanning): "No new alerts in code changed by this pull request" -> nothing to triage.
  • CodeQL / Semgrep OSS (code scanning): neutral, "1 configuration not found" (security-code-scanner.yml config present on main) -> pre-existing: tooling configuration, not a finding in this diff (https://github.com/MetaMask/metamask-mobile/runs/125810147289).
  • Socket Security: Pull Request Alerts -> false positive: no dependency changes (https://github.com/MetaMask/metamask-mobile/runs/125809575226).
  • Run lint (1-4): success with deprecation warnings (SectionHeader/Tag) -> pre-existing: app files outside this diff.
  • pr-title-linter / Security scan required: Node.js 20 and ubuntu-latest runner notices -> false positive: runner notices.
  • Cursor Automation "Force PRs to use mm-mobile-testing": neutral, automation error -> false positive: repo automation, not about this diff.

Dropped

2

Fixes Warden F1
Fixes Warden F2
Fixes Warden F3
Fixes Warden F4
Fixes Warden F5
Fixes Warden F7

Documents Warden F6: every run still requests pull_requests write.
The token-exchange policy for this workflow was specified with that
scope, and a read-only request was not confirmed as allowed.

F4 pins github-tools release-slack-summaries to
f99347bfb23bbbd352d199be7b58b3d7cb9f9bb9, which is still the head of
draft PR 306 on cursor/release-slack-summaries-a324.

Co-authored-by: Victor Pinto <vpintorico@users.noreply.github.com>
@github-actions github-actions Bot added size-L and removed size-M labels Nov 3, 2026
# github-tools-ref is the same SHA so the action's second checkout
# follows this commit rather than the branch tip.
- name: Post release Slack summary
uses: MetaMask/github-tools/.github/actions/release-slack-summaries@f99347bfb23bbbd352d199be7b58b3d7cb9f9bb9 # cursor/release-slack-summaries-a324 (github-tools#306)
Comment on lines +248 to +259
const proc = spawnSync(
'bash',
[
'-c',
'source "$1"; release_slack_summaries_concurrency_suffix "$2" "$3"',
'bash',
scriptPath,
schedule,
mode,
],
{ encoding: 'utf8' },
);

Copy link
Copy Markdown
Contributor Author

Automated adversarial review (Warden), not a human review

Head: 33bcab0 · Verdict: blocked · Fix round: 1

Since last review

  • F1 (major): fixed in 33bcab0 (test: F1 whitespace test channels never post while not live). Whitespace-only channels fail at flags.sh:93-95. The new allowlist at flags.sh:98 also rejects U+FEFF and other zero-width characters, which the test doesn't cover. Warden reproduced this locally: TEST_CHANNEL_VAR=$'\uFEFF', a dispatch of $'\uFEFF#release-mobile-8-16-0' (GA_MODE unset, test and live), $'#release-mobile-8-16-0\uFEFF', U+200B and U+180E all exit 1 with Test channel is not a Slack channel ID (C…/G…) or #name and an empty output file.
  • F2 (major): fixed in 33bcab0 (test: F2 dispatch dry-run false survives and other values stay dry). INPUT_DRY_RUN: ${{ format('{0}', inputs.dry-run) }} (workflow :101), and only the exact string false turns dry-run off (flags.sh:110-113).
  • F3 (major): still open. Live runs now refuse an empty JQL, but the queries are still not the ticket's (details under F3 below).
  • F4 (major): fixed in 33bcab0 (test: F2 and F4 workflow wiring). uses: and github-tools-ref are both f99347bfb23bbbd352d199be7b58b3d7cb9f9bb9 (workflow :138, :152).
  • F5 (minor): fixed in 33bcab0 (test: F5 scheduled and dispatched runs of one mode share a concurrency suffix). The group is per mode (workflow :69).
  • F6 (minor): disputed: accepted. token-exchange-service#221 grants this workflow one same-repo entry (refs/heads/main, environment release-notifications) with pull_requests: write, so a narrower request would need a policy change outside this PR. The workflow documents this at :111-115. Closed, on the same basis as metamask-extension#47572.
  • F7 (minor): still open. #release-* names are now rejected when not live, but a Slack channel ID is not (details under F7 below).

Open findings at this head

  • F3 (major, Spec checker + Breaker) .github/workflows/release-slack-summaries.yml:105-108, .github/scripts/release-slack-summaries-flags.sh:127-136. Upstream: github-tools lib/jira.mjs:48-67, craft-596.mjs:127-128. The workflow hardcodes type = Bug AND labels = "release-blocker" AND statusCategory != Done and type = Bug AND statusCategory != Done, and the action appends cf[14565] = "V" / cf[16946] = "V" to them. MCRM-155 requires labels = "regression-RC-{V}". Per the release model, Release Number (cf 14565) is only piloted in ASSETS (MCRM-154), and jira.mjs marks cf[16946] "OPEN to confirm". Repro: GA_MODE=live, schedule 21 10 * * 1-5 exits 0 with dry-run=false allow-pr-write=true and those strings. An empty Jira result then posts No remaining bugs to release-mobile-8-16-0. The live gate checks only that the strings are non-empty, and the comment at flags.sh:127 calls them "the ticket JQL". Test gap: nothing covers the empty-regression guard (flags.sh:133-135). Removing it still passes 13/13 (the Spec checker's mutation).
  • F7 (minor, Spec checker + Breaker) .github/scripts/release-slack-summaries-flags.sh:98-104, workflow :15-19, :60. While not live, the regex explicitly accepts ^[CG][A-Z0-9]+$, but the release check only looks at names. Repro: schedule 21 10 * * 1-5, GA_MODE=test, TEST_CHANNEL_VAR=C0C7GM7J16W (the ID of #release-mobile-8-16-0 in the release model) exits 0 with dry-run=false allow-pr-write=false test-channel=C0C7GM7J16W. A dispatch with the same ID does the same. The action then posts to that ID. The header (:15) still says unset/test posts "only to a non-release test channel". This needs a repo writer's dispatch or a variable admin, so it stays minor, as on #47572.
  • Also checked, no finding: the heredoc delimiter injection reported on #47572 doesn't apply here. Outputs are single key=value lines (flags.sh:142-149), the test channel refuses CR/LF (:86-88), and both JQL values are workflow constants (:107-108). The JQL path does keep embedded newlines and U+FEFF, though. Locally, BLOCKER_JQL=$'x\nallow-pr-write=true\ndry-run=false' appends later output lines, and $'\uFEFF' gets past the live empty check while JavaScript trim() empties it. Neither is reachable while the JQL values are constants. Both must be closed if the F3 fix moves JQL into repository variables.

New findings

None.

Other bots

  • github-advanced-security[bot] / zizmor: "action's hash pin has mismatched or missing version comment" at workflow :138 (code-scanning 710) -> false positive: the SHA is a commit on unmerged github-tools#306 with no tag yet. The TODO at :133-134 covers the re-pin.
  • github-advanced-security[bot] / CodeQL: "Shell command built from environment values" at release-slack-summaries-flags.test.mjs:248-259 (code-scanning 711) -> false positive: test-only spawnSync('bash', ['-c', 'source "$1"; …', 'bash', scriptPath, …]) passes the path as a quoted positional argument, not interpolated.
  • sonarqubecloud[bot]: Quality Gate passed (issuecomment-6599800674) -> nothing to triage.
  • Semgrep OSS: neutral, "1 configuration not found" -> pre-existing tooling configuration, unrelated to this diff.
  • Socket Security: Pull Request Alerts skipped -> false positive: no dependency changes.
  • Run lint (1-4): design-system deprecation warnings in app files outside this diff -> pre-existing.
  • Cursor Automation (mm-mobile-testing): neutral automation result -> false positive: not a code finding.

Dropped

3

Fixes Warden F3, F7

A live post reads RELEASE_SUMMARY_BLOCKER_JQL and
RELEASE_SUMMARY_REGRESSION_JQL and fails unless both are set.
While GA_MODE is not live, a Slack channel id is accepted only when
it equals RELEASE_SUMMARY_TEST_CHANNEL.

Co-authored-by: Victor Pinto <vpintorico@users.noreply.github.com>
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 87.63%. Comparing base (944d3c5) to head (905a023).
⚠️ Report is 3 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #38717   +/-   ##
=======================================
  Coverage   87.63%   87.63%           
=======================================
  Files        7967     7975    +8     
  Lines      231645   231724   +79     
  Branches    58693    58706   +13     
=======================================
+ Hits       202997   203072   +75     
- Misses      16302    16305    +3     
- Partials    12346    12347    +1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@sonarqubecloud

sonarqubecloud Bot commented Nov 3, 2026

Copy link
Copy Markdown

Copy link
Copy Markdown
Contributor Author

Automated adversarial review (Warden), not a human review

Head: 905a023 · Verdict: pass with notes · Fix round: 2

Since last review

  • F1 (major): fixed in 33bcab0, not regressed. Warden checked it locally: TEST_CHANNEL_VAR=$'\uFEFF' and $'\u0085\u001c' fail with "only whitespace". $'\uFEFF#release-mobile-8-16-0' and #re<U+200B>lease-mobile-8-16-0 fail as release channels (flags.sh:28-34, 108-119).
  • F2 (major): fixed in 33bcab0, not regressed (format('{0}', inputs.dry-run), workflow :105).
  • F3 (major): fixed in 905a023 at the caller level (tests: F3 live non-dry runs require both repository JQL variables, F3 JQL with a newline writes nothing). A live run that is not a dry run uses only RELEASE_SUMMARY_BLOCKER_JQL / RELEASE_SUMMARY_REGRESSION_JQL. Unset, blank, FEFF, ZWSP, U+0085 or CR/LF values fail, and nothing is written to the output file (flags.sh:148-178). The preview strings are no longer used on that path. What remains is upstream: github-tools#306 always appends cf[14565] / cf[16946] and can't substitute labels = "regression-RC-{V}" (jira.mjs:48-67). This caller can't fix that, so it is left for the owner's decision. The workflow header (:31-36) and the PR body say so. Closed here, the same as metamask-extension#47572.
  • F4 (major): fixed in 33bcab0, not regressed. uses: and github-tools-ref are both f99347bf… (workflow :142).
  • F5 (minor): fixed in 33bcab0, not regressed (one group per mode, workflow :72-74).
  • F6 (minor): disputed: accepted (token-exchange-service#221 policy). Closed.
  • F7 (minor): still open, left for the owner's decision. While not live, a dispatch ID that doesn't equal RELEASE_SUMMARY_TEST_CHANNEL now fails (flags.sh:120-125, test a non-live channel id must equal the configured variable). Details under F7 below.

Open findings at this head (minor, left for the owner's decision)

  • F7 (minor, Spec checker) flags.sh:113, 120-125. RELEASE_SUMMARY_TEST_CHANNEL=C0C7GM7J16W (the release model lists that ID for #release-mobile-8-16-0) on schedule 21 10 * * 1-5 with GA_MODE=test exits 0 with dry-run=false allow-pr-write=false. The test above asserts this. The header (:19-20), the input text and the PR body state the exception. Reaching it needs a variable admin, so it stays minor, as on #47572.
    • Also checked: the live-dispatch gap from #47572 doesn't exist here. With GA_MODE=live, dispatch test-channel=C0C7GM7J16W (or #release-mobile-8-16-0), dry-run false and empty JQL exits 1. The live JQL gate at :160 applies whether or not a test channel is set.
  • F8 (minor, Spec checker) workflow :64. The test-channel input says "Leave empty to use that variable." With GA_MODE=live, an empty input ignores the variable (flags.sh:91-97). Repro: live dispatch, blocker-summary, dry-run false, TEST_CHANNEL_VAR=#mm-summary-test, both JQL variables set exits 0 with an empty test-channel and dry-run=false, so it posts to the real release channel.
  • F9 (minor, Spec checker) PR body, Manual testing: "A live dispatch stays failed until both JQL repository variables are set." A live dispatch with dry-run true (the input default) exits 0 with dry-run=true and the preview JQL. Only a non-dry-run live post is blocked, which the Prerequisites section states correctly.
  • F10 (minor, Spec checker) release-slack-summaries-flags.test.mjs:40-41, 228-248. run() and the test at :222 set BLOCKER_JQL / REGRESSION_JQL, but the script reads RELEASE_SUMMARY_BLOCKER_JQL / RELEASE_SUMMARY_REGRESSION_JQL. That test passes because both real variables are unset, not because the case it names is exercised. The guard is covered by F3 live non-dry runs require both repository JQL variables at :375.
  • F3 upstream remainder, F6 policy, tests not in CI: left for the owner's decision. node --test …flags.test.mjs (17/17 locally) isn't run by any workflow, and yarn test:unit covers .github/**/*.test.ts only. The PR body says so.

New findings

F8, F9, F10 above (all minor).

Other bots

  • github-advanced-security[bot] / zizmor: "action's hash pin has mismatched or missing version comment" at workflow :142 (review comment 4452674414, https://github.com/MetaMask/metamask-mobile/runs/125835587473) -> false positive: the SHA is a commit on unmerged github-tools#306 with no tag. The re-pin TODO covers it.
  • github-advanced-security[bot] / CodeQL: "Shell command built from environment values" at release-slack-summaries-flags.test.mjs:257 (review comment 4452727710) -> false positive: test-only, the path is passed as a positional argument.
  • codecov-commenter: all modified coverable lines covered (issuecomment-6600298341) -> nothing to triage.
  • sonarqubecloud[bot]: Quality Gate passed (issuecomment-6600318220) -> nothing to triage.
  • CodeQL / Semgrep OSS: neutral, "1 configuration not found" -> pre-existing tooling configuration.
  • Run lint (1-4): deprecation warnings in app files outside this diff -> pre-existing.
  • Cursor Automation (mm-mobile-testing): neutral -> false positive: not a code finding.

Dropped

1

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size-L team-delivery Release delivery team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants