macos-14 brownouts from Oct 5: rerun a Sume submit with the same key
GitHub's macos-14 runners fail on purpose in brownout windows before the 2026-11-02 retirement. Derive a stable Idempotency-Key so a re-run does not bill twice.

If a GitHub Actions workflow submits a Sume job from a macos-14 runner, the brownouts that start on 2026-10-05 will fail some runs, and re-running them is safe only if the submit carries an Idempotency-Key that is the same on every attempt. Sume's docs say a retried submit with the same key returns the original job instead of billing a second one, and that reusing a key for a different payload returns 409 idempotency_conflict.
GitHub's dates and labels are from its macOS 14 retirement notice; Sume's behavior is from Jobs and results, Generation admission and Errors and rate limits, read 2026-10-03. The notice says jobs on these labels will temporarily fail during the scheduled brownouts; it does not say at which step a job stops, so the design below assumes any step can be the last one that ran.
When are the brownouts?
Retirement is 2026-11-02 for macos-14, macos-14-large and macos-14-xlarge. GitHub lists eight October brownout windows, each starting at 14:00 UTC and ending at 00:00 UTC the next day, and warns it may also reduce capacity, which means longer queue times. The recommended replacements are macos-latest (macOS 26), macos-15, macos-latest-xlarge and macos-15-xlarge.
| Start | End |
|---|---|
| Oct 5, 14:00 | Oct 6, 00:00 |
| Oct 12, 14:00 | Oct 13, 00:00 |
| Oct 16, 14:00 | Oct 17, 00:00 |
| Oct 19, 14:00 | Oct 20, 00:00 |
| Oct 23, 14:00 | Oct 24, 00:00 |
| Oct 26, 14:00 | Oct 27, 00:00 |
| Oct 29, 14:00 | Oct 30, 00:00 |
| Oct 30, 14:00 | Oct 31, 00:00 |
What should the idempotency key be?
Build it from values that stay constant across a re-run and that identify the intent, for example the repository, the workflow's run id and the step name. GitHub's run_id stays the same on a re-run while run_attempt increases, so leave the attempt number out of the key (this is GitHub's documented behavior for the github context; I did not re-fetch that page for this post). Put the exact request body in a file or a step output so a re-run sends the same bytes, not a freshly timestamped prompt.
If a run died after the submit reached Sume, the re-run's submit returns the original job. Then do not stop at the submit response: read status_url, honor next_poll_after_seconds, and fetch the result when result_ready is true.
What if the queue is full when the re-run lands?
A re-run burst after a brownout can submit many jobs at once. Sume accepts valid jobs as queued while queue capacity remains and answers 429 queue_full when it does not; the docs say to retry with the same key after capacity opens, and 429 rate_limited is separate (back off with retry-after). Check generation_limits.queue_capacity_remaining in submit responses and stop adding work when it is low.
Sources
Related posts
More in Developers
- MAI-Transcribe-2-Streaming Realtime API: events vs Sume job URLs
Microsoft's streaming transcriber uses a WebSocket with delta, intermediate and commit events. Sume STT takes a file URL and returns a job. A side-by-side.
- MAX_MCP_OUTPUT_TOKENS 25,000: size a Sume jobs_wait wave read
Claude Code caps MCP output at 25,000 tokens and saves larger results to a file. How that meets Sume's jobs_wait include_results and a batch jobs_result read.
- MCP 401 challenge: the WWW-Authenticate header Sume returns
What a client sees when it calls Sume's MCP endpoint with no token: the WWW-Authenticate challenge, its resource_metadata URL and scope, and the spec.
- MCP Python SDK 2.3 max_sse_event_size vs Sume's 256 KiB result cap
MCP Python SDK 2.3.0 adds max_sse_event_size. Sume caps a tool result at 256 KiB, so a normal Sume result fits well under any sane SSE limit.
Written by Sume