Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 38 additions & 13 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,20 +130,39 @@ dry-run, no diff and no revert.
which lets WordPress rewrite its own `.htaccess` block exactly as Settings →
Permalinks does. A soft flush would leave Apache without rules after a move
off plain permalinks, so it stays a hard flush.
- **Updates are applied only through WordPress's own updater, and only for
what WordPress already offers.** `saddle/update-plugin` and
`saddle/update-theme` (admin tier, gated, at most 10 items) queue a
background run; `Saddle_Update_Runner` hands each item to
`WP_Automatic_Updater::update()`, which downloads the package core listed,
keeps the temporary backup, and for an active plugin runs the loopback fatal
check and restores the backup on failure. Saddle never writes a file, never
chooses a package URL, never calls the upgrader inside a request (a test
pins this), never installs or deletes a plugin or theme, and never updates
core. It refuses, naming the reason, wherever core would (`DISALLOW_FILE_MODS`,
- **Updates and installs run only through WordPress's own updater and
installer, and only for what WordPress already offers.** Six tools, all
admin tier and gated, queue a background run and never call the upgrader
inside a request (a test pins this): `saddle/update-plugin` and
`saddle/update-theme` (at most 10 items), `saddle/update-core`,
`saddle/update-translations`, `saddle/install-plugin` and
`saddle/install-theme` (one slug each). `Saddle_Update_Runner` hands each
update to `WP_Automatic_Updater::update()`, which downloads the package core
listed, keeps the temporary backup, and for an active plugin runs the
loopback fatal check and restores the backup on failure;
`Saddle_Install_Runner` hands an install to `Plugin_Upgrader::install()` or
`Theme_Upgrader::install()`.
Saddle installs a plugin or theme only from the WordPress.org directory, by
slug, and only through WordPress's own installer, out of band, after a
confirmed preview. It never takes a zip, a URL or a file. A new install
arrives inactive. Saddle applies core updates only for releases WordPress
already offers, through core's automatic updater: minor and security
releases, and a major release only when WordPress would apply it in the
background itself: its own "automatic updates for all new versions" switch
in Dashboard → Updates, which no tool can flip (on by default for sites
installed since WordPress 5.6). Translation updates go through
core's language pack upgrader. Saddle never deletes a plugin or theme. It
still never writes a file and never picks a package URL: the package is the
one the WordPress.org API names, exactly as on the Add New screen, and a
package from anywhere else is refused.
It refuses, naming the reason, wherever core would (`DISALLOW_FILE_MODS`,
`AUTOMATIC_UPDATER_DISABLED`, a VCS checkout, a non-direct filesystem). The
auto-update switch is WordPress's own option. Decided 2026-09-27 evening on
Fahim's "research, then take the decision", replacing the same morning's
"reported, never run"; applies to Pro too.
auto-update switch is WordPress's own option. Updates decided 2026-09-27
evening on Fahim's "research, then take the decision", replacing the same
morning's "reported, never run"; installs, core and translations added
2026-10-12 (#347, Fahim: majors only behind WordPress's own switch; #351
found that the switch defaults to on for new installs). Applies
to Pro too.

If a feature seems to need any of these, that is a signal to redesign the
feature. Two reasons, both load-bearing: WordPress.org will not accept arbitrary
Expand Down Expand Up @@ -460,6 +479,12 @@ change. `Tested up to:` moves only when Fahim has verified against a newer WP.
all three competitors that were checked.
- Don't add PHP execution, filesystem writes or shell WP-CLI as a power-user
convenience. See the hard line.
- Don't install a plugin or theme from a zip upload, a URL or a file path, and
don't add a tool that takes one. Installs come only from the WordPress.org
directory, by slug, with the package its API names. Don't activate anything
as part of an install either; activation stays its own confirmed step.
- Don't add `delete-plugin` or `delete-theme`. Removing a plugin or theme
stays in wp-admin.
- Don't change the default tier away from `read`, even temporarily for testing.
- Don't remove the Application Password path now that OAuth exists. Every
header-capable client uses it, it needs no consent round-trip, and it is the
Expand Down
15 changes: 13 additions & 2 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,24 @@ when it is picked up; this file names direction, not tickets.
**Added 2026-09-27 (evening), in this order, all free:** updates and health
(`list-updates`, `update-plugin`, `update-theme`, `set-auto-update`,
`get-site-health`; applied through core's own updater with its temporary
backup and fatal-check rollback, admin tier, gated, never an install or a
core update); `undo-changes` (#181) and rehearsal mode (#180); custom post
backup and fatal-check rollback, admin tier, gated; installs and core
updates came later, below); `undo-changes` (#181) and rehearsal mode (#180); custom post
types (#137); menus (#244); template, part and pattern writes (#172). Ordered
by what people use and what saves time, then by what keeps "safe on a live
site" true as rivals ship undo and snapshots. The research is in the
2026-09-27 plan; the updates decision revises the morning's "reported, never
run" and is written into `CLAUDE.md`'s hard line with the code.

**Added 2026-10-12, in this order, all free, next to the updates (Fahim):**
`search-plugins` (#348, built), `install-plugin` (#349, built), `install-theme` (#350, built),
`update-core` (#351, built), `update-translations` (#352, built). Installs come only from
the WordPress.org directory, by slug, through WordPress's own installer in
the background runner, and arrive inactive; activating stays its own
confirmed step, and nothing deletes. Core updates are minor and security
releases, plus a major release only when WordPress's own switch for all
new versions is on (the default since WordPress 5.6 for new installs). No zip or URL
installs, no file editors, no delete tools. The hard line was rewritten
first (#347).
3. **The agency workflow.** Divi 5 page editing moves to free (2026-09-26 split:
free edits, Pro operates the site). Divi design-system export/import as JSON (Pro) —
global colors, fonts, variables, presets, Theme Builder templates, library
Expand Down
Loading
Loading