This document describes the repeatable process for cutting a new bootstrap release. Follow it before bumping the version or merging release-oriented changes.
| Change type | Version bump |
|---|---|
| Documentation fixes, wording corrections, cosmetic template edits | PATCH |
| New template files, new profiles, new optional marker fields, script enhancements | MINOR |
| Marker field renames/removals, required-file restructuring, breaking apply/refresh changes | MAJOR |
If unsure, prefer PATCH. Record the reasoning in IMPLEMENTATION_TRACKER.md.
See docs/BOOTSTRAP_VERSIONING.md for the full semver policy and refresh-safety
expectations.
Before updating VERSION or merging, confirm all of the following:
python scripts/validate_bootstrap.pyExpected: VALIDATION PASSED. Bootstrap repository structure is intact.
python scripts/run_fixture_selftest.pyExpected: B:PASS C:PASS D:PASS for every fixture.
python -m py_compile scripts/validate_bootstrap.py scripts/apply_bootstrap.py \
scripts/run_fixture_selftest.py scripts/refresh_bootstrap.py \
scripts/bootstrap_status.pypython scripts/bootstrap_status.pyCheck: no [MISSING] or [WARN] items for core files. Version/changelog
coherence should show OK.
The GitHub Actions CI workflow must pass on the branch before merge. It runs:
py_compilesyntax check on all scriptsvalidate_bootstrap.pyrun_fixture_selftest.py
Do not merge a release-oriented change with a failing CI run.
Determine whether this is a patch, minor, or major release using the table above.
Edit VERSION at the repository root:
0.14.0
One line, no trailing whitespace, no v prefix.
Move the [Unreleased] section content into a new dated release entry:
## [0.14.0] — YYYY-MM-DD
### Added
- ...
### Changed
- ...Add a fresh empty [Unreleased] section at the top:
## [Unreleased]
---Add a Milestone entry recording:
- The version bump decision and rationale
- Files created or modified
- Validation results
python scripts/validate_bootstrap.py && python scripts/run_fixture_selftest.py
python scripts/bootstrap_status.pyConfirm all pass cleanly and the status report shows the new version.
Commit all changed files together:
git add VERSION CHANGELOG.md IMPLEMENTATION_TRACKER.md [any other changed files]
git commit -m "Bump version to 0.14.0: <brief description of what changed>"
git tag v0.14.0
git push origin v0.14.0
Tagging is a human decision. It is not automated. Tags create a stable reference
point for target repos that record Bootstrap source revision.
After merging (or pushing to the main branch):
- Confirm CI passes on
main. - Run
python scripts/bootstrap_status.pyfrom a fresh checkout if in doubt. - Note the release in
IMPLEMENTATION_TRACKER.mdunder the relevant milestone.
If you added new required files (templates, scripts, docs), add them to:
BOOTSTRAP_REPO_REQUIRED_FILESinscripts/validate_bootstrap.pybootstrap_repo_required_filesinbootstrap-manifest.yaml
Both lists must stay in sync. The CI regression gate will catch drift because
validate_bootstrap.py checks for every file in its list.
New profiles require updates in four places:
PROFILESdict inscripts/apply_bootstrap.pyPROFILESdict inscripts/refresh_bootstrap.pyprofiles:section inbootstrap-manifest.yaml- A matching template file in
templates/profiles/<profile-name>/
A new profile is a minor version bump. After adding it, run the fixture self-test and confirm CI passes.
VERSIONmust contain a valid semver string.CHANGELOG.mdmust exist.- The current version must appear in
CHANGELOG.md(as a release entry), OR there must be an[Unreleased]section (indicating the version is in progress). - If
bootstrap-manifest.yamlreferences a version field, it must matchVERSION.
Run python scripts/bootstrap_status.py to check these automatically.
- Do not bump
VERSIONwithout updatingCHANGELOG.md. - Do not update
CHANGELOG.mdwithout bumpingVERSION(except for adding to[Unreleased]). - Do not push release commits with failing CI.
- Do not rename or remove marker fields (
BOOTSTRAP_SOURCE_VERSION,BOOTSTRAP_SOURCE_REVISION) without a major version bump. - Do not add release automation or tag-pushing to CI unless explicitly decided.