fix(ap): self-heal retries until a clean pass; feed re-boost also refreshes
Scale fix (think 1M instances, not this one row): the previous remedies
still had two gaps that only showed up per-user.
- selfHealTimeline consumed its version even when some origins were
unreachable at that exact moment - phone-hosted instances are offline
routinely, so their notes stayed stale forever with no retry. The
version is now only persisted after a CLEAN pass (0 unreachable);
otherwise it retries on the next boots and gives up after 5 attempts
(dead origins answer 404/410 and are pruned, so no infinite loop).
SELFHEAL_VERSION 6 -> 7 so already-healed instances rerun with the new
semantics.
- The /news feed boost only did markBoosted, so "boost again to heal a
stale copy" silently worked from the interact page but not the feed.
Boosting from the feed now also re-resolves the note (fire-and-forget)
and refreshes the cached row via upsertBoostedNote.
Retry state machine verified in isolation (offline-then-reachable ->
heals; permanently dead -> gives up after 5 passes, then skips). Suite
45/45.
- src/services/ActivityPubService.js - clean-pass gating + attempts
counter (app_settings, no schema change); SELFHEAL_VERSION 7
- src/routes/posts.js - /news/boost refreshes the cached row on boost
- CHANGELOG(.nl/.de).md - extended the Unreleased bullet (3 languages)
Co-Authored-By: Claude <noreply@…>