{
"id": "app.tempomusic.feed.reply",
"defs": {
"main": {
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"text",
"reply",
"createdAt"
],
"properties": {
"text": {
"type": "string",
"maxLength": 3000,
"description": "The reply content.",
"maxGraphemes": 300
},
"langs": {
"type": "array",
"items": {
"type": "string",
"format": "language"
},
"maxLength": 3,
"description": "BCP-47 language tags for the text content. Up to three."
},
"reply": {
"ref": "#replyRef",
"type": "ref",
"description": "Threading context. Required: every reply must point at the post (and possibly intermediate reply) it answers."
},
"labels": {
"refs": [
"com.atproto.label.defs#selfLabels"
],
"type": "union",
"description": "Author-declared content warnings. Uses the standard AT Protocol self-label vocabulary for ecosystem compatibility."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared timestamp when this reply was originally created."
}
}
},
"description": "A text reply attached to a Tempo post. Reply records form threads via the reply ref; the music subject lives on the root post, not on the reply itself."
},
"replyRef": {
"type": "object",
"required": [
"root",
"parent"
],
"properties": {
"root": {
"ref": "com.atproto.repo.strongRef",
"type": "ref"
},
"parent": {
"ref": "com.atproto.repo.strongRef",
"type": "ref"
}
},
"description": "Threading context. AppViews MUST enforce: root references an app.tempomusic.feed.post (threads anchor on a post); parent references either an app.tempomusic.feed.post or an app.tempomusic.feed.reply (sub-thread replies). strongRef is collection-agnostic by design — these constraints live in AppView validation, not in the lexicon schema."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}