Whether there are more records to fetch after this batch
OptionalNewUpdated watermark value after this batch
OptionalNextNext keyset/seek position — the highest StableOrderingKey value in this batch — to pass back via FetchContext.AfterKeyValue (plan.md §7 keyset resume).
OptionalNextNext cursor to pass back via FetchContext.CurrentCursor on the next call (cursor-based pagination)
OptionalNextNext offset to pass back via FetchContext.CurrentOffset on the next call (offset-based pagination)
OptionalNextNext page number to pass back via FetchContext.CurrentPage on the next call (page-based pagination)
Records retrieved in this batch
OptionalSourceMJ-RUN-35 — the total the SOURCE says it holds for this object, when it says so.
Many APIs state it on every page (Django REST returns {count, next, previous, results}), and
it is the cheapest self-check available: comparing it against what a clean fetch actually
produced turns a silently incomplete scan into a failed one. Before this it went nowhere — the
REST base parsed count into its internal pagination state and had no field to carry it out
on, so every connector that read it discarded it and the engine had nothing to check against.
Absent means "the source did not say", which is NOT the same as zero and must never be compared as if it were.
OptionalWarningsNon-fatal diagnostics from this fetch (e.g. a second-layer object that found zero parents). The engine forwards each to the structured progress artifact as a SyncWarning so the silent-empty case is visible over GraphQL instead of a swallowed console.warn.
Result of a FetchChanges call, containing a batch of records