Whilly v4.0.0 Release Checklist
Final gate before tagging
v4.0.0. Every checkbox below traces to a concrete artefact in the repo (test path, demo script, CI job, doc file). The release smoke attests/integration/test_release_smoke.pyprosecutes all six PRD Success Criteria as one pytest invocation — see “How to verify” below the table.
Release commit (planning): bb7d46a (test: TASK-034a — release smoke ...). The annotated git tag v4.0.0 will be applied to the final commit in the refactoring-1 plan — i.e. the commit that follows this checklist in git log.
Version sync (TASK-033a):
whilly/__init__.py::__version__="4.0.0"pyproject.toml::project.version="4.0.0"whilly_worker/pyproject.toml::project.version="4.0.0"whilly_worker/pyproject.toml::dependenciespin ="whilly-orchestrator[worker]==4.0.0"- Drift detector test green:
tests/unit/test_version_consistency.py
Success Criteria — all 6 must be ✅
| ✅ | SC | What it proves | Pinned by |
|---|---|---|---|
| ✅ | SC-1 | N workers race for K tasks; every task ends up assigned to exactly one worker (no double-claim) | tests/integration/test_concurrent_claims.py — exercised by test_release_smoke.py::test_sc_runtime_gate_runs_green[sc_1_concurrent_claims] |
| ✅ | SC-2 | A SIGKILL’d worker’s claim returns to PENDING via the visibility-timeout sweep; dashboard reflects truthfully throughout | tests/integration/test_phase6_resilience.py — exercised by test_release_smoke.py::...[sc_2_worker_kill_recovery] |
| ✅ | SC-3 | A separate OS process talking to the control plane via TCP claims and completes a task | tests/integration/test_phase5_remote.py (pytest) + docs/demo-remote-worker.sh (operator artefact). Smoke node: ...[sc_3_remote_worker_http] |
| ✅ | SC-4 | whilly plan import rejects cyclic dependency graphs (DAG invariant) | tests/integration/test_phase3_dag.py — exercised by test_release_smoke.py::...[sc_4_cycle_rejection] |
| ✅ | SC-5 | whilly/core/ has ≥80% line+branch coverage (PRD NFR-4); actual is 100% | coverage report --include='whilly/core/*' --fail-under=80 — exercised by test_release_smoke.py::test_sc_5_core_coverage_at_least_eighty_percent; CI gate in .github/workflows/ci.yml::test job |
| ✅ | SC-6 | whilly.core imports no I/O / transport modules + no os.chdir/os.getcwd call sites in core | lint-imports (.importlinter core-purity contract) + grep — exercised by test_release_smoke.py::test_sc_6_lint_imports_core_purity_kept; CI gate in .github/workflows/ci.yml::arch-guard job |
How to verify
A green release smoke is the single command that proves all six SCs:
# Prereqs: Docker daemon up (testcontainers spins postgres:15-alpine)
# .venv with `pip install -e '.[dev]'` applied
.venv/bin/python -m pytest tests/integration/test_release_smoke.py -v
Expected output (last line):
============================== 6 passed in ~25s ==============================
A red run blocks the tag. Triage by reading the assertion message of the failing node — it carries the inner pytest’s stdout/stderr verbatim.
CI pipeline status
The same 6-SC contract is enforced on every PR via .github/workflows/ci.yml. The release candidate must show all jobs green on feat/v4-rewrite’s PR:
lint— ruff check + formatarch-guard— lint-imports + os.chdir grep (SC-6)type-check— mypy –strict whilly/core/test— pytest tests/unit/ + coverage –fail-under=80 (SC-5)agent-backends— v3 legacy backend registry tests (kept for one cycle)
PR: #218
Documentation — all four ship
README.md— v4 quickstart on one screen (commitaec8477)CHANGELOG.md—[4.0.0]section (commitaec8477)docs/Whilly-v4-Architecture.md— Hexagonal layout, data flow, concurrency primitivesdocs/Whilly-v4-Migration-from-v3.md— env-var mapping, CLI surface mapping, breaking changesdocs/Whilly-v4-Worker-Protocol.md— HTTP API spec for non-Python workersdocs/demo-remote-worker.sh— operator-facing SC-3 reproducer
Tagging
After this checklist lands and the release smoke is green on the final commit of the refactoring-1 plan:
# Annotated tag — message captures the version + the release date.
git tag -a v4.0.0 \
-m "Whilly v4.0.0 — distributed orchestrator (Hexagonal rewrite)" \
-m "" \
-m "Six PRD Success Criteria green via tests/integration/test_release_smoke.py." \
-m "Migration guide: docs/Whilly-v4-Migration-from-v3.md" \
-m "Architecture: docs/Whilly-v4-Architecture.md" \
-m "Worker HTTP protocol: docs/Whilly-v4-Worker-Protocol.md"
# Push the tag to origin
git push origin v4.0.0
The v4.0.0 tag is what PyPI’s GitHub release workflow consumes — publishing the wheel happens out-of-band (manual python -m build && twine upload or via the existing .github/workflows/release.yml if it has been re-flowed for v4 — verify before the push).
Post-tag
- PyPI release:
python -m build && twine upload dist/* - PyPI release for the meta-package:
cd whilly_worker && python -m build && twine upload dist/* - GitHub Release notes: copy from
CHANGELOG.md::[4.0.0] - Convert PR #218 from draft → ready-for-review (or merge directly, depending on team policy)
- Announce:
mshegolev/whilly-orchestratorREADME badge update
Out of scope for v4.0 — tracked for v4.1
- Per-worker bearer rotation (currently shared cluster bearer; see
docs/Whilly-v4-Worker-Protocol.md) - Budget guards (
WHILLY_BUDGET_USD) - File-based audit log mirror of
eventstable - PRD wizard /
--init/--prd-wizard(v3-only) whilly --reset PLAN.jsonv4 equivalent- Removal of
whilly/cli_legacy.py - Cross-platform smoke (windows / macOS) — v4 is Linux-shaped
These are known gaps, not regressions. The PRD (docs/PRD-refactoring-1.md) has follow-up issues for each.