-
Notifications
You must be signed in to change notification settings - Fork 0
Releasing
Status: 1.1.x release process. Mirror the listed docs to the wiki after release.
- Update
odd/odd.php,odd/readme.txt,CHANGELOG.md, and package metadata. - Run
odd/bin/check-version --expect <version>andodd/bin/check-plugin-metadata. - Run the validation suite listed below.
- Commit with a release-focused message.
- Tag
v<version>and pushmainplus the tag. - Confirm
.github/workflows/release-odd.ymlpassesquality-gates, install smoke, Plugin Check, and publish. - Verify
https://github.com/RegionallyFamous/odd/releases/latest/download/odd.zipresolves to the new release. - Keep the public stable Playground blueprint/cache-busting links on the release version. Before the WordPress.org SVN tag exists,
validate-blueprintcan still allow the previous public zip during prep; after SVN publish, the stable blueprint must point athttps://downloads.wordpress.org/plugin/odd-outlandish-desktop-decorator.<version>.zip.
Run locally before tagging:
odd/bin/check-version --expect <version>
odd/bin/check-plugin-metadata
python3 _tools/build-catalog.py
ODD_VALIDATE_REBUILD=1 odd/bin/validate-catalog
odd/bin/validate-blueprint
npm test -- --run
composer phpcs
odd/bin/check-licenses
odd/bin/make-pot --out odd/languages/odd-outlandish-desktop-decorator.pot
odd/bin/build-zip
odd/bin/check-zip-contents --listRun PHPUnit locally when the WordPress test environment is configured. Otherwise, the release workflow must keep PHPUnit and install-smoke as blocking checks before publishing.
CI runs the official WordPress/plugin-check-action against the expanded
contents of dist/odd.zip. To run the same shape locally, build the zip,
expand it into a temporary plugin directory, and run Plugin Check against that
directory from a WordPress test install.
Plugin Check errors block release. Warnings block release unless the warning is documented in the release issue with a concrete reason it is acceptable.
Use a catalog-only update when the change is limited to first-party content
under _tools/catalog-sources/ or generated files under site/catalog/v1/.
- Edit catalog source files.
- Run
python3 _tools/build-catalog.py. - Run
ODD_VALIDATE_REBUILD=1 odd/bin/validate-catalog. - Commit and push to
main. - Confirm
.github/workflows/pages.ymlpublishes the catalog.
validate-catalog also checks that every bundle has a published card_url and
that card assets stay small enough for Shop use. If it fails on card size,
recompress the source card.webp files under _tools/catalog-sources/ and
rebuild instead of raising the limit.
Do not bump ODDOUT_VERSION, tag a GitHub release, or edit CHANGELOG.md for
catalog-only changes.
- Open
https://odd.regionallyfamous.com/go/(stable: newest approved ODD + Desktop Mode releases from WordPress.org). For trunk, use/go/dev/instead — do not use the stable URL to validatemain. - Confirm WordPress Playground loads the pinned Desktop Mode release and ODD.
- Confirm the ODD Shop opens.
- Confirm the starter wallpaper, icon set, and cursor set install or show a visible retry state.
- Install one app, one widget, one wallpaper, one icon set, and one cursor set.
- Open the app, add the widget, apply the visual content, then copy diagnostics from About.
- Mutating REST routes use capability checks and nonces/cookie-auth explicitly.
- Bundle extraction blocks traversal, symlinks, unexpected file types, and slug or type mismatches.
- Catalog downloads verify SHA256 before install.
- Remote catalog fetches reject non-HTTPS registries, oversized bodies, malformed rows, duplicate slugs, bad hashes, and bundle/icon/card URLs outside the configured catalog base.
- Catalog refresh, catalog install, bundle upload, and starter retry routes are rate-limited per user.
- App iframe serving sends
nosniff,noindex,no-referrer,SAMEORIGIN, and a restrictive permissions policy. - SVG and cursor assets are passive and validated.
- Diagnostics are local-only, user initiated, and redact secrets/nonces.
- ODD makes no telemetry, analytics, beacon, or remote error-reporting calls.
-
odd/uninstall.phpclearly controls which options, user meta, and content folders are removed.
- Shop cards, dialogs, controls, and settings are keyboard reachable with visible focus.
- Buttons and inputs have accessible names.
- Status changes use visible text and
aria-livewhere appropriate. - Reduced-motion preferences are respected by scenes and UI transitions.
-
dist/odd.zipstays below the 2 MB budget. - The Shop first paint uses localized state and does not block on remote catalog refresh.
- Shop diagnostics include local-only render, catalog fetch/install, iframe load, and wallpaper scene-swap timing counters. Use them for regressions, but do not add remote telemetry.
- Shop card art uses
card_urlwhen present and lazy/async image loading. - Scenes, widgets, apps, and iframes clean up timers, listeners, and resources.
- The static marketing site remains low-dependency and passes
site-lint.
- Open ODD Shop → Settings and check the System Health card.
- Click Refresh catalog once. If it rate-limits, wait for the retry window.
- If
sourceisstale_option, the Shop is using the last known good catalog. - If
sourceisfallback_file, the bundled fallback registry is active. - Run
ODD_VALIDATE_REBUILD=1 odd/bin/validate-catalogbefore publishing a catalog fix.
- Copy diagnostics from ODD Shop.
- Use the starter retry action in the Shop or call
POST /odd/v1/starter/retryas an admin. - If retry reports missing starter slugs, rebuild the catalog and confirm
starter_packentries resolve to real bundle rows.
- Confirm the app iframe shows an ODD diagnostic card instead of a blank frame.
- Copy diagnostics; check local metrics for
app.iframe.load,app.iframe.emptyRoot, orapp.iframe.skipped. - Reinstall or update the app from the catalog if the serve URL is missing.
- Inspect the iframe console only after the visible diagnostic confirms the host path loaded.
- Trust the first
WP_Errorcode:sha256_mismatch,path_traversal,forbidden_file_type,catalog_slug_mismatch, andcatalog_type_mismatchare security blockers, not retry noise. - Check that no partial bundle directory remains under
wp-content/uploads/odd/*. - Rebuild the bundle from
_tools/catalog-sources/and rerun catalog validation.
The 1.0 reset backup lives outside the plugin tree in the local release backup created before pruning superseded tags/releases. To recover a deleted tag:
git tag <old-tag> <recorded-sha>
git push origin <old-tag>
gh release create <old-tag> --generate-notesFor a bad public release, prefer a quick patch hotfix:
- Branch from the current release tag.
- Apply the fix and regression test.
- Run the validation suite.
- Commit, tag the next patch version, push, and verify the latest download URL.
After release, mirror these repo docs into the GitHub wiki:
docs/architecture.mddocs/building-on-odd.mddocs/store-state-machine.mddocs/release-policy.mddocs/release-runbook.mddocs/security/serve-paths.md