Skip to content

ci: fix latest.json race condition in release workflow#60

Merged
Delimiters merged 3 commits into
mainfrom
fix/release-latest-json-race
May 10, 2026
Merged

ci: fix latest.json race condition in release workflow#60
Delimiters merged 3 commits into
mainfrom
fix/release-latest-json-race

Conversation

@Delimiters

Copy link
Copy Markdown
Owner

Summary

  • All three platform builds (Windows, macOS, Linux) were running in parallel and all tried to upload latest.json (the auto-updater manifest) simultaneously
  • The concurrent delete + re-upload of the same release asset caused intermittent 404 errors (Not Found - update-a-release-asset)
  • This caused the last two releases to fail on different platforms (Windows in run 25634915972, Linux in run 25638673819)

Fix

Add max-parallel: 1 to the build matrix strategy. Each platform now runs sequentially: Windows → macOS → Linux. Each job reads the existing latest.json from the draft release and merges in its own platform's signatures, so the final latest.json contains all three platforms correctly.

Trade-off: releases take ~3x longer (~45 min instead of ~15 min), but they no longer fail randomly.

Test plan

  • Merge this PR and verify the next release run completes with all three build jobs succeeding
  • Confirm the published latest.json contains signatures for all three platforms

🤖 Generated with Claude Code

…dition

All three platform builds were uploading latest.json in parallel; concurrent
delete+re-upload of the same asset caused 404 errors. max-parallel:1 makes
each platform run sequentially so each job merges its signatures into the
existing latest.json without conflict. Releases take ~3x longer but are
reliable.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@Delimiters Delimiters enabled auto-merge (squash) May 10, 2026 20:59
@vercel

vercel Bot commented May 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
den Ready Ready Preview, Comment May 10, 2026 9:48pm

- Move removeMessage before the await in deleteMessage so the message
  disappears from the UI instantly rather than waiting for the Supabase
  round trip (which can take >10s in CI, causing the E2E assertion to time out)
- Switch Add Friend search from fill() to click()+keyboard.type() so each
  keystroke fires React's onChange on the controlled input reliably

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- clickByTitle: use locator.dispatchEvent('click') instead of page.evaluate
  element.click() — dispatchEvent bypasses viewport bounds without the silent
  no-op risk when querySelector returns null
- Widen timeout on tab bar button waits from default 5s to 10s so slow CI
  renders don't cause false failures
- setInputValue: native value setter + single input event fires exactly one
  Supabase query for the Add Friend search, eliminating the race condition
  where keyboard.type fired 10 concurrent queries that could overwrite each other

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@Delimiters Delimiters merged commit 2498314 into main May 10, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant