atjam Test Scenarios
Twelve populated rounds that exercise every documented behavior of the atjam lexicon and the web app. See /scenarios for the index.
Rounds
- Jun 3, 2026open
Empty round (no signups, no submissions)
Fresh round with nobody signed up and nothing submitted. Confirms the empty-state UI for both Signups and Submissions sections renders cleanly.
- Jun 3, 2026open
Custom phases — gotcha (no submission-deadline)
Every milestone is a custom label and all are in the past, so the Timeline looks finished — but there is no 'submission-deadline', so deriveState has nothing to close on and the header still reads OPEN. This is the documented gotcha: pair custom phases with a standard submission-deadline (see /docs/extending).
- Jun 3, 2026open
Custom phases — multi-stage round
Milestones use custom labels as named phases, EPTSS-style: signup-opens → voting-opens → covering-begins → submission-deadline → closing-event. The Timeline renders every label as a station with the 'now' dot mid-line (covering phase). Round.deriveCurrentPhase reports since='covering-begins', until='submission-deadline'. A standard submission-deadline is included so deriveState stays meaningful — the header reads OPEN until it passes.
- Jun 3, 2026open
Round accepting multiple submission types
acceptedSubmissionTypes lists three NSIDs from different atproto apps. The 'Accepted submission types' section should render all three as pills.
- Jun 3, 2026open
Round with subject + closingEvent
Both optional structured fields (subject and closingEvent) are populated with fake $type-discriminated objects. The page should render without crashing even if it doesn't display the structured fields directly.
- Jun 3, 2026open
Network round — cycle attempt
joinMode=network. test2 and test3 try to invite each other without ever rooting at the organizer (no organizer→test2 or organizer→test3 invitation exists). Both signups cite the other's invitation. Validator should detect the cycle and render both as INVALID with the 'cycle detected' reason.
- Jun 3, 2026open
Network round — contributed gate
joinMode=network, networkGate=contributed. Two inviters: • test2 has signup AND submission → her invitee (test3) is VALID • test4 has signup but NO submission → her invitee would be INVALID (test4 didn't invite anyone, but we set it up so validator's gate logic is visible per chain) Confirm the validator distinguishes inviters who've earned invitation rights from those who haven't.
- Jun 3, 2026open
Network round — chain
joinMode=network. Chain of invitations: organizer → test2 → test3, plus organizer → test4 directly. All three signups should render valid because every chain roots at the organizer.
- Jun 3, 2026open
Hosted round — mixed validation
joinMode=hosted. Three signups, three different validator outcomes: • test2 with valid invitation from organizer → VALID • test3 with no invitation field → INVALID • test4 with self-forged invitation → INVALID Hover the amber badges to see the failure reason.
- Jun 3, 2026closed
Open round — state: closed
Submission-deadline (1 day ago) is past. State derives to 'closed'. Header should show 'CLOSED'. Page should display the 'round is closed' notice; no signup or submission UI.
- Jun 3, 2026in-progress
Open round — state: in-progress
Signup-deadline (1 day ago) is past, submission-deadline (30 days out) is still future. State derives to 'in-progress'. Header should show 'IN-PROGRESS'. Signup button should be hidden or rejected; submissions still accepted.
- Jun 3, 2026open
Open round — state: open
Base case. Signup-deadline (7 days out) and submission-deadline (30 days out) are both in the future. State derives to 'open'. Header should show 'OPEN'.