v2.2.2 is the current stable Base Bash release, backed by its verified
canonical release asset. v1.4.0 and earlier releases are historical references;
the 5/5 initiative has one stable target and will not create a stable v1.5.0
or reset the version to 0.x.
Those choices would either hide breaking changes inside the current 1.x compatibility range or move version precedence backward.
Post-GA releases use one repository-owned v2 SemVer policy. Compatibility
guarantees began at v2.0.0; v2.2.2 is the current release on that line:
2.MINOR.PATCH
2.MINOR.PATCH-alpha.N
2.MINOR.PATCH-beta.N
2.MINOR.PATCH-rc.N
MINOR and PATCH are non-negative canonical decimal integers; N starts at
1 and has no leading zeroes. Build metadata and prerelease channels other than
alpha, beta, and rc are not accepted by the release workflow. Prereleases
do not receive compatibility shims. The stable SemVer compatibility contract
began at v2.0.0 GA.
After GA, v2 is the only supported release line. Versions through v1.4.0
remain available as historical releases but no longer receive fixes or support.
Additive features and fixes remain within 2.x; a breaking stable API change
requires v3 or later.
The repository-owned scripts/release command is the
mandatory entry point for every release inspection and publication attempt. It
sources scripts/release-version-policy.sh
before delegating read-only operations and dry runs to Base's guarded release
command. The artifact builder and repository validation source the same policy.
The release-invariant CI stage follows the active release contract without a
hidden environment setting. It always checks the current candidate tree at
HEAD against the published compatibility baseline named by
first-party-cutover.yaml, even after VERSION is advanced for a candidate.
The two references and their provenance are always printed. An explicit,
audited BASE_BASH_LIBS_COMPATIBILITY_REF override is available for isolated
fixtures and controlled release rehearsals.
Prerelease publication became available because #233 and the follow-up
release-artifact contract landed. The reviewed v2.0.0-rc.1 artifact and the
pre-GA work in #240 validated and rehearsed the exact release candidate across
Base, Base Demo, Homebrew, vendored, and bundled paths. The canonical
v2.0.0 archive, checksum manifest, SBOM, and provenance are now published and
the first-party handoff is complete; future releases must preserve the same
verified-asset contract.
The release policy is code reviewed, not an environment-variable or sentinel-file override. Maintainers can inspect any candidate without changing GitHub state:
scripts/release check --version 2.2.2 --manifest base_manifest.yaml
scripts/release plan --version 2.2.2 --manifest base_manifest.yaml
scripts/release publish --version 2.2.2 --manifest base_manifest.yaml --dry-runThe generic basectl release command is not a substitute for this guard. Its
current manifest contract does not encode this repository's release line,
artifact, provenance, or GA gates.
Before any real publication attempt, run the repository-owned tag preflight:
scripts/release refs --version 2.2.2The preflight checks both the exact candidate tag in the local checkout and the
same tag on origin. It fails closed when Git cannot inspect either side or
when the tag is already present. Published tags are immutable; a stale local
tag may be removed only after confirming that the remote ref is absent and that
the local object is the withdrawn July 2026 commit documented below.
On July 2, 2026, PR #100
created commit
2d90249
with v2.0.0 metadata. A corresponding
Homebrew PR #66 used
GitHub's automatic tag-archive URL.
The next day, PR #103
and commit
6ce8af0
corrected the release line to v1.1.0.
Homebrew PR #68
corrected the formula and added version_scheme 1 so Homebrew would accept the
version-order correction.
The attempted v2.0.0 remote tag and GitHub Release are no longer present.
The commits and pull requests remain part of the public history, and caches of
the old automatic archive may still exist. The final v2 release therefore uses
a newly verified canonical release asset rather than that automatic archive.
The project will never silently retag or represent the withdrawn artifact as
the final release.
Older local clones can retain the deleted lightweight tag. Inspect both sides before removing a stale local ref:
git ls-remote --tags origin refs/tags/v2.0.0
git show-ref --verify refs/tags/v2.0.0If the remote command has no output and the local command finds the withdrawn
ref at 2d90249eec35aa00d04513294ce0fb09042c3f3f, remove only that local tag:
git tag -d v2.0.0The complete checkout, archive, Homebrew, vendored, and standalone verification
procedure is maintained in pinned-consumption.md.
Do not install from an unpinned default-branch checkout. Use the canonical
v2.2.2 release asset and verify its checksum, or pin the stable source to the
full commit resolved from the annotated v2.2.2 tag:
git clone https://github.com/basefoundry/base-bash-libs.git vendor/base-bash-libs
git -C vendor/base-bash-libs fetch --tags origin v2.2.2
git -C vendor/base-bash-libs checkout --detach v2.2.2
base_bash_libs_commit="$(git -C vendor/base-bash-libs rev-parse HEAD)"
test "$(git -C vendor/base-bash-libs rev-parse HEAD)" = "$base_bash_libs_commit"Prerelease validation must likewise use an immutable prerelease tag resolved to its expected commit, a verified release asset, or a full commit. Release notes, bug reports, and CI fixtures should record the resolved commit in addition to the human-readable version.