{
"id": "at.eptss.candidateLedger",
"defs": {
"main": {
"key": "any",
"type": "record",
"record": {
"type": "object",
"required": [
"round",
"playlist",
"nominations",
"publishedAt"
],
"properties": {
"round": {
"ref": "com.atproto.repo.strongRef",
"type": "ref",
"description": "The at.atjam.round this ledger belongs to."
},
"playlist": {
"ref": "com.atproto.repo.strongRef",
"type": "ref",
"description": "The at.atjam.playlist holding the candidates, in ballot order, CID-pinned."
},
"nominations": {
"type": "array",
"items": {
"ref": "#nomination",
"type": "ref"
},
"maxLength": 256,
"description": "Who put what in the hat. Empty when every candidate was organizer-carried. Tracks absent here are carried candidates, unattributed by design."
},
"publishedAt": {
"type": "string",
"format": "datetime"
}
}
},
"description": "The round's ballot sheet, revealed as one atomic record when signups close. Published by the round organizer. The candidate list itself lives in an at.atjam.playlist of at.eptss.track records — this record pins that playlist by CID and adds only what a playlist must never carry: round attribution and who nominated what. Ballots strong-ref this ledger, so the pin chain runs ballot → ledger → playlist → tracks, and a post-hoc edit anywhere is detectable. Attribution keys on the track's AT-URI, never on its position — a positional array desyncs silently on one reorder. The organizer honors un-naming requests by editing nominations in place."
},
"nomination": {
"type": "object",
"required": [
"track",
"by"
],
"properties": {
"by": {
"type": "string",
"format": "did",
"description": "DID of the member who nominated it."
},
"track": {
"type": "string",
"format": "at-uri",
"description": "The at.eptss.track this attribution is about. A URI and not an index: identity, not position."
}
}
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}