ZeroModel 1.0.13 uses a nine-distribution release-candidate workflow before any publish, tag, or GitHub release action:
python scripts/validate_release_candidate.py
python scripts/run_fast_tests.py
python scripts/check_quality.py
The validator builds and checks all nine packages declared in
package-boundaries.toml (the authoritative package configuration; the
validator fails if its own package list drifts from that file):
zeromodel (core)zeromodel-analysiszeromodel-observationzeromodel-visionzeromodel-videozeromodel-sqlalchemyzeromodel-artifactszeromodel-trustzeromodel-navigationIt writes docs/architecture/package-release-artifacts-1.0.13.json and
docs/architecture/package-public-api-1.0.13.csv. It does not upload to
TestPyPI or PyPI, create tags, or create a GitHub release. No publication of
the 1.0.13 nine-package release has occurred as of this writing; the workflow
below (Phase 1/Phase 2, scripts/create-release.ps1) has not been adapted to
drive a nine-package publish and should not be run against 1.0.13 without
that work first — see “Historical: 1.0.12 single-package workflow” below.
The following two-phase PowerShell workflow published ZeroModel 1.0.12, when
the repository still shipped one monolithic zeromodel distribution. It is
recorded here as history and as a starting point for a future nine-package
publish orchestrator, not as a currently runnable process:
scripts/create-release.ps1 still reads and rewrites zeromodel\__init__.py
and a single root pyproject.toml version, both of which no longer exist in
this checkout (each of the nine packages now carries its own
packages/*/pyproject.toml and version). Do not run this script against the
current tree until it is updated for the nine-package layout.
Prepare
↓
release pull request
↓
review + CI + merge
↓
Publish
↓
final integration validation
↓
PyPI upload
↓
Git tag
↓
GitHub release
The workflow is implemented by:
scripts/create-release.ps1
The existing scripts/publish-pypi.ps1 remains the low-level production PyPI uploader. The release orchestrator calls it only after the merged release commit and all release gates have been validated.
Run releases from a clean Windows checkout with:
gh) authenticated for ernanhughes/zeromodel;PYPI_API_TOKEN, or available for secure interactive entry;main.Check GitHub authentication with:
gh auth status
For ZeroModel 1.0.12:
.\scripts\create-release.ps1 `
-Mode Prepare `
-Version 1.0.12
The prepare phase requires a clean, synchronized main branch. It then:
release/1.0.12;pyproject.toml;zeromodel\__init__.py;CHANGELOG.md;twine check;The prepare phase does not upload to PyPI, create a tag, or create a GitHub release.
.\scripts\create-release.ps1 `
-Mode Prepare `
-Version 1.0.12 `
-DryRun
A dry run verifies the repository, branch, synchronization state, commands, and release-notes path without changing anything.
Review the generated release PR and require the normal Python package workflow to pass.
The release PR should contain only release metadata changes:
Merge the PR before starting the publish phase.
Return to main, pull the merged release commit, and run:
.\scripts\create-release.ps1 `
-Mode Publish `
-Version 1.0.12
The publish phase requires the merged source tree to already declare 1.0.12. It then:
main is synchronized with origin/main;zeromodel==1.0.12 already exists on PyPI;scripts/publish-pypi.ps1 when upload is still required;v1.0.12;Before the irreversible step, the operator must type:
RELEASE 1.0.12
Use -Yes only in a controlled non-interactive release environment.
The publish phase is designed to be safely repeatable after a partial failure:
Do not delete or move a published tag. PyPI versions are immutable and cannot be reused.
The script exposes narrowly scoped recovery switches:
-SkipQuality
-SkipTests
-SkipDemos
-SkipFinalizationIntegration
-SkipPyPI
-SkipGitHubRelease
These switches are not normal release posture. Use them only when the skipped gate has already passed for the exact release commit or when recovering a partially completed release.
A successful release proves package construction, installation, bounded runtime behavior, and the named integration contracts exercised by the release gates.
It does not establish:
docs/claims-audit.md remains the source of truth for public capability wording.
The nine-package split described above is not future work: it is the current
state of main at release-candidate version 1.0.13, and the removal of the
legacy root compatibility import surface is already in effect in this
checkout. There is no pending 2.0.0.dev0 package-architecture line still to
begin. Any future major-version bump should be driven by a new breaking
change identified after the 1.0.13 nine-package release candidate is
published, not by the split itself.