Skip to content

Set up releases to PyPI, and prepare the first release - #33

Merged
rohan-hotdata merged 7 commits into
mainfrom
release-setup
Oct 23, 2026
Merged

rohan-hotdata merged 7 commits into
mainfrom
release-setup

Conversation

@rohan-hotdata

Copy link
Copy Markdown
Collaborator

This PR adds the release procedure for PyPI, prepares the changelog for 0.1.0, and cleans the repository for a public package. It does not change the version. ./scripts/release.sh prepare 0.1.0 does that in a later PR.

How

  • Release procedure, adapted from hotdata-langchain to uv and make verify:
    • scripts/release.sh prepare opens a release PR. scripts/release.sh publish pushes the tag.
    • scripts/changelog.py moves the notes, prints the notes of a version, and checks that a version change has a changelog section.
    • On a vX.Y.Z tag, publish.yml builds the wheel and the sdist, checks them with twine, and uploads them through PyPI trusted publishing in the environment pypi. After the upload, it creates the GitHub Release. check-release.yml runs the changelog check on PRs.
    • RELEASING.md gives the procedure and the one-time setup.
  • CI:
    • verify runs on Python 3.11 to 3.14.
    • The new floor job tests at the lowest allowed dependency versions. This found that the hotdata extra needs pyarrow 16.0.
    • Every action is pinned by SHA, and Dependabot updates the pins weekly.
  • Package metadata: classifiers, URLs, and an SPDX license. The sdist holds only src/hotmemory, the README, the CHANGELOG, and the LICENSE. The README uses absolute GitHub links so that they work on PyPI, and check_links.py checks them.
  • CHANGELOG: the Unreleased section is one "first release" list of what 0.1.0 contains. Before, it held Changed entries between versions that no one installed.
  • Privacy audit:
    • docs/internal/ is now in .gitignore and no longer tracked.
    • docs/local.md moved into it, because the engine image is private.
    • docs/architecture.md is public. I removed its section on the local catalog storage paths and its note on the network between the client and the engine.
    • The public docs say "the Hotdata engine". Before the folder left git, I removed from it a person's name, the private engine branch and flag, and the in-progress engine work.
  • README: a section on how to install the skill for a coding agent. The package does not include skills/hotmemory/.
  • .gitignore: lists the local state of the coding agent under .claude/ (worktrees, settings.local.json, the lock file), so the rest of .claude/ can be shared.

Verification

  • make verify passes with 304 tests. make floor passes.
  • uv build and twine check --strict pass on both archives. The wheel holds only hotmemory/.
  • The built wheel was installed in a clean environment:
    • The three offline README examples printed what their comments say.
    • hotmemory.hotdata and hotmemory.openai import with the extras.
    • A skill script runs from a copied skill folder.
  • A clean export of the commit, without the ignored files, passes the link check.
  • Not run: the HotdataStore README example (needs the cloud), make integration, and publish.yml, which runs only on a tag.

Notes

  • The pre-release history of the CHANGELOG stays in git.
  • RuntimeDB stays in compose.yaml, the Makefile, and CI. These lines are the image name and the configuration keys that the engine requires.
  • Before the first tag, the owner creates the GitHub environment pypi and the pending trusted publisher on PyPI. RELEASING.md lists the values.

Add the release procedure from hotdata-langchain, adapted to uv and make verify.

- scripts/release.sh prepares a release pull request and pushes the tag.
- scripts/changelog.py moves the Unreleased notes into a version section, prints
  the notes of a version, and checks that a version change has a section.
- publish.yml builds on a vX.Y.Z tag, publishes through PyPI trusted publishing
  in the pypi environment, then creates the GitHub Release.
- check-release.yml runs the changelog check on a pull request.
- verify.yml runs make verify on Python 3.11 to 3.14, and make floor runs the
  tests at the lowest allowed dependency versions.

The sdist now holds src/hotmemory, README.md, CHANGELOG.md, and LICENSE only.
pyproject.toml gains classifiers, project URLs, and an SPDX license. The hotdata
extra needs pyarrow 16.0. At the floor, pyarrow 14.0.0 installs next to numpy 2
and fails to import, and pyarrow 16.0.0 passes the offline tests. The README
links to repository files with absolute links, so they work on PyPI,
and check_links.py checks those links too.
…y audit

- CHANGELOG.md: the Unreleased section describes the first release as one
  Added list. The pre-release history stays in git.
- verify.yml pins each action by commit SHA, as publish.yml does.
  Dependabot updates the pins and hotdata-framework each week.
- The internal docs no longer name a person, the private engine branch and
  its flag, the engine team, the engine work in progress, or the machine
  that runs the benchmarks.
- docs/internal/ is now ignored: the plan, the roadmap, the brief, the
  survey, and the benchmark research stay only in the owner's checkout.
- docs/local.md moves there too, because the engine image is private and
  only the Hotdata team can start the local stack.
- docs/architecture.md is public. It no longer names the engine, the
  storage paths of the local catalog, or what the framework source says
  about the network between the client and the engine.
- The public docs say "the Hotdata engine" or "the local engine stack"
  in place of the engine's name, and no longer link to the moved files.
… the measurement scripts

The scripts declare pyarrow 16.0, as the hotdata extra does. .gitignore lists
the worktrees, settings.local.json, and the lock file of Claude Code, so the
rest of .claude/ can be shared.
The package does not include skills/hotmemory/, so the README tells the reader
to install hotmemory and copy the folder into the skills folder of the agent.
@rohan-hotdata
rohan-hotdata requested a review from a team as a code owner October 23, 2026 04:38
@rohan-hotdata
rohan-hotdata requested review from shefeek-jinnah and removed request for a team October 23, 2026 04:38

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The full diff was omitted from the review prompt. Files read from the checkout: .github/workflows/publish.yml, .github/workflows/check-release.yml, .github/workflows/verify.yml, scripts/release.sh, scripts/changelog.py, scripts/check_links.py, tests/test_changelog.py, pyproject.toml, Makefile, CHANGELOG.md, RELEASING.md, README.md (skill section and link references). The removed docs/internal/ files and the doc wording edits were not read line by line. A grep found no remaining tracked links to docs/internal/ or docs/local.md. The verify, floor, and integration checks had not reported when this review started.

if [[ "$GITHUB_REF_NAME" != "v$version" ]]; then
echo "The tag $GITHUB_REF_NAME does not match version $version in pyproject.toml" >&2
exit 1
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Add a check that the tagged commit is on main (not blocking).

Suggested step after the checkout, with fetch-depth: 0 on the checkout:

- name: Check that the tag is on main
  run: git merge-base --is-ancestor "$GITHUB_SHA" origin/main

The workflow publishes any v* tag whose version matches pyproject.toml. A tag pushed from a feature branch publishes unreviewed code to PyPI. RELEASING.md:4 says to tag only through release.sh, and the workflow does not enforce that rule. A tag rule on the pypi environment is an alternative fix.

claude[bot]
claude Bot previously approved these changes Oct 23, 2026

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The full diff was omitted from the review prompt. Files read from the checkout: scripts/release.sh, scripts/changelog.py, scripts/check_links.py, tests/test_changelog.py, .github/workflows/publish.yml, .github/workflows/check-release.yml, .github/workflows/verify.yml, .github/dependabot.yml, pyproject.toml, Makefile, CHANGELOG.md, RELEASING.md, .gitignore. The doc edits and the deletions under docs/internal/ were checked by a search for internal references, not read line by line.

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The review prompt omitted the full diff. This review used the full patch from gh pr diff, and read .github/workflows/publish.yml, scripts/release.sh, and scripts/changelog.py from the checkout. The tag check in publish.yml resolves the prior nit.

@rohan-hotdata
rohan-hotdata merged commit 079eb75 into main Oct 23, 2026
8 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.

1 participant