feat: version discipline, tagged releases, and downstream bump automation - #23
Merged
Merged
Conversation
…tion Two products consume AgentCore by pinning a revision, but [project].version never moved off the bootstrap 0.1.0 across 80 commits. Both products therefore report the same version for different code, and the installed dist-info identifies nothing. Establish the version as a real identifier and automate its propagation: - Bump to 0.2.0 and relock. 0.1.0 is retired rather than reused: it named no particular revision. - CI fails a pull request that changes agent_core/ or pyproject.toml without moving the version, with a 'skip-version-bump' label as the escape hatch. This is the gap that let 80 commits ship as 0.1.0. - Release workflow: a v* tag is verified against the declared version, the tagged tree is re-checked (a tag can point at a commit no pull request saw), built, and published as a GitHub Release carrying the wheel, sdist, and its changelog section. A missing changelog entry fails the release. - Release dispatches to both products, which repin and open a bump PR for their own CI to validate. Templates in .github/downstream/, setup in docs/downstream-bump.md. - docs/versioning.md records the scheme, what counts as breaking while the effective public surface is wider than agent_core.__all__, why 1.0 cannot be promised yet, and why a private registry is not yet worth its operating cost. Two corrections found by testing against the real consumers: - The documented pin scheme was https://, but both products declare git+ssh://git@github.com/. The credential note rewrote https://github.com/, which is a no-op against an ssh:// dependency URL. - Repinning uses an in-place rev substitution, not `uv add`: uv add rewrites the PEP 508 direct URL into uv's proprietary [tool.uv.sources] table, which pip ignores, silently breaking non-uv install paths. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Neither product declares AgentCore on main: the pin exists only on each product's in-progress migration branch (fix/ci-bwrap-soft-probe, refactor/agent-core), and neither has an open pull request yet. This matters for the bump automation, which repins on the default branch. Until a migration merges, repin_agent_core.py reports 'found 0' and exits non-zero rather than committing a half-edited pin — correct behavior, but it makes the automation inert until then. Say so where someone setting it up will read it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
[project].versionnever moved off the bootstrap0.1.0across 80 commits. Both products pin AgentCore by commit SHA, so both reportapodex-agent-core 0.1.0for different code — the installeddist-infoidentifies nothing, and no version constraint downstream can mean anything.Both products currently pin
a9b5272(the #21 merge), five commits behindmain.What this does
Version becomes a real identifier
0.2.0+uv lock.0.1.0is retired rather than reused: it named no particular revision.agent_core/orpyproject.tomlwithout moving the version. This is the gap that let 80 commits ship as0.1.0. Escape hatch: theskip-version-bumplabel.Tagged releases
v*verifies the tag matches the declared version, re-runs ruff/pyright/pytest against the tagged tree (a tag can point at a commit no PR ever saw), builds, and publishes a GitHub Release with the wheel, sdist, and that version's changelog section. No changelog entry ⇒ the release fails.Downstream automation
agent-core-releaseto ApodexHarness and FrontierAgentInternal; each repins and opens a PR for its own CI to validate. Templates in.github/downstream/, one-time setup indocs/downstream-bump.md.Docs
docs/versioning.md: the0.MINOR.PATCHscheme; what counts as breaking given that the effective public surface is wider thanagent_core.__all__(consumers importagent_core.runtime.loopand friends directly); why 1.0 cannot be promised yet; and why a private registry is not yet worth its operating cost.Two bugs found by testing against the real consumers
The documented pin scheme was wrong. Both products declare
git+ssh://git@github.com/, but the README saidhttps://— and its credential snippet rewrotehttps://github.com/, which is a no-op against anssh://dependency URL. Copying it into product CI fails on an SSH key the runner does not have.uv addcorrupts the dependency declaration. It rewrites the standard PEP 508 direct URL into uv's proprietary[tool.uv.sources]table, which pip ignores — silently breaking any non-uv install path (a Dockerfile runningpip install .). Repinning is an in-place rev substitution instead, anchored onAgentCore.git@so the@ingit@github.comis never mistaken for the separator.Verification
ruffclean,pyright0 errors,pytest1119 passed,uv buildproduces 0.2.0 artifacts.uv sync --frozensucceeds, provinguv.locktracks the bump.uvaccepts a tag as rev and records?rev=<tag>#<resolved sha>(readable tag, sha still pinned); the PEP 508 shape survives;uv.lockfollows; the operation is idempotent.run:script in all three workflows passesbash -n.Note on merge order
This PR is itself subject to the new
version-bumpcheck and passes it (it moves the version0.1.0→0.2.0).Do not tag
v0.2.0until the secrets indocs/downstream-bump.mdare in place — or do, and dispatch degrades to a warning that can be recovered with the products'workflow_dispatchtrigger.