chore(release): v0.4.0 #54
No reviewers
Labels
No labels
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
status/deferred
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/purser!54
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "release-prep/rolling"
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?
Added
release: attach a compiled
purser-linux-amd64binary to each Forgejo release (#16)A new
attach-release-assetjob runs after the cut and uploads the binary to the draft release before the operator publishes it. The binary is built with the same-ldflags "-X …/version.Tag=${TAG}"injection used by the Docker image, so the login page and the Docker-deployed binary report the same tag. The job is a no-op on non-cut runs (update / noop mode) and on dry runs.The dashboard can now choose a certificate's expiry at issue time, up to
PURSER_MAX_CERT_LIFETIME. Leaving the box empty givesPURSER_CERT_LIFETIMEas before, and the control is hidden entirely until the ceiling is raised above
the default — so nothing changes for a deployment that does not opt in.
A request above the ceiling is refused before anything is signed, with the
limit named. A request shorter than
PURSER_DOWNLOAD_WINDOWis refused too: nominTLSCertDurationis set on the provisioner, so the CA would sign acertificate that can expire before it finishes being installed.
docs: document dashboard password rotation with
hashpw(#44)Operators now have a runbook for replacing the mounted bcrypt hash without putting the password in argv or adding a change-password form to Purser.
Changed
None.
Fixed
version: add tests for the Tag → VCS revision → dev fallback chain (#29)
internal/versionhad no test file;purser#7carried a negative-control AC for the dev/unknown fallback that was never met. Six tests now cover the three arms (Tagset, VCS revision present, neither) including an arm for the empty-revision guard (vcs.revisionkey present, value empty → must fall through to"dev") and a mutation-verified negative control asserting the chain never returns an empty or invented string. Each arm uses an injectablereadBuildInfohook so tests exercise the full chain regardless of whether VCS info is available in the CI container.release: address Lookout review 4976 on attach-release-asset job
Removed
None.
Deprecated
None.
Upgrade
None.
chore(release): v0.3.1to chore(release): v0.4.0c141484472to47d04a17a247d04a17a2to8ae3c7393c⚠️ This PR has NO CI. Not "nothing failing" — nothing ran.
Posting here rather than only on #41, because this page is where the decision gets made and the page looks fine.
Zero is not green. There is no red, no failed job, and no tell — the PR simply never received a
pull_requestevent, because it was pushed byforgejo-actionsfromrelease-prep/rolling. A PR that ran every check and got one warning would look worse than this one.The control, measured in the same window
Same repo, same afternoon, same
paths: ['CHANGELOG.md']filter matched. One variable: who pushed. And the surface is demonstrably live —manifest-checkfired on #48 at 15:11,go-ciandrelease.ymlonmainat 15:13.So this is not "the changelog gate is broken." The gate is wired and fires — that was proven separately. It is that prep PRs receive no PR CI at all on this instance, which is exactly what #41 exists for, now measured rather than hypothesised.
Why it matters on this PR specifically
This is a v0.4.0 cut, which is a different weight from a docs PR with no CI. The last cut that went through this same hole — #25 — merged with two 36-word sentences that the density check would have caught, and it cost a morning to unwind.
Whoever merges this: the changelog body has not been checked by anything. If it is going to be merged, the body wants a human read first — or run the check by hand against it.
Mechanism is stated as hypothesis, not measurement: Forgejo's anti-recursion safeguard suppresses workflow triggers for pushes made with the Actions token. That fits every observation here; what is measured is the absence and its control, not the cause.
Discriminator by Surveyor — separating "ran and skipped" from "never ran" — against the arm-0 control.
8ae3c7393cto447bcf272f