scope: a real beta loop for caldav-mcp, and where the prerelease version comes from #13
Labels
No labels
blocked
waiting-on-julian
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
jlxq0/caldav-mcp#13
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Scope only. No change proposed for merge until the two decisions below are made.
Context is #9: this repo has no beta path in CI,
v0.1.1-beta.e1ad86bwas cutby hand, and its sha suffix cannot match the platform's
clusters/fondue/*-beta/**Renovate rule, which requires-(beta|alpha)\.\d+$. I cutv0.1.2-beta.20260826052605by hand on 2026-08-26to unstick it. That is a patch, not the loop.
The house mechanism, read rather than remembered
oddie-apps/lenno_webis the reference..forgejo/workflows/ci.ymltriggers onpushtoalpha,beta,mainand onv*tags; the image job runs only forrefs/heads/beta,refs/heads/alphaandrefs/tags/v*. The version comes frombin/ci-version, and the part that matters here is that it does not read themanifest version at all:
BASE_TAG= highestv<major>.<minor>.<patch>git tag.BUMP= conventional-commit analysis ofBASE_TAG..HEAD— a!:subject orBREAKING CHANGE:body gives major, afeat:subject gives minor, anythingelse gives patch.
VERSION=<bumped base>-beta.<UTC YYYYMMDDHHMMSS>.With this comment against the patch default, verbatim:
That is exactly the cost I named when cutting
v0.1.2-beta.<ts>by hand: itsorts below the released
0.1.2. The house scheme bumps first so the betasorts above the release it replaces.
Decision 1: does
Cargo.tomlcarry the next version between releases?No, on the evidence.
lenno_webderives the prerelease version from thelatest stable git tag and never from
mix.exs. Porting that here keeps thisrepo's existing convention —
Cargo.tomlis bumped at release time by achore(release): prepare vX.Y.Zcommit — untouched, and removes the reason tochange it.
The consequence is that CI's guard has to move. Today:
A derived
0.1.3-beta.<ts>fails that against aCargo.tomlreading0.1.2,which is the whole reason the hand-cut tag had to be
0.1.2-beta.<ts>. Theguard is worth keeping for stable
v*tags — it is what stops a release tagnaming a version the binary does not report — and worth not applying to a
derived beta version, which by construction has no manifest to agree with.
Decision 2: does this apply to the other four MCP servers?
caldav-mcp-betais the only*-betanamespace among the five MCP servers infondue. Either it is a pilot and the other four follow, or it is a one-off andthe loop should be built no larger than this repo. The work below is written for
one repo; a decision to do all five changes what "port
bin/ci-version" shouldproduce (a copied script per repo, consistent with the no-shared-crate decision
in #3).
The work, if both are settled
betato the workflow'spush.branches.bin/ci-version— a port oflenno_web's, minus the release-pleaseassumptions. Same three-step derivation, same timestamp suffix.
refs/tags/v*, skip it forrefs/heads/beta.PUSH=true, tagsv${VERSION}andsha-${short}, andno
latest— the existing*-*check already covers that.mainthe onlywriter to
:buildcacheafter two concurrent writers failed a run whose imagehad already been pushed. A beta-branch build exporting to the same ref
reintroduces that race with a branch that will often be pushed alongside
main. Import-only costs a partial cache hit whenbetahas diverged, whichis the cheaper side of that trade.
oddie-apps/platform. The*-betarule already matches-beta.<digits>, hasignoreUnstable: false,minimumReleaseAge: nullandautomerge: true, so a conforming tag flows without touching that repo.What this costs
A second long-lived branch to keep in sync with
main, and a fullcargojobplus a docker build on every push to it.
Not in scope
The stable release flow, the
mainbuild, and anything about the other fouroauth_redirect.rscopies (#3).