ci / rust (push) Canceled after 5m55s
ci / rust-arm64 (push) Canceled after 0s
ci / web (push) Canceled after 0s
ci / docs-site (push) Canceled after 0s
docker / builders (--build-arg FEDORA_VERSION=44, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm, -f44) (push) Canceled after 0s
docker / builders (ci/android-ci.Dockerfile, punktfunk-android-ci) (push) Canceled after 0s
docker / builders (ci/arch-ci.Dockerfile, punktfunk-arch-ci) (push) Canceled after 0s
docker / builders (ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Canceled after 0s
docker / builders (ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Canceled after 0s
docker / builders (ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Canceled after 0s
docker / builders-arm64cross (push) Canceled after 0s
docker / apps (., web/Dockerfile, punktfunk-web) (push) Canceled after 0s
docker / apps (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Canceled after 0s
docker / deploy-docs (push) Canceled after 0s
android / android (push) Successful in 6m28s
Play does not show an empty "What's new" when the file is missing — it carries the PREVIOUS release's text onto the new version. So the store listing ends up describing a build nobody is getting, and nothing surfaces it except reading the listing. That is the shape of the v0.22.3 notes announcing a feature the tag never contained, and a soft warning in a log nobody reads does not prevent it. The gate runs FIRST in the job, before the ten-minute build: a miss costs a second and leaves nothing half-published — no build, no assets on the Gitea release, nothing on Play. It rejects three things: a missing file, a file byte-identical to another release's (the same bug reached by copy-paste rather than omission), and an empty or over-500-char one. Length is checked here as well as in play-upload.py on purpose. The uploader stays the last line of defence and is the only check android-promote.yml gets, but it runs at step 9; this catches an unedited TEMPLATE copy at step 1. It counts CHARACTERS, not bytes — Play's cap is 500 chars and `•` is three bytes in UTF-8, so a `wc -c` check would have called the 356-char v0.23.0 notes 365 and can reject a legal file. whatsnew/TEMPLATE.txt gives the file a starting point and says what the gate does and does not enforce: it cannot tell whether the prose was ever edited, so a copy that still reads "<The headline change>" ships exactly as written. Canary stays exempt — no curated notes, and Play reusing text for internal testers costs nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
28 lines
1.7 KiB
Plaintext
28 lines
1.7 KiB
Plaintext
• <The headline change, in what the user gets — not what was built.>
|
|
• <Second thing. Name devices they recognize: a phone, an Android TV, a DualSense.>
|
|
• <Third. Stop at what fits; 500 characters is the hard cap, and it is small.>
|
|
|
|
HOW TO USE THIS FILE
|
|
Copy to vX.Y.Z.txt, replace every line, delete this block. It is skipped by the CI gate by
|
|
name, so leaving it in place never blocks a release — but a copy that still says "<The
|
|
headline change>" will ship to the Play Store exactly as written. Nothing checks your prose.
|
|
|
|
WHAT BELONGS HERE
|
|
Only what changed in the ANDROID APP. Host-side work — Windows installers, gamescope, the web
|
|
console — means nothing to someone reading a phone app's store listing, and it is spending
|
|
characters you do not have. The full release notes in ../vX.Y.Z.md are where that lives.
|
|
|
|
RULES THE CI GATE ENFORCES (.gitea/workflows/android.yml)
|
|
* The file must exist for a vX.Y.Z tag, or the release fails before it builds. Play does not
|
|
show "no notes" when the file is missing — it carries the PREVIOUS release's text onto the
|
|
new version, and nobody notices until they read the store listing.
|
|
* It must not be byte-identical to another release's file.
|
|
* play-upload.py refuses anything over 500 characters and prints the real count.
|
|
|
|
RULES NOTHING ENFORCES
|
|
* Plain text. No markdown — Play renders none of it, so `**bold**` ships as asterisks.
|
|
* One `•` bullet per line.
|
|
* Same voice as ../README.md: lead with what the user can now do, no internal vocabulary.
|
|
* Frozen once the tag exists. Editing it later does not change what already shipped; it only
|
|
misleads the next person who reads it as the record of that versionCode.
|