Skip to content

ci: gate the starter install shape, and source release notes from the changelog - #37

Merged
harshuljain13 merged 2 commits into
mainfrom
fix/release-pipeline
Sep 7, 2026
Merged

harshuljain13 merged 2 commits into
mainfrom
fix/release-pipeline

Conversation

@harshuljain13

Copy link
Copy Markdown
Collaborator

The two commits that did not make it into #36 — its head was still fc83c0e when it merged.

ci: install the shape a new user gets, and run an agent in it

The clean-environment job installs all six packages with every extra, so
agentship-observability is always present. That is why it passed on 0.0.1: the bug was
that a stack without the adapter could not run any agent, and no job in CI ever built that
stack. --help and an import passed too — only running an agent found it.

The job now also installs agentship-sdk[starter] as a new user gets it and runs the README
quickstart with the provider keys empty. Siblings install by explicit file path, because
with the same version on PyPI pip prefers the published wheel and silently tests the wrong
build — which happened while verifying this by hand. A guard fails the job if the adapter
ever appears in that environment, since the step would then prove nothing.

Verified both directions: against wheels from this branch the quickstart prints
echo: hi there and the job passes; against the published 0.0.1 it fails with
observability provider 'otel' is not installed.

docs: make the changelog the source of the GitHub release notes

github-release published with --generate-notes alone — a list of PR titles rather than a
description of what changed. scripts/changelog.py now extracts the ## [<version>] section
and the workflow publishes it as the release body, with the generated commit list appended.

build runs changelog.py --check before anything is published, so a tag with no notes
fails while it is still free to fix.

Also drew the version boundary the changelog never had: it was written before any release, so
everything sat under [Unreleased] — but that work shipped in 0.0.1. Marked as such,
leaving 0.0.2 to say the one thing that is new.

Verification

779 passed, 14 skipped, 3 xfailed · ruff clean · mkdocs build --strict clean · both workflows
parse · changelog.py --check passes for 0.0.2 and 0.0.1 and exits 1 with an actionable
message for a version with no section.

The clean-environment job installs all six packages with EVERY extra, so
agentship-observability is always present. That is why it passed on 0.0.1: the bug was that
`provider` defaults to "otel" and every agent is traced, so a stack WITHOUT the adapter
could not run any agent at all. A job that always installs the adapter cannot see it.

`--help` and an import passed too. Only running an agent found it, and only in the minimal
shape -- which nothing in CI installed.

So the job now also builds `pip install "agentship-sdk[starter]"` as a new user gets it, and
runs the README quickstart with the provider keys empty. Two supporting details:

Siblings install by explicit FILE PATH, not --find-links. With the same version already on
PyPI, pip prefers the published wheel over the local one and silently tests the wrong build
-- exactly what happened while verifying this change by hand, where the "release candidate"
under test turned out to be the broken 0.0.1 from the index.

And a guard fails the job if agentship-observability ever appears in that environment,
because the step would then be quietly testing the same shape as the job above it and
proving nothing.

Verified both directions, which is the part that matters: against wheels built from this
branch the quickstart prints `echo: hi there` and the job passes; against the published
0.0.1 it prints `observability provider 'otel' is not installed` and the job fails. The gate
reproduces the escape it exists to prevent.

779 passed, 14 skipped, 3 xfailed. Lint clean. ci.yml parses.
The releases page is empty and would have stayed low-value: `github-release` published with
`--generate-notes` alone, which writes the page from PR titles. That is a list of what was
merged, not a description of what changed, and it lives nowhere a reader can find later.

So the release page becomes a copy of docs/CHANGELOG.md rather than a second account of the
same release. `scripts/changelog.py` extracts the `## [<version>]` section; the workflow
publishes it as the release body and appends the generated commit list underneath for
anyone who wants the detail.

The `build` job now runs `changelog.py --check` before anything is published. A tag with no
notes fails while it is still free to fix -- after six uploads the version is burned and the
page is already public.

Also drew the version boundary the changelog never had. It was written when the project had
cut no releases, so everything sat under [Unreleased] -- but that work shipped IN 0.0.1.
Marked it as such (117 lines, YANKED, with what yanking means), leaving 0.0.2 to say the one
thing that is actually new: an agent runs without the observability adapter installed.

Verified: --check passes for 0.0.2 and 0.0.1, exits 1 with an actionable message for a
version with no section, and --section prints the 29 lines the page will show. Both
workflows parse. mkdocs --strict clean. 779 passed, 14 skipped, 3 xfailed. Lint clean.
@harshuljain13
harshuljain13 merged commit d5983bb into main Sep 7, 2026
4 checks passed
@harshuljain13
harshuljain13 deleted the fix/release-pipeline branch September 7, 2026 14:27
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