Fix list.member clobber + precise PK-collapse eval guard
The real fire under the follow-cap smell (caught by Codex): list membership keyed
by (actor, list.member, pds, self-repo) means a user on two of your lists clobbers
to one row — the same provenance/cardinality bug we fixed for labels, one level
deeper. Fix: key list.member by the list URI as source_id; value is boolean
(rkey lives in the index, not the value, so duplicate-membership records collapse
idempotently instead of looking like conflicting values). RecordIndexEntry now
carries source + source_id so a listitem delete retracts the exact membership.
Eval: replaced the blunt "all PKs unique" assertion (which false-failed on benign
duplicate membership records in real data) with a precise one — distinct (actor,list)
from the records must equal distinct list.member PKs, so a real clobber/regression is
caught while idempotent duplicates are reported as benign, not failed. Verified live.
Doc: softened "never bulk-pull follows" to the accurate rule (never request-time
bulk-pull or cap; scoped getRelationships ≤30 for actors in hand, or streaming
backfill + changelog for a complete set) and Codex's key point — incremental-from-now
is incomplete forever without a baseline backfill — plus the multi-valued-feature
keying discipline.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>