docs: verify CHANGELOG against full git history since repo creation
test / test (push) Waiting to run

Correct historical gaps: compose cap_add (CAP_FOWNER/FSETID/KILL) in [0.2.0], nav Backup/Sign-out icons in [0.3.0], Export/Danger layout in [1.2.5], and move GHCR per-arch tag cleanup from [1.3.0] to [1.3.1] where the fix landed.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-19 01:11:31 +03:00
parent 72126b63af
commit b81a261d01
+27 -18
View File
@@ -252,6 +252,14 @@ tag bump; no schema migration.
parsed aggregate report (aligned vs third-party fail), not a hub-only parsed aggregate report (aligned vs third-party fail), not a hub-only
summary. summary.
### Fixed
- ci (GHCR): per-arch package tags (`X.Y.Z-amd64`, `X.Y.Z-arm64`) are dropped
after the manifest merge via the GitHub Packages API. The `[1.3.0]` merge job
called `docker buildx imagetools rm`, which is not a valid subcommand — cleanup
failed with a warning and the side-effect tags stayed in the registry until
this fix.
## [1.3.0] - 2026-08-14 ## [1.3.0] - 2026-08-14
Security and quality after 1.2.5: domain-admin send-log authorization, Security and quality after 1.2.5: domain-admin send-log authorization,
@@ -336,11 +344,6 @@ Plex. Upgrading from 1.2.x is a tag bump; no migration.
the same Resync on demand. The `internal/backup` package comment now matches the same Resync on demand. The `internal/backup` package comment now matches
this behaviour. this behaviour.
- ci (GHCR): per-arch package tags (`X.Y.Z-amd64`, `X.Y.Z-arm64`) are dropped
after the manifest merge via the GitHub Packages API. The merge job had called
`docker buildx imagetools rm`, which is not a valid subcommand — cleanup failed
with a warning and the side-effect tags stayed in the registry.
### Changed ### Changed
- docs: operator and as-built docs aligned with the code after a full - docs: operator and as-built docs aligned with the code after a full
@@ -390,15 +393,13 @@ Plex. Upgrading from 1.2.x is a tag bump; no migration.
(`vX.Y.Z`) or a manual `workflow_dispatch` with an explicit SemVer version — a (`vX.Y.Z`) or a manual `workflow_dispatch` with an explicit SemVer version — a
bare git tag push no longer starts the build. `release.yml` listens for bare git tag push no longer starts the build. `release.yml` listens for
`release: published`, checks out that tag (not `main` HEAD), e2e-gates each `release: published`, checks out that tag (not `main` HEAD), e2e-gates each
native arch build, merges `X.Y.Z-amd64` and `X.Y.Z-arm64` into one manifest, native arch build, and merges `X.Y.Z-amd64` and `X.Y.Z-arm64` into one
then removes the per-arch tags from GHCR via the GitHub Packages API so manifest. Reliable removal of the per-arch side-effect tags from GHCR landed
operators see only `ghcr.io/mixeme/selfpost:X.Y.Z` (what in `[1.3.1]`. A dispatch whose version input is missing or not `X.Y.Z` fails
`deploy/docker-compose.yml` pins). A dispatch whose version input is missing in `prepare`. [development.md](docs/development.md) documents draft vs
or not `X.Y.Z` fails in `prepare`. [development.md](docs/development.md) published releases, why deleting a release tag converts it back to draft, and
documents draft vs published releases, why deleting a release tag converts Gitea → GitHub tag-mirror pitfalls (do not prune release tags on GitHub; a
it back to draft, and Gitea → GitHub tag-mirror pitfalls (do not prune release mirrored `v1.0.0` still runs that tag's `on: push: tags` workflow).
tags on GitHub; a mirrored `v1.0.0` still runs that tag's `on: push: tags`
workflow).
- test: the authorization and sign-in surfaces that had no tests now have them. - test: the authorization and sign-in surfaces that had no tests now have them.
The login limiter is covered for its ceiling, its per-address scope, the reset The login limiter is covered for its ceiling, its per-address scope, the reset
@@ -495,7 +496,9 @@ Rate-limit form polish after 1.2.4. Upgrading is a tag bump; no migration.
carry muted leads and matched control height; trusted-IP help sits under the carry muted leads and matched control height; trusted-IP help sits under the
IP field. Domain settings pairs DMARC reports with the level-2 rate limit IP field. Domain settings pairs DMARC reports with the level-2 rate limit
using CSS subgrid so titles, fields, and Save / Remove buttons line up across using CSS subgrid so titles, fields, and Save / Remove buttons line up across
columns. columns. Domain page Export and Danger cards stack naturally again — a
shared-baseline flex pin on `.split` cards made mismatched body lengths look
worse than a plain stack.
## [1.2.4] - 2026-08-12 ## [1.2.4] - 2026-08-12
@@ -1302,9 +1305,10 @@ database, or the on-disk layout. Upgrading is a tag bump.
Bookmarks to the old paths stop working. Bookmarks to the old paths stop working.
- panel: each entry in the navigation bar now carries an icon beside its label, - panel: each entry in the navigation bar now carries an icon beside its label,
so the bar is scannable at a glance instead of a row of similar-length words. so the bar is scannable at a glance instead of a row of similar-length words
The icons are inline SVG drawn in the entry's own colour — no extra request, Backup uses a filing-cabinet mark; Sign out has its own icon too. The icons
no exemption from the panel's Content-Security-Policy — and are hidden from are inline SVG drawn in the entry's own colour — no extra request, no
exemption from the panel's Content-Security-Policy — and are hidden from
screen readers, which still announce the label alone. screen readers, which still announce the label alone.
- panel: the navigation bar is laid out as two rows on purpose — the signed-in - panel: the navigation bar is laid out as two rows on purpose — the signed-in
@@ -1444,6 +1448,11 @@ database, or the on-disk layout. Upgrading is a tag bump.
login/password and on the sending server name. login/password and on the sending server name.
- panel: the *Addresses* field is hidden while an application's address mode is - panel: the *Addresses* field is hidden while an application's address mode is
*Any address of the domain*, where the server ignores it. *Any address of the domain*, where the server ignores it.
- deploy: `cap_add` gains `CAP_FOWNER` and `CAP_FSETID` so the entrypoint can
chmod and set the setgid bit on `/data` directories it has just chowned under
`cap_drop: ALL`, and `CAP_KILL` so supervisord can signal OpenDKIM across uids
when domains are added or removed. Production boot under the hardened compose
file exposed both gaps after Phase 10.
- ci: disable provenance attestation on release image push, so the ghcr.io - ci: disable provenance attestation on release image push, so the ghcr.io
manifest list shows only `linux/amd64`/`linux/arm64` (no `unknown/unknown`). manifest list shows only `linux/amd64`/`linux/arm64` (no `unknown/unknown`).
- ci: run `go vet` and `go test ./...` on every push to `main` and every pull - ci: run `go vet` and `go test ./...` on every push to `main` and every pull