At this level
at.eptss · 6- at.eptss.ballot record A voter's public attestation: 'I voted on this ballot sheet.' Written to the voter's own repo. The ledger strongRef pins the exact candidateLedger (URI and CID) the vote was cast against, making post-hoc ledger edits detectable. Scores are never public: privateRef resolves only through the round organizer's private sidecar.
- at.eptss.candidateLedger record 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, nev
- at.eptss.song object A song, used inline (with $type) as an at.atjam.round subject or inside at.eptss records. Not a standalone record.
- at.eptss.track record One song, published so anything can point at it. Written by the round organizer at ledger-publish time — never at nomination time, which would reveal a nomination the reveal design exists to hold back. Holds only identity: this record is CID-pinned by the round's candidate ledger and therefore frozen, so anything that might later be corrected (links, MBIDs, durations) belongs in records that point here instead — see at.eptss.trackLink. Written fresh per round rather than reused across rounds: sh
- at.eptss.trackLink record An assertion that a track plays at a URL, written by anyone, about any track, and never editing the track it is about. There is at least one of these per platform per song, which is exactly why the URL cannot live on the track itself. Prefer a deterministic rkey so re-running an importer upserts instead of piling up.
- at.eptss.voteResult record Aggregate (anonymous) vote result for one candidate in one round, published by the organizer after voting closes. Individual scores are never published. The candidate is a strongRef to its at.eptss.track — one shape for a song across the whole system, not an embedded copy that goes stale. Integers only (count + total; clients divide) because DAG-CBOR forbids floats. The scale is self-describing: distribution has (scaleMax - scaleMin + 1) buckets, distribution[0] = count of scaleMin scores.