refetchQueries on a mutation intermittently never delivers its result to a useSuspenseQuery consumer
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