A community based topic aggregation platform built on atproto

fix(consumer): address PR comments on PLC handle resolution master

This commit addresses all critical and important issues from the PR review: ## Critical Issues Fixed 1. **Removed fallback to deterministic handle construction** - Production now ONLY resolves handles from PLC (source of truth) - If PLC resolution fails, indexing fails with error (no fallback) - Prevents creating communities with incorrect handles in federated scenarios - Test mode (nil resolver) still uses deterministic construction for testing 2. **Deleted unnecessary migration 016** - Migration only updated column comment (no schema change) - Documentation now lives in code comments instead - Keeps migration history focused on actual schema changes ## Important Issues Fixed 3. **Extracted duplicated handle construction to helper function** - Created `constructHandleFromProfile()` helper - Validates hostedBy format (must be did:web) - Returns empty string if invalid, triggering repository validation - DRY principle now followed 4. **Added repository validation for empty handles** - Repository now fails fast if consumer tries to insert empty handle - Makes contract explicit: "handle is required (should be constructed by consumer)" - Prevents silent failures 5. **Fixed E2E test to remove did/handle from record data** - Removed 'did' and 'handle' fields from test record - Added missing 'owner' field - Test now accurately reflects real-world PDS records (atProto compliant) 6. **Added comprehensive PLC resolution integration tests** - Created mock identity resolver for testing - Test: Successfully resolves handle from PLC - Test: Fails when PLC resolution fails (verifies no fallback) - Test: Validates invalid hostedBy format in test mode - All tests verify the production code path ## Test Strategy Improvements 7. **Updated all consumer tests to use mock resolver** - Tests now exercise production PLC resolution code path - Mock resolver pre-configured with DID → handle mappings - Only one test uses nil resolver (validates edge case) - E2E test uses real identity resolver with local PLC 8. **Added setupIdentityResolver() helper for test infrastructure** - Reusable helper for configuring PLC resolution in tests - Uses local PLC at http://localhost:3002 for E2E tests - Production-like testing without external dependencies ## Architecture Summary **Production flow:** Record (no handle) → PLC lookup → Handle from PLC → Cache in DB ↓ (if fails) Error + backfill later **Test flow with mock:** Record (no handle) → Mock PLC lookup → Pre-configured handle → Cache in DB **Test mode (nil resolver):** Record (no handle) → Deterministic construction → Validate format → Cache in DB All tests pass. Server builds successfully. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>