Skip to content

Modern Core and Publishing

Nick Hamze edited this page Sep 4, 2026 · 1 revision

Modern Core and publishing

Implementation-time record, September 4, 2026, for the 0.9.0-rc.1 candidate. The observations and checksums below describe the build before release preparation; see the release record for publication status and the downloadable artifact.

Current platform, not a compatibility layer

Fleet now requires WordPress 7.1+ and PHP 8.3+. Plugin metadata, README, static analysis and CI agree on that baseline. WordPress's download page listed 7.1 during this review and recommends PHP 8.3+. CI smoke/build jobs cover PHP 8.3 and 8.5; a configured CI job is not evidence that hosted CI has run. WordPress download and requirements

The latest OpenStation trunk was checked with git ls-remote and still pointed to 9bac9176b26a6228e3e57c9a7c8f11f586063afd. Fleet uses its experimental App Framework directly. There is no classic-admin Fleet fallback and no OpenStation source change or PR. See Framework integration for the feature-by-feature audit and deliberate non-uses.

The integration uses Core Application Passwords, REST discovery and capabilities, _fields, bounded pagination, supported Core batching, Site Health, Abilities discovery/environment information, and block-theme resource APIs. This update adds Core revisions, post-type schemas and wp_text_diff() rather than equivalent custom services. PHP's native array_is_list() replaces the old list helper. Obsolete Core function-existence guards were removed; required-extension checks and safe stored-data migrations remain. Feature discovery still matters on modern sites because plugins and hosting can restrict APIs. Abilities API, REST handbook, Core diff renderer

Four bug fixes

Finding Implemented behavior
Closing a dirty window lost source Dirty state is keyed to the actual .os-window, not a nested tab panel. Cancel preserves source; each site window has an independent guard.
Failed health checks erased findings Last-known findings survive failed/partial checks. Valid partial results update individually; failed checks are marked stale. Attempt time and complete-success time are separate.
Timezone reported a false success Read/write Core's timezone REST field and verify the returned value. Named zones and fixed offsets are resolved from the managed site.
Malformed scheduling input threw Strict ISO date validation rejects malformed/control-character and impossible dates with WP_Error before writing.

The original evidence remains in Bug hunt. Integration also uncovered a local compare-and-swap mismatch: normalization added new defaults before comparing against a stored record. Saves now compare the original stored value and merge normalized fields, so adding views or health fields does not silently prevent persistence. Smoke coverage also protects custom types named posts or pages from colliding with Fleet's built-in collection aliases.

Three implemented recommendations

Publishing review and revision recovery

Publishing, scheduling, and edits to already public/scheduled content require a destination/status/time/change review. A ten-minute HMAC binds the exact editor values to the hub user, site, connection generation and operation. Changed or expired values require another review. Confirmation fetches the current remote fields and checks the edit fingerprint before submitting the normal Core update.

Revision history reads twelve records per page; selecting one fetches its supported source fields and verifies its parent. Use this revision loads title/content/excerpt into the editor, marks it dirty and leaves status/date/slug unchanged. It does not write until the user saves. Existing unsaved text must be explicitly discarded before opening history. Core revisions

This is not durable autosave, a visual block editor, an atomic remote lock, or whole-site rollback. There remains a race between Core's last read and write; no custom endpoint was added to eliminate it. Long diffs are explicitly shortened, with full source retained in the editor.

Saved work views

Save up to twelve named content filters per user/site: type, status, search and date period. The same name replaces that view; apply resets pagination; remove changes no remote content. Views survive reopening and credential repair, are included in privacy export, and disappear with their owning connection. The week filter uses the managed site's timezone and week start. Comment-based and cross-fleet saved views remain proposals.

REST-enabled custom content types

Types are discovered from Core with the connected account's capabilities. Viewable types with title/editor support appear in Content. Custom controllers must expose compatible writable fields through OPTIONS; routes come from server-side discovery, never submitted browser URLs. Unsupported/private/internal types and attachment editing are not broadened by discovery. Namespaced routes and restricted types have live fixture coverage. This is not complete WooCommerce or arbitrary plugin administration. Core post types

Verification and artifacts

Testing uses the disposable Cedar Street Studio hub and Harbor Arts Journal/Center sites on WordPress 7.1, HTTP PHP 8.3.33 and CLI PHP 8.5.10. Temporary write-test content, users and views are cleaned up; the opt-in custom-type MU fixture is inert outside its test. Credentials remain encrypted and browser cookies remain in memory. No new endpoint is installed on a managed site by Fleet.

The expanded suite covers all four regressions plus publishing consent, modified/expired/cross-site review rejection, revision recovery, saved-view persistence/isolation, custom type discovery, partial health recovery, same-item conflicts and two dirty windows. This is not another 30-site load run or public-host certification; Launch checklist still applies.

Final verification on the installed ZIP:

  • 28 tests passed in 1.7 minutes, no failures or skips. Scoped axe WCAG A/AA checks passed for the hub, managed window and publishing review.
  • composer quality: WordPress coding standards, compatibility checks and static analysis passed. Build smoke tests, incremental search tests and JavaScript syntax checks passed.
  • Two clean builds produced SHA-256 8dcbf6ec51fa74350e3f05a0c9f01c8ac6da3a9901091aa20249288d2a3e49d4. All 16 installed runtime files matched that ZIP byte-for-byte. Tests, screenshots, fixtures and development dependencies are not shipped inside it.
  • Cleanup found the original two connections, zero temporary test users, zero temporary views, zero temporary publishing items, the original fixed-offset timezone setting, and the custom-type fixture disabled. The screenshot subject remained a draft and did not contain the proposed replacement source.
  • Ten captures completed with fetched CSS/JavaScript hashes matching the working tree. Native review/Explorer captures and the complete thumbnail sheet were inspected. README screenshots and wiki links were checked.
  • No commit, push, GitHub release, OpenStation modification or public deployment was performed in this follow-up.

README captures are real runtime screenshots. The new review image never confirms a write; proposed source is discarded after capture. Asset hashes are checked against the working tree. See Publishing visual review.

Clone this wiki locally