Linux and Windows both ensure the release exists in parallel; a job can GET 404 (not yet created) then POST 422 (the other job won the race), leaving its release id empty so its assets never upload. Add || true to the create and a fallback re-fetch of the release id by tag when the create fails, so both jobs upload reliably.