Skip to content

prow-github-actions 3.2.0

Choose a tag to compare

@github-actions github-actions released this 29 Oct 21:36
· 35 commits to main since this release
4f97e30

v3.2.0

Prow can now run as a GitHub App (beta) as well as a GitHub Action, and the action picks up
six weeks of features and fixes. Nothing changes for existing action installs: @v3 callers get
it automatically, @v3.0.1 pins move to @v3.2.0.

GitHub App (beta)

The same /commands, OWNERS, labelling and merging code receives webhooks instead of running in a
workflow: one install per organization, no workflow file, fork pull requests are first class, and
the App's writes trigger your workflows (GITHUB_TOKEN's do not). Deploy it as a container or on
Cloudflare Workers; scheduled jobs run for every installation; /label-sync stands in for the
Run workflow button. Details, permissions and limits: Running as a GitHub App.

Internally the handlers now reach the runtime through a Platform interface with a per-event
RunState, which the action adapter implements on @actions/core. The action's behaviour is
unchanged and its bundle is verified byte-equivalent by the end-to-end suite.

Features (action and App)

  • GitHub teams in OWNERS — approvers/reviewers may list "@org/team" (docs).
  • blunderbuss.delay — wait before requesting reviewers; request only if nobody has yet (docs).
  • approve.github_review (opt in) — mirror the approved label as a GitHub review.
  • authorization policy (opt in) — who may run label, hold, close and review commands.
  • /label-sync — collaborators run the label-sync job from a comment. In the default command list.

Fixes

  • /meow matches case-insensitively like every other command.
  • A 0-byte OWNERS file lists nobody; a comment-only prow.yaml is an empty configuration.
  • A label command names the refused values instead of saying "command args missing".
  • The lgtm job keeps evaluating the remaining pull requests when one evaluation fails.
  • A comment without a body carries no commands; a command on a payload without an issue or pull
    number prints the payload, not [object Object].

Upgrading

Nothing to do for the action. To try the App, see docs/github-app.md and treat it
as beta: the deployment story is settling and feedback is welcome.

Verification

The SBOM, its cosign signature and the SLSA provenance are attached to this release; the commands
are under SBOM and provenance below.

Usage

- uses: cncf/prow-github-actions@v3.2.0

SBOM and provenance

An SPDX 2.3 SBOM of the runtime dependencies, generated with
waybill, is attached as
prow-github-actions-3.2.0.spdx.json and signed with
cosign (keyless). SLSA build
provenance covering both dist/index.js and the SBOM is attached as
prow-github-actions-3.2.0.intoto.jsonl.

Verify the SBOM signature:

cosign verify-blob \
  --bundle prow-github-actions-3.2.0.spdx.json.bundle \
  --certificate-identity-regexp="https://github.com/cncf/prow-github-actions" \
  --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
  prow-github-actions-3.2.0.spdx.json

Verify the provenance of the bundled action:

gh attestation verify dist/index.js --repo cncf/prow-github-actions

What's Changed

  • test(pullReq): cover onPrLgtm error paths and the lgtm-job rejection handoff by @hivecommons-hive[bot] in #173
  • test(issueComment): cover the error branches of assign, unassign, cc, uncc, reopen, close, retitle and lock by @hivecommons-hive[bot] in #175
  • test(labels): cover the error branches of remove, hold, lgtm, fixed and prefixed label handlers by @hivecommons-hive[bot] in #177
  • test(cronLgtm): cover the pulls.list failure, closed-PR skip and throwing-evaluation paths by @hivecommons-hive[bot] in #179
  • test(utils): cover sleep with fake timers by @hivecommons-hive[bot] in #181
  • test(issueComment): cover the error branches of the approve and milestone handlers by @hivecommons-hive[bot] in #183
  • test(trigger): cover the edge and error branches of /retest, /test, /ok-to-test and okToTestOnPullRequest by @hivecommons-hive[bot] in #185
  • test(tide): cover the fork-403 diagnosis failures, the refused explanatory comment and the head-moved skip in the merge-queue path by @hivecommons-hive[bot] in #187
  • test(mergeQueue): cover queueState, enqueue, dequeue and enqueuedByBot directly by @hivecommons-hive[bot] in #190
  • test(approve): cover the comment/review/notifier error throws, the no-base-ref OWNERS fallback and the notifier ordering by @hivecommons-hive[bot] in #192
  • test(auth): cover the getErrorDetails fallback branches for string, empty-object and bare Error rejections by @hivecommons-hive[bot] in #194
  • test(issueComment): cover the /check-required-labels sweep dedup and non-Error rejections in handleIssueComment by @hivecommons-hive[bot] in #196
  • test(utils): cover the error and edge branches of labelMatch, labeling, comments and config by @hivecommons-hive[bot] in #198
  • test(cronJobs): cover the labelSync list failure and the sweep non-Error and absent-field branches by @hivecommons-hive[bot] in #200
  • test(plugins): cover the error and fallback branches of lgtmBinding, ownersLabel and requireMatchingLabel by @hivecommons-hive[bot] in #204
  • test(meow): cover the missing-issue-number throw and the response-body cancel fallback by @hivecommons-hive[bot] in #206
  • test: cover the error branches of run, config fetch paths, createCommentOnce and prefixed labels by @hivecommons-hive[bot] in #208
  • test: cover the src/main.ts entry point by @hivecommons-hive[bot] in #212
  • chore(coverage): raise vitest coverage thresholds to the current floor by @hivecommons-hive[bot] in #202
  • chore(deps-dev): bump the dev-dependencies group across 1 directory with 5 updates by @dependabot[bot] in #188
  • test: assert .github/prow.yaml parses and agrees with prow-bot.yml, the label catalogue and the issue templates by @hivecommons-hive[bot] in #256
  • test: assert docs/commands.md rows match the handleIssueComment dispatcher and the prow.yml prow-commands default by @hivecommons-hive[bot] in #254
  • test(bundle): drive /test and lgtm cancel (/lgtm cancel, /remove-lgtm) through dist/index.js by @hivecommons-hive[bot] in #240
  • test(bundle): opt the node --check spawn out of NODE_V8_COVERAGE so the suite survives coverage.autoAttachSubprocess by @hivecommons-hive[bot] in #236
  • test: assert the Node runtime major agrees across action.yml, package.json, README and setup-node by @hivecommons-hive[bot] in #234
  • test: assert action.yml inputs match the core.getInput names read in src/ by @hivecommons-hive[bot] in #232
  • test: cover the residual branch fallbacks of meow, trigger and tide by @hivecommons-hive[bot] in #225
  • test: cover the non-Error rejection and empty-config fallbacks of labelSync, lgtm, mergeQueue and issueComment/approve by @hivecommons-hive[bot] in #223
  • test(tide): cover evaluateMerge on a queue entry with no position, no entry and no enqueuer by @hivecommons-hive[bot] in #219
  • test(auth): cover the rethrow catch blocks of checkCommenterAuth and getOrgCollabCommentUsers by @hivecommons-hive[bot] in #217
  • test(bundle): assert dist/index.js requires only node built-ins and inlines every package src/ imports by @hivecommons-hive[bot] in #266
  • test: assert docs/configuration.md defaults, field tables and probe order against config.ts and the plugin resolvers by @hivecommons-hive[bot] in #258
  • test(bundle): drive /cc /uncc /unassign /retitle /lock /reopen through dist/index.js by @hivecommons-hive[bot] in #238
  • test(config): cover the empty sweep mapping and non-Error lookback rethrow branches of normalizeSweep by @hivecommons-hive[bot] in #229
  • fix: name the cron and pull request dispatchers in their failure messages by @jeefy in #271
  • test: stop approve and lgtm suites leaking state between tests by @jeefy in #272
  • test(bundle): share the config-probe, comment and request-sequence helpers across bundle suites by @jeefy in #273
  • test: keep the msw server offline on msw 3 and settle the parallel config probe by @hivecommons-hive[bot] in #280
  • chore(deps-dev): bump the dev-dependencies group with 3 updates by @dependabot[bot] in #277
  • test(bundle): drive the merge queue's failed state read, refused enqueue and refused dequeue through dist/index.js by @hivecommons-hive[bot] in #270
  • test(bundle): drive the status event's success path through dist/index.js as a row of the head-sha lookup case by @hivecommons-hive[bot] in #262
  • test(bundle): drive ok-to-test on pull_request synchronize and in the sweep through dist/index.js by @hivecommons-hive[bot] in #260
  • test(bundle): drive handleIssueComment's prow-commands input arms and per-command error isolation through dist/index.js by @hivecommons-hive[bot] in #252
  • test(bundle): drive /assign with argument users and /milestone set-by-title through dist/index.js by @hivecommons-hive[bot] in #250
  • test(bundle): drive the dry-run and config inputs of label-sync through dist/index.js by @hivecommons-hive[bot] in #248
  • test: assert release.yml and pre-release.yml stay one pipeline and attach the artifacts docs/releasing.md lists by @hivecommons-hive[bot] in #268
  • test(plugins): cover the non-Error rejection arm of the requireMatchingLabel error report by @hivecommons-hive[bot] in #227
  • test(plugins): cover the /lgtm cancel and null-body notifier arms of approveOnPullRequest by @hivecommons-hive[bot] in #221
  • test(coverage): add test:coverage:e2e to report the bundle suite's coverage of src/ by @hivecommons-hive[bot] in #274
  • test(bundle): drive /approve cancel on a repository without OWNERS files through dist/index.js by @hivecommons-hive[bot] in #276
  • chore(deps-dev): bump msw from 2.15.0 to 3.0.1 by @dependabot[bot] in #278
  • chore(deps-dev): bump brace-expansion from 5.0.9 to 5.0.12 by @dependabot[bot] in #281
  • feat(approve): opt-in approve.github_review mirrors approved as a GitHub review by @mfahlandt in #263
  • test(meow): keep the unit /meow suite off the real network under msw 3 by @hivecommons-hive[bot] in #287
  • test(bundle): drive blunderbuss's ready_for_review skip, /auto-cc-on-issue, uncovered-file, no-candidate and refused-request arms through dist/index.js by @hivecommons-hive[bot] in #353
  • test(bundle): drive labelIssue's refused label write through dist/index.js by @hivecommons-hive[bot] in #337
  • test(bundle): drive /assign's refused writes and empty authorized set through dist/index.js by @hivecommons-hive[bot] in #302
  • test(bundle): drive removeFixedLabels' no-op and failed-labels-read arms through dist/index.js by @hivecommons-hive[bot] in #300
  • test(bundle): drive the configured blunderbuss section through dist/index.js by @hivecommons-hive[bot] in #291
  • test(bundle): drive the push event and a blank jobs input through the cron dispatcher in dist/index.js by @hivecommons-hive[bot] in #242
  • test(bundle): drive /cc, /uncc, /lock and /unassign refused writes through dist/index.js by @hivecommons-hive[bot] in #308
  • test(bundle): drive /meow through dist/index.js against a stubbed cat api by @hivecommons-hive[bot] in #244
  • test(bundle): drive syncApprovalReview's not-open and nothing-to-dismiss short-circuits and withdrawalReason's no-files and lgtm-skip arms through dist/index.js by @hivecommons-hive[bot] in #363
  • test(bundle): drive label-sync's custom-section, needs-* and dedup catalog arms through dist/index.js by @hivecommons-hive[bot] in #351
  • test(bundle): drive require-matching-label's no-rule, already-correct, grace-period and comment-failure arms through dist/index.js by @hivecommons-hive[bot] in #316
  • test(bundle): drive /remove-help, the built-in /lifecycle defaults and the no-config failure through dist/index.js by @hivecommons-hive[bot] in #246
  • test(bundle): drive the https:// config source (config.ts fetchUrl) through dist/index.js by @hivecommons-hive[bot] in #359
  • test(bundle): drive the approve.github_review refusals, short-circuits and failures through dist/index.js by @hivecommons-hive[bot] in #286
  • test(bundle): drive the prefixed label commands' and /remove's failure arms through dist/index.js by @hivecommons-hive[bot] in #341
  • test(bundle): drive the lgtm cron's listing-500, closed-pr and evaluation-throw arms through dist/index.js by @hivecommons-hive[bot] in #335
  • chore(coverage): emit lcovonly and json-summary reporters from vitest.config.mjs by @hivecommons-hive[bot] in #230
  • feat(auth): opt-in authorization policy for label, hold, close and review commands by @jeefy in #367
  • fix: treat an issue comment without a body as having no commands by @jeefy in #374
  • fix: print the payload, not [object Object], when a command has no issue or pull number by @jeefy in #373
  • fix(lgtm): keep evaluating the remaining pull requests when one evaluation fails by @jeefy in #375
  • fix(labels): say which values were refused instead of "command args missing" by @jeefy in #376
  • chore(deps-dev): bump source-map-js from 1.2.1 to 1.2.2 by @dependabot[bot] in #370
  • test(bundle): drive root-OWNERS authorization on an issue and the OWNERS-based /lgtm refusal through dist/index.js by @hivecommons-hive[bot] in #283
  • test(bundle): drive the tide merge gate's missing_labels block and labelMatch wildcards through dist/index.js by @hivecommons-hive[bot] in #289
  • test(bundle): drive the configured hold and sweep sections through dist/index.js by @hivecommons-hive[bot] in #293
  • test(bundle): drive plain /close, its write failure and the /milestone refusals through dist/index.js by @hivecommons-hive[bot] in #296
  • test(bundle): drive /retest's no-failed and already-re-running arms and /ok-to-test's author, already-trusted and approval-failure arms through dist/index.js by @hivecommons-hive[bot] in #304
  • test(bundle): drive /reopen's and /retitle's collaborator-read 500 and refused-write arms through dist/index.js by @hivecommons-hive[bot] in #306
  • test(bundle): drive handlePullReq's unsupported-job and failed-lgtm-read arms through dist/index.js by @hivecommons-hive[bot] in #310
  • test(bundle): drive label-sync's refused-write and description-drift arms through dist/index.js by @hivecommons-hive[bot] in #312
  • test(bundle): drive lgtmBinding's failure arms and /lgtm cancel's failed reads and writes through dist/index.js by @hivecommons-hive[bot] in #318
  • test(bundle): drive owners.ts' truncated-tree probes and the base-branch OWNERS probe's arms through dist/index.js by @hivecommons-hive[bot] in #320
  • test(bundle): drive tide's merge-queue skip and enqueue-refusal arms through dist/index.js by @hivecommons-hive[bot] in #322
  • test(bundle): drive commandLines' fence-closer, indented-code and info-string guards through dist/index.js by @hivecommons-hive[bot] in #324
  • test(bundle): drive /hold cancel's no-label, failed-read, failed-removal and already-gone arms through dist/index.js by @hivecommons-hive[bot] in #326
  • test(bundle): drive pullRequestOwners' rename and base-tip-fallback arms and tide's fork 403 diagnosis arms through dist/index.js by @hivecommons-hive[bot] in #328
  • test(bundle): drive the issue-side OWNERS fallback and the membership probes' 500 arms through dist/index.js by @hivecommons-hive[bot] in #331
  • test(bundle): drive parseProwConfig's schema rejections through dist/index.js by @hivecommons-hive[bot] in #339
  • test(bundle): drive the missing issue/pull number guards of every command handler and onPrLgtm through dist/index.js by @hivecommons-hive[bot] in #343
  • test(bundle): drive /approve's membership-mode review failures and no-review cancel through dist/index.js by @hivecommons-hive[bot] in #355
  • test(bundle): drive the prow-commands alias canonicalization and unsupported-command arms through dist/index.js by @hivecommons-hive[bot] in #357
  • test(bundle): drive the OWNERS filters-ignored arm (owners.ts parseOwners) through dist/index.js by @hivecommons-hive[bot] in #365
  • test(bundle): drive the repoHasOwners/defaultBranch fallback of approve and the tide gate through dist/index.js by @hivecommons-hive[bot] in #369
  • test(bundle): drive the cron dispatcher's unknown-job arm through dist/index.js by @hivecommons-hive[bot] in #371
  • test(bundle): drive /meow's parseCatImage refusals and dropped-connection retry through dist/index.js by @hivecommons-hive[bot] in #372
  • test(bundle): drive the 'could not list the repository labels' arms of labelIssue and label-sync through dist/index.js by @hivecommons-hive[bot] in #388
  • test(bundle): drive the plugin payload guards (requireMatchingLabel.ts:184, blunderbuss.ts:94, trigger.ts:188, tide.ts:489) through dist/index.js by @hivecommons-hive[bot] in #399
  • chore(deps): move js-yaml to dependencies by @mrbobbytables in #411
  • ci: run test.yml once per commit and keep a main baseline after bot merges by @mrbobbytables in #389
  • fix(config): treat a comment-only prow.yaml as an empty configuration by @mrbobbytables in #415
  • fix(owners): read a 0-byte OWNERS file as listing nobody by @mrbobbytables in #416
  • test(bundle): drive the pull-request OWNERS fail-closed arm (auth.ts:426, no OWNERS file covers README.md) through dist/index.js by @hivecommons-hive[bot] in #401
  • test(bundle): drive blunderbuss's assignee exclusion (pullRequestOwners.ts:96) through dist/index.js by @hivecommons-hive[bot] in #403
  • test(bundle): drive parseOwners's content-shape arms (owners.ts:39/41/83) through dist/index.js by @hivecommons-hive[bot] in #406
  • test(bundle): drive withdrawalReason's 'and N more' tail and no-withdrawer arm (approveReview.ts:105/120) through dist/index.js by @hivecommons-hive[bot] in #408
  • test(bundle): drive the lgtm removal no-op arms (onPrLgtm.ts:33, labels/lgtm.ts:106) through dist/index.js by @hivecommons-hive[bot] in #410
  • test(bundle): drive react()'s missing comment.id arm (trigger.ts:293) through dist/index.js by @hivecommons-hive[bot] in #413
  • chore: remove unused getArgumentLabels and anyLabelMatches by @mrbobbytables in #421
  • test(bundle): drive /test's empty-head none row (trigger.ts:286) and null-name run path fallback (trigger.ts:272) through dist/index.js by @hivecommons-hive[bot] in #418
  • test(bundle): drive the prefixed label refusal's 'allowed: none' arm (prefixed.ts:251) through dist/index.js by @hivecommons-hive[bot] in #420
  • ci: repack dist/ on dependabot branches without exposing a write token by @mrbobbytables in #390
  • test(bundle): drive owners-label's early-return and failure arms through dist/index.js by @hivecommons-hive[bot] in #298
  • test(bundle): drive the config input's explicit source and the loader's tier read failures through dist/index.js by @hivecommons-hive[bot] in #314
  • test(bundle): drive the approve plugin's evaluation arms through dist/index.js by @hivecommons-hive[bot] in #333
  • test(bundle): drive the sweep cron's empty-window, failed-listing and blunderbuss-freshness arms through dist/index.js by @hivecommons-hive[bot] in #345
  • test(bundle): drive tide's verdict arms (unknown-retry exhaustion, moved head, 405/409 refusals, merged/closed/locked, check_suite guards, once-per-run) through dist/index.js by @hivecommons-hive[bot] in #347
  • test(bundle): drive the authorization policy arms of auth.ts (members/collaborators/root-OWNERS admits, trusted refusal, config-load failures, empty login) through dist/index.js by @hivecommons-hive[bot] in #378
  • test(bundle): drive the authorization section's schema rejections and the cross-tier users union through dist/index.js by @hivecommons-hive[bot] in #381
  • test(bundle): drive loadOwnersTree's failure arms (owners.ts L164/L197/L229) through dist/index.js by @hivecommons-hive[bot] in #383
  • test(bundle): drive the sweep cron's enqueued outcome (sweep.ts:75) through dist/index.js by @hivecommons-hive[bot] in #385
  • test(bundle): drive parseProwConfig's empty-document arm (config.ts:373) through dist/index.js by @hivecommons-hive[bot] in #395
  • test(bundle): drive meow.ts:28 (strict /meow re-check after the dispatcher's generic match) through dist/index.js by @hivecommons-hive[bot] in #397
  • test(bundle): stop the acceptance harness from loading src/ into the vitest worker by @hivecommons-hive[bot] in #427
  • test(coverage): give the e2e coverage bundle map columns so lines tsc flattens report their hits by @hivecommons-hive[bot] in #425
  • test(bundle): drive loadExplicitConfig's not-found arm (config.ts:305) through dist/index.js by @hivecommons-hive[bot] in #423
  • test(bundle): drive handleIssueComment's bodiless-comment fold (handleIssueComment.ts:117) through dist/index.js by @hivecommons-hive[bot] in #429
  • test(bundle): drive recentlyUpdatedPulls' full-page paging arm (sweep.ts:179) through dist/index.js by @hivecommons-hive[bot] in #431
  • test(bundle): drive getCurrentLabels' bare-string label arm (labeling.ts:148) through dist/index.js by @hivecommons-hive[bot] in #433
  • test(bundle): drive labelSync's null label description arm (labelSync.ts:133) through dist/index.js by @hivecommons-hive[bot] in #435
  • test(bundle): drive run()'s last-resort catch (run.ts:40) through dist/index.js by @hivecommons-hive[bot] in #437
  • test(bundle): drive pullRequestOwners.load's null-field folds (pullRequestOwners.ts:92-97) through dist/index.js by @hivecommons-hive[bot] in #439
  • test(bundle): drive the sweep's alreadyChecked skip (handleIssueComment.ts:164,180) through dist/index.js by @hivecommons-hive[bot] in #445
  • test(bundle): drive checkOrgMember's missing payload.repository guard (auth.ts:43-45) through dist/index.js by @hivecommons-hive[bot] in #447
  • test(bundle): drive labelCatalog.ts:80 (the /label allowlist's empty prefix) through dist/index.js by @hivecommons-hive[bot] in #448
  • chore(deps-dev): bump the dev-dependencies group with 3 updates by @dependabot[bot] in #441
  • chore(deps): bump actions/setup-node from 7.0.0 to 7.1.0 by @dependabot[bot] in #442
  • chore(deps): bump actions/upload-artifact from 7.0.1 to 7.0.2 by @dependabot[bot] in #443
  • refactor(auth): drop the 14 unreachable commenter-auth catch wrappers by @mrbobbytables in #449
  • refactor(pullReq): drop the unreachable 'None found' setFailed arm in handlePullReq by @hivecommons-hive[bot] in #451
  • chore(deps): bump js-yaml from 5.4.2 to 5.4.3 in the production-dependencies group by @dependabot[bot] in #440
  • fix(meow): match /meow case-insensitively like every other command by @jeefy in #453
  • test(bundle): drive /uncc's non-collaborator self arm (uncc.ts:79) and /milestone's empty listing (milestone.ts:66) through dist/index.js by @hivecommons-hive[bot] in #455
  • test(bundle): drive meow.ts:112 (cancelResponseBody's rejected cancel) through dist/index.js by @hivecommons-hive[bot] in #457
  • test(bundle): drive selfAssign's unauthorized no-op arm (assign.ts:100) by @hivecommons-hive[bot] in #460
  • test(bundle): drive queueState's once-per-run warning suppression (mergeQueue.ts:87) through dist/index.js by @hivecommons-hive[bot] in #461
  • chore(e2e-coverage): give the bundle coverage run its own coverage-e2e/ report directory by @hivecommons-hive[bot] in #463
  • test(bundle): drive /lgtm on a PR by a reviewer the covering OWNERS file lists (auth.ts:397 success arm) by @hivecommons-hive[bot] in #464
  • refactor: drop defensive arms unreachable from dist/index.js by @mrbobbytables in #462
  • test(bundle): drive the merge-queue null answers (no entry, no enqueuer, errors: []) through dist/index.js by @hivecommons-hive[bot] in #471
  • test(bundle): drive rootOwnersIncludes' approvers arm and the trusted-policy refusal after an OWNERS read (auth.ts:423) through dist/index.js by @hivecommons-hive[bot] in #474
  • test(bundle): drive organization-only authorization.users (config.ts:751 over.users ?? [] arm) through dist/index.js by @hivecommons-hive[bot] in #475
  • test(bundle): drive fileList's and N more truncation (tide.ts:291) through dist/index.js by @hivecommons-hive[bot] in #476
  • test(bundle): drive isTrustedImageSource's s3 bucket arm (meow.ts:156-157) through dist/index.js by @hivecommons-hive[bot] in #477
  • test(bundle): drive checkIssueComments' non-matching comment arm (auth.ts:129) through dist/index.js by @hivecommons-hive[bot] in #478
  • test(bundle): drive require-matching-label's no-applicable-rule arm for pull requests (requireMatchingLabel.ts:149) through dist/index.js by @hivecommons-hive[bot] in #479
  • test(bundle): drive fetchMergeability's known-on-last-retry arm (tide.ts:108) through dist/index.js by @hivecommons-hive[bot] in #480
  • test(bundle): drive the sweep section's default and 24h-capped lookback (config.ts:646) through dist/index.js by @hivecommons-hive[bot] in #481
  • test(bundle): drive the sweep's shared identity and base-tip memos (approveReview.ts:33, pullRequestOwners.ts:109) through dist/index.js by @hivecommons-hive[bot] in #482
  • test(bundle): drive isOwnReview's user-token arm through dist/index.js (approveReview.ts:63) by @hivecommons-hive[bot] in #467
  • test(bundle): drive approve.ignore_review_state through dist/index.js (approve.ts:380-381) by @hivecommons-hive[bot] in #468
  • test(bundle): drive approvalEvents' COMMENTED/DISMISSED review arm through dist/index.js (approve.ts:125) by @hivecommons-hive[bot] in #469
  • test(bundle): drive canonicalCommand's dynamic remove-form arm (handleIssueComment.ts:91) through dist/index.js by @hivecommons-hive[bot] in #470
  • test(bundle): drive suggestApprovers' second greedy round (approve.ts:260) through dist/index.js by @hivecommons-hive[bot] in #472
  • test(bundle): drive loadTide's configured tide.labels arm (tide.ts:542) through dist/index.js by @hivecommons-hive[bot] in #473
  • chore(prow): add kind/feature label by @mrbobbytables in #487
  • feat(owners): support GitHub groups in OWNERS by @mrbobbytables in #486
  • ci(test): run the bundle e2e coverage suite in its own job by @mrbobbytables in #488
  • chore(coverage): v8-ignore the six reset*() isolation hooks so coverage-e2e names only bundle-reachable code by @hivecommons-hive[bot] in #483
  • chore(coverage): give the bundle e2e coverage run a regression floor (99/95/98/99) instead of zeroed thresholds by @hivecommons-hive[bot] in #484
  • ci(test): drop the Dependabot dist/ repack jobs by @jeefy in #489
  • test(bundle): drop three bundle cases that add no coverage or guard by @jeefy in #490
  • test(bundle): fold the sweep memo case into sweepArms, drop the root OWNERS approver case by @jeefy in #491
  • test(bundle): drive the remaining unit-only arms in sweep, trigger and lgtmBinding through dist/index.js by @mrbobbytables in #496
  • refactor(tide): require fetchMergeability's initial read, drop the unreachable getPull fallback by @hivecommons-hive[bot] in #492
  • chore(deps-dev): bump the dev-dependencies group with 4 updates by @dependabot[bot] in #503
  • chore(coverage): raise the unit coverage floor to 99/99/99/99 and fix the documented values by @hivecommons-hive[bot] in #500
  • chore(coverage): raise the e2e coverage floor to 99/97/99/99 to match what main reaches by @hivecommons-hive[bot] in #502
  • refactor(approve, meow): drop the three dead arms left open on #466 by @hivecommons-hive[bot] in #497
  • test(docs): parse every prow.yaml and OWNERS example in the guides against the config and OWNERS parsers by @hivecommons-hive[bot] in #501
  • test(bundle): serve comment.body and label.name absent to drive the '?? ""' folds through dist/index.js by @hivecommons-hive[bot] in #508
  • test(bundle): drive /close, /reopen and /approve on an issue whose user is null through dist/index.js by @hivecommons-hive[bot] in #505
  • test(bundle): drive tide's draft/files folds and sweep's labels fold through dist/index.js by @hivecommons-hive[bot] in #498
  • test(bundle): drive newOctokit's api.github.com fallback through dist/index.js with an empty GITHUB_API_URL by @hivecommons-hive[bot] in #504
  • test(bundle): serve a bodyless comment to approvalEvents through dist/index.js by @hivecommons-hive[bot] in #509
  • chore(deps-dev): bump vite from 8.3.1 to 8.3.4 by @dependabot[bot] in #546
  • test(remove): assert every DELETE the /remove happy paths issue; enable test/expect-expect by @hivecommons-hive[bot] in #512
  • test(utils): pin matchesLabelPattern's suffix/overlap arm and commandLines' fence-close boundary by @hivecommons-hive[bot] in #514
  • test(tide): pin the merge_queue:off no-GraphQL rule, the draft-without-field refusal, and the fork-403 path boundaries by @hivecommons-hive[bot] in #518
  • test(approve): pin the any-Bot comment and user-token review skips, the require_self_approval continue, approver ordering, label casing and isBot's notifier match by @hivecommons-hive[bot] in #522
  • test(approveReview): pin the user-token-not-author submit, withdrawalReason's five-file bound, lgtm skip, user casing and withdrawer order by @hivecommons-hive[bot] in #527
  • test(assign,cc): pin that /assign and /cc write only the authorized subset of a mixed argument list by @hivecommons-hive[bot] in #545
  • test(sweep): pin blunderbuss ignore_authors on the sweep and the since-window edge by @hivecommons-hive[bot] in #516
  • test(require-matching-label): pin the withGracePeriod default, the graceMs > 0 guard, isBot's || and the no-rule debug text by @hivecommons-hive[bot] in #520
  • test(trigger): pin /test's case-insensitive name and path match, the OK-To-Test label already present, and the green non-PR arm of /test and /ok-to-test by @hivecommons-hive[bot] in #524
  • test(mergeQueue): pin each classify alternative and enqueuedByBot's ^ anchor individually by @hivecommons-hive[bot] in #529
  • test(owners): pin parseGroup's segment limit, loadOwnersTree's OWNERS-directory and encoding-less blob arms, probeOwners' empty hasOwners and the empty default_branch fallback by @hivecommons-hive[bot] in #525
  • test(pullRequestOwners): omit draft/state/labels for real, pin the rename dedupe and the repository-keyed pull and tip memos by @hivecommons-hive[bot] in #533
  • test(config): pin org-tier lgtm/sweep survival in mergeProwConfig, object values without color, values without exclusive, and the no-unknown-keys debug silence by @hivecommons-hive[bot] in #535
  • test(bundle): cover non-Error rejection paths including auth by @hivecommons-hive[bot] in #528
  • test(label-sync): pin the case-insensitive name and color folds, the null-description fold, the dry-run counts and per_page by @hivecommons-hive[bot] in #531
  • test(prefixed): pin /stage and /status exclusive replacement, two-value /remove-lifecycle, mixed-case allowlist values and the first protected offender by @hivecommons-hive[bot] in #539
  • test(lgtmBinding): pin hasLgtmLabel's .some and case fold, unbindLgtm's pending body and 140-char bound, and isLgtmBound's per_page=100 by @hivecommons-hive[bot] in #540
  • test(hold): pin cancelHold's case fold on the issue's labels and on hold.label (Hold, DO-NOT-MERGE/HOLD) by @hivecommons-hive[bot] in #541
  • test(utils): pin parseDuration's whitespace trim and millisecond rounding, and desiredLabels' case-insensitive needs- color by @hivecommons-hive[bot] in #542
  • test(labeling): pin removeLabels continuing past an already-gone label and stopping at a real failure by @hivecommons-hive[bot] in #543
  • test(errorPaths): pin the GitHub refusal in every wrapped issue-comment failure by @hivecommons-hive[bot] in #547
  • docs(contributing): record the four negative-count BRDA branches as a v8 await artifact, not a gap by @hivecommons-hive[bot] in #511
  • test(bundle): drive the non-Error String(e) arms of tide, mergeQueue, sweep, trigger and approveReview through dist/index.js by @hivecommons-hive[bot] in #548
  • chore(coverage): v8-ignore lgtm.ts's unreachable String(e) arm after bindLgtm (bindLgtm only ever throws Error) by @hivecommons-hive[bot] in #537
  • chore(coverage): v8-ignore the bundle-unreachable fallback arms in run.ts:40, command.ts:23 and config.ts:657 by @hivecommons-hive[bot] in #544
  • chore(coverage): v8-ignore requireMatchingLabel's bundle-unreachable non-Error arm at the rule loop's catch by @hivecommons-hive[bot] in #549
  • Add optional delay for blunderbuss by @katcosgrove in #530
  • docs(coverage): link upstream negative-count branch report by @mrbobbytables in #552
  • chore(deps-dev): bump the dev-dependencies group with 3 updates by @dependabot[bot] in #577
  • chore(deps): bump js-yaml from 5.4.3 to 5.5.0 in the production-dependencies group by @dependabot[bot] in #576
  • chore(coverage): raise the e2e branch floor to 98 after the pending coverage work landed by @hivecommons-hive[bot] in #556
  • test(tide): pin the lgtm gate re-check after an unknown-mergeability retry (evaluateMerge, tide.ts:198-206) by @hivecommons-hive[bot] in #557
  • test(mutation): add a bounded Stryker harness for the merge-decision code by @hivecommons-hive[bot] in #572
  • test(config): pin normalizeBlunderbuss' non-Error parseDuration arm and v8-ignore it for the bundle by @hivecommons-hive[bot] in #563
  • test(bundle): record the fake GitHub API's unmatched requests and assert on them outside the application by @hivecommons-hive[bot] in #569
  • test(harness): fail a unit test on any msw request no handler served; serve the merge-queue state and base-branch tip the exposed tests were falling back from by @hivecommons-hive[bot] in #571
  • chore(coverage): v8-ignore getErrorDetails' bundle-unreachable object folds by @mrbobbytables in #587
  • test: pin the Stryker survivors of nine modules (consolidates #573, #575, #578-#583, #585) by @mrbobbytables in #588
  • test: pin the delayed-blunderbuss and paginated-OWNERS contracts (consolidates #555, #558, #559, #561, #562, #564-#567) by @mrbobbytables in #589
  • chore(deps): bump undici from 6.28.1 to 6.29.1 by @dependabot[bot] in #586
  • refactor: route the handlers through a Platform seam (GitHub Actions remains the only adapter) by @jeefy in #606
  • refactor: per-event RunState on the platform; scope platform() per run by @jeefy in #607
  • feat: run as a GitHub App — webhook adapter and Node server (beta) by @jeefy in #608
  • feat(app): scheduled jobs for every installation; /label-sync command by @jeefy in #614
  • feat(app): run on Cloudflare Workers; Platform.defer() for the grace period by @jeefy in #615
  • test(plugins): pin blunderbuss' file-count tier preference, requireMatchingLabel's unlabeled arm and withdrawalReason's event ordering by @hivecommons-hive[bot] in #591
  • test(sweep,meow,command,approve): pin the delayed-reviewer guards, image validation edges, tilde-fence opener and /approve cancel's review author by @hivecommons-hive[bot] in #593
  • test(prefixed,tide): pin a do-not-merge label section's own command past the /label protected guard, and the position-less enqueued verdict by @hivecommons-hive[bot] in #597
  • test(adapters/app): pin receiveWebhook's refusal texts and header guard, dedupe's capacity boundary and settings' unset-input omission (webhook.ts:35-56, dedupe.ts:15, settings.ts:37) by @hivecommons-hive[bot] in #612
  • test(bundle): drive decodeContent's non-base64 refusal through dist/index.js by @hivecommons-hive[bot] in #613
  • test(platform): pin platform()'s no-platform throw and installed-scope fall-back (src/platform/index.ts:49,51) by @hivecommons-hive[bot] in #609
  • test(coverage): guard the v8-ignore hints in src/ so each ignored arm keeps the unit test it names by @hivecommons-hive[bot] in #601
  • test(sweep): drive the delayed-reviewer pass's failure arm end-to-end and raise the e2e branch floor to 99 by @hivecommons-hive[bot] in #596
  • test(runtime): pin CI's Node major to action.yml's node24 via package.json devEngines.runtime by @hivecommons-hive[bot] in #603
  • test(config): pin the type-guard, 24h-bound and fetch-timeout survivors and fail toThrow on a nullish throw by @hivecommons-hive[bot] in #595
  • test(adapters/app): expect the jobs default next to an empty dry-run by @jeefy in #616
  • test(harness): silence the :: runner-command output of the unit suite's call-through @actions/core spies by @hivecommons-hive[bot] in #605
  • test(harness): make the unit suite order-independent under vitest --sequence.shuffle (fixtures, config-probe chains, module memos) by @hivecommons-hive[bot] in #598
  • test(typecheck): type-check tests/ with tsc -p tsconfig.test.json and fix the 29 errors it finds by @hivecommons-hive[bot] in #599
  • chore: pin npm to the public registry in a project .npmrc by @jeefy in #618
  • test(server,app): execute src/server's entry point and bundle, pin #614's cron arms, and gate src/adapters/app/** + src/server/** at 100% (main.ts, node.ts:24/67/82, webhook.ts:65, cron.ts:85, vitest.config.mjs) by @hivecommons-hive[bot] in #611
  • chore: release v3.2.0 by @jeefy in #619

New Contributors

Full Changelog: v3.0.1...v3.2.0