refetchQueries on a mutation intermittently never delivers its result to a useSuspenseQuery consumer

Author: dh-seanmurphyCreated Aug 24, 2026Updated Aug 27, 2026

Issue Description

When a mutation's refetchQueries option refetches a query that's already being consumed elsewhere via useSuspenseQuery, the refetch's underlying network request completes successfully, but the completed result is intermittently never delivered to that useSuspenseQuery consumer — the component is left showing stale data indefinitely, with no error and no further update, even given an arbitrarily long wait.

This isn't a slow update — we confirmed it's a genuinely dropped notification:

  • Waiting up to 25 seconds (vs. a normal ~100ms round trip) still fails identically.
  • Monkey-patching QueryManager's refetchQueries at runtime shows the refetch's own returned promise (oq.refetch()) resolving successfully.
  • Subscribing directly to the same ObservableQuery that the useSuspenseQuery-backed InternalQueryReference listens on shows exactly one emission — { loading: true, networkStatus: 4 (refetch), data: } — with no follow-up "completed" emission ever arriving on that channel, even though the fetch itself finished.

This reproduces at roughly 10% of runs in both our application and the minimal repro below (no data masking, no custom link chain — just @apollo/client + React + Testing Library).

Versions

  • @apollo/client: 4.2.12
  • react / react-dom: 19.2.8
  • graphql: 16.14.2
  • Test environment: jest 30.4.2 + jest-environment-jsdom 30.4.1 (jsdom, not a real browser)
  • Node:24.16.0

Note

Issue generated in conjunction with claude code.

Link to Reproduction

https://github.com/dh-seanmurphy/apollo-refetch-repro

Reproduction Steps

$ npm install
$ ./run-repro.sh

@apollo/client version

4.2.12

Source: apollographql/apollo-client