Read-only ActivityPub → atproto bridge for the threadiverse using Coves lexicons

Task 08 (2/2): e2e scenarios, helpers, FOLLOWUPS — and a real vote-retraction bug the suite caught master

Eight scenarios against the real Lemmy/PLC/Jetstream stack: subscribe, post ordering, comment strongRefs (wire-captured uri+cid), edit/delete, votes via side-channel XRPC, backfill (author-profile-first + seeded counts), restart idempotency (backfill-completion poll, gap-post cursor -resume proof, op-agnostic duplicate keys), concurrent burst. Review fixes (8-reviewer panel): drain() now fails on a dead listener instead of passing negative assertions vacuously; every consumed create/update is lexicon-validated and unknown collections fail the suite (votes-never-records enforced suite-wide); reader goroutine joined on cleanup; subscribe retries only pending states; embed .external crosses the wire validated. The new retract-to-zero assertion caught a production bug: Lemmy federates vote-clears as Undo with a RECONSTRUCTED inner vote (fresh activity id, typed Like even when the live vote is a dislike; flips are bare opposite votes with no Undo) — the id-targeted RetractVote never matched, so every Lemmy vote-clear was a silent no-op. Fixed: id-targeted first, known-id probe stops replays, unknown-id falls back to retracting the voter's live vote. +3 unit tests. make e2e: ok tidepool/tests/e2e 100.036s (8/8). Full unit suite green. All 8 PLAN.md tasks complete. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>