The test compared len(w) and list(w) as two SEPARATE locked reads, so the churn thread could mutate between them (30 vs 31) — a bug in the test, not the Watchlist (each read is individually consistent; there is no torn-read guarantee ACROSS two calls). Now snapshots once and asserts that snapshot never tears + concurrent contains/slice never raise. 5/5 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>