8000 Record the 0.5.0 publication; finalize step before tagging (#48, #71) by rafatahmed · Pull Request #72 · rafatahmed/Flahax · GitHub
[go: up one dir, main page]

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# Changelog

## 0.5.0 — Unreleased
## Unreleased

- Record the 0.5.0 publication. The published 0.5.0 manual and changelog still carry the release-candidate wording ('not yet published', 'Unreleased'); they are corrected here, and the publishing procedure now has an explicit finalize step before tagging (#71).

## 0.5.0 — 2026-10-20

- Publish Benchmark v1 snapshot 2026-10-20-linux-df0d30b (hosted run 39515183621 on `main`, after #62, #65 and #69), the first with every correctness gate passing: 7/7 controlled NNLS cases, 21/21 stored chemistry comparisons, 17/17 timing workloads; complete recipes 34/52 (was 29/52). The results page no longer calls a fully passing scorecard 'not fully passing' (#66).
- Fix `recommend()` slowness and start-dependent recipes under incidental-ion ceilings (#68). Two root causes, both measured against SciPy on every fit: the NNLS optimality test used one tolerance scaled by the whole matrix (max |A| times |b|), so a heavily weighted row hid real descent directions in the other columns and NNLS stopped early (doses off by up to 4.2e-3 g/L); it now bounds each column's dual weight by the rounding error of its own terms. And a binding ceiling was enforced by a 1024-weight penalty, which left the problem so flat in double precision that doses were fixed only to ~2e-3 g/L and depended on the solver's starting point. A binding ceiling is now a constraint: a weight-8 row whose aim is shifted by the Lagrange multiplier, found by a bracketed secant search, with one Gram cache per search. Every ceiling fit now matches SciPy to 1.4e-10 g/L, warm and cold starts agree to 7e-9 g/L, and binding ions land on their aim. Over the 52 benchmark recipes `recommend()` is 34% faster with the default ammonium limit (4.20 -> 2.78 s) and unchanged with a 3 mmol/L Cl ceiling (3.77 -> 3.87 s); the Benchmark v1 formulation workload falls from about 30 to 16 ms. Pass counts are unchanged by default (34/52 recipes, 571/636 targets) and rise with the Cl ceiling (41 -> 42 recipes, 598 -> 599 targets), with no limit violations; the 10 recipes that change have equal or better target fit.
Expand Down
2 changes: 1 addition & 1 deletion docs/development-status.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Water-to-delivery development status

Updated 2026-10-21. **0.5.0 is prepared, not published** (see the [0.5.0 preparation record](site/evidence/release-evidence.md#050-preparation---2026-10-21)). **0.4.0 is published on PyPI** (tag `v0.4.0`; Apache-2.0, measured-pH water balancing) through the [hardened release workflow](publishing.md); see the [0.4.0 publication evidence](site/evidence/release-evidence.md#040-publication---2026-10-17). Before it, **0.3.1** was published (tag `v0.3.1`); see the
Updated 2026-10-21. **0.5.0 is published on PyPI** (tag `v0.5.0`; see the [0.5.0 publication evidence](site/evidence/release-evidence.md#050-publication---2026-10-20)). **0.4.0 was published on PyPI** (tag `v0.4.0`; Apache-2.0, measured-pH water balancing) through the [hardened release workflow](publishing.md); see the [0.4.0 publication evidence](site/evidence/release-evidence.md#040-publication---2026-10-17). Before it, **0.3.1** was published (tag `v0.3.1`); see the
[publication evidence](site/evidence/release-evidence.md#031-publication---2026-10-17).
The matrix below describes the 0.3.1 capabilities and their boundaries.

Expand Down
33 changes: 23 additions & 10 deletions docs/publishing.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,17 @@ pushing a tag.
reference; write the changelog section; record readiness and evidence.
Merge it by pull request after CI passes.
2. Confirm the publication decision with the owner. Merging is not approval.
3. Create the GitHub Release for tag `v<version>` on the merged `main`
3. **Finalize the wording before tagging** (#71): on a short branch, date the
changelog section and change the manual's version line from "release
candidate ... not yet published" to "released <date>"; merge it after CI
passes. The tag must point at this commit, because the packaged manual and
the sdist changelog are fixed at upload.
4. Create the GitHub Release for tag `v<version>` on that merged `main`
commit, with the changelog section as its notes. Publishing it starts the
workflow.
4. Review the run: the guard notice, all test jobs, the live replay and the
5. Review the run: the guard notice, all test jobs, the live replay and the
artifact hashes in the build summary. Then approve the `pypi` deployment.
5. After upload: check PyPI metadata, install `flahax==<version>` in a fresh
6. After upload: check PyPI metadata, install `flahax==<version>` in a fresh
environment, run the manual's examples and both CLI entry points, and
record the date, run URL and hashes in [release evidence](site/evidence/release-evidence.md).

Expand All @@ -76,18 +81,21 @@ Dashboard settings, recorded here because they live outside the repository:
- The default version is `latest` until that release, then `stable`.
- Never put a Read the Docs token in the repository.

## Checklist (in progress: 0.5.0)
## Checklist (last run: 0.5.0)

- [x] Choose the version and align metadata, runtime version, citation, manual and changelog.
- [x] Review compatibility, scientific provenance and distribution contents.
- [x] Pass local tests with live PHREEQC and isolated wheel/sdist verification.
- [ ] Observe successful hosted Python 3.11–3.13 checks on the merged revision.
- [ ] Obtain explicit publication authorization.
- [ ] Publish the `v0.5.0` GitHub Release; review the run; approve the deployment.
- [ ] Verify PyPI metadata and a fresh installed-package check; record the date, run and hashes.
- [ ] Confirm the Read the Docs `stable` version builds `v0.5.0` and serves the benchmark pages (#48).
- [x] Observe successful hosted Python 3.11–3.13 checks on the merged revision.
- [ ] Date the changelog and the manual's version line, and merge, before tagging. **Missed for 0.5.0** (#71); do it for every release.
- [x] Obtain explicit publication authorization.
- [x] Publish the `v0.5.0` GitHub Release; review the run; approve the deployment.
- [x] Verify PyPI metadata and a fresh installed-package check; record the date, run and hashes.
- [x] Confirm the Read the Docs `stable` version builds `v0.5.0` and serves the benchmark pages (#48).

Completed 2026-10-20 apart from the finalize step. Copy this checklist, with that step, for the next release.

## Checklist (last run: 0.4.0)
## Checklist (0.4.0)

- [x] Choose the version and align metadata, runtime version, citation, manual and changelog.
- [x] Review compatibility, scientific provenance and distribution contents.
Expand Down Expand Up @@ -125,6 +133,11 @@ package was uploaded.

## 8000 Release history

- **0.5.0**, 2026-10-20: published through the hardened workflow (run
`39517327774`) from `692108b`; the deployment was approved at the owner's
instruction after artifact review, and verified by a fresh installation from
PyPI. The packaged manual and changelog still say "not yet published" (#71).
See the [0.5.0 publication evidence](site/evidence/release-evidence.md#050-publication---2026-10-20).
- **0.4.0**, 2026-10-17: first Apache-2.0 release and first upload through the
hardened workflow with Trusted Publishing (run `39043172800`), approved by
the owner, verified by a fresh installation from PyPI. See the
Expand Down
4 changes: 3 additions & 1 deletion docs/release-readiness.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

The current preparation comes first; dated audits below it are history.

## 0.5.0 - preparation 2026-10-21
## 0.5.0 - published 2026-10-20

Published from `692108b` (tag `v0.5.0`); see the
[publication evidence](site/evidence/release-evidence.md#050-publication---2026-10-20).
Prepared on `release/0.5.0` from `main` at `9bea54a`. The evidence is the
[0.5.0 preparation record](site/evidence/release-evidence.md#050-preparation---2026-10-21).

Expand Down
33 changes: 33 additions & 0 deletions docs/site/evidence/release-evidence.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,39 @@ They are kept here because the records cite them.
| 0.3.1 | 2026-10-17 | Published | [Publication](#031-publication-2026-10-17), [release audit](#031-release-audit-2026-10-17), [documentation audit](#031-documentation-audit-2026-10-02), [preparation](#031-preparation-2026-10-01) |
| 0.3.0 | 2026-09-27 | Yanked 2026-10-17 | [Publication exception](#030-authorized-publication-exception-2026-09-27), [automated evidence](#030-automated-evidence), [P2/P3 acceptance](#p2p3-end-to-end-numerical-acceptance), [continuation](#package-and-delivery-continuation-2026-09-27), [cleanup](#030-release-readiness-cleanup), [preparation](#030-preparation) |

## 0.5.0 publication (2026-10-20)

0.5.0 was published to PyPI on **2026-10-20** (23:51 UTC) by the hardened release
workflow (run [`39517327774`](https://github.com/rafatahmed/Flahax/actions/runs/39517327774)),
triggered by the GitHub Release for tag `v0.5.0` on `main` at `692108b` (merge of
[PR #70](https://github.com/rafatahmed/Flahax/pull/70)). Hosted CI had passed on `692108b`
([run 39517146974](https://github.com/rafatahmed/Flahax/actions/runs/39517146974): Python
3.11, 3.12 and 3.13, live PHREEQC replay, docs). The owner authorized publication
and instructed approval of the `pypi` deployment, which was then approved through
the GitHub API after the review below.

| Check | Result |
|---|---|
| Release guard | Tag `v0.5.0` matched `pyproject.toml`; "flahax 0.5.0 is not on PyPI; continuing to verification" |
| Workflow gates on `692108b` | Tests on Python 3.11, 3.12 and 3.13 with clean wheel/sdist verification, live PHREEQC replay, one build with `twine check --strict` (both PASSED): all passed before the approval gate |
| 8000 Pre-approval artifact review | The workflow's artifacts were downloaded and inspected before approval. `USER_GUIDE.md`, `API_REFERENCE.md`, `chemistry_25c.json` and `library.json` in both the wheel and the sdist match the hashes in the 0.5.0 preparation record. Metadata: version 0.5.0, `License-Expression: Apache-2.0`, `Requires-Python: >=3.11`, no runtime dependency. Sdist 468 files with no PDF and no `docs/publication/` file |
| PyPI upload | Wheel 2026-10-20 23:51:03 UTC (172,854 bytes); sdist 23:51:05 UTC (5,117,131 bytes). PyPI reports 0.5.0 as the latest version, licence `Apache-2.0`, `Requires-Python >=3.11`, not yanked |
| Hash identity | The SHA-256 values on PyPI equal those of the reviewed workflow artifacts, and a fresh `pip download` of the wheel matches |
| Fresh install from PyPI | New Python 3.14.0 virtual environment outside the checkout, `pip install flahax==0.5.0`. The release smoke test from `tools/verify_distribution.py` passed: version, all public exports, nine manual examples, 30 catalogue products, both CLI entry points, planning EC 1.15 mS/cm; installed resource hashes as below |
| Documentation | Read the Docs `stable` serves 0.5.0, including [Benchmark v1 results](https://flahax.readthedocs.io/en/stable/evidence/benchmark-results.html) (snapshot `2026-10-20-linux-df0d30b`) and the [competitor comparison](https://flahax.readthedocs.io/en/stable/evidence/competitor-comparison.html) (#48) |
| Known wording defect | The published manual (line 5) says "release candidate prepared 2026-10-21; not yet published" and the sdist changelog says "0.5.0 — Unreleased": the finalize step that 0.4.0 performed before tagging was not done. Code and data are unaffected; corrected on `main` (#71) |

| Artifact | SHA-256 |
|---|---|
| `flahax-0.5.0-py3-none-any.whl` | `c209476ae768f79da807068073aacbd55d3ffb6f59024f88e7cff83cb4359141` |
| `flahax-0.5.0.tar.gz` | `08ca45bc53645a482a57d01a73c6b028f42ce7e7af288b930202d02887e5ab3c` |

Installed resources: `USER_GUIDE.md` `92f5d5806b1f0931df05fe490b738b8b277486d70a21d6ea53e2839f36c5ffb9`;
`API_REFERENCE.md` `db350573e41e407468d0ddb7bd7b86304c80562baf8d6b77d146d4f8df1ab9c8`;
`chemistry_25c.json` `ad87363818ccc2471c1343a0791f9ae63798bc0b3530b5b710344aff3077188f`;
`library.json` `dfc65ac7fc0060ebe760870b832e6c2c4febce2babf8cfa9defa6a858e28a05a`.
The thermodynamic data are unchanged since 0.3.1.

## 0.5.0 preparation (2026-10-21)

Prepared revision: `release/0.5.0`, cut from `main` at `9bea54a` (merge of
Expand Down
2 changes: 1 addition & 1 deletion src/flahax/data/USER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Fertilizer formulation • bounded chemistry • reviewed delivery planning

**Version:** 0.5.0, release candidate prepared 2026-10-21; not yet published. See the repository's release evidence.
**Version:** 0.5.0, released 2026-10-20. The release workflow ran the Python 3.11–3.13 checks and the live PHREEQC replay on the tagged commit; see the repository's release evidence.

## Contents

Expand Down
Loading
0