Release Checklist¶
Steps to follow when publishing a new version of GodotMaker.
Pre-release¶
- Finalize
docs/update/next.md - Review all entries, fix typos, group by category
- Rename
next.mdtovX.Y.Z.md(e.g.,v0.5.0.md) as a permanent archive -
Create a new empty
next.mdby copyingnext.template.md -
Check migration scripts (any bump level — applied tracking is decoupled from the version)
- If this release rewrites files inside existing target projects (moved paths, renamed config keys, hook fix-ups, etc.), scaffold a migration:
- Test migrations against a real target project:
- See
migrations/README.mdfor script format and the applied-tracking model - MAJOR bump: old migration scripts are NOT deleted at release time.
The timestamp series is monotonic and global; existing scripts stay on
disk as historical record. MAJOR upgrades use
--forcefull rebuild, andbaseline_applied()re-marks every current migration as applied after re-deploy. -
Recommended — release that introduces applied-tracking machinery. The release that first ships the applied-tracking subsystem (see
migrations/README.mdTransition note) prefers shipping withmigrations/empty. Legacy targets reach the bootstrap branch and emerge as "tracked, zero applied"; the next release that ships V files goes through the normal pending path. Shipping V files in the same release as the machinery also works —run_migrations()auto-bootstraps the legacy target and runs the V files as pending in one step — but you forgo the chance to land the tracker change in isolation, which makes the diff harder to review. Pick based on review surface, not safety. Once applied-tracking is in any released version, this guidance no longer applies — drop it from your release notes for that release. -
Update version numbers — these MUST stay in lockstep. Skipping any one ships a half-bumped release.
VERSION— single-line file at the repo root, content is the bareX.Y.Z(no leadingv, no trailing newline issues). This is the source-of-truthtools/publish.pyreads (read_source_version()attools/publish.py:43) and writes into target projects'.godotmaker/version. Forgetting this bump causes downstream consumers (godotmaker-cli,publish.pyupgrade detection) to seeinstalled_version != target_versionon every run, triggering an infinite "framework upgrade X.Y.Z-1 → X.Y.Z" loop that never converges.pyproject.toml— updateversion = "X.Y.Z". Python package metadata only; not consumed by the publish pipeline, but kept in sync so PyPI/SDK consumers see the same number.CHANGELOG.md— add a new## [X.Y.Z] — YYYY-MM-DDsection with entries from the archivednext.md-
Do not leave the rolling-main explanatory text underLICENSEChange Date — in theChange Datefield, pin this release's concrete Change Date: the calendar date equal to this release's publication date plus four years (a release published 2026-06-01 records2030-06-01). BUSL treatsChange Dateas a license parameter, so the tagged release'sLICENSEshould contain only the concrete value, followed directly byChange License.Change Datein a tagged release:Keep that rule in this checklist/docs instead. BUSL converts each version on its own date — never reuse a previous release's date.For each specific version of the Licensed Work, the fourth anniversary of the first publicly available distribution of that version under this License. For this purpose, a "version" of the Licensed Work means a release published under a Semantic Versioning tag (for example, v0.4.0). The LICENSE file included in each such tagged release records that version's Change Date as a specific calendar date. -
Run all tests locally
-
Cross-layer consistency gates — these catch the contract drifts that shipped past previous releases. Run before tagging.
-
README + wiki entry-flow consistency. The first command shown in
README.md,README.zh-CN.md, anddocs/wiki/01-getting-started/first-game.mdmust match the current public entrypoint. For the CLI-first path this isgodotmaker; direct/gm-scaffoldor/gm-gddrole commands are advanced/manual entrypoints, not the first-run command shown to new users. - New config keys are in
config.yaml.default. Any*_modelfield newly referenced by a skill must also be declared inconfig/config.yaml.defaultwith the same default value. The automated check istests/test_config_consistency.py; if you add a new<role>_model, run pytest before tagging. - Documented artifacts match real outputs. If a wiki page or skill
description claims a role produces a file (e.g.,
.godotmaker/foo.json), either the role'sSKILL.mdactually writes that file or the doc claim is removed. There is no "documented but not produced" file in the pipeline. - Release notes are visible. Every new
docs/update/vX.Y.Z.mdmust appear under theRelease Notessection ofmkdocs.yml. Adding the archive without the nav entry hides it from the published site. -
Chinese release-note policy. Release notes under
docs/update/are English-only by design — the i18n plugin shows the same English page on the Chinese site rather than maintaining a parallel translation track. If this policy ever changes, mirror notes underdocs/zh/update/and update this checklist. -
Commit and push
Publish¶
- Create a git tag and push
This triggers the
release.ymlworkflow, which automatically: - Reads release notes from
docs/update/vX.Y.Z.md -
Creates a GitHub Release (source code archives are attached by GitHub)
-
Verify the release
- Check the Releases page
- Verify release notes match
CHANGELOG.md
Post-release¶
- Announce (optional)
- Post on relevant communities (Godot forums, Reddit, etc.)