Release preparation — family 1.4.0 (published 2026-10-04); the next cycle is not yet opened¶
The one-off companion of RELEASE.md (the durable workflow): the state of the release
currently being prepared. Current state: the family 1.4.0 release (flow 1.3.0, coupling 1.1.1,
metapackages peclet / peclet-cu13 1.4.0; core 1.4.0 the day before) was published on
2026-10-04 — §12.9. No later cycle has been opened. When one is, re-cut this file as RELEASE.md §9
says: archive §12 next to the earlier cycles and start a new section from RELEASE.md's phase
headers.
Still open from the 1.4.0 cycle (§12.9): Phase F (Snellius package) and Phase G (LUMI) — both
need the user, as they spend billed cluster time; the gallery re-check (RELEASE.md §10); a quiet-GPU
timing of the CUDA backward-facing step against v1.2.0; the pocket mask for get_p and the traction
(a CHANGELOG known limitation).
Carried into the next cycle (found by the pre-flight and the doc clean-up, 2026-10-08):
- Core must be tagged before flow ships. flow
mainincludespeclet/core/scheme/cut_cell_geometry.hppandprobe_flux.hpp, which are absent at its pinv1.4.0: a wheel would not compile. Cut the core tag, repin flow (PECLET_CORE_TAG), then release.tools/release/check_release_state.shflags it. - coupling's next version is a minor bump: the
eps_mindefault changed 0.25 → 0.05 (results change wherever ε fell below 0.25; CHANGELOG [Unreleased]; register, coupling). - The pre-flight's docstring audit fails locally because
peclet.halo/geom/amr/couplingare not installed in the suite venv — an environment gap, not a package defect; install or point it at the build trees before trusting the audit. - Needs the user — GitHub hygiene: (a) ~40 remote branches already merged into
main(core, flowvof-p*/telescope/kokkos-migration…, dem, voro, umbrella) can be deleted without loss — blocked for agents by the permission policy; (b) ~35 open Dependabot GitHub-Actions PRs across core, morton, flow, dem, voro and the umbrella (some from July): apply as direct commits or close. - Doc debt to check in the release docs pass: flow
doc/porous_drag_scheme.md§2 may still show the plain-u predictor/projection coefficients without ε (ρε inertia landed in flow2d1564a); flowdoc/velocity_mg_plan.mdmay cite stale names (set_ibm_solid,setVelocityStaircaseCoarse); flowAGENTS.mdnot re-checked against the compacted CLAUDE.md;docs/DEVELOPMENT.md,CORE_BOUNDARY.md,AGENT_WORKFLOW_HARDENING.mdare not in the mkdocs nav (mkdocs build --strictnot run); dead plain-text paths inPHYSICAL_UNITS_PLAN.md:319,321,415,459(core/python/amr_bindings.cpp,test_amr.pymoved to amr) andROADMAP.md:101(dem/mpi/test_particle_migration.cpp); flowquality.ymlstill excludes sixvof-w4files from clang-format althoughvof-w4is superseded.
Earlier cycles, archived verbatim:
- archive/RELEASE_PREP_1.0-1.1.md — 1.0.0 (2026-09-12), 1.0.1 (2026-09-14) and 1.1.0 (2026-09-16), §0–§11 with their original numbering. Its open lists were not re-verified when it was archived — check each item against the repos before acting: the operator-storage follow-ups (§1.2 items 2–4), open technical issues (§5), decisions needed (§6), physical domains (§7).
- archive/RELEASE_PREP_0.7.x.md — 0.7.0/0.7.1/0.7.2.
- The 1.2.x and 1.3.0 umbrella releases (2026-09-21, 2026-09-27) have no RELEASE_PREP record; see the CHANGELOG.
Section 12 keeps its number so that citations of "RELEASE_PREP §12.x" (the decision register cites §12.5) stay valid.
12. CYCLE — family 1.4.0 (opened 2026-10-03)¶
Prepared up to, not including, any outward step (no push, tag, publish, GitHub release or workflow
dispatch). Every change sits on a local branch rel-1.4.0 in a sibling worktree, ready for
git merge --ff-only. The coordinator publishes on the user's go.
12.1 Versions (RELEASE.md §4.1)¶
| Package | Old → new | Why |
|---|---|---|
| peclet-halo / peclet-core | 1.4.0 (released alone today) | not re-released; flow and coupling pin v1.4.0 |
peclet-flow (+ -cu13) |
1.2.0 → 1.3.0 | minor: march_to_steady, set_pressure_bottom_solver, the force API (hydro_force_torque() deprecated), the GPU device bottom (a named numerics change) |
| peclet-coupling | 1.1.0 → 1.1.1 | patch: the traction reader + fallback, core pin |
| peclet / peclet-cu13 | 1.3.0 → 1.4.0 | pins changed; the LE claim removed from the page; [mpi] → peclet-core 1.4.0 |
peclet-voro (+ -cu13) |
1.0.4 (kept) | the one commit since v1.0.4 removes three stale scripts under mpi/ and edits docs; the README (its PyPI page) never carried the Lees–Edwards or "14–17 M cells/s" claims (checked at v1.0.4 and main); LE lived in the umbrella README/docs/index.md, fixed there. Open question Q1. |
| peclet-morton | 1.0.2 (kept) | one commit: the vcpkg port file (not in any wheel) |
| peclet-geom | 1.0.1 (kept) | one commit: a module docstring date (peclet-core 1.3.1, not 1.3.0); its vendored core geom/*.hpp are byte-identical v1.3.0 → v1.4.0 (git diff --quiet) |
| peclet-amr | 0.2.0 (kept) | one commit: a design-note pointer |
| peclet-pnm, peclet-dem | kept | no commits since their tags |
12.2 Branches (worktrees left in place)¶
- flow
rel-1.4.0(suite/flow-rel140): version bump, cell-unit trap docstrings, README capabilities; rebased onto flow mainb63402dafter the battery. The tested tree (ff6402c) and the release head differ only underdoc/andtests/study/(git diff --statoutside those: empty). - coupling
rel-1.4.0(suite/coupling-rel140): core pin v1.4.0, version bump. - voro
rel-1.4.0(suite/voro-rel140): core pin v1.4.0, 1.0.5 bump — prepared but not pinned by the metapackage (Q1); publish only if Q1 is answered "release". - umbrella
rel-1.4.0(.claude/worktrees/rel140): api-autogen (rebased:f4ccf80,f203911,f6295e7cherry-picked cleanly onto origin/main 5251d49), the LE fix, the metapackage pins, the release-tooling binding map, this section, the CHANGELOG, and the submodule gitlinks. - dem
suite/dem-rel140(detached at origin/main): build trees for the coupling tests only.
12.3 Checklist¶
- [x] A: state pre-flight; worktree branches of flow/core/dem/voro/amr are campaign branches, not in this release (parked by scope).
- [x] B: test matrix (§12.4).
- [x] C: versions (§12.1),
PECLET_CORE_TAG v1.4.0in coupling (and voro's prepared branch). - [x] D: landing pages (flow README gains steady states + forces; umbrella README loses LE),
check_landing_pages.py,check_docs_snippets.py --ref origin/main --run(§12.5),mkdocs build --strictwith generated pages. - [ ] E: publish (coordinator, after the user's go) — §12.6.
- [ ] H: containers (now with geom + amr), Site dispatch, GitHub Releases, Zenodo.
12.4 Test matrix (2026-10-03, host-openmp and nvidia-cuda prefixes, MPI on, --bind-to none)¶
| Repo | host-openmp | nvidia-cuda | Notes |
|---|---|---|---|
flow rel-1.4.0 |
194/194 (-LE bench) |
194/194 | host first pass at 4 threads/rank, -j4, load 57–75: 96 passed, then velocitymg_bc_mpi_np4, sdflow_mpi_np4, sdflow_colocated_mpi_np4 hit the 3600 s timeout (OpenMP spin under oversubscription, the flow/CLAUDE.md trap). Stopped and re-ran the remaining 98 at 2 threads/rank, -j3: 98/98, those three in 7.8 s, 14.9 s and 430 s. Not a code failure. |
| flow verify scripts | PASS ×3 | PASS ×3 | verify_periodic_spheres_sdflow, verify_channel_sdflow, verify_bfs_sdflow (poiseuille, lid cavity, regression are ctests above). CUDA BFS: the first run hit its 3600 s timeout with the GPU shared by another session (the process sat in cudaDeviceSynchronize, i.e. GPU-bound); re-run with a 9000 s budget: PASS in 5056 s, x_r/S 5.26 / 8.16 identical to the host. Per step 0.18 / 0.25 s on the shared GPU vs 0.13 / 0.14 s on 8 host threads; the case is a small quasi-2D grid with a non-singular operator, so the new device bottom is not engaged (GraphAMG, as in 1.2.0). Not attributed; worth a quiet-GPU timing against v1.2.0 after the release |
coupling rel-1.4.0 |
3/3 | 3/3 | against flow rel-1.4.0 + dem origin/main build trees (PECLET_FLOW_BUILD / PECLET_DEM_BUILD set); traction smoke: no DeprecationWarning, split filled |
voro rel-1.4.0 (prepared, Q1) |
42/42 | 42/42 | CUDA first pass 41/42: repair_sdf_mpi_np4 failed to allocate 4.6 MiB on the GPU while the flow CUDA battery shared it; re-run alone: PASS (7.6 s) |
| docs | — | — | check_docs_snippets.py --ref origin/main --run (with the fixed binding map): NAMES PASS; RUN PASS ×3 (README, index, notebook; k = 1.2410e-01); mkdocs build --strict PASS with pages generated from the MPI build trees |
| geom, amr wheels | built | — | pip wheel ./geom, pip wheel ./amr against host-openmp: both build and import (peclet.amr OpenMP) — de-risks the new cpu.def lines (the Apptainer image itself is built only in CI) |
12.5 Pre-tag checks¶
- dem: dense periodic growth of an elongated grid-SDF particle — does not reproduce. The
2026-07-04 crash (position → inf → segfault at scale ~0.85) was reproduced by protocol on dem
main (
2b0aebd= v1.1.0, no commits since): abuild_particlespherocylinder (L/D 3.2, 288 shell points), fully periodic cube, forced linear scale ramp 0.3 → 1.0 (no overlap gate) over 1400 steps + 600 settle. CUDA N 200 φ 0.50: PASS, positions finite throughout, max overlap 5.6 % of the particle length; host-openmp, same case: PASS, 1.3 %; CUDA N 400 φ 0.60: PASS through scale 0.85–0.875 and to the end, finite — but the forced ramp past jamming ends at max overlap 0.82 of the length (expected for an un-gated ramp, not a crash). Consistent with dem7b5d1b8having fixed the OOB writes. Script:dem_elongated_periodic_growth.py(session scratchpad; recorded in the coordinator report). - CUDA teardown abort — not reproduced on the CUDA build tree.
peclet.flow(nvidia-cuda prefix, flowrel-1.4.0): N 32 sphere, 5 steps, interpreter exit with the Solver alive → exit 0; same with adiagnostics.field_viewcapsule held past exit → exit 0. The fix is flow3035320(Releasable solver + capsule, atexit release-then-finalize), shipped since flow 0.5.0; the open-item note was stale. Thepeclet-flow-cu13wheel itself was not built locally (its CI cuda-wheel job builds it at the tag;gh workflow run release.ymlwould dry-run it but is a workflow trigger, outside this preparation). cell_centers()vs analytic scene, cell units — confirmed and documented. Without an extentcell_centers()= i + 1/2;set_sceneplaces cell i's centre at i. The same sphere installed throughset_solid(SDF sampled on cell_centers())and throughset_scenediffers in its blocked x-face centroid by (0.5, 0.5, 0.5) cells (N 24); withextent=the difference is- Docstrings of
cell_centersandset_scenenow say so (flow4cf66df); CHANGELOG known limitation; a register entry deferring the API fix to 2.0.0 is DRAFTED for the user (not committed).
12.6 Before publishing — user actions, then the sequence¶
User actions before publishing:
- The go for the release (scope: flow 1.3.0, coupling 1.1.1, metapackages 1.4.0; Q1 voro).
gh auth refresh -s workflow— the umbrella branch changes.github/workflows/containers.ymlandsite.yml; a push without theworkflowscope is refused.- Answer or accept the defaults of the open questions (§ coordinator report): Q1 voro, Q2 the cell-centers register entry.
Sequence (RELEASE.md §6; each member's release.yml runs landing-pages before publish):
- flow: if
origin/mainmoved,git -C flow-rel140 rebase origin/main(only doc commits so far) — thengit -C flow-rel140 push origin rel-1.4.0:main;git -C flow-rel140 tag v1.3.0 && git -C flow-rel140 push origin v1.3.0; watch Release (CPU wheels + cuda-wheel, ~90 min); confirmpip index versions peclet-flowandpeclet-flow-cu13show 1.3.0. - coupling: same with
coupling-rel140, tagv1.1.1; confirmpeclet-coupling1.1.1. - umbrella: re-point the gitlinks if flow or coupling were rebased
(
git update-index --cacheinfo 160000,<sha>,flowin.claude/worktrees/rel140, amend the pointer commit), thengit push origin rel-1.4.0:main,git tag v1.4.0, push the tag → Release (landing-pages, the two metapackages, quickstart) and Containers (cpu/cuda/hip; the cpu leg dispatches Site withimage_tag=1.4.0). - GitHub Releases: flow
v1.3.0, couplingv1.1.1, umbrellav1.4.0, body = the CHANGELOG sections → Zenodo version DOIs. - Smoke in a fresh venv:
pip install peclet==1.4.0(+peclet-cu13on the GPU box, +peclet[mpi,cfd-dem]),check_docs_snippets.py --installed --run.
12.9 PUBLISHED — family 1.4.0, 2026-10-04 (user go 2026-10-03)¶
- PyPI: peclet-flow + peclet-flow-cu13 1.3.0 (tag v1.3.0 on 7c95c20; 13/13 Release jobs, CUDA wheels cp310–cp314), peclet-coupling 1.1.1 (v1.1.1 on 485ca1f), peclet + peclet-cu13 1.4.0 (umbrella v1.4.0 on 00078fb; Release incl. landing-page and quickstart jobs green). peclet-halo / peclet-core 1.4.0 the day before (core v1.4.0 on c656ccb).
- Not re-released: voro 1.0.4 (§12 Q1: the stale claims were on the umbrella page, fixed), dem, pnm, morton, geom, amr.
- Containers: cpu, cuda-sm80, cuda-sm90 AND hip-gfx90a all green. The CPU leg dispatched Site with the 1.4.0 image: the API pages for flow (march_to_steady), amr and halo/geom are generated, none a "not importable" stub.
- GitHub Releases / Zenodo: core v1.3.2 and v1.4.0 (neither had one), flow v1.3.0, coupling v1.1.1, umbrella v1.4.0.
- Smoke: fresh venv
peclet==1.4.0andpeclet-cu13==1.4.0import (versions as pinned;march_to_steadypresent);check_docs_snippets.py --installed --runPASS on README, index and quickstart notebook (k = 1.2410e-01, N 32) once matplotlib is installed (the snippets plot; not a peclet dependency). - Tag type: flow v1.3.0 and core v1.4.0 are lightweight (convention: annotated);
describe --tagstooling unaffected. - NOT done (need the user: billed cluster time): Phase F Snellius package, Phase G LUMI; gallery re-check (§10).
- Follow-ups: quiet-GPU compare of the CUDA backward-facing step against v1.2.0 (0.18–0.25 s/step vs 0.13–0.14 s on 8 host threads, unattributed); pocket mask for get_p + pocket cells out of the traction (CHANGELOG known limitation).