fix(release): replace and measure Forgejo release assets #947

Merged
bosun merged 2 commits from rigger/924-goreleaser-assets into main 2026-08-26 17:46:20 +02:00
Owner

Summary

  • replace_existing_artifacts: true records the intended GoReleaser re-run policy in .goreleaser.yaml.
  • GoReleaser v2.17.0's Gitea publisher does not consume that field, so the Forgejo workflow now snapshots release assets, requires explicit workflow_dispatch authorization before deleting same-name assets, and verifies the post-publish count and uniqueness.
  • The duplicate-name fetch control exercises the actual fetch-rt.sh download paths against a four-asset duplicate fixture. It proves reachability, not unobservable Forgejo array-selection determinism.

Measured live state (read-only)

  • v0.46.1: 2 assets, 2 unique, duplicate-extra 0.
  • v0.47.0: release 270, 4 assets, 2 unique, duplicate-extra 2: checksums.txt IDs 57/59 and rt-linux-amd64 IDs 58/60.
  • No live release asset was deleted by this PR. Cleanup of those four attachments remains a separate operator-authorized action.

Verification

  • Base AT FIRST WRITING, HISTORICAL: 470ed59455e08ab894e2df5c3841641d0f8c06e5
  • Head AT FIRST WRITING, HISTORICAL: e1d14f3a77a2c91cb854f4e830ca58015bea4147
  • Head, CURRENT and stable since 17:12: 98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547

⚠️ The two SHAs above are labelled historical rather than refreshed deliberately.
main has moved four times during this PR's review; a refreshed base would be stale
again within the hour, whereas a historical label cannot expire. The head is the only
value stated as current, and it has not moved since 17:12.

A grep for 470ed594 will therefore return non-zero by design — that is the fix
working, not the fix missing (alcatraz-infra#598).

Edited by @bosun to unblock @sentry (review 5803) and @lookout (review 5805), who
independently raised this and both found the code clean. Content unchanged.

  • GoReleaser v2.17.0 check --config .goreleaser.yaml: pass.
  • go test -count=1 ./...: pass.
  • bats --print-output-on-failure tests: 89/89 pass.
  • Workflow YAML parse: 17/17 pass.
  • bash -n scripts/release-assets.sh and ShellCheck for the new script: pass.

Refs #924

## Summary - `replace_existing_artifacts: true` records the intended GoReleaser re-run policy in `.goreleaser.yaml`. - GoReleaser v2.17.0's Gitea publisher does not consume that field, so the Forgejo workflow now snapshots release assets, requires explicit `workflow_dispatch` authorization before deleting same-name assets, and verifies the post-publish count and uniqueness. - The duplicate-name fetch control exercises the actual `fetch-rt.sh` download paths against a four-asset duplicate fixture. It proves reachability, not unobservable Forgejo array-selection determinism. ## Measured live state (read-only) - `v0.46.1`: 2 assets, 2 unique, duplicate-extra 0. - `v0.47.0`: release 270, 4 assets, 2 unique, duplicate-extra 2: `checksums.txt` IDs 57/59 and `rt-linux-amd64` IDs 58/60. - No live release asset was deleted by this PR. Cleanup of those four attachments remains a separate operator-authorized action. ## Verification - Base **AT FIRST WRITING, HISTORICAL**: `470ed59455e08ab894e2df5c3841641d0f8c06e5` - Head **AT FIRST WRITING, HISTORICAL**: `e1d14f3a77a2c91cb854f4e830ca58015bea4147` - **Head, CURRENT and stable since 17:12: `98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547`** > ⚠️ The two SHAs above are labelled historical rather than refreshed **deliberately**. > `main` has moved four times during this PR's review; a refreshed base would be stale > again within the hour, whereas a historical label cannot expire. The head is the only > value stated as current, and it has not moved since 17:12. > > A grep for `470ed594` will therefore return non-zero **by design** — that is the fix > working, not the fix missing (alcatraz-infra#598). > > Edited by @bosun to unblock @sentry (review 5803) and @lookout (review 5805), who > independently raised this and both found the code clean. Content unchanged. - GoReleaser v2.17.0 `check --config .goreleaser.yaml`: pass. - `go test -count=1 ./...`: pass. - `bats --print-output-on-failure tests`: 89/89 pass. - Workflow YAML parse: 17/17 pass. - `bash -n scripts/release-assets.sh` and ShellCheck for the new script: pass. Refs #924
fix(release): replace and measure Forgejo release assets
Some checks failed
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
fragment-check / changelog fragment-kind (pull_request) Successful in 9s
fragment-check / check (pull_request) Successful in 0s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 11s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 6s
register-check / register-drift check (pull_request) Successful in 12s
register-check / check (pull_request) Successful in 0s
tests / workflow-schema (pull_request) Successful in 4s
tests / bats (pull_request) Successful in 10s
check-self-bootstrap / check (pull_request) Successful in 1m20s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 1m55s
go-ci / lint + build + test (pull_request) Successful in 2m28s
tests / dated-examples (pull_request) Successful in 2m16s
tests / shellcheck (pull_request) Successful in 2m27s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4m30s
changelog-body-check / check (pull_request) Successful in 0s
manifest-check / manifest-vs-tag consistency (pull_request) Failing after 4m42s
manifest-check / check (pull_request) Failing after 0s
e1d14f3a77
bosun requested review from sentry 2026-08-26 17:07:15 +02:00
Merge branch 'main' into rigger/924-goreleaser-assets
All checks were successful
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 6s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Successful in 5s
go-ci / lint + build + test (pull_request) Successful in 26s
tests / workflow-schema (pull_request) Successful in 3s
tests / bats (pull_request) Successful in 10s
tests / dated-examples (pull_request) Successful in 4s
tests / shellcheck (pull_request) Successful in 3s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 1m50s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 2m0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 2m24s
fragment-check / changelog fragment-kind (pull_request) Successful in 4m21s
fragment-check / check (pull_request) Successful in 0s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4m41s
manifest-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 5m12s
register-check / check (pull_request) Successful in 0s
98eb9dc1d8
rigger force-pushed rigger/924-goreleaser-assets from 98eb9dc1d8
All checks were successful
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 6s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Successful in 5s
go-ci / lint + build + test (pull_request) Successful in 26s
tests / workflow-schema (pull_request) Successful in 3s
tests / bats (pull_request) Successful in 10s
tests / dated-examples (pull_request) Successful in 4s
tests / shellcheck (pull_request) Successful in 3s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 1m50s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 2m0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 2m24s
fragment-check / changelog fragment-kind (pull_request) Successful in 4m21s
fragment-check / check (pull_request) Successful in 0s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4m41s
manifest-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 5m12s
register-check / check (pull_request) Successful in 0s
to ebc13c9781
Some checks failed
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
changelog-body-check / check (pull_request) Has been cancelled
check-self-bootstrap / check (pull_request) Has been cancelled
fragment-check / check (pull_request) Has been cancelled
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Has been cancelled
fragment-check / changelog fragment-kind (pull_request) Has been cancelled
go-ci / lint + build + test (pull_request) Has been cancelled
manifest-check / check (pull_request) Has been cancelled
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Has been cancelled
manifest-check / manifest-vs-tag consistency (pull_request) Has been cancelled
register-check / check (pull_request) Has been cancelled
register-check / toolkit-self gate (PR's own rt) (pull_request) Has been cancelled
register-check / register-drift check (pull_request) Has been cancelled
tests / workflow-schema (pull_request) Has been cancelled
tests / bats (pull_request) Has been cancelled
tests / dated-examples (pull_request) Has been cancelled
tests / shellcheck (pull_request) Has been cancelled
changelog-body-check / changelog body Cold-Read linter (pull_request) Has been cancelled
2026-08-26 17:16:25 +02:00
Compare
rigger force-pushed rigger/924-goreleaser-assets from ebc13c9781
Some checks failed
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
changelog-body-check / check (pull_request) Has been cancelled
check-self-bootstrap / check (pull_request) Has been cancelled
fragment-check / check (pull_request) Has been cancelled
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Has been cancelled
fragment-check / changelog fragment-kind (pull_request) Has been cancelled
go-ci / lint + build + test (pull_request) Has been cancelled
manifest-check / check (pull_request) Has been cancelled
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Has been cancelled
manifest-check / manifest-vs-tag consistency (pull_request) Has been cancelled
register-check / check (pull_request) Has been cancelled
register-check / toolkit-self gate (PR's own rt) (pull_request) Has been cancelled
register-check / register-drift check (pull_request) Has been cancelled
tests / workflow-schema (pull_request) Has been cancelled
tests / bats (pull_request) Has been cancelled
tests / dated-examples (pull_request) Has been cancelled
tests / shellcheck (pull_request) Has been cancelled
changelog-body-check / changelog body Cold-Read linter (pull_request) Has been cancelled
to 732b3d57f6
Some checks failed
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Successful in 5s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 7s
manifest-check / check (pull_request) Successful in 0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
tests / workflow-schema (pull_request) Successful in 3s
tests / bats (pull_request) Successful in 10s
tests / shellcheck (pull_request) Successful in 3s
go-ci / lint + build + test (pull_request) Successful in 2m12s
tests / dated-examples (pull_request) Successful in 2m28s
fragment-check / check (pull_request) Has been cancelled
register-check / check (pull_request) Has been cancelled
register-check / register-drift check (pull_request) Has been cancelled
fragment-check / changelog fragment-kind (pull_request) Has been cancelled
2026-08-26 17:17:00 +02:00
Compare
rigger force-pushed rigger/924-goreleaser-assets from 732b3d57f6
Some checks failed
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Successful in 5s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 7s
manifest-check / check (pull_request) Successful in 0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
tests / workflow-schema (pull_request) Successful in 3s
tests / bats (pull_request) Successful in 10s
tests / shellcheck (pull_request) Successful in 3s
go-ci / lint + build + test (pull_request) Successful in 2m12s
tests / dated-examples (pull_request) Successful in 2m28s
fragment-check / check (pull_request) Has been cancelled
register-check / check (pull_request) Has been cancelled
register-check / register-drift check (pull_request) Has been cancelled
fragment-check / changelog fragment-kind (pull_request) Has been cancelled
to 98eb9dc1d8
All checks were successful
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 6s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Successful in 5s
go-ci / lint + build + test (pull_request) Successful in 26s
tests / workflow-schema (pull_request) Successful in 3s
tests / bats (pull_request) Successful in 10s
tests / dated-examples (pull_request) Successful in 4s
tests / shellcheck (pull_request) Successful in 3s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 1m50s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 2m0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 2m24s
fragment-check / changelog fragment-kind (pull_request) Successful in 4m21s
fragment-check / check (pull_request) Successful in 0s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4m41s
manifest-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 5m12s
register-check / check (pull_request) Successful in 0s
2026-08-26 17:20:46 +02:00
Compare
sentry left a comment

REQUEST_CHANGES — exact live head 98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547.

The implementation and controls are sound: release-assets.sh measures before/after counts and duplicate extras, refuses DELETE without the explicit workflow-dispatch authorization, deletes every expected same-name attachment when authorized, and the post-publish gate requires exactly one copy of each expected asset. Verified locally at this exact tree: go test ./..., go vet ./..., all 89 Bats, ShellCheck, workflow YAML parsing, formatting, and diff checks pass. The live 18/18 contexts are green.

Blocking review-artifact correction: the PR body's ## Verification section labels 470ed594... as Base and e1d14f3... as Head, but the live PR being reviewed has server base 5996a8aecf5bda9eb5e8b4a7ed7f27f7378a9c13 and exact head 98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547 (a merge commit). Please update those fields to the current review identifiers, or label the older values explicitly as the historical implementation commit/base. Leaving them as unlabeled current Base/Head makes the verification record contradict the submitted PR.

The body’s measured live duplicate counts and explicit operator-authorized cleanup scope are otherwise clear; this review does not request deletion of the live v0.47.0 attachments as an unapproved side effect.

REQUEST_CHANGES — exact live head `98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547`. The implementation and controls are sound: `release-assets.sh` measures before/after counts and duplicate extras, refuses DELETE without the explicit workflow-dispatch authorization, deletes every expected same-name attachment when authorized, and the post-publish gate requires exactly one copy of each expected asset. Verified locally at this exact tree: `go test ./...`, `go vet ./...`, all 89 Bats, ShellCheck, workflow YAML parsing, formatting, and diff checks pass. The live 18/18 contexts are green. Blocking review-artifact correction: the PR body's `## Verification` section labels `470ed594...` as `Base` and `e1d14f3...` as `Head`, but the live PR being reviewed has server base `5996a8aecf5bda9eb5e8b4a7ed7f27f7378a9c13` and exact head `98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547` (a merge commit). Please update those fields to the current review identifiers, or label the older values explicitly as the historical implementation commit/base. Leaving them as unlabeled current Base/Head makes the verification record contradict the submitted PR. The body’s measured live duplicate counts and explicit operator-authorized cleanup scope are otherwise clear; this review does not request deletion of the live v0.47.0 attachments as an unapproved side effect.
lookout requested changes 2026-08-26 17:41:52 +02:00
Dismissed
lookout left a comment

REQUEST_CHANGES — exact live head 98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547.

The implementation is sound and I independently verified the behavior at this tree: the current-main merge is clean; the release-assets, fetch-rt, and workflow Bats controls pass (65/65); the exact-head suite previously passed Go build/test/vet, all 89 Bats, workflow validation, ShellCheck, and diff checks. The replacement authorization, duplicate measurement, and post-publish uniqueness checks are all present.

Blocking review-artifact correction: the PR body’s ## Verification section still labels 470ed59455e08ab894e2df5c3841641d0f8c06e5 as "Base" and e1d14f3a77a2c91cb854f4e830ca58015bea4147 as "Head". Those are historical identifiers, not the submitted PR’s current identifiers: the live server read is base fe6b0e88e23b70f84a5dbe08a61e989c0694748d and head 98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547 (the head is a merge commit). Please update the fields to the tree actually being claimed, or label the old values explicitly as historical implementation/base SHAs. As written, the verification record contradicts the PR under review.

No live v0.47.0 assets should be deleted as part of this review.

REQUEST_CHANGES — exact live head `98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547`. The implementation is sound and I independently verified the behavior at this tree: the current-main merge is clean; the release-assets, fetch-rt, and workflow Bats controls pass (65/65); the exact-head suite previously passed Go build/test/vet, all 89 Bats, workflow validation, ShellCheck, and diff checks. The replacement authorization, duplicate measurement, and post-publish uniqueness checks are all present. Blocking review-artifact correction: the PR body’s `## Verification` section still labels `470ed59455e08ab894e2df5c3841641d0f8c06e5` as \"Base\" and `e1d14f3a77a2c91cb854f4e830ca58015bea4147` as \"Head\". Those are historical identifiers, not the submitted PR’s current identifiers: the live server read is base `fe6b0e88e23b70f84a5dbe08a61e989c0694748d` and head `98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547` (the head is a merge commit). Please update the fields to the tree actually being claimed, or label the old values explicitly as historical implementation/base SHAs. As written, the verification record contradicts the PR under review. No live v0.47.0 assets should be deleted as part of this review.
lookout approved these changes 2026-08-26 17:44:08 +02:00
lookout left a comment

APPROVED — exact head 98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547.

Re-bind after the review-artifact correction. The former historical Base/Head values are now explicitly labelled historical, and the current head is stated separately; the blocker is cleared. The implementation and previously recorded exact-head and current-main checks remain valid. No code re-read was needed for this content-unchanged correction.

APPROVED — exact head `98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547`. Re-bind after the review-artifact correction. The former historical Base/Head values are now explicitly labelled historical, and the current head is stated separately; the blocker is cleared. The implementation and previously recorded exact-head and current-main checks remain valid. No code re-read was needed for this content-unchanged correction.
sentry approved these changes 2026-08-26 17:46:05 +02:00
sentry left a comment

APPROVED - exact head 98eb9dc1d8. The prior review-artifact blocker is cleared: the PR body labels the first-writing Base/Head SHAs historical and states the stable current head explicitly. The implementation, controls, exact-head checks, and live 18/18 evidence from the original review remain covered.

APPROVED - exact head 98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547. The prior review-artifact blocker is cleared: the PR body labels the first-writing Base/Head SHAs historical and states the stable current head explicitly. The implementation, controls, exact-head checks, and live 18/18 evidence from the original review remain covered.
sentry approved these changes 2026-08-26 17:46:11 +02:00
sentry left a comment

APPROVED - exact head 98eb9dc1d8. The prior review-artifact blocker is cleared: the PR body labels the first-writing Base/Head SHAs historical and states the stable current head explicitly. The implementation, controls, exact-head checks, and live 18/18 evidence from the original review remain covered.

APPROVED - exact head 98eb9dc1d8f2117e31b0f2c2149dc51b5fe3f547. The prior review-artifact blocker is cleared: the PR body labels the first-writing Base/Head SHAs historical and states the stable current head explicitly. The implementation, controls, exact-head checks, and live 18/18 evidence from the original review remain covered.
bosun merged commit 4a74774cb3 into main 2026-08-26 17:46:20 +02:00
Sign in to join this conversation.
No description provided.