test(posts): RED cycle 2 — collection-aware fail-closed + getComments + counts master
Corrects cycle 1's fail-OPEN predicate (missing admission row => visible), which is a security hole for postv2. - TestVisibility_CollectionAwareFailClosed (pinned hardest): a legacy community.post with no admission row stays visible (accepted-by-construction, until task 8's drain); a postv2 with no admission row is HIDDEN from non-authors on feed/discover/post.get but visible to its author. A missing postv2 admission row is a failed pending seed, not grandfathered content. - TestGetCommentsVisibility: the thread header goes through an admission+ deleted-aware fetch — pending header hidden from non-author, accepted shown, soft-deleted no longer leaks (closes the 2026-07-29 defect). - TestCommunityPostCountVisibility + countAcceptedPostsForCommunity stub: pins accepted-only count semantics (community post_count is a stale stored counter; the counter itself is a consumer-side follow-up — see report). - Blocker reseed: service_blob_test.go's PDS-hydration fixture gets an accepted admission row (it tests hydration, not visibility) so the fail-closed fix doesn't break it. - author_post_contract retarget/delete rework: the anonymous content reads of a now-hidden pending post are replaced — retarget leans on getStatus state; the delete accepts the post first so its removal is an observable served->gone transition. Authorship-from-repo proof moved onto the accepted post in the read-visibility contract. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>