Bounded continuation for activity sources
The first activity candidate retained complete fields but stopped collecting after one bounded batch. In the largest existing development world that left 519 later fields unavailable. A source-count increase alone still hit the byte ceiling. This change adds an offline continuation API using the same 128-source/512-KiB per-page limits, 64-KiB whole-field limit and bounded named-field scan.
collectActivitySourcePage binds its progress marker to a hash of the entire ordered, size-eligible source stream, including later pages and omission diagnostics. A source change outside the current page invalidates an earlier marker. Pages contain a contiguous sequence: a smaller later field cannot jump ahead of an earlier field that needs the next page. The progress marker is for an offline job, not an authenticated browser cursor. Callers must retain an immutable published snapshot and impose total job, page and model-token budgets.
The API reports oversized fields and truncated scans explicitly. complete describes coverage of the scanned world, independently of whether another page is available; it is false when size or scan limits leave omissions. The output holds one bounded page, while each call rescans the bounded input to validate its identity. This trades additional offline scanning for simple, verifiable resumption.
The original collectActivitySources API and activity artifact remain unchanged. The shared visitor preserves their original field ordering, hashes, limits and behavior when a later smaller field fits. This compatibility permits comparison with the preserved development artifacts. The semantic selector and artifact integration for later pages are still separate work; the new source API alone does not make those fields influence recommendations.
Development verification
The real new API traversed the same twelve development snapshots in 17 pages, yielding 1,258 sources and 1,102,750 UTF-8 bytes. Every source object matched an independently expanded enumeration of the pinned earlier collector, in order, with no duplicate IDs. The largest world yielded 647 sources/568,828 bytes across six pages; the other eleven each needed one page. All twelve original collector outputs and three prior activity artifact hashes also matched exactly.
The implementation probe SHA-256 is 8f40ee5be15b254b526b54624ac818ece48fe48e65ff68b019bf4be74837c95d. It records the candidate source hash. This is a coverage and compatibility result on development worlds, not retrieval uplift, semantic review accuracy or a production performance measurement. No provider request, new subscription, database write, evaluation-cohort access or serving change was involved.
The combined isolated regression suite passed all 296 tests, including sixteen new continuation tests; the original red shell fails fourteen of those assertions. Server typecheck passed. Independent review found no actionable issues and additionally checked 71 pages/7,034 sources across 26 synthetic fixtures. The preceding commit 98bf53e also completed both full discovery CI (run35506304203) and full OSS export CI (run35506305085) successfully; those runs validate that commit, not this subsequent pagination change.
