fix(consumer): address PR comments on PLC handle resolution
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>