Skip to content

fix(release): v1.0.1 — lockstep component publishing: stamp the tag version onto every dist, publish the complete closure (ADR-0053)#186

Merged
officialCodeWork merged 2 commits into
fix/v1.0.1-serve-entrypointfrom
fix/v1.0.1-pypi-lockstep-publishing
Jun 10, 2026
Merged

fix(release): v1.0.1 — lockstep component publishing: stamp the tag version onto every dist, publish the complete closure (ADR-0053)#186
officialCodeWork merged 2 commits into
fix/v1.0.1-serve-entrypointfrom
fix/v1.0.1-pypi-lockstep-publishing

Conversation

@officialCodeWork

Copy link
Copy Markdown
Owner

Stacked on #185 (the v1.0.1 serve-path fix) — this PR shows only the publishing commit; it auto-retargets to main when #185 merges.

The bug

pip install rag-platform could never resolve. packaging/rag-platform pinned 16 component dists at ==1.0.0, but release.yml's PyPI job only built the meta + the Python SDK — no component was ever published. And the pins couldn't have resolved even if publishing existed:

  • one pin named a dist that doesn't exist (ragctl; the workspace dist is rag-ragctl),
  • 15 transitive components (rag-parsers, rag-query, rag-cache, …) were missing entirely,
  • the [backends]/[kms] extras referenced extras rag-backends never declared (pgvector/qdrant/redis/s3/kms-aws are base deps) — rag-platform[backends] silently installed nothing,
  • the metadata-only meta wheel didn't even build (hatchling refuses a file-less wheel without bypass-selection),
  • workspace versions ranged 0.1.0–0.26.0, so nothing could satisfy ==1.0.0,
  • release-please was vestigial: 2 of 32 members configured, manifest frozen at 0.2.0 (vs 0.26.0/0.10.0 in the pyprojects it tracked), and its core-v* tags match no workflow trigger.

The fix — ADR-0053: one lockstep platform version, stamped from the tag

Keeps ADR-0052's one-platform-version policy and makes the tag the only version authority:

  • scripts/stamp_versions.py (new) rewrites every version site — each member's [project] version, literal __version__ attrs, and the meta's version + all of its == pins. task version:stamp -- X.Y.Z / task version:check wrap it. In-repo versions are now the lockstep baseline (1.0.1).
  • release.yml resolves the version from the tag (dispatch version input for dry runs, env-indirected), stamps, then builds + publishes the complete closure — 33 dists (31 components + agentcontextos + rag-platform) via uv build --all-packages + Trusted Publishing. npm stamps the TS SDK (npm version), Helm stamps the chart (--version/--app-version; published chart version = platform version; push now respects dry_run).
  • The meta pins all 31 components exactly, by real dist name, with extras that exist.
  • tests/packaging/test_meta_package.py (new CI gate): lockstep across all 84 version sites, pin-set == workspace dist set (a new package can't ship unpinned; a rename can't dangle), extras-validity, and stamp idempotency.
  • release-please removed — refines ADR-0052's "components version under it via release-please" parenthetical: components version with the platform, in lockstep.

Also includes the in-tree gateway version single-sourcing fix (one reported version: __version__ / OpenAPI info.version / GET /v1/info all read the rag-gateway dist metadata; dist/openapi.* + REST reference regenerated; surfaces pinned by a new gateway test).

Verification

  • All 33 dists build (uv build --all-packages + meta), and from a clean venv against those artifacts: pip install rag-platform==1.0.1 resolves (144 pkgs), [all] resolves (181), a real install imports rag_gateway/rag_core/ragctl at 1.0.1 and runs ragctl.
  • Full CI-equivalent suite green (pytest incl. the new gates), ruff check + format --check clean, mypy --strict clean, OpenAPI drift gate clean.

Documentation

  • New: docs/adr/ADR-0053-lockstep-component-publishing.md
  • Updated: docs/guides/packaging-distribution.md (stamping mechanism + cutting-a-release checklist), docs/release-notes/v1.0.1.md, docs/README.md (ADR row + guide row), packaging/README.md, packaging/rag-platform/README.md, docs/ga/ga-readiness-checklist.md (trusted-publisher scope: all 33 dists), ADR-0049/0052 cross-links, CLAUDE.md (lockstep standing constraint), TRACKER.md

🤖 Generated with Claude Code

Deep Kumar Singh Kushwah and others added 2 commits June 10, 2026 21:19
…ersion onto every dist, publish the complete closure (ADR-0053)

pip install rag-platform could never resolve: the meta pinned 16 component
dists at ==1.0.0 but release.yml never built or published any component, one
pin named a dist that doesn't exist (ragctl; the workspace dist is
rag-ragctl), 15 transitive components were unpinned, the [backends]/[kms]
extras referenced extras rag-backends never declared, the metadata-only meta
wheel didn't even build (hatchling needs bypass-selection), and workspace
versions ranged 0.1.0-0.26.0.

The fix (ADR-0053): one lockstep platform version, stamped from the tag.

- scripts/stamp_versions.py rewrites every version site (member pyprojects,
  literal __version__ attrs, the meta + all its == pins); task version:stamp
  / version:check wrap it.
- release.yml resolves the version from the tag (dispatch input for dry
  runs), stamps, then publishes the complete closure — uv build
  --all-packages + the meta = 33 dists — via Trusted Publishing; npm stamps
  the TS SDK (npm version) and Helm stamps the chart (--version /
  --app-version; published chart version = platform version) in the same run.
- The meta pins all 31 components exactly, by real dist name, with extras
  that exist; in-repo versions are the lockstep baseline (1.0.1).
- tests/packaging/test_meta_package.py gates lockstep, closure-completeness,
  and extras-validity, so a hand-bumped single package cannot merge.
- release-please removed: it covered 2 of 32 members, its manifest was
  frozen at 0.2.0, and its core-v*/gateway-v* tags matched no workflow. The
  tag is the only version authority (refines ADR-0052 "components version
  under it via release-please").

Also includes the in-tree gateway version single-sourcing fix (one reported
version: __version__ / OpenAPI info.version / GET /v1/info all read the
rag-gateway dist metadata via rag_gateway._version; dist/openapi.* + REST
reference regenerated; every surface pinned by a new gateway test).

Verified end-to-end: all 33 dists build; pip install rag-platform==1.0.1
resolves, installs, imports, and runs ragctl against them; full test suite,
ruff, and mypy --strict green.

Documentation: docs/adr/ADR-0053-lockstep-component-publishing.md (new),
docs/guides/packaging-distribution.md, docs/release-notes/v1.0.1.md,
docs/README.md, packaging/README.md, packaging/rag-platform/README.md,
docs/ga/ga-readiness-checklist.md, ADR-0049/0052 cross-links, CLAUDE.md,
TRACKER.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…aken (rename before first tag)

Independent post-implementation verification of the ADR-0053 lockstep scheme
swept all 33 intended dist names against PyPI: rag-agent, rag-reranker, and
rag-retrieval are already owned by unrelated third-party projects (active
releases 2024-2026, so PEP 541 reclaim is unrealistic). The meta's ==X.Y.Z
pins on those names can never resolve from the real index, and pinning a
third-party-owned name is a dependency-confusion risk; the publish is also
not atomic, so tagging before a rename would publish ~30 dists, fail 3, and
leave rag-platform unresolvable. The other 30 names were verified free, as
were rename candidates: agentcontextos-{agent,reranker,retrieval} (coherent
set), rag-rerank, rag-agent-runtime; rag-retriever is taken.

Recorded as a blocker on the GA checklist's registry first-publish item
(with the verified-free candidates and the mechanical rename recipe), as an
ADR-0053 consequence, and as a caveat on TRACKER's next-action tag cut. The
name choice itself is a product decision, deliberately not made here.

Everything else verified green in the same pass: tests/packaging + full
suite + mypy --strict + ruff + uv lock --check; 33 dists build at 1.0.1;
pip install rag-platform==1.0.1 from those dists resolves, imports, and
runs ragctl version => 1.0.1 in a fresh venv.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@officialCodeWork
officialCodeWork merged commit 30c3517 into fix/v1.0.1-serve-entrypoint Jun 10, 2026
13 of 23 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