Skip to content

WP Build Polyfills: continue the admin menu color behind the boot frame - #51619

Merged
retrofox merged 4 commits into
trunkfrom
fix/wp-build-admin-frame-backdrop
Aug 27, 2026
Merged

retrofox merged 4 commits into
trunkfrom
fix/wp-build-admin-frame-backdrop

Conversation

@retrofox

@retrofox retrofox commented Aug 26, 2026 •

Copy link
Copy Markdown
Contributor

Proposed changes

On trunk, every admin page generated by @wordpress/build (Forms, Premium Analytics, Newsletter, Backup, Scan, SEO, Social, VideoPress, Podcast, Activity Log, site setup in jetpack-mu-wpcom) renders inside the @wordpress/boot single-page layout: a white stage with rounded corners over a backdrop that is meant to continue the wp-admin menu. @wordpress/admin-ui maps nine core color schemes to theme seeds and falls back to modern for anything else, so on every WordPress.com scheme (nightfall, aquatic, classic-blue, classic-bright, classic-dark, contrast, powder-snow, sakura, sunset) and on any third-party scheme registered with wp_admin_css_color() the backdrop is near-black (#1e1e1e) next to a menu of another color: a black notch under the admin bar and black bands in the bottom and right margins of the frame.

With this PR the backdrop follows the menu on every scheme, with no changes in the consuming packages:

  • WP_Build_Polyfills::register() also arms a new WP_Build_Admin_Frame class in packages/wp-build-polyfills, the one runtime every wp-build page already loads.
  • On admin_head it prints a stylesheet that paints .boot-layout--single-page and the body with --wp-build-admin-menu-background, falling back to boot's own colors when the property is not set.
  • On in_admin_header, right after #adminmenuback is printed and before the layout mounts, it prints an inline script that samples that element's computed background into the custom property on the root element.
image image image image

How it works

The layout rule boot injects at runtime is .boot-layout { background: var(--wpds-color-background-surface-neutral-weak) }, specificity (0,1,0), appended to <head> after the page stylesheets. #wpcontent .boot-layout--single-page is (1,1,0), so the override wins on specificity rather than order. The second selector covers boot 0.21 (WordPress/gutenberg#81756, Gutenberg 23.9), where the layout styles are CSS Modules and the root class is _<hash>__layout-single-page: wp-build keeps the local name in production builds (checked on @wordpress/boot@0.21.0), so [class*="__layout-single-page"] matches whatever the hash is, at the same specificity. body:has(.boot-layout--single-page) keeps the elastic-scroll area consistent without relying on boot's body sync; it is a separate rule so browsers without :has() still apply the layout rule.

Sampling the rendered menu instead of mapping schemes is the point: one mechanism covers core schemes on older cores, WordPress.com schemes and third-party schemes, and the property is only set when the sample is a real color. Pages without a boot layout are unaffected by construction: the selectors match nothing.

The fix lives in PHP because on WordPress 7.0+ the boot module that runs is core's bundled copy. WP_Script_Modules::register() ignores an id that is already registered, so bumping @wordpress/boot in a package changes nothing on WordPress.com. Core already made its nine schemes' menu color equal the ramp output (r62454), which is why only unknown schemes break.

Notes for reviewers

  • The class is self-contained (src/class-wp-build-admin-frame.php) so it can be removed in one commit once wp-build or boot ship the same behavior. The upstream direction is structured per-scheme seeds in wp_admin_css_color(), see Allow third-party color schemes to apply to Site Editor screens WordPress/gutenberg#80766 and Centralize WordPress admin color scheme settings WordPress/gutenberg#81980.
  • The accent color inside the app (--wp-admin-theme-color, primary buttons) still comes from the modern seed on unknown schemes. Same upstream problem, out of scope here.
  • Plugin changelog entries are in a separate commit: the change is visible to the users of every plugin that ships a wp-build page.
  • Which boot runs where: the Gutenberg plugin overrides core's @wordpress/boot module through the wp-build module registration (deregister, then register), so WordPress.com runs boot 0.21 once it moves from Gutenberg 23.8 to 23.9. Jetpack's own builds register only their @jetpack-* modules and keep core's boot. Both class forms were checked on a live page by renaming the layout root to the 0.21 class names: layout and body keep the menu color, and any other local name does not match.

Related product discussion/links

Does this pull request change what data or activity we track or use?

No.

Testing instructions

Register a throwaway third-party scheme in a mu-plugin, then pick Navy in Users → Profile → Admin Color Scheme:

add_action( 'admin_init', function () {
	wp_admin_css_color(
		'navy',
		'Navy',
		plugin_dir_url( __FILE__ ) . 'navy/colors.css',
		array( '#02395c', '#043959', '#2271b1', '#9ec2e6' ),
		array( 'base' => '#9ec2e6', 'focus' => '#fff', 'current' => '#fff' )
	);
} );

with navy/colors.css containing #adminmenu, #adminmenuback, #adminmenuwrap { background: #02395c; }. Any Masterbar scheme on a WordPress.com site behaves the same way.

Unknown scheme

  • Open Jetpack → Forms (admin.php?page=jetpack-forms-responses-wp-admin), Jetpack → Stats (admin.php?page=jetpack-premium-analytics-wp-admin) and Jetpack → Activity Log. The corner under the admin bar and the bottom and right margins around the frame must be #02395c, on load and after scrolling. On trunk they are near-black.
  • In DevTools, getComputedStyle( document.documentElement ).getPropertyValue( '--wp-build-admin-menu-background' ) returns rgb(2, 57, 92) and document.querySelectorAll( '#wp-build-admin-frame-css, #wp-build-admin-frame-js' ).length returns 2.

Boot 0.21

  • With Gutenberg 23.9 (RC1 or later) active, repeat the Navy checks: the layout root now carries _<hash>__layout-single-page and the frame must still be #02395c.

Core schemes

  • Switch to Blue, then Light: the frame continues the menu in both (rgb(36, 82, 120) and rgb(229, 229, 229)), so nothing regresses on the schemes that already worked.

Pages without a boot layout

  • Open Dashboard and Posts: nothing changes, and neither id is in the DOM (the querySelectorAll above returns 0).

Narrow viewport

  • Below 782px the layout goes full-screen; nothing of this is visible or broken.

Tests

  • jp test php packages/wp-build-polyfills

@retrofox
retrofox requested a review from a team as a code owner August 26, 2026 17:33
@retrofox retrofox added [Status] Needs Review This PR is ready for review. [Type] Bug labels Aug 26, 2026
@retrofox
retrofox requested a review from a team as a code owner August 26, 2026 17:33
@retrofox retrofox added [Status] Needs Review This PR is ready for review. [Type] Bug labels Aug 26, 2026
@retrofox retrofox self-assigned this Aug 26, 2026
@github-actions github-actions Bot added [Package] Wp Build Polyfills [Plugin] Backup A plugin that allows users to save every change and get back online quickly with one-click restores. [Plugin] Boost A feature to speed up the site and improve performance. [Plugin] Jetpack Issues about the Jetpack plugin. https://wordpress.org/plugins/jetpack/ [Plugin] mu wpcom jetpack-mu-wpcom plugin [Plugin] Premium Analytics [Plugin] Protect A plugin with features to protect a site: brute force protection, security scanning, and a WAF. [Plugin] Search A plugin to add an instant search modal to your site to help visitors find content faster. [Plugin] Social Issues about the Jetpack Social plugin [Plugin] VideoPress A standalone plugin to add high-quality VideoPress videos to your site. [Plugin] Wpcomsh [Tests] Includes Tests Docs labels Aug 26, 2026
@github-actions

github-actions Bot commented Aug 26, 2026 •

Copy link
Copy Markdown
Contributor

Are you an Automattician? Please test your changes on all WordPress.com environments to help mitigate accidental explosions.

  • To test on WoA, go to the Plugins menu on a WoA dev site. Click on the "Upload" button and follow the upgrade flow to be able to upload, install, and activate the Jetpack Beta plugin. Once the plugin is active, go to Jetpack > Jetpack Beta, select your plugin (Jetpack or WordPress.com Site Helper), and enable the fix/wp-build-admin-frame-backdrop branch.
  • To test on Simple, run the following command on your sandbox:
bin/jetpack-downloader test jetpack fix/wp-build-admin-frame-backdrop
bin/jetpack-downloader test jetpack-mu-wpcom-plugin fix/wp-build-admin-frame-backdrop

Interested in more tips and information?

  • In your local development environment, use the jetpack rsync command to sync your changes to a WoA dev blog.
  • Read more about our development workflow here: PCYsg-eg0-p2
  • Figure out when your changes will be shipped to customers here: PCYsg-eg5-p2

@github-actions

github-actions Bot commented Aug 26, 2026 •

Copy link
Copy Markdown
Contributor

Thank you for your PR!

When contributing to Jetpack, we have a few suggestions that can help us test and review your patch:

  • ✅ Include a description of your PR changes.
  • ✅ Add a "[Status]" label (In Progress, Needs Review, ...).
  • ✅ Add testing instructions.
  • ✅ Specify whether this PR includes any changes to data or privacy.
  • ✅ Add changelog entries to affected projects

This comment will be updated as you work on your PR and make changes. If you think that some of those checks are not needed for your PR, please explain why you think so. Thanks for cooperation 🤖


Follow this PR Review Process:

  1. Ensure all required checks appearing at the bottom of this PR are passing.
  2. Make sure to test your changes on all platforms that it applies to. You're responsible for the quality of the code you ship.
  3. You can use GitHub's Reviewers functionality to request a review.
  4. When it's reviewed and merged, you will be pinged in Slack to deploy the changes to WordPress.com simple once the build is done.

If you have questions about anything, reach out in #jetpack-developers for guidance!


Jetpack plugin:

The Jetpack plugin has different release cadences depending on the platform:

  • WordPress.com Simple releases happen as soon as you deploy your changes after merging this PR (PCYsg-Jjm-p2).
  • WoA releases happen weekly.
  • Releases to self-hosted sites happen monthly:
    • Scheduled release: September 7, 2026

If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack.


Backup plugin:

No scheduled milestone found for this plugin.

If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack.


Boost plugin:

No scheduled milestone found for this plugin.

If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack.


Search plugin:

No scheduled milestone found for this plugin.

If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack.


Social plugin:

No scheduled milestone found for this plugin.

If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack.


Protect plugin:

No scheduled milestone found for this plugin.

If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack.


Videopress plugin:

No scheduled milestone found for this plugin.

If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack.


Mu Wpcom plugin:

  • Next scheduled release: WordPress.com Simple releases happen semi-continuously (PCYsg-Jjm-p2)

If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack.


Wpcomsh plugin:

  • Next scheduled release: Atomic deploys happen twice daily on weekdays (p9o2xV-2EN-p2)

If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack.


Premium Analytics plugin:

No scheduled milestone found for this plugin.

If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack.

@jp-launch-control

jp-launch-control Bot commented Aug 26, 2026 •

Copy link
Copy Markdown

Code Coverage Summary

Coverage changed in 1 file.

File Coverage Δ% Δ Uncovered
projects/packages/wp-build-polyfills/src/class-wp-build-polyfills.php 113/122 (92.62%) 0.06% 0 💚

1 file is newly checked for coverage.

File Coverage
projects/packages/wp-build-polyfills/src/class-wp-build-admin-frame.php 16/16 (100.00%) 💚

Full summary · PHP report · JS report

boot 0.21 (gutenberg#81756) renames boot-layout--single-page
the second register() call is the idempotence assertion

@kangzj kangzj left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Verdict: approving — thorough code review found no blockers, and I reproduced both the bug on trunk and the fix on this branch in a live docker WP env (WP 7.1, Gutenberg 23.7.1), including the boot 0.21 CSS Modules selector path.

Blockers

None.

Suggestions (non-blocking)

  1. The failing Code coverage (JS) check is extensions/shared/test/execution-lock-test.js in plugins/jetpack — a JS test this PHP-only PR never touches, and the regular JS-tests check passes. Looks like a flake; a re-run of the failed job should clear it and unblock the coverage gate.

Code review notes

  • WP_Build_Admin_Frame::register() is genuinely idempotent (same static callback + priority → one $wp_filter entry), so arming it from every WP_Build_Polyfills::register() call is safe; the test covers the double-registration case.
  • Both printed blocks are static strings (nowdoc, no interpolation), so there's no escaping surface, and wp_print_inline_script_tag() keeps the script CSP/nonce-filterable.
  • All register() consumers I checked (forms, activity-log, my-jetpack) scope the call to their own page load, which is why Dashboard/Posts stay clean — confirmed live below.
  • Changelog coverage is complete: entries in the package plus the 10 dependent plugins where the change is user-reachable. plugins/stats and plugins/starter-plugin also bundle the package (via my-jetpack) but ship no boot single-page layout, so skipping them is correct.
  • The one new Phan suppression (PhanPluginDuplicateAdjacentStatement in the test) carries a justification and suppresses a style rule, not a defect.

Testing performed

Live docker WP env, plugins/jetpack + affected packages built from this branch (PHP is source-mounted; the "before" state is the merge-base 0a3e1ac33a9 of the package source). Navy third-party scheme registered exactly per the testing instructions.

Step Result
Navy · Forms (jetpack-forms-responses-wp-admin) ✅ property = rgb(2, 57, 92), both ids present (2), layout + body backgrounds = menu color
Navy · Activity Log ✅ same values
Boot 0.21 simulation (layout root renamed to _a1b2c3__layout-single-page) ✅ layout + body keep rgb(2, 57, 92) via the attribute selector
Core scheme Blue ✅ rgb(36, 82, 120) continues behind the frame
Core scheme Light ✅ rgb(229, 229, 229) continues behind the frame
Dashboard + Posts (no boot layout) ✅ neither id in the DOM (0), no property set, pages unchanged
Narrow viewport (600px) ✅ page renders, no horizontal scroll, nothing broken
Before state (merge-base) ✅ bug reproduced: ids absent, layout/body = rgb(30, 30, 30) against the navy menu
jp test php packages/wp-build-polyfills ✅ pass (CI also green across the PHP 7.4–8.5 matrix)
jp phan Crashed locally (env issue parsing wordpress-stubs); CI Static analysis is green, which I'm treating as authoritative

Evidence

Before/after under the navy scheme, Forms page — zoomed crops of the bottom band and the notch under the admin bar (2.5×):

Before: near-black backdrop bands next to the navy menu. After: the backdrop continues the menu color.

@retrofox
retrofox merged commit 18bdbaf into trunk Aug 27, 2026
126 of 127 checks passed
@retrofox
retrofox deleted the fix/wp-build-admin-frame-backdrop branch August 27, 2026 07:35
@github-actions github-actions Bot removed the [Status] Needs Review This PR is ready for review. label Aug 27, 2026
CGastrell added a commit that referenced this pull request Sep 22, 2026
… asked for

Three cases where the tool produced a clean result it had not earned:

* The prompt and progress lines went to stdout, so the documented
  `run … > report.md` wrote the "flip the flag" prompt into the report and
  hid it from the terminal. stdout now carries the report alone.
* `run` accepted a bare Enter, so EOF (a pipeline, a non-TTY shell) exited 0
  with no report, and a keypress buffered during the first capture answered
  the prompt early and captured flag-off twice. It now refuses a non-TTY,
  asks for the flag name, and fails if input closes first.
* The report judged every run against the default targets, where `control` is
  optional and has no selector. A control that a port renamed away read as
  "ok (not present, optional)". Captures now record the targets they used,
  and a control with a selector is required.

Also from that review: record `requestfailed`, so a bad host or a CSP block
is not invisible; use `checkVisibility` so an ancestor's `display:none` is a
visibility change rather than four px deltas; report when a control selector
matches more than one element; keep rects unrounded so a sub-pixel tolerance
means something; assert the landed URL still matches the requested path, with
`--autologin-url` for hosts whose link logs you in; add `--load-state` for a
page whose requests never settle; apply `--wait-selector` to the flag-on
capture only and require its absence flag-off, which proves the flip landed;
keep the host in the request key and drop per-event hosts such as
`pixel.wp.com`; report per-side request totals and count an empty side;
warn when the two snapshots are of different pages.

Docs and wiring: `.gitignore` now matches the filenames the README uses;
the colour-scheme regression is #51619, not #52096; root `composer.json`
`test-js` runs these tests, the hook `tools/performance` already used.

`capture.js` is no longer untested. `test/stub-wp-admin.js` is a `node:http`
stub of wp-login.php, a Dashboard and one flag-dependent admin page, and
`pnpm test:smoke` drives real headless Chromium against it — 11 tests
covering login, the buffer clear, both redirect guards, ancestor-aware
hidden detection and the failed-request path. It skips itself when no
browser is installed. The README's claim that this needed a GPU was wrong.

70 unit tests, up from 55, plus the 11 smoke tests.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CGastrell added a commit that referenced this pull request Sep 23, 2026
* Script the wp-build port verification check's geometry and network diffs

JETPACK-2685 splits the scriptable half of the port verification rule
(JETPACK-2573) out of its manual checklist: step 2 (computed styles and
geometry) and step 3 (the network panel), compared with a port's feature
flag off versus on.

Adds tools/port-verification, a standalone CLI (`verify-port run|capture|
diff`) built on Playwright. `run` captures a page with the flag off,
pauses for the reviewer to flip the flag on the site, captures again, and
prints a Markdown report to paste into the PR. The diff and report logic
(src/diff.js, src/report.js) is pure and unit-tested against fixtures
here; the Playwright capture half (src/capture.js) needs a live site and
is documented as unverified in this sandbox (no GPU).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Fix wpfooter false positive, redact nonces, and narrow the ignore list

PR review on #52579 found three issues in the port verification script:

- Blocker: boot hides #wpfooter by design (see
  projects/js-packages/base-styles/admin-page-layout.scss, so every live
  run reported it CHANGED with bogus zero-rect deltas -- getBoundingClientRect()
  on a display:none element is all zeros. capture.js now records a
  per-target hidden flag; diff.js reports a visibility change as its own
  hidden-changed status instead of diffing a meaningless rect; report.js
  renders it as OK (hidden by design) only for targets whose selectors.js
  entry sets allowHidden (just the footer). An unexpected visibility
  change on any other target still surfaces as a CHANGED finding.
- report.js printed the raw request URL in the network section, so a
  nonce value survived into Markdown meant to be pasted into a public PR.
  Added diff.js redactUrl(), which strips the same ignored query params
  used for matching, and used it for display too.
- Dropped v and t from DEFAULT_IGNORED_QUERY_PARAMS -- generic enough to
  carry real state (an API version, a tab filter) that stripping them
  could hide a genuine step-3 difference. Added --ignore-query-param for
  a site that needs them ignored anyway.

Also hardened capture.js login(): it now waits for
#dashboard-widgets/#wpbody after submit and fails with a clear message
instead of silently proceeding to capture wp-login.php own failure page
on a wrong password (mirrors tools/performance/scripts/measure-lcp.js).

12 new tests (25 to 37), covering the hidden/missing distinction, the
nonce redaction, and the v/t opt-in. node --test and eslint
--max-warnings=0 both clean.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
EOF
)

* Address review: don't diff login traffic, don't collapse repeat requests

Review of #52579 found three ways the tool reports a clean pass on a page it
should flag:

* The response listener started before `login()`, so step 3 diffed
  wp-login.php and the Dashboard alongside the target page. Clear the buffer
  after login.
* `diffNetwork` keyed a Map by method + path, so a repeated request kept only
  its last occurrence -- a 404 refetched into a 200 reported nothing. Group
  every occurrence, compare the distinct statuses, and report a changed
  occurrence count on its own.
* A non-numeric `--tolerance` became `NaN`, and `delta > NaN` is false for
  every delta, so step 2 reported OK for every target. Reject it instead.

Also: abort when a capture lands on wp-login.php, since a fresh browser
profile has no cookies to arrive authenticated with; add `_ajax_nonce` and
`_nonce` to the ignored params, so admin-ajax calls match between loads and
their nonces stay out of a report pasted into a public PR; give an unmeasured
target its own row, so a skipped `--control-selector` no longer reads as a
passing check.

Option parsing moves to `src/options.js` to be testable without running
`main()`. 55 tests, up from 37.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Address dhasilva review: keep stdout for the report, enforce what was asked for

Three cases where the tool produced a clean result it had not earned:

* The prompt and progress lines went to stdout, so the documented
  `run … > report.md` wrote the "flip the flag" prompt into the report and
  hid it from the terminal. stdout now carries the report alone.
* `run` accepted a bare Enter, so EOF (a pipeline, a non-TTY shell) exited 0
  with no report, and a keypress buffered during the first capture answered
  the prompt early and captured flag-off twice. It now refuses a non-TTY,
  asks for the flag name, and fails if input closes first.
* The report judged every run against the default targets, where `control` is
  optional and has no selector. A control that a port renamed away read as
  "ok (not present, optional)". Captures now record the targets they used,
  and a control with a selector is required.

Also from that review: record `requestfailed`, so a bad host or a CSP block
is not invisible; use `checkVisibility` so an ancestor's `display:none` is a
visibility change rather than four px deltas; report when a control selector
matches more than one element; keep rects unrounded so a sub-pixel tolerance
means something; assert the landed URL still matches the requested path, with
`--autologin-url` for hosts whose link logs you in; add `--load-state` for a
page whose requests never settle; apply `--wait-selector` to the flag-on
capture only and require its absence flag-off, which proves the flip landed;
keep the host in the request key and drop per-event hosts such as
`pixel.wp.com`; report per-side request totals and count an empty side;
warn when the two snapshots are of different pages.

Docs and wiring: `.gitignore` now matches the filenames the README uses;
the colour-scheme regression is #51619, not #52096; root `composer.json`
`test-js` runs these tests, the hook `tools/performance` already used.

`capture.js` is no longer untested. `test/stub-wp-admin.js` is a `node:http`
stub of wp-login.php, a Dashboard and one flag-dependent admin page, and
`pnpm test:smoke` drives real headless Chromium against it — 11 tests
covering login, the buffer clear, both redirect guards, ancestor-aware
hidden detection and the failed-request path. It skips itself when no
browser is installed. The README's claim that this needed a GPU was wrong.

70 unit tests, up from 55, plus the 11 smoke tests.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Fix two defects a live Jurassic Ninja run found

First run of capture.js against a real site, on Jetpack 16.3-a.1:

* Login never worked on a site with Jetpack SSO, which is most Jetpack
  sites. SSO leaves the classic form in the DOM but hidden behind "Log in
  with username and password", so filling it timed out. Click the toggle
  first. Pick it by visibility, not by class: the visible one on the test
  site was `.jetpack-sso-toggle.wpcom`, which is not the one its name
  suggests.
* `_cacheBuster` was not an ignored query param, so every `wp-json` call
  appeared under both "only with flag off" and "only with flag on". On the
  Search dashboard that was 4 of 24 network findings.

Verified against the `search-wp-build` flag on a real Search dashboard: the
four default selectors all resolve, geometry comes back clean on all four
frame targets, and step 3 shows the port swapping `jp-search-dashboard.js`
for boot's module graph. After the `_cacheBuster` fix, 20 findings, all
real.

71 unit tests, 11 smoke tests.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Stop the login flaking on networkidle

Re-running the live check at 86f9772 failed with "Login did not land in
wp-admin", then passed twice. About one run in four.

`login()` gated its navigation on the caller's --load-state, which defaults
to `networkidle`. wp-admin never really goes idle -- heartbeat, JITM -- so
the wait sometimes timed out, and the catch reported it as bad credentials,
which is a misleading error on top of a flaky one. The login hop now uses
`domcontentloaded` and leans on the selector waits, which are the real
evidence of being logged in. --load-state still applies to the page capture,
where settling is the point.

8 of 8 live logins clean afterwards, against roughly 1 in 4 failing before.
That is evidence rather than proof at this sample size, but the mechanism
matches: a page that never goes idle cannot be waited on that way.

Adding a `#loginform` wait then broke 9 of the 11 smoke tests, because the
stub's form had no `id`, which real wp-login.php does have. Fixed the stub
rather than dropping the wait -- that gap is the same kind of divergence
that hid the SSO bug until a real site ran it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Own tools/port-verification in CODEOWNERS

@Automattic/jetpack-monorepo owns /tools by default and does not have the
bandwidth for a special-purpose tool, so name an owner explicitly. Follows
the @jeherve precedent for a single-owner tool; last match wins, so this
takes it off the monorepo team.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Docs [Package] Wp Build Polyfills [Plugin] Backup A plugin that allows users to save every change and get back online quickly with one-click restores. [Plugin] Boost A feature to speed up the site and improve performance. [Plugin] Jetpack Issues about the Jetpack plugin. https://wordpress.org/plugins/jetpack/ [Plugin] mu wpcom jetpack-mu-wpcom plugin [Plugin] Premium Analytics [Plugin] Protect A plugin with features to protect a site: brute force protection, security scanning, and a WAF. [Plugin] Search A plugin to add an instant search modal to your site to help visitors find content faster. [Plugin] Social Issues about the Jetpack Social plugin [Plugin] VideoPress A standalone plugin to add high-quality VideoPress videos to your site. [Plugin] Wpcomsh [Tests] Includes Tests [Type] Bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants