Skip to content

πŸ› Correct "activation is not a boot" β€” the receipt was a WP-CLI artifact - #14

Merged
courtneyr-dev merged 1 commit into
mainfrom
wpcli-boot-false-positive
Sep 1, 2026
Merged

courtneyr-dev merged 1 commit into
mainfrom
wpcli-boot-false-positive

Conversation

@courtneyr-dev

Copy link
Copy Markdown
Owner

Adam Silverstein retracted the eps-301-redirects finding on PR #13198. Installed by hand through wp-admin the plugin is healthy β€” front page 200, wp-login.php 200, /wp-admin/ 302, no debug.log. Only the WP-CLI boot failed.

The mechanism is WP-CLI's, not WordPress's. WP-CLI requires wp-settings.php from inside WP_CLI\\Runner->load_wordpress(), and PHP executes an included file in the including scope. A plugin's file-scope $Var = new Thing() becomes a local of that method rather than a global; code reading it back with global $Var on init gets null and calls a method on it. It only fires when permalink_structure is empty β€” exactly what a fresh wp core install leaves behind, so CI hits it and real sites don't.

Verified independently here, in plain PHP with no WordPress involved:

included at global scope:    global is VISIBLE
included inside a method:    global is MISSING

The rule survives, sharper. Activation is still not a boot β€” but the boot must be an HTTP request, not wp eval, and a CLI-only fatal is a note, not a failure. Corrected in the learning loop's accepted controls, the ecosystem lane, both prompt fences, the plugin-author CI drop-in, and fleet-operators Β§4.

And it lands on us. scripts/core-preflight-probe.sh β€” merged to main this morning β€” boots the target through wp eval and has no HTTP check, so its exit 3 means "fataled under WP-CLI", a strictly larger set than "this release breaks this site." Documented in the script header and emitted in its output. Both controls still pass, but only because the fixture plugins happen not to use file-scope globals. Adding the HTTP half is now the priority on that page rather than a nicety.

What the 200-plugin run demonstrated is smaller than reported: its one failure wasn't real, so zero confirmed core-related plugin fatals out of 200, with instagram-feed the only remaining candidate and unverified here.

Original kept beside the correction rather than rewritten away, per refuted claims are assets. Draft comment revised again, still unfiled.

python3 scripts/check-repo.py passes clean.

Silverstein retracted the eps-301-redirects finding. Installed by hand the
plugin is healthy: front page 200, wp-login 200, /wp-admin/ 302, no debug.log.
Only the WP-CLI boot failed.

WP-CLI requires wp-settings.php from inside WP_CLI\Runner->load_wordpress(), and
PHP runs an included file in the including scope, so a plugin's file-scope
$Var = new Thing() becomes a local of that method instead of a global. Code
reading it back with `global $Var` gets null and calls a method on it. Fires only
when permalink_structure is empty, which is what a fresh wp core install leaves β€”
so CI hits it and real sites don't. Verified here in plain PHP with no WordPress:
included at global scope, the global is visible; included inside a method, missing.

The rule survives, sharper: activation is still not a boot, but the boot must be
an HTTP request, not wp eval, and a CLI-only fatal is a note rather than a
failure. Corrected in the learning loop, the ecosystem lane, both prompt fences,
the plugin-author drop-in and fleet-operators Β§4.

And it lands on us. scripts/core-preflight-probe.sh, merged to main this morning,
boots through wp eval and has no HTTP check β€” so its exit 3 means "fataled under
WP-CLI", a strictly larger set than "this release breaks this site". Documented in
the header and in the probe output. Both controls still pass, but only because the
fixture plugins don't happen to use file-scope globals. Adding the HTTP half is now
the priority on that page rather than a nicety.

Also narrows what the 200-plugin run showed: its one failure wasn't real, so zero
confirmed core-related fatals out of 200, instagram-feed the only candidate left.

Refuted claims are assets β€” the original is kept beside the correction rather than
rewritten away.

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

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Approved. Cursor Bugbot was not present after the first check poll, so that signal was skipped; no approval policy required human review and there were no existing findings. Reviewers were not assigned.

Open in WebΒ View AutomationΒ 

Sent by Cursor Approval Agent: Pull Request Router and Approver

@courtneyr-dev
courtneyr-dev merged commit 1f2a0a0 into main Sep 1, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant