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 at tests/integration/test_release_smoke.py prosecutes 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::dependencies pin = "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 + format
  • arch-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

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-orchestrator README 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 events table
  • PRD wizard / --init / --prd-wizard (v3-only)
  • whilly --reset PLAN.json v4 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.