Two commits touching nothing but .gitea/workflows/unclaim.yml were written fix(ci): and cut two real releases:
v0.2.1 23:05:38 fix(ci): run the unclaim step under bash
v0.2.2 23:30:31 fix(ci): give the unclaim step a CA bundle
.releaserc.yml's commit-analyzer reads the type and ignores the scope. fix is a patch whatever sits in the brackets, so fix(ci): releases and ci: does not.
CLAUDE.md already warned that "a mistyped feat ships a minor version". That was not enough, because this was not a mistyped type — fix was chosen deliberately, in the belief that the (ci) scope qualified it.
Why a paragraph and not a clause
The version bump is the small half. A merge to main starts two workflows; if release.yml finds a releasable commit it pushes a v* tag, and that tag push starts four more:
16982 ci.yml check, e2e
16983 release.yml release ← cut the tag
16984 android-apk.yml apk ┐
16985 arch-package.yml arch-package │ all four keyed on v*
16986 desktop-assets.yml linux │
16987 homebrew-formula.yml sync-formula ┘
On a runner with capacity 1, where the APK build alone is tens of minutes and publishes a signed artifact to a public registry. So a mistyped type is six workflow runs, not an odd-looking changelog. make release-dry answers this before the merge and is cheaper than any one of them.
The releases are staying
v0.2.1 and v0.2.2 are already published to Arch, Homebrew and the APK registry. A version that vanishes is worse for whoever pulled it than a version that turns out to contain only CI changes, so neither is deleted or retracted. They are noise in the changelog and nothing worse.
This PR
docs:, which .releaserc.yml maps to release: false — so it ships nothing, which is the point. make release-dry cannot confirm that from a branch (it only evaluates main), so the config mapping is the evidence rather than a dry run.
Two commits touching nothing but `.gitea/workflows/unclaim.yml` were written `fix(ci):` and cut two real releases:
```
v0.2.1 23:05:38 fix(ci): run the unclaim step under bash
v0.2.2 23:30:31 fix(ci): give the unclaim step a CA bundle
```
`.releaserc.yml`'s commit-analyzer reads the **type** and ignores the **scope**. `fix` is a patch whatever sits in the brackets, so `fix(ci):` releases and `ci:` does not.
CLAUDE.md already warned that "a mistyped `feat` ships a minor version". That was not enough, because this was not a *mistyped* type — `fix` was chosen deliberately, in the belief that the `(ci)` scope qualified it.
## Why a paragraph and not a clause
The version bump is the small half. A merge to `main` starts two workflows; if `release.yml` finds a releasable commit it pushes a `v*` tag, and **that tag push starts four more**:
```
16982 ci.yml check, e2e
16983 release.yml release ← cut the tag
16984 android-apk.yml apk ┐
16985 arch-package.yml arch-package │ all four keyed on v*
16986 desktop-assets.yml linux │
16987 homebrew-formula.yml sync-formula ┘
```
On a runner with capacity 1, where the APK build alone is tens of minutes and publishes a signed artifact to a public registry. So a mistyped type is six workflow runs, not an odd-looking changelog. `make release-dry` answers this before the merge and is cheaper than any one of them.
## The releases are staying
`v0.2.1` and `v0.2.2` are already published to Arch, Homebrew and the APK registry. A version that vanishes is worse for whoever pulled it than a version that turns out to contain only CI changes, so neither is deleted or retracted. They are noise in the changelog and nothing worse.
## This PR
`docs:`, which `.releaserc.yml` maps to `release: false` — so it ships nothing, which is the point. `make release-dry` cannot confirm that from a branch (it only evaluates `main`), so the config mapping is the evidence rather than a dry run.
Closes #111
yonlu
self-assigned this 2026-08-18 23:41:29 +00:00
Reviewed and verified rather than read. Every factual claim in this holds:
.releaserc.yml's releaseRules match on type only — fix → patch, ci → false, docs → false — so "the scope is decoration" is exactly
right, and this PR's own docs: type ships nothing, which is the correct
shape for the change.
v0.2.1 and v0.2.2 both trace to commits touching only .gitea/workflows/unclaim.yml (fix(ci): run the unclaim step under bash, fix(ci): give the unclaim step a CA bundle), and the earlier ci: drop the claim label when an issue closes on the same file correctly
cut nothing. The contrast is the argument.
The paragraph lands in the right section (beside the existing "a mistyped feat ships a minor version" note), which is where someone about to pick a
type would actually be reading.
The framing is the valuable part: the reason this deserves a paragraph is the
six workflow runs on a capacity-1 runner, not the version number. Agreed on
leaving the two releases in place — a version that vanishes is worse than one
that turns out to be empty.
Closes #111 is in the commit body, so it will actually take. Merging.
Reviewed and verified rather than read. Every factual claim in this holds:
- `.releaserc.yml`'s `releaseRules` match on **type** only — `fix` → `patch`,
`ci` → `false`, `docs` → `false` — so "the scope is decoration" is exactly
right, and this PR's own `docs:` type ships nothing, which is the correct
shape for the change.
- `v0.2.1` and `v0.2.2` both trace to commits touching **only**
`.gitea/workflows/unclaim.yml` (`fix(ci): run the unclaim step under bash`,
`fix(ci): give the unclaim step a CA bundle`), and the earlier
`ci: drop the claim label when an issue closes` on the same file correctly
cut nothing. The contrast is the argument.
- The paragraph lands in the right section (beside the existing "a mistyped
`feat` ships a minor version" note), which is where someone about to pick a
type would actually be reading.
The framing is the valuable part: the reason this deserves a paragraph is the
six workflow runs on a capacity-1 runner, not the version number. Agreed on
leaving the two releases in place — a version that vanishes is worse than one
that turns out to be empty.
`Closes #111` is in the commit body, so it will actually take. Merging.
Reviewed and approved above — the e2e failure on 35c0d83 is not this PR.
album-dropdown.spec.ts:91 failed on chromium with Expected: 80, Received: 10, while WebKit passed in the same run, against a change that touches one
paragraph of CLAUDE.md. I chased it rather than re-running: the spec guards on scrollHeight > clientHeight + 40 and then asserts it can scroll to 80, so
any range in 41–79 satisfies the precondition and cannot satisfy the assertion,
and the grid passes through that while it settles.
Filed as #133 with the measurements and fixed in #134 (0 failures in 10 runs,
against 2 in 9 on current main). My #132 is what made it reachable — the
queue panel's mode is measured rather than media-queried, so there is one more
layout pass at that width — so the fix is mine to land.
Once #134 is in I will rebase this and merge it. Sorry for the extra cycles on
your branch; the rebase-per-merge is the branch protection requiring an
up-to-date head, not anything about this change.
Reviewed and approved above — the e2e failure on `35c0d83` is **not** this PR.
`album-dropdown.spec.ts:91` failed on chromium with `Expected: 80, Received:
10`, while WebKit passed in the same run, against a change that touches one
paragraph of `CLAUDE.md`. I chased it rather than re-running: the spec guards on
`scrollHeight > clientHeight + 40` and then asserts it can scroll to **80**, so
any range in 41–79 satisfies the precondition and cannot satisfy the assertion,
and the grid passes through that while it settles.
Filed as #133 with the measurements and fixed in #134 (0 failures in 10 runs,
against 2 in 9 on current `main`). My #132 is what made it reachable — the
queue panel's mode is measured rather than media-queried, so there is one more
layout pass at that width — so the fix is mine to land.
Once #134 is in I will rebase this and merge it. Sorry for the extra cycles on
your branch; the rebase-per-merge is the branch protection requiring an
up-to-date head, not anything about this change.
The commit-analyzer reads the type and ignores the scope, so `fix` is a
patch whatever sits in the brackets. Two commits touching nothing but
.gitea/workflows/unclaim.yml were written `fix(ci):` and cut v0.2.1 and
v0.2.2 -- real releases, published to Arch, Homebrew and the APK
registry, containing no user-facing change.
CLAUDE.md already warned that a mistyped feat ships a minor version.
That was not enough, because this was not a mistyped type: `fix` was
chosen deliberately, in the belief that the (ci) scope qualified it.
The version bump is the small half, which is why this gets a paragraph
rather than a clause. A merge to main starts two workflows; if
release.yml then pushes a tag, that tag push starts four more --
arch-package, homebrew-formula, android-apk and desktop-assets -- on a
runner with capacity 1, where the APK build alone is tens of minutes
and publishes a signed artifact to a public registry. So a mistyped
type is six workflow runs, not an odd-looking changelog.
`make release-dry` answers this before the merge instead of after, and
is cheaper than any one of those runs.
The two releases are staying: they are already published, and a version
that vanishes is worse for whoever pulled it than one that turns out to
be empty.
Closes#111
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Two commits touching nothing but
.gitea/workflows/unclaim.ymlwere writtenfix(ci):and cut two real releases:.releaserc.yml's commit-analyzer reads the type and ignores the scope.fixis a patch whatever sits in the brackets, sofix(ci):releases andci:does not.CLAUDE.md already warned that "a mistyped
featships a minor version". That was not enough, because this was not a mistyped type —fixwas chosen deliberately, in the belief that the(ci)scope qualified it.Why a paragraph and not a clause
The version bump is the small half. A merge to
mainstarts two workflows; ifrelease.ymlfinds a releasable commit it pushes av*tag, and that tag push starts four more:On a runner with capacity 1, where the APK build alone is tens of minutes and publishes a signed artifact to a public registry. So a mistyped type is six workflow runs, not an odd-looking changelog.
make release-dryanswers this before the merge and is cheaper than any one of them.The releases are staying
v0.2.1andv0.2.2are already published to Arch, Homebrew and the APK registry. A version that vanishes is worse for whoever pulled it than a version that turns out to contain only CI changes, so neither is deleted or retracted. They are noise in the changelog and nothing worse.This PR
docs:, which.releaserc.ymlmaps torelease: false— so it ships nothing, which is the point.make release-drycannot confirm that from a branch (it only evaluatesmain), so the config mapping is the evidence rather than a dry run.Closes #111
Reviewed and verified rather than read. Every factual claim in this holds:
.releaserc.yml'sreleaseRulesmatch on type only —fix→patch,ci→false,docs→false— so "the scope is decoration" is exactlyright, and this PR's own
docs:type ships nothing, which is the correctshape for the change.
v0.2.1andv0.2.2both trace to commits touching only.gitea/workflows/unclaim.yml(fix(ci): run the unclaim step under bash,fix(ci): give the unclaim step a CA bundle), and the earlierci: drop the claim label when an issue closeson the same file correctlycut nothing. The contrast is the argument.
featships a minor version" note), which is where someone about to pick atype would actually be reading.
The framing is the valuable part: the reason this deserves a paragraph is the
six workflow runs on a capacity-1 runner, not the version number. Agreed on
leaving the two releases in place — a version that vanishes is worse than one
that turns out to be empty.
Closes #111is in the commit body, so it will actually take. Merging.d414fdb2b6to2ada69a40f2ada69a40ftofeab0c18ecfeab0c18ecto35c0d83819Reviewed and approved above — the e2e failure on
35c0d83is not this PR.album-dropdown.spec.ts:91failed on chromium withExpected: 80, Received: 10, while WebKit passed in the same run, against a change that touches oneparagraph of
CLAUDE.md. I chased it rather than re-running: the spec guards onscrollHeight > clientHeight + 40and then asserts it can scroll to 80, soany range in 41–79 satisfies the precondition and cannot satisfy the assertion,
and the grid passes through that while it settles.
Filed as #133 with the measurements and fixed in #134 (0 failures in 10 runs,
against 2 in 9 on current
main). My #132 is what made it reachable — thequeue panel's mode is measured rather than media-queried, so there is one more
layout pass at that width — so the fix is mine to land.
Once #134 is in I will rebase this and merge it. Sorry for the extra cycles on
your branch; the rebase-per-merge is the branch protection requiring an
up-to-date head, not anything about this change.
35c0d83819to446380e3a9