CI / build-and-deploy (pull_request) Successful in 30s
`startEnrichment` snapshotted `bookmarks.indices`, then awaited a network call per bookmark. `bookmarks` is replaced wholesale by loads, searches and the unread filter, so by the time the loop read `bookmarks[i]` the index could be out of range — EXC_BREAKPOINT in Array._checkSubscript, straight from the read. The write path already guarded with `i < bookmarks.count`; the read did not. `enrichAll()` had the same shape and the same exposure. Both now track bookmark ids and re-resolve the position after each await, via a shared `apply(summary:tags:toId:)` that skips a bookmark that is no longer loaded rather than writing to whatever now sits at that index — which is the other half of the bug: a stale-but-in-range index would have silently attached one bookmark's summary to another. Found while investigating leftover Spotlight "translation error ... Code=1 (null)" entries after the indexing fix. Those turned out to be a symptom, not a separate bug: the crash tore the process down mid-donation and the in-flight items failed to translate. With the crash fixed they are gone, and the suite went from crashing (0 tests executed) to green across three consecutive runs. Adds a source round-trip to SpotlightRetrievalTests, so both donation paths — app entities and raw searchable items — are covered. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgLHztZGaEHvS3KNeGQmRM