Skip to content

Rollout ordering: server expires cursors (cloud#196) but deployed mount clients predate the 410 handler (#476, v0.10.56) #482

Description

@kjgbot

Sandbox agent-relay cloud run workflows fail after their command steps succeed, because the post-step mount flush dies on 410 cursor_expired and never performs the full resync the error asks for. Two independent occurrences on 2026-09-09, ~20 min apart, on different runs.

This is a rollout ordering problem, not a missing fix

relayfile-cloud#196  "expire cursors and retain event history"   merged 2026-09-07 21:54Z   <- server starts emitting 410
relayfile#476        "resync expired event cursors"              merged 2026-09-08 05:37Z   <- client handler
                                                                  released v0.10.56 05:51Z

The server began expiring cursors roughly eight hours before the client-side handler was released. #476 is exactly the missing behaviour — "recognize 410 cursor_expired / action: full_resync … clear the stale event cursor and force exactly one authoritative full-tree reconciliation" — and its own description flags the dependency:

makes retained-event pruning safe for mount clients once both PRs are reviewed, merged, released, and intentionally enabled by a human

The deployed clients are all older than the handler

sandbox snapshot:  relay-orchestrator-sdk-11.10.3-relayfile-v0.10.55-...   <- one release short
sf-mini CLI:       0.10.41
finn-mini CLI:     0.10.22

That answers the reporter's question of why cursor expiry does not trigger the resync its own log message names: the code that would do it is not in v0.10.55.

Suggested fix

Bump the sandbox snapshot's pinned relayfile to v0.10.56 or later, and audit any other pinned client. Until then, every mount whose event cursor expires mid-run fails non-deterministically, which blocks both demo workflows and the flows review-swarm CI gate.

The other half — the WebSocket 403 — is probably separate

The reported sequence is: WebSocket handshake returns 403 → falls back to polling → polling's cursor is rejected with 410 → no resync. The 410 half is explained above. The 403 is not, and should not be assumed to share a cause.

Worth noting alongside it, without claiming causation: delegated credential minting is currently failing fleet-wide for CLI clients —

mint delegated relayfile credentials: http 502 relayauth_mint_failed:
RelayAuth request failed (500) /v1/identities;
unable to verify whether RelayAuth identity creation committed

A 403 on a WebSocket upgrade is consistent with an auth/token problem, and the reporter separately observed Relaycast workspace key repair failed: 503 database_overloaded the same day. Those may share a root cause in the session/credential path, or may not — it is being investigated separately and should be established rather than assumed.

Relayfile itself is up. Verified from the deployed factory's authenticated evidence: Relayfile workspace mirror preflight: mounted=1 failed=0 routedRepos=19, with successful ensureSubRoot and listTree operations. Clients holding a valid credential and a current version work fine.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions