fix(release): stop the desktop version silently blocking every release - #96
Merged
Merged
Conversation
The repo's tags stopped at v0.39.38 while npm went to 0.39.42. That looked like four forgotten tags. It wasn't: `release-dmg.yml` is the only thing that tags, and it refuses to build when `TokenTrackerBar/project.yml`'s MARKETING_VERSION disagrees with package.json. That file — and `TokenTrackerWin.csproj` — sat at 0.39.38, so a desktop release was impossible from 0.39.39 onward. Forgetting to tag and being unable to build the apps were the same omission. Three files carry the release version and all three were hand-edited; `npm version` touched only one. The existing gates live in the release workflows, which report nothing when nobody dispatches them — so the drift was invisible for four releases. - validate-version-lockstep.cjs runs the same check in `ci:local`, where a PR shows it. Same reasoning ci.yml already records for moving the test gate in front of the merge rather than after it. It collects each version literal separately, so the "only one of the two project.yml targets got bumped" case — which once shipped a DMG advertising the previous version — fails too. A checkout without the desktop projects is not a failure. - sync-desktop-version.cjs rewrites them, wired to npm's `version` lifecycle. Deliberately NOT described as automatic: this repo bumps with `npm version --no-git-tag-version`, which makes no commit, so npm never stages what the hook edited. The files still need `git add`. The validator is the guarantee; the hook just saves typing. - Both desktop projects moved to 0.39.42, so the apps can be cut again. This does not claim a desktop build ships with every npm release — the README is explicit that they are cut less often. It keeps the version recorded in *source* in step, which is what makes a release possible at any time instead of a version bump away.
Uh oh!
There was an error while loading. Please reload this page.
pitimon added a commit
that referenced
this pull request
Jul 25, 2026
Ships #98 (issue #97): GitHub Copilot quota now reports the premium-request count — "158/300", or "142/300" in Remaining mode — instead of a percentage the reader has to convert. The numbers were already being fetched from api.github.com and discarded after one division. The independent Codex QA gate returned SHIP: NO on the first cut and all three findings were real: the bar and its caption could be drawn from different fields and disagree (70% beside 228/300, which is 76%); a null `remaining` coerced to zero and reported the whole allowance consumed; and the dashboard clamped only one end, so an unclamped payload could render "312/300" in either mode. Fixed, each with a regression test built from the exact reproduction. First release where the `version` lifecycle hook from #96 did its job: the bump synced TokenTrackerBar/project.yml and TokenTrackerWin.csproj, which is what made 0.39.39–0.39.42 unable to cut a desktop build. prepublishOnly re-vendored the LiteLLM seed: 2,522 models, no rate changes, only _meta.generated_at moved. Co-authored-by: itarun.p <itarun.p@somapait.com>
This was referenced Jul 25, 2026
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 freeto 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.
Closes the second half of the two governance gaps found after 0.39.42 shipped.
The tags weren't forgotten — they were impossible
Tags stopped at
v0.39.38while npm reached0.39.42. The cause isn't a missed step:release-dmg.ymlis the only thing in this repo that creates a tag. Its first job runsgh release create "v<version>" --draft --generate-notes, it dispatches the Windows build in parallel, and its final job flips the release out of draft with--latest. One dispatch produces the tag, the.dmgand the.exe.TokenTrackerBar/project.yml'sMARKETING_VERSIONdisagrees withpackage.json— andrelease-windows.ymldoes the same forTokenTrackerWin.csproj's<Version>.Three files carry the version, all three hand-edited, and
npm versiontouches only one.Why nothing caught it
The check already existed — in the release workflows. A gate in a workflow nobody dispatches reports nothing. It went unnoticed for four releases.
scripts/validate-version-lockstep.cjsruns the same check inci:local, where every PR shows it. That is the reasoningci.ymlalready records for itself: the #18 dashboard redesign merged with failing tests because the gate ran only post-merge, so the gate moved in front of the merge. Same fix, different gate.It collects each version literal separately, so the case
release-dmg.ymldocuments in its own comment — one of the twoproject.ymltargets bumped, shipping a DMG whoseInfo.plistadvertised the previous version — also fails. A checkout without the desktop projects passes; the CLI is publishable alone.scripts/sync-desktop-version.cjsrewrites them and is wired to npm'sversionlifecycle. Deliberately not described as automatic: this repo bumps withnpm version --no-git-tag-version, which makes no commit, so npm never stages what aversionhook edited — the files remain working-tree changes you mustgit add. The validator is the guarantee; the hook only saves typing. The checklist says so in those words.Also in this change set (already pushed, not in this diff)
v0.39.39,v0.39.40,v0.39.41backfilled as annotated tags at their real release commits (7c105cb,96479cc,0ea200e), each recording why it was late. Deliberately git tags and not GitHub Releases: an assetless Release would take over/releases/latest, which the README now points at for desktop downloads.enforce_adminsenabled onmain. Protection requiredci:localbut exempted admins, so the two direct release pushes reportedBypassed rule violations. Verified thatci.yml's job is literallyname: ci:localand runson: pull_request, so PRs still produce the required context and merges are unaffected — this PR is that test. Direct pushes tomaincan no longer satisfy it, which is the intent.After this merges,
release-dmg.ymlcan be dispatched for0.39.42to produce the tag and both desktop builds.Test plan
npm run ci:local— exit 0, 833/833 (was 827; +6 here)mainas it stood it printed all three mismatches and exited 1; aftersync-desktop-version.cjs, exit 0enforce_adminsblocking a direct push is verified by config read-back and mechanism, not by an attempted push — I was not willing to land an unreviewed commit onmainto prove it. The first real attempt will confirm.