Skip to content

chore(version): stamp the dev version with the UTC time it lands - #1160

Merged
potiuk merged 1 commit into
apache:mainfrom
potiuk:magpie-dev-version-datestamp
Sep 8, 2026
Merged

chore(version): stamp the dev version with the UTC time it lands#1160
potiuk merged 1 commit into
apache:mainfrom
potiuk:magpie-dev-version-datestamp

Conversation

@potiuk

@potiuk potiuk commented Sep 8, 2026

Copy link
Copy Markdown
Member

The marketplace is served straight from main, so adopters install dev versions — the .devN suffix reaching a consumer is the normal case, not the exception the docs assumed.

claude plugin update compares version strings, not commit SHAs. With every manifest frozen at 0.2.0.dev0 since #907, an adopter's update answers "already at the latest version" and never moves the pinned commit, however far behind main the installed copy has fallen. Observed today on a real install: three magpie plugins pinned at a1cff444 (#1134), 14 commits stale, with claude plugin update reporting all three as current. Recovery means claude plugin marketplace update plus a full uninstall + reinstall of every plugin — nobody discovers that unaided.

This moves the suffix to a timestamp: 0.2.0.dev00.2.0.dev202609080121. Ordinary claude plugin update then works.

  • Minute resolution, not date alone, so two bumps on the same day stay distinct — this repo routinely lands several changes a day.
  • UTC, not local time, so the string sorts in the order the bumps were made regardless of the contributor's timezone.

Mechanical apart from three files

project.version and the two docs that stated the old convention were hand-edited. Everything else is generated: tools/dev/check-family-plugins.py --fix propagated the version to the four ecosystem manifests and the ten per-family plugin.json files plus their marketplace entries, and uv lock refreshed the workspace pin.

release-management-config.md now carries the bump as a copy-pasteable recipe rather than prose:

sed -i '' "s/^version = .*/version = \"0.2.0.dev$(date -u +%Y%m%d%H%M)\"/" pyproject.toml
python3 tools/dev/check-family-plugins.py --fix
uv lock

The docs also drop the claim that "only released versions are ever published to a marketplace, so the PEP 440 suffix never reaches a consumer" — untrue for a marketplace served from a git branch, and the assumption this bug rested on.

Bumping stays deliberate

Not every PR. Requiring a bump of every change would put every contributor in conflict with every other over one line, for no gain on changes nobody is waiting for. The docs land the narrower rule instead: bump when the work needs to reach installed copies — before pointing adopters at claude plugin update, before announcing a change they should take, or when merged work has piled up behind a stale stamp. A bump is a one-line edit plus a regeneration, so it costs little whenever it is actually wanted.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WJopDiCvbwSG6t4k15JE4H

The marketplace is served straight from `main`, so adopters install dev
versions — the `.devN` suffix reaching a consumer is the normal case, not
the exception the docs assumed. And `claude plugin update` compares
version strings, not commit SHAs: with every manifest frozen at
`0.2.0.dev0` since apache#907, an adopter's update answers "already at the
latest version" and never moves the pinned commit, however far behind
`main` the installed copy has fallen. Recovery today means
`claude plugin marketplace update` plus a full uninstall + reinstall of
every plugin, which nobody discovers unaided.

Move the suffix to a timestamp: 0.2.0.dev0 -> 0.2.0.dev202609080121.
Ordinary `claude plugin update` then works. Minute resolution keeps two
bumps on the same day distinct, and the stamp is UTC so it sorts in the
order the bumps were made regardless of the contributor's timezone.

Bumping stays deliberate rather than per-PR — before pointing adopters
at `claude plugin update`, before announcing a change they should take,
or when merged work has piled up behind a stale stamp. Requiring it of
every PR would put every contributor in conflict with every other over
one line, for no gain on changes nobody is waiting for.

Mechanical apart from `project.version` and the two docs that stated the
old convention: `tools/dev/check-family-plugins.py --fix` propagated the
version to the ecosystem manifests and the ten per-family plugin.json
files plus their marketplace entries, and `uv lock` refreshed the
workspace pin.

Generated-by: Claude Code (Opus 5)
@potiuk
potiuk force-pushed the magpie-dev-version-datestamp branch from 50c5ebc to 93de21e Compare September 8, 2026 01:31
@potiuk
potiuk merged commit 2c6aab0 into apache:main Sep 8, 2026
40 checks passed
potiuk added a commit that referenced this pull request Sep 8, 2026
The marker sat at a1cff44, 17 commits behind main. Bumping it alone
would claim those commits are described by the specs, so the drift is
closed first.

Specs updated for what actually shipped:

- meta-and-quality-tooling: skill-evals errors, rather than passing, when
  a case's CLI produced no gradeable output (#1161).
- security-reporting: the tracker dashboard projects the current partial
  bucket to its end-of-bucket value, splitting RATE series (accumulate
  from zero) from LEVEL series (carry over), and deliberately not
  projecting mean-based signals (#1158).
- project-agnosticism: <PROJECT> and <project> are two placeholders
  holding different values, and the lint carries both spellings plus
  spaced variants (#1154).
- adapters: the forwarder relay's contact_handle defaults to an
  org-level shared inbox rather than a named individual (#1135). The
  multi-hop coordinator case is designed in RFC-AI-0008 and unimplemented.
- issue-management-family: the family's eval suites, and the note that
  --cli runs belong outside a credential-denying sandbox (#1145).

Commits needing no spec change: #1152, #1143 and #1156 updated their own
specs in-commit; #1149, #1147, #1151 are behaviour-preserving bug fixes;
#1155 and #1141 are CI and dependency chores; #1159's spec edits landed
with it; #1144 removes hardcoded literals that no spec asserted.

One genuine gap recorded rather than papered over: no spec covers
marketplace distribution or the dev-version stamping rule from #1160,
which is load-bearing because `claude plugin update` compares version
strings, not commit SHAs. Logged in adoption-and-setup as wanting its own
spec.

Generated-by: Claude Code (Opus 5)
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