v1.2.1
Makes releases self-recording.
release.yml built and pushed the image on every version tag but never created
a GitHub release entry, so the Releases page stopped at v1.0.1 while v1.1.0,
v1.1.1, v1.1.2 and v1.2.0 had all shipped to GHCR. The repository read as
abandoned since April, and 'gh release list' became a false negative for
whether a version had shipped, which caused at least one wrong conclusion
during development.
A github-release job now reads the annotated tag message, which is where this
project keeps its notes, falling back to generated notes for a lightweight
tag. It is idempotent, so re-running a workflow cannot fail on a duplicate,
and it is gated on the image build: a release entry pointing at a version with
no published image would be worse than no entry at all.
The four missing entries were backfilled by hand from their tag annotations.
No functional change to the server. 49 tests passing, lint clean.