A community based topic aggregation platform built on atproto

test: vote/profile/subscription contracts — two more shipping defects pinned master

Phase 4 task 14. Five legacy files die (3,918 LOC), including the last hand-rolled Jetstream subscriber in the tree — no test dials a websocket anymore. Three ingestion contracts land: feed.vote (re-tap idempotency keyed three ways, delete decrements, superseded-delete staged past the GREATEST floor with a second live voter), actor.profile (mandatory arm-then-prove against backfill, avatar/banner blobs fetched through the image proxy as binary image/* — not any-2xx), community.subscription (stored count and live COUNT(*) asserted together). The spike confirmed and worsened the flagged hazard — an orphan vote row inserts uncounted and its later withdrawal SUBTRACTS a different voter's real vote (p1 filed) — and found a second: putRecord vote updates are silently dropped by the create/delete-only consumer switch (p2 filed). Both pinned with issue IDs in the assertion strings and KNOWN DEFECT notes replacing the production comments that claimed the behavior was fine. Defect tally: seven. make ci green: 3549 tests, 0 skips. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>