fix(release): reject rebuilds of existing versions - #98
Conversation
|
🦞👀 Pull request received. I will update this pull request when review starts. |
|
Codex review: needs real behavior proof before merge. Reviewed August 28, 2026, 12:05 PM ET / 16:05 UTC. ClawSweeper reviewWhat this changesThe PR adds a read-only release preflight that blocks existing tags or releases before the shared publishing workflow, serializes release runs, and documents the v0.14.7 duplicate-dispatch incident. Merge readiness⛔ Blocked until stronger real behavior proof is added - 7 items remain Keep open: this is a focused release-safety fix, but its validation accepts non-SemVer numeric identifiers and it changes the documented same-version recovery policy without maintainer confirmation. Priority: P2 Review scores
Verification
How this fits togetherThe unified release workflow receives a version, delegates artifact creation and signing to the shared release pipeline, then publishes a Git tag and release. The new preflight sits before that handoff to prevent a duplicate version from starting another build. flowchart LR
A[Release dispatch] --> B[Version preflight]
B --> C{Tag or release exists?}
C -->|Yes| D[Stop duplicate build]
C -->|No| E[Shared release workflow]
E --> F[Signed artifacts and release]
Decision needed
Why: This PR intentionally replaces the repository’s documented same-version retry behavior, and the appropriate recovery path affects release policy beyond the narrow validation repair. Before merge
Findings
Agent review detailsSecurityNone. Review metrics
Merge-risk optionsMaintainer options:
Technical reviewBest possible solution: Adopt the crawlkit-specific version-immutability policy only with maintainer approval, then enforce canonical SemVer and retain a documented, separately authorized recovery procedure. Do we have a high-confidence way to reproduce the issue? Yes—source-reproducible: the introduced regex accepts v01.2.3, while the added invalid-input tests omit leading-zero numeric identifiers. Is this the best way to solve the issue? No—not yet: fail-closed dispatching is plausible, but it needs canonical SemVer validation and explicit approval for replacing the existing retry policy. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 8620d26db83f. LabelsLabel changes:
Label justifications:
EvidenceWhat I checked:
Likely related people:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
|
What Problem This Solves
Resolves a problem where dispatching an already published version rebuilt and re-signed its assets, created a redundant draft, and failed the correct final checksum-binding gate.
The red run 31838411168 did not leave v0.14.7 unpublished: run 31836986812 had already published it 14 minutes earlier. The public release is intact; the failed run left a separate complete eight-asset draft, ID
370810895. The tag and Go proxy/checksum-database version already exist.Why This Change Was Made
A read-only preflight now rejects existing version tags and releases before entering the shared release workflow. One repository-wide concurrency group covers preflight through publication, including equivalent
0.14.8/v0.14.8inputs. Tags are rejected even without a published GitHub Release because they already expose Go module versions and precede draft creation in this pipeline. API errors fail closed.The shared workflow retains signing, notarization, independent verification, and final byte binding. No checksum comparison is relaxed and no existing tag, release, draft, or asset is changed. The generic shared-workflow retry behavior for other callers is outside this PR. Historical runs still use their old workflow definition and must not be rerun to publish v0.14.7.
User Impact
New dispatches cannot rebuild an existing release version. Failed releases require reconciliation of their original payload or a new patch version. Publishing guidance now reflects the actual v0.14.7 state and identifies v0.14.8 as the next unused version, carrying #92's HTTP timeout fix, #96/#97's dependency/toolchain updates, and this guard. This PR does not publish or dispatch a release.
Evidence
Detailed reconciliation, hashes, asset IDs, provenance, and repeatable reads.
LC_CODE_SIGNATURE, with identical code directory hashes and new signing timestamps. This is a fresh rebuild/re-sign, not stale cache, changed source, or a publication race.v, existing tags/releases, and API failures. They run in CI andmake check.0.14.7andv0.14.7, accepts absent0.14.8, and never invokes a release workflow.actionlintandgit diff --checkpass. Tidy, formatting, vet, deadcode, and govulncheck pass; the vulnerability gate reports no reachable vulnerabilities..agents/skills/autoreview/scripts/autoreview --mode local --engine codex) completed with no findings.make checkpassed (tidy/diff, formatting, vet, deadcode, govulncheck, all Go tests, race tests, and release regression tests). The separateGOWORK=off go test -count=1 ./...also passed.af84dd5996f5510627f640be18732aacf0be1510; no retries were needed.