Home / Input Output / actions
Feb 24, 2-3 AM (0)
Feb 24, 3-4 AM (0)
Feb 24, 4-5 AM (0)
Feb 24, 5-6 AM (0)
Feb 24, 6-7 AM (0)
Feb 24, 7-8 AM (0)
Feb 24, 8-9 AM (0)
Feb 24, 9-10 AM (0)
Feb 24, 10-11 AM (0)
Feb 24, 11-12 PM (0)
Feb 24, 12-1 PM (0)
Feb 24, 1-2 PM (0)
Feb 24, 2-3 PM (0)
Feb 24, 3-4 PM (0)
Feb 24, 4-5 PM (0)
Feb 24, 5-6 PM (0)
Feb 24, 6-7 PM (0)
Feb 24, 7-8 PM (0)
Feb 24, 8-9 PM (0)
Feb 24, 9-10 PM (0)
Feb 24, 10-11 PM (0)
Feb 24, 11-12 AM (0)
Feb 25, 12-1 AM (0)
Feb 25, 1-2 AM (0)
Feb 25, 2-3 AM (0)
Feb 25, 3-4 AM (0)
Feb 25, 4-5 AM (0)
Feb 25, 5-6 AM (0)
Feb 25, 6-7 AM (0)
Feb 25, 7-8 AM (0)
Feb 25, 8-9 AM (0)
Feb 25, 9-10 AM (0)
Feb 25, 10-11 AM (0)
Feb 25, 11-12 PM (0)
Feb 25, 12-1 PM (0)
Feb 25, 1-2 PM (0)
Feb 25, 2-3 PM (0)
Feb 25, 3-4 PM (0)
Feb 25, 4-5 PM (0)
Feb 25, 5-6 PM (0)
Feb 25, 6-7 PM (0)
Feb 25, 7-8 PM (0)
Feb 25, 8-9 PM (0)
Feb 25, 9-10 PM (0)
Feb 25, 10-11 PM (0)
Feb 25, 11-12 AM (0)
Feb 26, 12-1 AM (0)
Feb 26, 1-2 AM (0)
Feb 26, 2-3 AM (0)
Feb 26, 3-4 AM (0)
Feb 26, 4-5 AM (0)
Feb 26, 5-6 AM (0)
Feb 26, 6-7 AM (3)
Feb 26, 7-8 AM (0)
Feb 26, 8-9 AM (0)
Feb 26, 9-10 AM (0)
Feb 26, 10-11 AM (0)
Feb 26, 11-12 PM (1)
Feb 26, 12-1 PM (0)
Feb 26, 1-2 PM (0)
Feb 26, 2-3 PM (0)
Feb 26, 3-4 PM (0)
Feb 26, 4-5 PM (0)
Feb 26, 5-6 PM (0)
Feb 26, 6-7 PM (0)
Feb 26, 7-8 PM (0)
Feb 26, 8-9 PM (0)
Feb 26, 9-10 PM (0)
Feb 26, 10-11 PM (0)
Feb 26, 11-12 AM (0)
Feb 27, 12-1 AM (0)
Feb 27, 1-2 AM (0)
Feb 27, 2-3 AM (0)
Feb 27, 3-4 AM (0)
Feb 27, 4-5 AM (0)
Feb 27, 5-6 AM (0)
Feb 27, 6-7 AM (0)
Feb 27, 7-8 AM (0)
Feb 27, 8-9 AM (0)
Feb 27, 9-10 AM (0)
Feb 27, 10-11 AM (0)
Feb 27, 11-12 PM (0)
Feb 27, 12-1 PM (0)
Feb 27, 1-2 PM (0)
Feb 27, 2-3 PM (0)
Feb 27, 3-4 PM (0)
Feb 27, 4-5 PM (0)
Feb 27, 5-6 PM (0)
Feb 27, 6-7 PM (0)
Feb 27, 7-8 PM (0)
Feb 27, 8-9 PM (0)
Feb 27, 9-10 PM (0)
Feb 27, 10-11 PM (0)
Feb 27, 11-12 AM (0)
Feb 28, 12-1 AM (1)
Feb 28, 1-2 AM (1)
Feb 28, 2-3 AM (2)
Feb 28, 3-4 AM (0)
Feb 28, 4-5 AM (0)
Feb 28, 5-6 AM (0)
Feb 28, 6-7 AM (2)
Feb 28, 7-8 AM (0)
Feb 28, 8-9 AM (0)
Feb 28, 9-10 AM (0)
Feb 28, 10-11 AM (0)
Feb 28, 11-12 PM (0)
Feb 28, 12-1 PM (0)
Feb 28, 1-2 PM (0)
Feb 28, 2-3 PM (0)
Feb 28, 3-4 PM (0)
Feb 28, 4-5 PM (0)
Feb 28, 5-6 PM (0)
Feb 28, 6-7 PM (0)
Feb 28, 7-8 PM (0)
Feb 28, 8-9 PM (0)
Feb 28, 9-10 PM (0)
Feb 28, 10-11 PM (0)
Feb 28, 11-12 AM (0)
Mar 01, 12-1 AM (0)
Mar 01, 1-2 AM (0)
Mar 01, 2-3 AM (0)
Mar 01, 3-4 AM (0)
Mar 01, 4-5 AM (0)
Mar 01, 5-6 AM (0)
Mar 01, 6-7 AM (0)
Mar 01, 7-8 AM (0)
Mar 01, 8-9 AM (0)
Mar 01, 9-10 AM (0)
Mar 01, 10-11 AM (0)
Mar 01, 11-12 PM (0)
Mar 01, 12-1 PM (0)
Mar 01, 1-2 PM (0)
Mar 01, 2-3 PM (0)
Mar 01, 3-4 PM (0)
Mar 01, 4-5 PM (0)
Mar 01, 5-6 PM (0)
Mar 01, 6-7 PM (0)
Mar 01, 7-8 PM (0)
Mar 01, 8-9 PM (0)
Mar 01, 9-10 PM (0)
Mar 01, 10-11 PM (0)
Mar 01, 11-12 AM (0)
Mar 02, 12-1 AM (0)
Mar 02, 1-2 AM (0)
Mar 02, 2-3 AM (0)
Mar 02, 3-4 AM (0)
Mar 02, 4-5 AM (0)
Mar 02, 5-6 AM (0)
Mar 02, 6-7 AM (0)
Mar 02, 7-8 AM (0)
Mar 02, 8-9 AM (0)
Mar 02, 9-10 AM (0)
Mar 02, 10-11 AM (0)
Mar 02, 11-12 PM (0)
Mar 02, 12-1 PM (0)
Mar 02, 1-2 PM (0)
Mar 02, 2-3 PM (0)
Mar 02, 3-4 PM (0)
Mar 02, 4-5 PM (0)
Mar 02, 5-6 PM (0)
Mar 02, 6-7 PM (0)
Mar 02, 7-8 PM (0)
Mar 02, 8-9 PM (0)
Mar 02, 9-10 PM (0)
Mar 02, 10-11 PM (0)
Mar 02, 11-12 AM (0)
Mar 03, 12-1 AM (0)
Mar 03, 1-2 AM (0)
Mar 03, 2-3 AM (0)
10 commits this week Feb 24, 2026 - Mar 03, 2026
wait-for-hydra: add SSE support for real-time Hydra status (#41)
When `hydra-status-url` is provided, the action connects to the
hydra-github-bridge SSE endpoint for real-time build status updates
instead of polling the GitHub API. This dramatically reduces latency
from minutes (poll interval) to seconds (event-driven).

SSE mode features:
- One-shot check on cached status before opening the stream
- Event filtering by check-run name (ignores unrelated jobs)
- Process substitution to avoid subshell exit trap
- read -t 60 to enforce timeout during idle streams
- Periodic re-checks every 120s as CDN buffering safety net
- Graceful fallback to poll mode on connection failure

Without `hydra-status-url`, the action behaves exactly as before
(pure GitHub API polling with exponential backoff).

Copyright (c) Moritz Angermann <[email protected]>, Input Output Group.
SPDX-License-Identifier: Apache-2.0
wait-for-hydra: add SSE support for real-time Hydra status
When `hydra-status-url` is provided, the action connects to the
hydra-github-bridge SSE endpoint for real-time build status updates
instead of polling the GitHub API. This dramatically reduces latency
from minutes (poll interval) to seconds (event-driven).

SSE mode features:
- One-shot check on cached status before opening the stream
- Event filtering by check-run name (ignores unrelated jobs)
- Process substitution to avoid subshell exit trap
- read -t 60 to enforce timeout during idle streams
- Periodic re-checks every 120s as CDN buffering safety net
- Graceful fallback to poll mode on connection failure

Without `hydra-status-url`, the action behaves exactly as before
(pure GitHub API polling with exponential backoff).

Copyright (c) Moritz Angermann <[email protected]>, Input Output Group.
SPDX-License-Identifier: Apache-2.0
fix(wait-for-hydra): add periodic re-checks during SSE stream
CDN proxies like Cloudflare may buffer SSE events, preventing real-time
delivery of status updates to the client. This caused the script to
hang indefinitely on the SSE stream even after the build completed.

Three fixes:

1. Periodic one-shot re-check: every 120s, poll the bridge's cached
   /status endpoint directly. This catches status changes even when
   SSE events are buffered or lost.

2. Reserve time for fallback: set curl --max-time to TIMEOUT - 120s
   so there's always 2 minutes left for one-shot re-check + polling.

3. Final one-shot re-check after SSE stream ends, before entering
   the polling fallback loop.
fix(wait-for-hydra): enforce timeout during idle SSE streams
Two fixes for SSE mode reliability:

1. Use `read -t 60` instead of blocking `read` so check_timeout fires
   every 60s even when the SSE stream is idle. Without this, if the
   stream goes idle (e.g. Cloudflare buffering, no new events), read
   blocks indefinitely and the script's TIMEOUT is never enforced.

2. After the SSE stream ends, re-check the one-shot endpoint before
   falling back to polling. This catches the case where the target
   status changed while we were connected but the SSE event was lost
   in transit (common with CDN/proxy intermediaries).
fix(wait-for-hydra): use process substitution to fix subshell exit bug
The SSE event loop used `curl | while read`, which creates a subshell
for the while loop. This means `exit 0/1` inside the loop only
terminates the subshell — not the script — causing SSE mode to always
fall through to the polling fallback.

Fix by using process substitution (`< <(curl ...)`) so the while loop
runs in the current shell and `exit` works as intended.
Fix wait-for-hydra: redirect debug echo to stderr
The debug echo inside poll_github() was captured by the command
substitution `conclusion=$(poll_github)`, making `conclusion` a
multi-line string that never matched the `success)` or `failure)`
patterns in the case statement. This caused the action to always
fall through to the `*` wildcard and wait until timeout.

Redirect both debug echo lines to stderr (`>&2`) so only the
actual gh api result is captured in the return value.
wait-for-hydra: add timeout, exponential backoff, and fix multi-value results
- Add timeout input (default: 3600s / 1 hour), exit code 2 on timeout
- Add max-delay input (default: 300s) to cap exponential backoff
- Exponential backoff: start at delay, double each iteration, cap at max-delay
- Fix multi-value conclusion from paginated API results (tail -1)
- Add iteration counter and elapsed time to all log messages
- Use GitHub Actions error annotations for validation/timeout failures
wait-for-hydra: add timeout, exponential backoff, and fix multi-value results
- Add timeout input (default: 3600s / 1 hour), exit code 2 on timeout
- Add max-delay input (default: 300s) to cap exponential backoff
- Exponential backoff: start at delay, double each iteration, cap at max-delay
- Fix multi-value conclusion from paginated API results (tail -1)
- Add iteration counter and elapsed time to all log messages
- Use GitHub Actions error annotations for validation/timeout failures