Skip to content

chore: release 0.1.0rc1 - #1752

Merged
FBumann merged 1 commit into
mainfrom
claude/release-0.1.0rc1
Sep 25, 2026
Merged

FBumann merged 1 commit into
mainfrom
claude/release-0.1.0rc1

Conversation

@FBumann

@FBumann FBumann commented Sep 25, 2026 •

Copy link
Copy Markdown
Collaborator

Prompt: And prepare a todo list for me the same way. Also start with 0.1.0rc1

Note

The following content was generated by AI.

This is the release PR for 0.1.0rc1, the release candidate for the first PyPI upload. It is stacked on #1751. It stays a draft until PyPI can take the package. One direct reference is left, the linopy extra, and #1755 removes it (step 1).

The first PyPI release, step by step

1. What blocks the upload

PyPI refuses a distribution that names a git URL in its metadata.

2. One-time setup

PyPI

  • On pypi.org, go to Account → Publishing → "Add a new pending publisher" → GitHub, and fill in:
    • PyPI project name: specsolve
    • Owner: fluxopt
    • Repository name: specsolve
    • Workflow name: release.yaml
    • Environment name: pypi

GitHub, under fluxopt/specsolve Settings

Clean-up that the release does not need

3. Before this PR merges: what the PyPI page shows

4. This PR

5. After the merge

  • Actions → Release, the run for the merge commit:
    • Tag the version the changelog names created the tag v0.1.0rc1 and the GitHub release 0.1.0rc1, marked as a pre-release.
    • Build passed, and its check printed specsolve-0.1.0rc1.
    • Publish to PyPI waits for approval: "Review deployments" → pypi → Approve.
  • https://pypi.org/project/specsolve/0.1.0rc1/ exists. The README renders, and the project links work.
  • Smoke test in a fresh environment:
    python -m venv /tmp/ss && /tmp/ss/bin/pip install specsolve==0.1.0rc1
    /tmp/ss/bin/python -c "import specsolve, mathspec; print(specsolve.__version__, mathspec.__version__)"   # 0.1.0rc1 0.1.0
    /tmp/ss/bin/pip install specsolve   # finds no stable version until 0.1.0 exists
  • If a job failed, fix the cause, then use "Re-run failed jobs" on that run. If 0.1.0rc1 reached PyPI broken, release 0.1.0rc2.

6. Then 0.1.0

  • Open the next release PR, titled chore: release 0.1.0. It renames the next ## Upcoming version to ## 0.1.0 (date), with notes that say this is the first release on PyPI. Merge it and approve the upload as above.
  • Smoke test pip install specsolve without a version. It should install 0.1.0.

7. Follow-ups

What this PR changes, what merging does, gates

The changes:

Why a release candidate: it goes through the same tag, GitHub release, build, approval and trusted-publishing upload as 0.1.0. The only addition is --prerelease on the GitHub release. pip skips it unless someone asks for it, so a broken first upload reaches no user. The version sorts after 0.0.1a358 and before 0.1.0.

What merging does: release.yaml finds 0.1.0rc1 with no tag. It creates v0.1.0rc1 and a GitHub pre-release, builds from the tag, checks that the wheel and the sdist are 0.1.0rc1, and waits for approval on pypi before the upload.

Gates: python -m tools.changelog check prints "releases 0.1.0rc1 on merge", and notes 0.1.0rc1 prints the section above. The suite on #1751's commit is in that PR. This commit changes only prose and the changelog.

Not verified: the name specsolve on PyPI. The PyPI API cannot be reached from this container, so check that the name is free when you add the pending publisher.

The type is chore, which owes no changelog line.

🤖 Generated with Claude Code

https://claude.ai/code/session_016Pv7LzSgzt7Yn2K3ioyJXw

@read-the-docs-community

read-the-docs-community Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

@codspeed

codspeed Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 24 untouched benchmarks
⏩ 82 skipped benchmarks1


Comparing claude/release-0.1.0rc1 (606d0c8) with main (8c783ca)2

Open in CodSpeed

Footnotes

  1. 82 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩

  2. No successful run was found on main (a4be39a) during the generation of this report, so 8c783ca was used instead as the comparison base. There might be some changes unrelated to this pull request in this report. ↩

@FBumann
FBumann added this pull request to stack #1753 September 25, 2026 10:59
@FBumann
FBumann removed this pull request from stack #1753 September 25, 2026 11:41
Base automatically changed from claude/confident-goodall-2iuw8n to main September 25, 2026 11:47
@FBumann
FBumann force-pushed the claude/release-0.1.0rc1 branch from 49eb258 to 2457bb1 Compare September 25, 2026 11:48
The release candidate for 0.1.0, the first release on PyPI. `## Upcoming
version` becomes `## 0.1.0rc1 (2026-09-25)`, and the compatibility rule
in AGENTS.md and CONTRIBUTING.md covers every version before 1.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Pv7LzSgzt7Yn2K3ioyJXw
@FBumann
FBumann force-pushed the claude/release-0.1.0rc1 branch from 2457bb1 to 606d0c8 Compare September 25, 2026 11:53
@FBumann
FBumann marked this pull request as ready for review September 25, 2026 11:57
@FBumann
FBumann merged commit fef9c80 into main Sep 25, 2026
27 of 44 checks passed
@FBumann
FBumann deleted the claude/release-0.1.0rc1 branch September 25, 2026 12:04
FBumann added a commit that referenced this pull request Sep 25, 2026
…saved answer says the layout moves before 1.0 (#1763)

> **Prompt:** Also do this

It came with the four items of section 3 of #1752's checklist, "Before
this PR merges: what the PyPI page shows", pasted below it.

> [!NOTE]
> The following content was generated by AI.

The four items in section 3 of #1752's checklist. The PyPI page gets
links to the docs, issues and changelog. The README's links resolve
there. Two error messages drop "0.0.1aN". RELEASING.md stops promising
tighter CI by 0.1.0.

<details><summary>What changed, gates, departures</summary>

**Changes**
- `pyproject.toml`: `[project.urls]` names `Documentation`,
`Repository`, `Issues` and `Changelog`, as energy-models/mathspec#707
did. It used to name only `repository`.
- `README.md`: the links to `CONTRIBUTING.md` and
`docs/about/prior-art.md` are now absolute: GitHub for the first, Read
the Docs for the second.
- `src/specsolve/relational/parquet.py`: both `LayoutError` messages say
"The layout moves before 1.0" instead of "while the package is on
0.0.1aN". The docstring of
`test_an_answer_in_another_layout_is_refused_by_name` follows. The test
matches on the rewrite ("solve the model again and save it"), not on
this clause.
- `RELEASING.md`, "Relaxed while in early development": it said "Tighten
these before 0.1.0". It now says a Python matrix behind a gate job is
the first thing to add back when CI is tightened, without a date. I
changed the sentence rather than add the matrix. The interpreter is
pinned once in `[tool.pixi.dependencies]`, so a matrix needs a pixi
feature per Python version. That is its own PR.
- `CHANGELOG.md`: this PR's line under `## Upcoming version`.

**Gates**, run in a `uv` environment (dev + docs groups, `gurobi` and
`xpress` extras), because pixi cannot be installed here:
- `ruff check .` and `ruff format --check .` pass.
- `pytest -n auto`: 4139 passed, 250 skipped, 1 xfailed.
- `zensical build --strict`: no issues.
- `uv build`, then `twine check`: passed. The wheel's metadata has the
four `Project-URL` lines and no direct reference.
- `python -m tools.changelog check` and `entry` pass.

**Departure from Part 2:** one PR for four checklist items rather than
one each. They are small, all serve the first PyPI page, and the
checklist groups them. The type is `fix`, the topmost row, because of
the messages in `src/`.

</details>

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_016Pv7LzSgzt7Yn2K3ioyJXw

---------

Co-authored-by: Claude <noreply@anthropic.com>
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