feat(lexicon): migrate vote to feed namespace and apply atProto best practices
This commit migrates the vote lexicon to align with atProto conventions and
fixes several pre-existing bugs discovered during the migration.
## Main Changes
1. **Namespace Migration**: social.coves.interaction.vote → social.coves.feed.vote
- Follows Bluesky's pattern (app.bsky.feed.like)
- All feed interactions now in consistent namespace
- Updated all code references, tests, and Jetstream consumers
2. **atProto Best Practices** (per https://github.com/bluesky-social/atproto/discussions/4245):
- Changed `enum` to `knownValues` for future extensibility
- Use standard `com.atproto.repo.strongRef` instead of custom definition
- Enhanced description to mention authentication requirement
3. **Added Core atProto Schemas**:
- com.atproto.repo.strongRef.json
- com.atproto.label.defs.json
- Required for lexicon validation, standard practice for Go projects
## Bug Fixes
1. **Foreign Key Constraint Mismatch** (013_create_votes_table.sql):
- REMOVED FK constraint on voter_did → users(did)
- Code comments stated FK was removed, but migration still had it
- Tests expected no FK for out-of-order Jetstream indexing
- Now consistent: votes can be indexed before users
2. **Invalid Test Data** (tests/lexicon-test-data/feed/vote-valid.json):
- Missing required `direction` field
- `subject` was string instead of strongRef object
- Now valid: includes direction, proper strongRef with uri+cid
## Files Changed
**Lexicon & Test Data:**
- Moved: internal/atproto/lexicon/social/coves/{interaction → feed}/vote.json
- Moved: tests/lexicon-test-data/{interaction → feed}/vote-valid.json
- Added: internal/atproto/lexicon/com/atproto/repo/strongRef.json
- Added: internal/atproto/lexicon/com/atproto/label/defs.json
**Code (10 files updated):**
- internal/validation/lexicon.go
- internal/validation/lexicon_test.go
- internal/atproto/jetstream/vote_consumer.go
- cmd/server/main.go (Jetstream URL)
- internal/db/postgres/vote_repo_test.go (12 test URIs)
- internal/db/migrations/013_create_votes_table.sql
## Tests
✅ All vote repository tests passing (11 tests)
✅ Validation tests passing with new lexicon path
✅ TestVoteRepo_Create_VoterNotFound passing (validates FK removal)
✅ Lexicon schema validation passing
✅ No regressions introduced
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>