Commit 634a5b55b77 for woocommerce
commit 634a5b55b77fb6420322e587d6fe64f844a86b83
Author: Jorge A. Torres <jorge.torres@automattic.com>
Date: Thu Aug 20 18:20:35 2026 +0100
Improve release handle rotation and Product DRI instructions (#67717)
diff --git a/.github/workflows/release-assignment.yml b/.github/workflows/release-assignment.yml
index c4fce449b43..74af844580b 100644
--- a/.github/workflows/release-assignment.yml
+++ b/.github/workflows/release-assignment.yml
@@ -342,10 +342,58 @@ jobs:
core.setOutput( 'assignee-display-name', displayName || '' );
core.setOutput( 'assignee-username', username || '' );
+ - name: Get release lead from two cycles ago
+ if: ${{ steps.check-existing-issue.outputs.exists != 'true' }}
+ id: get-previous-tracking-issue
+ uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
+ with:
+ script: |
+ const { LinearClient } = require( '@linear/sdk' );
+ const linearClient = new LinearClient( {
+ apiKey: '${{ secrets.LINEAR_OAUTH_TOKEN }}'
+ } );
+
+ const releaseMainVersion = '${{ needs.check-upcoming-release-events.outputs.version }}';
+ const twoCyclesBackVersion = ( releaseMainVersion - 0.2 ).toFixed( 1 );
+ const fallbackMention = `the release lead from the ${ twoCyclesBackVersion } cycle`;
+
+ try {
+ const previousTitle = `[${ twoCyclesBackVersion }] Release tracking`;
+ console.log( `Looking for tracking issue two cycles back: "${ previousTitle }"` );
+
+ const issues = await linearClient.issues( {
+ includeArchived: true,
+ filter: {
+ team: { id: { eq: '${{ secrets.LINEAR_TEAM_ID }}' } },
+ title: { eq: previousTitle }
+ }
+ } );
+
+ const previousIssueUrl = issues.nodes[ 0 ]?.url;
+ const cycleRef = previousIssueUrl ? `[the ${ twoCyclesBackVersion } cycle](${ previousIssueUrl })` : `the ${ twoCyclesBackVersion } cycle`;
+
+ const assignee = await issues.nodes[ 0 ]?.assignee;
+
+ if ( ! assignee ) {
+ console.log( 'No assignee found for the tracking issue two cycles back' );
+ core.setOutput( 'mention', `the release lead from ${ cycleRef }` );
+ return;
+ }
+
+ console.log( 'Found release lead from two cycles back' );
+ const name = assignee.displayName;
+ core.setOutput( 'mention', `**${ name }** (release lead from ${ cycleRef })` );
+ } catch ( error ) {
+ core.warning( `Failed to look up the release lead from two cycles back, falling back to a generic mention: ${ error.message }` );
+ core.setOutput( 'mention', fallbackMention );
+ }
+
- name: Process template and create release tracking issue
if: ${{ steps.check-existing-issue.outputs.exists != 'true' }}
id: create-tracking-issue
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
+ env:
+ PREVIOUS_RELEASE_LEAD: ${{ steps.get-previous-tracking-issue.outputs.mention }}
with:
script: |
const { LinearClient } = require( '@linear/sdk' );
@@ -398,7 +446,8 @@ jobs:
'{date_beta1}': '${{ needs.check-upcoming-release-events.outputs.beta-1-release-date }}',
'{date_beta2}': '${{ needs.check-upcoming-release-events.outputs.beta-2-release-date }}',
'{date_rc1}': '${{ needs.check-upcoming-release-events.outputs.rc-1-release-date }}',
- '{date_stable}': '${{ needs.check-upcoming-release-events.outputs.final-release-date }}'
+ '{date_stable}': '${{ needs.check-upcoming-release-events.outputs.final-release-date }}',
+ '{previous_release_lead}': process.env.PREVIOUS_RELEASE_LEAD || ''
};
// Apply replacements.
diff --git a/.github/workflows/release-code-freeze.yml b/.github/workflows/release-code-freeze.yml
index 2213b368b3f..9e099eb270a 100644
--- a/.github/workflows/release-code-freeze.yml
+++ b/.github/workflows/release-code-freeze.yml
@@ -175,7 +175,7 @@ jobs:
with:
script: |
const nextTrunkMainVersion = '${{ needs.prepare-for-feature-freeze.outputs.nextTrunkMainVersion }}'; // e.g. '10.5'
- const minVersionToKeep = Number( nextTrunkMainVersion ) - 0.2; // e.g. 10.3
+ const minVersionToKeep = Number( ( nextTrunkMainVersion - 0.2 ).toFixed( 1 ) ); // e.g. 10.3
const { data: latestMilestones } = await github.rest.issues.listMilestones( {
owner: context.repo.owner,
diff --git a/.linear/release-kickoff-patch.md b/.linear/release-kickoff-patch.md
index 2ab2311bf5f..542cf5bf14c 100644
--- a/.linear/release-kickoff-patch.md
+++ b/.linear/release-kickoff-patch.md
@@ -12,13 +12,13 @@ Keep the _[Release Troubleshooting & Recovery](https://developer.woocommerce.com
### 1. Go/no-go
-For scheduled stable releases, hold this 24-48 hours before the release date, with the Product DRI (named on the parent tracking issue). Bring in QualityOps and the Atomic contact when staging or monitoring left open questions. See the [readiness guide](https://developer.woocommerce.com/docs/contribution/releases/readiness/) for details.
+For scheduled stable releases, hold this 24-48 hours before the release date with the Product DRIs named on the parent tracking issue - ping `@woo-core-release` in Slack if you need to reach them or aren't sure who's available. Bring in QualityOps and the Atomic contact when staging or monitoring left open questions. See the [readiness guide](https://developer.woocommerce.com/docs/contribution/releases/readiness/) for details.
- [ ] The readiness review is complete and its verdicts still hold.
- [ ] No new blocking findings since the readiness review (check `#woo-core-releases` threads and the [newest issues]({repository_url}/issues?q=is%3Aissue%20state%3Aopen%20sort%3Acreated-desc)).
- [ ] Decision recorded as a comment on this issue - **go**, **no-go**, or **go with conditions** - with the names behind it.
-For scheduled releases, the readiness review is the one in the RC sub-issue. Point releases have no RC: run the [readiness criteria](https://developer.woocommerce.com/docs/contribution/releases/readiness/) over the changes being shipped as part of this go/no-go. For unscheduled point releases shipping an urgent fix, a quick go/no-go with the Product DRI in `#woo-core-releases` is enough - record the outcome here all the same.
+For scheduled releases, the readiness review is the one in the RC sub-issue. Point releases have no RC: run the [readiness criteria](https://developer.woocommerce.com/docs/contribution/releases/readiness/) over the changes being shipped as part of this go/no-go. For unscheduled point releases shipping an urgent fix, a quick go/no-go with `@woo-core-release` in `#woo-core-releases` is enough - record the outcome here all the same.
### 2. Pre-build checks
diff --git a/.linear/release-kickoff-rc.md b/.linear/release-kickoff-rc.md
index 5aa04b36e37..37695d555a7 100644
--- a/.linear/release-kickoff-rc.md
+++ b/.linear/release-kickoff-rc.md
@@ -12,7 +12,7 @@ Keep the _[Release Troubleshooting & Recovery](https://developer.woocommerce.com
### 1. Release readiness review
-Go through this with the Product DRI (named on the parent tracking issue) before starting the build. The goal is a deliberate "this RC is ready to go out" call, with the evidence in one place. See the [readiness guide](https://developer.woocommerce.com/docs/contribution/releases/readiness/) for details on each item.
+Go through this checklist together with the Product DRIs named on the parent tracking issue before starting the build - ping `@woo-core-release` in Slack if you need to reach them or aren't sure who's available. The goal is a deliberate "this RC is ready to go out" call, with the evidence in one place. See the [readiness guide](https://developer.woocommerce.com/docs/contribution/releases/readiness/) for details on each item.
- [ ] Review the QIT compatibility regression sweep report for this prerelease. Every introduced issue has a verdict: blocking or not.
- [ ] Every open finding against this release (bug reports, testing threads, monitoring alerts) has a linked issue and a verdict: release-blocking / fix in a point release / not a bug.
diff --git a/.linear/release-kickoff.md b/.linear/release-kickoff.md
index 34196a30893..513c7229484 100644
--- a/.linear/release-kickoff.md
+++ b/.linear/release-kickoff.md
@@ -6,7 +6,7 @@ This issue provides visibility on the progress of the release process of WooComm
- **Milestone:** [{release_milestone}]({repository_url}/issues?q=is:open+milestone:{release_milestone})
- **Release branch:** [`{release_branch}`]({repository_url}/tree/{release_branch})
- **Release lead:** {lead_user} ({lead_team})
-- **Product DRI:** _to be confirmed - see [release roles](https://developer.woocommerce.com/docs/contribution/releases/readiness/#release-roles)_
+- **Product DRI:** James Kemp, Warren Holmes (reachable via `@woo-core-release` in Slack)
- **Relevant dates:** ([release calendar](https://developer.woocommerce.com/release-calendar/))
- **Feature Freeze:** {date_feature_freeze}
- **Beta 1:** {date_beta1}
@@ -16,11 +16,17 @@ This issue provides visibility on the progress of the release process of WooComm
---
-⚠ Dear release lead:
+⚠ Complete the setup steps below to get started, and keep the rest of this section handy as reference throughout the release cycle.
-- Please read this issue carefully and familiarize yourself with the [release process documentation](https://developer.woocommerce.com/docs/contribution/releases/).
-- Confirm the Product DRI for this cycle: ask `@woo-core-release` in `#woo-core-releases` to confirm the product-side owner for this release, then edit the line above with their name. The readiness review (RC sub-issue) and the go/no-go (stable sub-issue) need both of you.
-- Join the release channels in Slack (`#woo-core-releases`, `#woo-core-releases-notifications`), where discussions happen and notifications are sent.
+##### Setup
+
+- [ ] Read this issue carefully and familiarize yourself with the [release process documentation](https://developer.woocommerce.com/docs/contribution/releases/).
+- [ ] On feature freeze ({date_feature_freeze}), update `@woo-core-release` membership in Slack: add yourself, give {previous_release_lead} a heads-up, then remove them. The previous cycle's lead stays for point releases. Leave everyone else alone.
+- [ ] Join the release channels in Slack (`#woo-core-releases`, `#woo-core-releases-notifications`), where discussions happen and notifications are sent.
+
+##### Good to know
+
+- When in doubt at any step, ping `@woo-core-release` in Slack. In particular, you'll need to loop in the Product DRIs listed above via the handle for the readiness review and the go/no-go during the RC and stable releases.
- For every release in the cycle, there's a corresponding sub-issue. On the date of each release (see schedule above), open the relevant issue and follow the instructions in it.
- Any additional point/patch releases after the first stable must be tracked as well. Run the **[Release: Create Tracking Issue]({repository_url}/actions/workflows/release-create-tracking-issue.yml)** workflow with the version (e.g., `{release_main_version}.1`) to create the sub-issue.
diff --git a/docs/contribution/releases/README.md b/docs/contribution/releases/README.md
index 2f0ab3956af..814cd164ff1 100644
--- a/docs/contribution/releases/README.md
+++ b/docs/contribution/releases/README.md
@@ -5,7 +5,7 @@ sidebar_label: Releases
# Releasing WooCommerce
-The WooCommerce release process is managed by a rotating release lead, paired with a per-cycle Product DRI (see [release roles](/docs/contribution/releases/readiness#release-roles)). The documentation below outlines the process for managing releases. To get started with a new release, see [Building and Publishing WooCommerce](/docs/contribution/releases/building-and-publishing).
+The WooCommerce release process is managed by a rotating release lead, alongside two standing Product DRI seats in `@woo-core-release` (see [release roles](/docs/contribution/releases/readiness#release-roles)). The documentation below outlines the process for managing releases. To get started with a new release, see [Building and Publishing WooCommerce](/docs/contribution/releases/building-and-publishing).
## Process Overview
diff --git a/docs/contribution/releases/readiness.md b/docs/contribution/releases/readiness.md
index 7d6d8e39f29..1f510c2baf6 100644
--- a/docs/contribution/releases/readiness.md
+++ b/docs/contribution/releases/readiness.md
@@ -15,7 +15,9 @@ Each cycle has two named owners, listed on the parent tracking issue:
* **Release lead** (engineering) - runs the release process end to end: builds, publishes, monitors, and executes the run-books.
* **Product DRI** - the product-side counterpart. Joins the readiness review at RC and the go/no-go before stable, and owns the product read on open findings: what blocks the release, what waits for a point release, and what ships with a known-issues note.
-The release lead is assigned by rotation via the [Release: Assignment workflow](/docs/contribution/releases/workflows). The Product DRI is confirmed per cycle on the tracking issue: the release lead asks `@woo-core-release` in `#woo-core-releases`, and the group confirms the product-side owner for the release.
+The release lead is assigned by rotation via the [Release: Assignment workflow](/docs/contribution/releases/workflows). The Product DRI role is covered by two standing Product seats in Slack's `@woo-core-release` group. Their names are on the tracking issue. If you're unsure who to loop in, ping the handle.
+
+The handle also holds a standing set of engineering members and the current and previous release leads, who rotate at each feature freeze.
## Readiness review (at RC)