From a152f85ee610ebf4513a966dfbbc6f4b70930897 Mon Sep 17 00:00:00 2001 From: Jarry Shaw Date: Fri, 18 Sep 2026 18:25:45 -0400 Subject: [PATCH 1/2] release: bump to 1.5.0b1, the wave-1 beta Wave 1 is closed -- twelve PRs merged and ten issues closed (#465, #472, #467, #445, #473, #476, #469, #477, #483, #443) -- so the two-step release plan in docs/source/pep.rst calls for a beta here, with the official 1.5.0 after the post-wave-1 consistency sweep. Version string only, and deliberately its own commit, because it IS the release trigger and should never be buried in an unrelated change. create-release.yml is version-driven rather than tag-driven, reached from an ordinary push: a push to main runs Vendor Update, whose completion runs Create Release, which reads pcapkit.__version__ and publishes only when the tag v does not yet exist. That gate is why nothing published today despite Create Release running on every push -- v1.5.0a1 is already tagged. v1.5.0b1 is not, so this commit publishes. Measured for this version: is_prerelease=True, so the GitHub release is marked prerelease and the Anaconda label stays dev; PyPI gets it but only `pip install --pre` resolves it. The consequential flip to a full release and the main conda label comes at 1.5.0, not here. #487 remains open and is deliberately not a wave-1 blocker. --- pcapkit/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pcapkit/__init__.py b/pcapkit/__init__.py index 8eba3c6c11..42c7cb5998 100644 --- a/pcapkit/__init__.py +++ b/pcapkit/__init__.py @@ -122,4 +122,4 @@ ] #: version number -__version__ = '1.5.0a1' +__version__ = '1.5.0b1' From 080b23b2b48fb5f1565aba276d59f12a40fd7631 Mon Sep 17 00:00:00 2001 From: Jarry Shaw Date: Fri, 18 Sep 2026 18:33:17 -0400 Subject: [PATCH 2/2] docs: bring the release plan in step with the 1.5.0b1 bump The sibling commit moves pcapkit.__version__ to 1.5.0b1, which made two statements in the release plan stale: the prose asserting the version "is already 1.5.0a1", and the table row labelling 1.5.0a1 as current. Step 1 is now marked done, with the two things the sweep has already turned up named rather than left abstract. Also records how create-release.yml is actually reached, which reading its `on:` block alone gets wrong -- it lists only a v* tag push and a workflow_run, which reads as "an ordinary commit cannot trigger this". The real chain is that a push to main runs Vendor Update, whose completion runs Create Release, and every publishing job is gated on the tag for the current version not already existing. That gate is why ordinary commits do not publish even though the workflow runs on all of them, and why changing the version string is what arms it. I had this wrong out loud today -- read the trigger list, concluded the version string was not the release button after all, and had to retract that after checking the run history. Writing the chain down so the next reader does not repeat it. Docs only. --- docs/source/pep.rst | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/docs/source/pep.rst b/docs/source/pep.rst index 073ed8cd55..270d11c1b2 100644 --- a/docs/source/pep.rst +++ b/docs/source/pep.rst @@ -850,14 +850,18 @@ rather than as a side effect of a checksum patch. Release Plan — 1.5.0 in Two Steps --------------------------------- -The version in :mod:`pcapkit` is already ``1.5.0a1``, and the release is -sequenced against the waves above in two deliberate steps: - -#. **A beta — ``1.5.0b1`` — when wave 1's remaining issues are closed.** Wave 1's - feature work has landed; what is left is the defect tail in `the issue tracker - `__. Closing it earns a beta, - not a final release, because the consistency sweep below has not run yet and - is expected to find things. +The version in :mod:`pcapkit` is ``1.5.0b1``, and the release is sequenced +against the waves above in two deliberate steps: + +#. **A beta — ``1.5.0b1`` — when wave 1's remaining issues are closed.** + *Done.* Wave 1's feature work had landed already; what remained was the + defect tail in `the issue tracker + `__, and closing it earned a + beta rather than a final release, because the consistency sweep below had not + run yet and was expected to find things. It has since found some: the + ipv6-route packing test was added only because the fix it covers had shipped + untested, and the `IPv6_Route` Source-Route round-trip defect was found + sideways while writing it. #. **The official ``1.5.0`` when the post-wave-1 consistency sweep is done.** The sweep is described under `Delivery Sequence`_ below — prose against code, missing tests, unaligned changes, and packet formats against the @@ -870,7 +874,23 @@ each step does before editing it.** ``.github/workflows/create-release.yml`` is version-driven rather than tag-driven: its ``version_check`` job reads ``pcapkit.__version__`` directly, derives ``PCAPKIT_PRERELEASE`` from ``packaging.version.Version(...).is_prerelease``, and picks the Anaconda label -from the same test. So: +from the same test. + +Worth spelling out how that workflow is *reached*, because reading its ``on:`` +block alone suggests it is not reachable from an ordinary commit at all — it +lists only ``push`` on ``v*`` tags and a ``workflow_run``. The chain is: + +.. code-block:: text + + push to main -> "Vendor Update" (cron-vendor.yml, which triggers on push to main) + -> "Create Release" (workflow_run, on Vendor Update completing) + +Every publishing job — ``github``, ``tag``, ``pypi``, ``conda`` — is gated on +``startsWith(github.ref_name, 'v') || PCAPKIT_TAG_EXISTS == 'false'``. That gate +is why ordinary commits do not publish: ``Create Release`` runs on each one, but +the tag for the current version already exists, so all four jobs skip. Changing +the version string is what makes ``PCAPKIT_TAG_EXISTS`` false, and the next push +then tags and publishes. So: .. list-table:: :header-rows: 1 @@ -880,11 +900,11 @@ from the same test. So: - prerelease - conda label - GitHub release - * - ``1.5.0a1`` (current) + * - ``1.5.0a1`` (shipped earlier) - yes - ``dev`` - marked prerelease - * - ``1.5.0b1`` (step 1) + * - ``1.5.0b1`` (step 1, **current**) - yes - ``dev`` - marked prerelease