A community based topic aggregation platform built on atproto

refactor(lexicon): Simplify community profile to single handle field

Remove redundant atprotoHandle field in favor of single DNS-resolvable
handle field. This matches Bluesky's pattern (app.bsky.actor.profile)
and follows atProto best practices.

Changes:
- Remove atprotoHandle field from social.coves.community.profile
- Update handle field description to indicate DNS-resolvable format
- Add format: "handle" validation
- Update test data to use DNS-valid handles

Rationale:
- Single source of truth for community handle
- Reduces confusion about which handle is "real"
- Client-side UI derives display format (!name@instance) from name + instance
- Follows separation of concerns: protocol vs presentation layer

Example:
- Before: handle="!gaming@coves.social", atprotoHandle="gaming.communities.coves.social"
- After: handle="gaming.communities.coves.social", display derived client-side

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

Changed files
+3 -9
internal
atproto
lexicon
social
coves
community
tests
lexicon-test-data
community
+2 -6
internal/atproto/lexicon/social/coves/community/profile.json
···
"handle": {
"type": "string",
"maxLength": 253,
-
"description": "Scoped handle (!name@instance.com) for UI display"
-
},
-
"atprotoHandle": {
-
"type": "string",
-
"maxLength": 253,
-
"description": "V2: Real atProto handle (e.g., gaming.coves.social) matching the community's DID"
},
"name": {
"type": "string",
···
"handle": {
"type": "string",
"maxLength": 253,
+
"format": "handle",
+
"description": "atProto handle (e.g., gaming.communities.coves.social) - DNS-resolvable name for this community"
},
"name": {
"type": "string",
+1 -3
tests/lexicon-test-data/community/profile-valid.json
···
{
"$type": "social.coves.community.profile",
-
"did": "did:plc:community123456789abc",
-
"handle": "!programming@coves.social",
"name": "programming",
"displayName": "Programming Community",
"description": "A community for programmers",
-
"owner": "did:plc:instance123456",
"createdBy": "did:plc:creator123456",
"hostedBy": "did:plc:instance123456",
"visibility": "public",
···
{
"$type": "social.coves.community.profile",
+
"handle": "programming.communities.coves.social",
"name": "programming",
"displayName": "Programming Community",
"description": "A community for programmers",
"createdBy": "did:plc:creator123456",
"hostedBy": "did:plc:instance123456",
"visibility": "public",