You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fix (SSE): the stream leg is pinned to the primary stream URL — SSE never fails over (qfg-41nh.6). The reconnect loop previously rotated through sse_api_urls on every reconnect, so with the default two derived stream URLs a primary blip silently parked the live stream on stream.secondary and bound config freshness to the mirror. The stream now always dials sse_api_urls[0] and retries it forever with backoff (matching sdk-go); failover remains HTTP-poll only, and the HTTP config-fetch hedge still uses both api_urls legs. The sse_failed_over_to_secondary? diagnostic is now latched at the dial site, and the failover chaos harness hands the client both stream legs so the f05 probe actually exercises the pin.
Fix (delivery): per-leg config-fetch aborts are now wall-clock (qfg-41nh.6). The per-leg timeout was enforced with Faraday/Net::HTTP phase timeouts, which are per-read — a slow-drip upstream (one byte per interval) could hold a "bounded" leg open indefinitely and wedge the init fetch, a fallback poll tick, or the hedge drain. timeout_ms (plus a small headroom) is now also enforced as a wall-clock ceiling over the whole request, surfacing a Faraday::TimeoutError through the existing failure paths. Hedged legs additionally always settle their drain slot, so fetch! is guaranteed to return within the per-leg abort budget.
Fix (client): liveness signals no longer lie during outages (qfg-41nh.6). The fallback poll worker stamped last_successful_refresh and fired on_update on every tick regardless of fetch outcome, so a total outage with on_init_failure: :return reported ready? == true over an empty store. The worker now stamps freshness only on successful fetches (:updated / :not_modified; a 304 or guard-rejected-but-successful response counts) and fires on_update only when an envelope is actually installed, matching sdk-go.
Fix (client): the fallback poller fetches immediately on engage and logs the engage edge (qfg-41nh.6). The poll worker previously slept a full interval before its first fetch, so the first post-engage data arrived ~180s after SSE loss (default 60s interval) vs ~120s in sdk-go; it now fetches first, then sleeps. Engaging Layer 2 also logs at WARN (previously silent — only the stop path logged, at debug), matching sdk-go's operator signal.