Skip to content

Automate releases, and cut 2.3.0 - #158

Merged
guilyx merged 1 commit into
mainfrom
claude/library-demo-plots-webpage-8r8uz4
Aug 4, 2026
Merged

Automate releases, and cut 2.3.0#158
guilyx merged 1 commit into
mainfrom
claude/library-demo-plots-webpage-8r8uz4

Conversation

@guilyx

@guilyx guilyx commented Aug 4, 2026

Copy link
Copy Markdown
Member

The actual problem

PyPI has been serving jupyddl 0.4.1 — the original Julia-backed wrapper — since long before the pure-Python rewrite landed. There was no release automation and nobody published by hand, so pip install jupyddl has been handing people a different library than this repository documents, across four minor versions (1.0.0, 2.0.0, 2.1.0, 2.2.0).

The README says pip install jupyddl and then describes a dependency-free planning framework. Today that install gives you something that wants Julia.

What lands

.github/workflows/release.yml — push a tag, get a release:

git tag -a v2.3.0 -m "jupyddl 2.3.0" && git push origin v2.3.0

Build → verify → publish to PyPI → cut the GitHub Release from that version's changelog section.

Authentication is PyPI Trusted Publishing (OIDC), so there is no API token in this repository to leak, rotate, or forget about. That trade costs one piece of setup only a PyPI maintainer can do — see below.

Four things it refuses to do

Each is a way a release goes wrong quietly, and PyPI never lets you take a version back:

Refusal Why it matters
Tag disagrees with pyproject.toml publishing 2.3.0 from a v2.4.0 tag is unfixable
jupyddl.__version__ disagrees with the metadata a package reporting a different version at runtime is a support ticket with no obvious cause
twine check --strict objects malformed metadata renders as raw text on the project page, fixable only by another release
The built wheel does not work it is installed into a clean venv, away from the source tree, and made to generate and solve an instance — which is what catches a module missing from the wheel

workflow_dispatch runs the same pipeline against TestPyPI, so this workflow can be changed without spending a real version number.

The pypi job is the only one gated on the trusted publisher, so a tag pushed before that setup exists still produces verified artifacts rather than a half-finished release.

⚠️ One-time setup only a maintainer can do

The pypi job will fail until this exists. On https://pypi.org/manage/project/jupyddl/settings/publishing/:

Field Value
Owner APLA-Toolbox
Repository name PythonPDDL
Workflow name release.yml
Environment name pypi

The environment name is load-bearing — PyPI rejects a token minted from anywhere else, which is what stops a workflow added later by someone else from publishing.

Optionally add yourself as a required reviewer on the pypi environment if you would rather a mistaken tag not reach PyPI unattended.

Full runbook in docs/RELEASING.md.

2.3.0

Closes the changelog section that accumulated the learned heuristics, the RL stage, and the CI work. Metadata filled out for a listing people will actually read: Python 3.9–3.14 classifiers, audience and status, changelog/issues/workbench URLs, and a real pip install jupyddl block in the README.

Two deliberate omissions:

  • Development Status is Beta, not Stablejupyddl.learn is new and its API will move.
  • No Typing :: Typed classifier — there is no py.typed marker and the annotations are not complete enough to claim one.

Verified locally, end to end

  • Builds; twine check --strict passes on both sdist and wheel.
  • Version guards accept v2.3.0 and refuse v2.4.0.
  • Changelog extraction pulls the right 4466 characters.
  • Wheel installs into a clean environment and solves an instance, reporting 2.3.0.
  • 415 tests green, flake8 and black clean, all five workflow files parse.

Generated by Claude Code

PyPI has been serving `0.4.1` -- the original Julia-backed wrapper --
since long before the pure-Python rewrite landed. There was no release
automation and nobody published by hand, so `pip install jupyddl` has
been handing people a different library than this repository documents,
for four minor versions. That is the actual bug being fixed here.

`.github/workflows/release.yml` fires on a `v*` tag: build, verify,
publish, cut the GitHub Release from the changelog section for that
version. Authentication is PyPI Trusted Publishing over OIDC, so there
is no API token in this repository to leak or rotate. It costs one
one-time setup on PyPI that only a project maintainer can do, written up
in docs/RELEASING.md.

Four things it refuses to do, because each is a way a release goes wrong
quietly and PyPI will not let you take a version back:

- a tag that disagrees with pyproject.toml
- a `jupyddl.__version__` that disagrees with the metadata
- anything `twine check --strict` objects to
- a wheel that does not work -- it is installed into a clean
  environment, away from the source tree, and made to generate and solve
  an instance, which is what catches a module missing from the wheel

`workflow_dispatch` runs the same pipeline against TestPyPI so this file
can be changed without spending a real version number.

The `pypi` job is the only one gated on the trusted publisher, so a tag
pushed before that setup exists still produces verified artifacts rather
than a half-finished release.

2.3.0 closes the changelog section that had accumulated the learned
heuristics, the RL stage and the CI work. Metadata filled out for a
listing people will actually read: Python 3.9-3.14 classifiers, audience
and status, changelog/issues/workbench URLs. Development Status is Beta
rather than Stable on purpose -- jupyddl.learn is new and its API will
move. No `Typing :: Typed` classifier, because there is no py.typed
marker and the annotations are not complete enough to claim one.

Verified locally end to end: builds, `twine check --strict` passes on
both artifacts, the version guards accept v2.3.0 and refuse v2.4.0, the
changelog extraction pulls the right 4466 characters, and the wheel
installs clean and solves an instance reporting 2.3.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Meb35zHKsyBkH2sbWoyKMT
@cursor

cursor Bot commented Aug 4, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@mergify
mergify Bot requested a review from sampreets3 August 4, 2026 07:24
@mergify

mergify Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Tick the box to add this pull request to the merge queue (same as @mergifyio queue).

  • Queue this pull request

@guilyx
guilyx merged commit 861ee88 into main Aug 4, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants