atjamalpha

Scenarios

A working tour of every behavior atjam can express — each one a live round on the network, not a mockup. Read top to bottom: a round is born, opens, runs, and closes; people join under different trust models; and a round carries just enough structure to stay generic.

Every round here is a real record on the network. It opens with a jam running in production, then walks every behavior through a deliberate test set on @nls-testuser1.bsky.social’s PDS, created by pnpm populate. Click any to open it.

Stateopenin-progressclosed
Joinopenhostednetwork

In the wild: EPTSS

Not a fixture — this is EPTSS (“Everyone Plays the Same Song”) running live on atjam, owned by @everyoneplaysthesamesong.com. Each round names a song as its subject; participants submit a cover (an fm.plyr.track). Same primitives, same transit line as the test rounds below — see how it maps onto the extension points.

EPTSS Round 1
BagsClairo
open·closed
  1. created
    Apr 1, 2020
  2. signup-opens
    Apr 1, 2020, 7:00 AM (passed)
  3. voting-opens
    Apr 20, 2020, 7:00 AM (passed)
  4. covering-begins
    Apr 27, 2020, 7:00 AM (passed)
  5. submission-deadline
    May 11, 2020, 7:00 AM (passed)
  6. closing-event
    May 19, 2020, 7:00 AM (passed)
  7. now — closed
Round 29
Right Back To ItWaxahatchee ft. MJ Lenderman
open·open
  1. created
    May 27, 2026
  2. signup-opens
    Oct 5, 2025, 3:12 AM (passed)
  3. voting-opens
    Feb 2, 2026, 8:00 AM (passed)
  4. covering-begins
    Feb 9, 2026, 8:00 AM (passed)
  5. closing-event
    Apr 23, 2026, 6:59 AM (passed)
  6. now — open

Reads open — the timeline has no submission-deadline, so deriveState never closes it even though every milestone has passed: the documented “keep a submission-deadline” gotcha, captured live.

The life of a round

A round has no status field — its state is derived from where now falls among its milestones. Open before the signup deadline, in-progress between the deadlines, closed once submissions close. Same record shape; watch the red now dot sit in a different stretch of track in each.

Open round — state: open
open·open
  1. created
    Jun 3, 2026
  2. now — open
  3. signup-deadline
    Jun 10, 2026, 3:10 AM (in 3 days)
  4. submission-deadline
    Jul 3, 2026, 3:10 AM (in 26 days)
Open round — state: in-progress
open·in-progress
  1. created
    Jun 3, 2026
  2. signup-deadline
    Jun 2, 2026, 3:10 AM (passed)
  3. now — in-progress
  4. submission-deadline
    Jul 3, 2026, 3:10 AM (in 26 days)
Open round — state: closed
open·closed
  1. created
    Jun 3, 2026
  2. signup-deadline
    May 27, 2026, 3:10 AM (passed)
  3. submission-deadline
    Jun 2, 2026, 3:10 AM (passed)
  4. now — closed

Naming the phases

Milestones are an open list. Past the two standard deadlines you can add as many named phases as you like — each becomes another station, and deriveCurrentPhase reports which stretch now is in. The catch: state only closes on a submission-deadline, so a round built from custom labels alone reads OPEN forever.

Custom phases — gotcha (no submission-deadline)
open·open
  1. created
    Jun 3, 2026
  2. signup-opens
    May 4, 2026, 3:10 AM (passed)
  3. voting-opens
    May 14, 2026, 3:10 AM (passed)
  4. covering-begins
    May 24, 2026, 3:10 AM (passed)
  5. closing-event
    Jun 1, 2026, 3:10 AM (passed)
  6. now — open

Reads open — the timeline has no submission-deadline, so deriveState never closes it even though every milestone has passed: the documented “keep a submission-deadline” gotcha, captured live.

Custom phases — multi-stage round
open·open
  1. created
    Jun 3, 2026
  2. signup-opens
    May 24, 2026, 3:10 AM (passed)
  3. voting-opens
    May 29, 2026, 3:10 AM (passed)
  4. covering-begins
    Jun 2, 2026, 3:10 AM (passed)
  5. now — open
  6. submission-deadline
    Jun 23, 2026, 3:10 AM (in 16 days)
  7. closing-event
    Jun 28, 2026, 3:10 AM (in 21 days)

Who's allowed in

Three trust models, encoded by form rather than colour (colour is reserved for state). A signup cites the invitation that admitted it; a read-time validator then walks the chain and separates legitimate from spoofed — open any round to see the green / amber badges.

What a round carries

A round stays generic on purpose. Domain specifics ride optional, $type-tagged extension points — a subject and a closingEvent — plus a list of accepted submission types. atjam never learns what your domain is.

The quiet baseline

A fresh round with nobody in it yet — proof the zero case is drawn as deliberately as the full one.