Skip to content

wp-env: Add opt-in --auto-port flag for automatic port selection#74472

Merged
youknowriad merged 21 commits intoWordPress:trunkfrom
kraftbj:add/env-port-resolution-49843
Mar 2, 2026
Merged

wp-env: Add opt-in --auto-port flag for automatic port selection#74472
youknowriad merged 21 commits intoWordPress:trunkfrom
kraftbj:add/env-port-resolution-49843

Conversation

@kraftbj
Copy link
Copy Markdown
Contributor

@kraftbj kraftbj commented Jan 9, 2026

What?

See #49843

Adds an opt-in --auto-port flag to wp-env start that automatically finds available ports when configured ports are busy.

Why?

The original implementation in this PR made auto-port resolution the default by changing port defaults to null. Reviewer feedback requested this be opt-in instead, since unconditional port checking broke PHP unit tests (the port resolver threw "port busy" errors at config time) and changed long-standing default behavior.

How?

  • Restored default ports to 8888/8889 (matching pre-PR behavior)
  • Added --auto-port CLI flag to the start command (default: false)
  • portResolver is only created when --auto-port is passed; otherwise null, so postProcessConfig skips port resolution entirely
  • Removed unused debug parameter from the Playground runtime start method (fixes lint error)
  • Updated tests, snapshots, README, and CHANGELOG

Without --auto-port, behavior is identical to trunk: Docker handles port binding directly and reports errors if ports are busy.

Testing Instructions

  1. npm run test:unit -- packages/env — all 138 tests pass
  2. npm run lint:js -- packages/env — no lint errors
  3. Run wp-env start without --auto-port — should use fixed ports 8888/8889, Docker-level error if busy
  4. Block port 8888: npx http-server -p 8888
  5. Run wp-env start --auto-port — should find an available port and display a message

Testing Instructions for Keyboard

N/A — CLI tool, no UI changes.

Screenshots or screencast

N/A — CLI output changes only.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Jan 9, 2026

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: kraftbj <kraftbj@git.wordpress.org>
Co-authored-by: ObliviousHarmony <obliviousharmony@git.wordpress.org>
Co-authored-by: nerrad <nerrad@git.wordpress.org>
Co-authored-by: jsnajdr <jsnajdr@git.wordpress.org>
Co-authored-by: youknowriad <youknowriad@git.wordpress.org>
Co-authored-by: mcsf <mcsf@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Jan 9, 2026

👋 Thanks for your first Pull Request and for helping build the future of Gutenberg and WordPress, @kraftbj! In case you missed it, we'd love to have you join us in our Slack community.

If you want to learn more about WordPress development in general, check out the Core Handbook full of helpful information.

@github-actions github-actions bot added the First-time Contributor Pull request opened by a first-time contributor to Gutenberg repository label Jan 9, 2026
@t-hamano t-hamano added [Type] Enhancement A suggestion for improvement. [Tool] Env /packages/env labels Jan 11, 2026
@kraftbj kraftbj force-pushed the add/env-port-resolution-49843 branch 2 times, most recently from 54110e5 to 1984ba9 Compare February 5, 2026 20:43
Copy link
Copy Markdown
Contributor

@ObliviousHarmony ObliviousHarmony left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @kraftbj!

One of the things that stands out after looking over this pull request is that we have a lot of statically configurable port numbers. While this might be necessary in some cases, such as E2E tests (arguable), I think that the majority of developers just want something that reliably works without any extra steps. This is an awesome idea and solves a genuine problem we have with having static ports in .wp-env.json files.

We actually have some prior art with the automatic assignment of the mysql service when the port is set to null in the configuration file (the default). How would you feel about replicating this behavior with all of the other configurable ports? I feel like that might be a more straightforward developer experience.

Out of curiosity, is there some way to rely on Docker's ability to bind to unspecified host ports? We're actually already relying on that behavior with the mysql port when it's set to null. It's probably more trouble than it's worth since it would require altering config parsing (we append the port to certain options) but it's worth asking!

@kraftbj kraftbj requested a review from desrosj as a code owner February 5, 2026 23:44
Copy link
Copy Markdown
Contributor

@ObliviousHarmony ObliviousHarmony left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alrighty @kraftbj, I've done a more thorough review and tested out the feature, it works great!

Aside from the comments I've left, I'm still not sure about this being entirely automatic. I really like the way that "mysqlPort": null causes a port to be assigned and it makes sense as a pattern.

What would you think of us having "{port-property}": null automatically assign a port rather than having the behavior be standard? Assuming we go that route, I'd also suggest we change the automatic mysql service port assignment to use this logic rather than having it rely on Docker for an automatic port.

You've added the WP_ENV_AUTO_PORT to disable this functionality (so that things like E2E tests don't break), but in practice, you probably always want the failure if a static port is bound. With the above, you'd be strongly encouraged to use automatic ports unless you need a static one.

@kraftbj
Copy link
Copy Markdown
Contributor Author

kraftbj commented Feb 9, 2026

Thanks for the thorough review! I've addressed the code-level feedback (loop refactor, structured port data instead of string messages, mocked tests, moving resolution into config parsing, dropping MySQL auto-resolution since it already works via Docker). Working through the port: null question now since I think it's worth discussing.

The existing mysqlPort: null pattern works well for MySQL because nothing inside the container needs to know the external MySQL port -- Docker picks one, and we read it back afterward. HTTP ports are different. WordPress needs the port baked into WP_SITEURL and WP_HOME before Docker starts. So we can't use the same "let Docker figure it out" approach for HTTP ports; we need to resolve the port ourselves, then pass it to the Docker config.

Given that, I think auto-by-default is the right call for the common case. The whole motivation behind #49843 is that developers run wp-env start, port 8888 is busy, and they have to stop and manually configure a different port. Making them opt into auto-resolution (even via null) adds a step most people won't know about until they hit the problem.

That said, I get the appeal of consistency with the null pattern -- it's a clear signal of intent. What if we default port and testsPort to null in the config (like mysqlPort already is), so the auto-resolution is the default behavior? Users who want a static port can set an explicit number. This way we get the null-means-auto pattern you're describing, AND it works out of the box without extra config.

The trade-off is that default ports become unpredictable (you'd get whatever's free instead of always 8888). For most developers that's fine -- they just want it to work. For anyone who needs a stable port (scripts, bookmarks, etc.), setting "port": 8888 is straightforward.

Thoughts on that approach?

@mcsf
Copy link
Copy Markdown
Contributor

mcsf commented Feb 24, 2026

The use case I'm running into is something along the lines of:

  1. working on multiple projects that have wp-env setup to stand up the local development environment.
  2. working in multiple worktrees on those projects.
  3. reviewing PRs in those projects.

Yeah, I guessed that this was the motivation. It's a more common one nowadays, and indeed other colleagues have complained about poor ergonomics when trying to play with parallel "agents" working in different branches+envs.

This weekend I was goofing around with a tool for myself to take advantage of git worktrees with wp-env more seamlessly. I hope I can refine it this next weekend, but in meantime here's the relevant part: allocating a free port when creating a new worktree:

# ...

if ! test -d "$WORKTREE"; then
	# Need to set up a fresh worktree, but first ensure we find an available
	# HTTP port.
	if ! find "$WORKTREES" -path '*/.wp-env.override.json' | grep -q .; then
		PORT=9000
	else
		PORT=$(comm -13 \
			<(find "$WORKTREES" -path '*/.wp-env.override.json' -print0 \
				| xargs -0 jq .port | sort -g) \
			<(seq 9000 9100) \
			| grep -m1 .) || error "no ports available"
	fi

	# ...

	git worktree add "$WORKTREE" "$BRANCH"

	printf '{"port":%d,"phpmyadminPort":null}\n' "$PORT" > "$WORKTREE/.wp-env.override.json"
fi

cd "$WORKTREE"
# ... etc.

There's a bit of shell magic there (command substitution, my old friend comm…) but in short we lazily take the first port from a range of 9000–9100 that isn't already assigned in some .wp-env.override.json.


Anyway, this isn't meant to dismiss the need for --auto-port in wp-env, but indeed to validate the use case. :) In other words, both things can be true at the same time:

  • Some envs are short-lived (when going in and out of a branch for one-off testing, when orchestrating scripts or agents, etc.)
  • Developers have one or a couple of long-lived envs on which any branch can be checked out. Often, devs have specific posts, CPTs, plugins, themes, style settings, etc. that they intend to keep to test different features over time.

@andrewserong
Copy link
Copy Markdown
Contributor

In other words, both things can be true at the same time

Indeed, I think that captures my immediate thoughts on this topic, too. For large feature development (e.g. media library work), I want a long-lived local dev environment as I've got things set up exactly as I want for that feature (100s of media items, large posts containing dozens of gallery blocks, etc, etc)

Whereas for quick bug fixes and testing PRs, I'll want an ephemeral environment.

Personally I like the idea of the default being the long-lived environment, and I like the general idea of the --auto-port flag as an opt-in 👍

@kraftbj
Copy link
Copy Markdown
Contributor Author

kraftbj commented Feb 25, 2026

I can dig the opt-in approach. I hadn't used wp-env for anything persistent, but I can completely understand where that would be handy. If I were designing wp-env from scratch today, I would probably say a persistent state would be the opt-in one, but I would argue strongly for not changing the default if I were already using it in that way. :-D

I've updated the branch to use --auto-port and ran through a manual test matrix covering both modes:

Test Description Result
Default (no --auto-port)
1.1 Clean start on default ports Pass — Port 8888
1.2 Start when 8888 busy Pass — Docker bind error
1.3 Explicit port via .wp-env.override.json Pass
1.4 Explicit port via WP_ENV_PORT env var Pass
--auto-port
2.1 Ports free Pass — Uses preferred 8888
2.2 8888 busy Pass — Ephemeral fallback
2.3 Both 8888+8889 busy Pass — Distinct ephemeral ports
2.4 Explicit port in config, busy Pass — Auto-resolves
2.5 "port": null in config, 8888 busy Pass — Ephemeral fallback
WordPress integration
3.1 siteurl/home match resolved port Pass
3.2 siteurl/home match ephemeral port Pass
Edge cases
4.1 Restart while running Pass — Port shifts (known, per your earlier note)
4.2 testsEnvironment: false Pass — No tests port
4.3 --auto-port on non-start commands Pass — Silently ignored
Unit tests
5.0 Full test suite Pass — 138/138
Test reproduction instructions

Prerequisites

  • Branch checked out, npm install done, Docker running
  • Helper to block ports on macOS (must block both IPv4 and IPv6 or Docker Desktop binds the other):
# Block a port (replace PORT):
python3 -c "
import socket, time
s4 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s4.bind(('0.0.0.0', PORT)); s4.listen(1)
s6 = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
s6.bind(('::', PORT)); s6.listen(1)
print('Blocking PORT'); import sys; sys.stdout.flush()
while True: time.sleep(1)
" &

Group 1: Default behavior (no --auto-port)

1.1 — Clean start

npm run wp-env start
npm run wp-env status  # expect port 8888
npm run wp-env stop

1.2 — Busy port

# Block 8888 (both IPv4+IPv6), then:
npm run wp-env start   # expect Docker bind error
# Kill blocker, stop env

1.3 — Explicit port via config

echo '{ "port": 9100 }' > .wp-env.override.json
npm run wp-env start
npm run wp-env status  # expect port 9100
npm run wp-env stop
rm .wp-env.override.json

1.4 — Explicit port via env var

WP_ENV_PORT=9001 npm run wp-env start
npm run wp-env status  # expect port 9001
npm run wp-env stop

Group 2: --auto-port

2.1 — Ports free

npm run wp-env start -- --auto-port
npm run wp-env status  # expect port 8888
npm run wp-env stop

2.2 — 8888 busy

# Block 8888, then:
npm run wp-env start -- --auto-port  # expect ephemeral port
npm run wp-env stop
# Kill blocker

2.3 — Both 8888 and 8889 busy

# Block both 8888 and 8889, then:
npm run wp-env start -- --auto-port  # expect two distinct ephemeral ports
npm run wp-env stop
# Kill blockers

2.4 — Explicit port in config, busy

echo '{ "port": 9200 }' > .wp-env.override.json
# Block 9200, then:
npm run wp-env start -- --auto-port  # expect ephemeral fallback
npm run wp-env stop
# Kill blocker
rm .wp-env.override.json

2.5 — Null port, 8888 busy

echo '{ "port": null }' > .wp-env.override.json
# Block 8888, then:
npm run wp-env start -- --auto-port  # expect ephemeral fallback
npm run wp-env stop
# Kill blocker
rm .wp-env.override.json

Group 3: WordPress integration

3.1 — URLs match port

npm run wp-env start -- --auto-port
npm run wp-env run cli wp option get siteurl  # expect matching port
npm run wp-env run cli wp option get home     # expect matching port
npm run wp-env stop

3.2 — URLs match ephemeral port

echo '{ "port": null }' > .wp-env.override.json
# Block 8888, then:
npm run wp-env start -- --auto-port
npm run wp-env run cli wp option get siteurl  # expect ephemeral port
npm run wp-env stop
# Kill blocker
rm .wp-env.override.json

Group 4: Edge cases

4.1 — Restart while running

npm run wp-env start -- --auto-port   # starts on 8888
npm run wp-env start -- --auto-port   # port shifts to ephemeral (known behavior)
npm run wp-env stop

4.2 — testsEnvironment: false

echo '{ "testsEnvironment": false }' > .wp-env.override.json
npm run wp-env start -- --auto-port
npm run wp-env status  # no tests port
npm run wp-env stop
rm .wp-env.override.json

Group 5: Unit tests

npm run test:unit -- --testPathPattern="packages/env"
# expect 18 suites, 138 tests, 8 snapshots all passing

@jsnajdr
Copy link
Copy Markdown
Member

jsnajdr commented Feb 25, 2026

If wp-env is intended more for production-esq instances—or instances that persist over time—then perhaps another tool is better for rapid development work?

I wouldn't say that wp-env is intended for production sites, quite the opposite, the intent is to "easily set up a local WordPress environment for building and testing plugins and themes" as the README says.

But the mainstream usage so far was to spin up the instance once and have it running long-term. What changes all the time is not the instance itself, but the plugin code inside the mapped directories. Gutenberg, CIAB Admin, Woo plugins etc.

Now, driven mainly with agents, the mainstream use case is shifting towards having multiple more ephemeral instances.

I did a little research on how Vite behaves when running a dev server. It's a tool with very similar purpose and problems.

  • the default behavior is that if a port is already occupied, Vite will increment the port number by one until a free port is found.
  • there is a --strictPort CLI flag, available also in a JSON config form, "strictPort": true that disables the auto-selection and fails quickly.
  • an important details is to inform the user in detail about what is happening. In console, report that a port was tried, failed, now I'm trying another, and another, and finally started the server at http://localhost:8889. The current wp-env is good at reporting the final state, not sure about the in-progress state.
  • even with auto-selection, you specify the port number. The meaning is "where to start".

Based on this, I think the following behavior of wp-env would be nice:

  • always specify the port. The null value no longer means "auto-selection"
  • add a new flag, --auto-port, both in CLI and JSON config, that enables the auto-selection. It would be disabled in CI, where it's unwanted
  • when searching for available ports, start from the default one and increment. It feels much more orderly when I have a farm of dev servers running at 8888, 8889, 8890, 8891, ... instead of jumping somewhere to 49152

In Vite, the --auto-port mode is the default, but it's OK if we make it opt-in. I have no strong opinion about this.

@kraftbj
Copy link
Copy Markdown
Contributor Author

kraftbj commented Feb 25, 2026

Based on this, I think the following behavior of wp-env would be nice:

  • always specify the port. The null value no longer means "auto-selection"
  • add a new flag, --auto-port, both in CLI and JSON config, that enables the auto-selection. It would be disabled in CI, where it's unwanted
  • when searching for available ports, start from the default one and increment. It feels much more orderly when I have a farm of dev servers running at 8888, 8889, 8890, 8891, ... instead of jumping somewhere to 49152

From that and @youknowriad's thumbs up on the comment, I'll make changes to match this.

@kraftbj
Copy link
Copy Markdown
Contributor Author

kraftbj commented Feb 25, 2026

Changes in this push:

  • Removed null as a valid port value—ports always have an integer default now
  • Added autoPort as a JSON config option (in .wp-env.json / .wp-env.override.json), alongside the existing --auto-port CLI flag
  • Changed port scanning to increment from the configured port (e.g. 8888 → 8889 → 8890) instead of jumping to ephemeral range (49152+)

All previous tests were rerun and still pass. Updated/new test results:

Test Description Expected Result
1.1 Clean start (no flag) Port 8888 PASS
1.2 Port 8888 busy (no flag) Docker bind error PASS
1.3 Explicit port via override Configured port PASS
1.4 Explicit port via env var Configured port PASS
2.1 --auto-port, ports free Port 8888 PASS
2.2 --auto-port, 8888 busy Port 8889 (incremental) PASS
2.3 --auto-port, 8888+8889 busy 8890 dev, 8891 tests PASS
2.4 Explicit port 9200 in config, busy, --auto-port Auto-resolves to 9201 PASS
2.5 port: null in config Validation error PASS
3.1 siteurl/home on default port Matches resolved port PASS
3.2 siteurl/home with fallback port Matches incremental port (8889) PASS
4.1 Restart while running Port shifts (known behavior) PASS
4.2 testsEnvironment: false No tests port PASS
4.3 --auto-port on non-start cmd Silently ignored PASS
5 Unit tests 18 suites, 145 tests, 8 snapshots PASS
6.1 autoPort: true in JSON config, 8888 busy Auto-resolves to 8889 PASS
6.2 autoPort: true + --no-auto-port CLI Docker bind error (CLI wins) PASS
6.3 CI=true + autoPort: true Docker bind error (CI suppresses) PASS
Full test plan

Port blocker helper (blocks both IPv4+IPv6 on macOS)

python3 -c "
import socket, time
s4 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s4.bind(('0.0.0.0', PORT)); s4.listen(1)
s6 = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
s6.bind(('::', PORT)); s6.listen(1)
while True: time.sleep(1)
" &

Group 1: Default Behavior (no --auto-port)

Test Description Expect
1.1 Clean start Port 8888
1.2 Port 8888 busy Docker bind error
1.3 Explicit port via override Configured port
1.4 Explicit port via env var Configured port

Group 2: --auto-port CLI Flag

Test Description Expect
2.1 Ports free Port 8888 (preferred)
2.2 8888 busy Port 8889 (incremental)
2.3 Both 8888+8889 busy Port 8890 for dev, 8891 for tests (incremental)
2.4 Explicit port 9200 in config, busy Auto-resolves to 9201
2.5 port: null in config Validation error (null no longer valid)

Group 3: WordPress Integration

Test Description Expect
3.1 siteurl/home on default port Matches resolved port
3.2 siteurl/home with fallback port Matches incremental port (e.g. 8889)

Group 4: Edge Cases

Test Description Expect
4.1 Restart while running Port shifts (known behavior)
4.2 testsEnvironment: false No tests port
4.3 --auto-port on non-start cmd Silently ignored

Group 5: Unit Tests

npm run test:unit -- --testPathPattern="packages/env"

Expect: 18 suites, 145 tests, 8 snapshots all passing

Group 6: JSON Config autoPort

Test Description Expect
6.1 "autoPort": true in .wp-env.override.json, 8888 busy Auto-resolves to 8889 (no CLI flag needed)
6.2 "autoPort": true in config, --no-auto-port CLI override Docker bind error (CLI wins)
6.3 CI=true env var with "autoPort": true Docker bind error (CI suppresses auto-port)

Copy link
Copy Markdown
Member

@jsnajdr jsnajdr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for making the changes, I think this is mergeable now, it's a nice enhancement for wp-env.

There is a CI failure in the Static analysis on Window task. That looks strange and unrelated. Something with npm install. Maybe a rebase would help?

When wp-env starts, it now checks if the configured ports (default 8888/8889)
are available. If a port is busy, it automatically finds an available
alternative and displays a message to the user.

New configuration options:
- portRangeMin / portRangeMax: Constrain port selection for development
- testsPortRangeMin / testsPortRangeMax: Constrain port selection for tests

These can also be set via environment variables:
- WP_ENV_PORT_RANGE_MIN / WP_ENV_PORT_RANGE_MAX
- WP_ENV_TESTS_PORT_RANGE_MIN / WP_ENV_TESTS_PORT_RANGE_MAX
Fix JSDoc check-line-alignment errors by ensuring proper column
alignment for @Property and @param tags in the three new port
resolution files.
Remove all portRange config options (portRangeMin, portRangeMax,
testsPortRangeMin, testsPortRangeMax, and their mysql/phpmyadmin
counterparts) and always fall back to the ephemeral port range
(49152-65535) when configured ports are busy.
When WP_ENV_AUTO_PORT=false, wp-env will fail with a clear error if
a configured port is busy instead of silently selecting a different
one. This is needed in CI where Playwright expects predictable ports.

Disable auto-selection in the E2E workflow so that port conflicts
surface as immediate failures rather than breaking Playwright's
hardcoded webServer port check.
The preferred port (e.g. 8888) was being skipped because the range
check required it to be within 49152-65535. Now the preferred port
is always tried first regardless of the fallback range bounds.
Replace real port binding (net.createServer) with jest mocks
to prevent flakiness and improve test speed.
- Rewrite resolve-available-ports.js with a loop over PORT_DEFINITIONS
  instead of repetitive copy-paste blocks
- Store port changes as structured data ({configPath, from, to})
  instead of pre-formatted strings
- Remove MySQL from auto-resolution since it already supports
  Docker-native auto-assignment via mysqlPort: null
- Move port resolution into postProcessConfig, after environment
  merging but before URL assignment, so WP_SITEURL/WP_HOME get
  correct ports automatically without manual fixes
- Format port change messages at the display layer in docker/index.js
Update post-process-config tests to use async/await and
rejects.toThrow for the now-async postProcessConfig.
Update config-integration snapshots for new portChanges field.
Null ports auto-resolve (trying 8888/8889 first, falling back to
ephemeral range). Explicit integer ports use strict mode and fail
if busy. This replaces the WP_ENV_AUTO_PORT env var.
phpmyadminPort should auto-fallback when busy, matching previous
behavior. Strict mode (fail if busy) only applies to the main
port property where null-vs-explicit is the API contract.
When the configured port is null (auto-resolve default), use
findAvailablePort to pick an open port instead of hardcoding 8888.
Persist the resolved port to a file so getStatus() can read it
across CLI invocations.
…erFiles

Move port resolution from Docker's initConfig into start.js so both
Docker and Playground runtimes receive a fully resolved config. Split
the old initConfig into writeDockerFiles (for the start path) and
loadDockerConfig (for non-start commands), eliminating the redundant
second loadConfig call during start.
The non-start Docker methods (stop, clean, run, logs, getStatus)
already receive a fully loaded config from the command layer. Remove
the redundant loadDockerConfig that re-called loadConfig, replacing
it with a simple ensureDockerInitialized guard that only checks the
work directory exists.
Query the real public ports from running WordPress and tests
containers via docker-compose port instead of reading config values
that may be null with auto-resolved defaults.
With ports now defaulting to null (auto-resolve), port reassignment
is expected behavior. The portChanges mechanism that warned about
busy ports is no longer needed.
Restore default ports (8888/8889) so wp-env start uses fixed ports by
default, matching pre-existing behavior. Port auto-resolution now only
runs when --auto-port is passed. Also removes unused debug parameter
from the Playground runtime start method.
@kraftbj
Copy link
Copy Markdown
Contributor Author

kraftbj commented Feb 26, 2026

I was hoping a rerun would resolve (can't do a rerun myself), but I rebased it to see if that would do it.

@kraftbj
Copy link
Copy Markdown
Contributor Author

kraftbj commented Feb 26, 2026

The unit test failure (packages/components/src/composite/legacy/test/index.tsxtoHaveFocus assertion) is unrelated to this PR, I think. The same shard passes on the latest trunk run, and there's a history of focus-timing flakiness in the Composite legacy tests.

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

Labels

First-time Contributor Pull request opened by a first-time contributor to Gutenberg repository [Tool] Env /packages/env [Type] Enhancement A suggestion for improvement.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants