πŸ§ͺ Comedy Loco β€” Pair Test Plan

Live pair-programming QA for the Comedy Loco show platform (Banana Peels vs Comedy Clubtrotters): Show Designer, Performance console, and screen surfaces. Two testers β€” the agent (AS Dev) and Mike β€” execute the same steps with their own shows and performances, compare results, and file GitHub issues for every mismatch. Shared protocol and the other brands live on the FunFirst test plan index.

Environments & data A Β· Show Designer B Β· Performance console C Β· Screens & preview E Β· Hardening Results & issue log

Environments & test data

ThingValue
Marketing sitecomedyloco.com (dark-neon family look: ink #07060d, Bebas Neue + Sora)
Consolefunfirst.fun/comedy-loco/performance β€” same path serves at comedyloco.com/performance; designer at /designer, wall at /preview. Sign in via /signin (Convex auth).
BackendConvex deployment funfirst (trustworthy-lemming-377); seeder seed.comedyLocoLuxor
Seeded show / performanceComedy Loco β€” Luxor Night 1 (28 scenes; performance shares the title)
Test data markerCreate only PairTest <who> …-titled shows/performances. Never rename or re-cue the seeded Luxor show β€” cue copies.

Brand data β€” use these exact values

TeamsBanana Peels ("Bananas") vs Comedy Clubtrotters ("Clubtrotters")
Round card12 rounds β€” Intro, then 11 scored games (Bucket, Choice, Audience, Line, Music, Challenge, Volunteer, Guessing, Line, Music, Joke)
Winner scenesWinner Banana Peels / Winner Comedy Clubtrotters β€” exact team names, never the nicknames
OverlaysGame Instructions, Vote, Crowd, Score, Games (shared overlay set), Score Rotation
Catalog picks to exerciseWorld's Worst / Blind Line (Line/Guessing), Sound Effects (Audience), Freeze Tag (Joke), Top This (Intro)
SoundtrackBackNForth, BringTheFun, BubbleGumGirl, CockatooInTheGrass, DressedInPink, DrivingYourVibes

Flow A Β· Show Designer

A1BothSign in at funfirst.fun/signin, open /designer, select Comedy Loco β€” Luxor Night 1.
Expected: 28 scenes render, every effect thumbnail loads from public/comedy-loco/effects/ (or the shared effects library), timeline renders, no console errors.
A2AgentCreate show PairTest Agent Smoke β€” <date>, tagged comedyloco, left draft. MikeCreate PairTest Mike Smoke β€” <date>.
Expected: show appears in the picker; the preview wall paints nothing for it while draft (verified in C5).
A3BothAdd a scene titled exactly Vote (overlay), attach one video-loop effect, set a duration.
Expected: scene saves into the ordered list; effect preview plays; overlay kind inferred from the title.
A4BothAdd scenes titled exactly Winner Banana Peels and Winner Comedy Clubtrotters β€” plus one deliberately-named Winner Bananas (nickname).
Expected: both save; Flow B5 proves nicknames never cue β€” winner matching strips only exact team names (exact-name winner contract).
A5AgentScreens tab: open the Luxor layout, drag one screen-polygon corner, save, verify in the multi-screen preview β€” then restore the original geometry and re-save. MikeSame screen, drag a whole edge; confirm the polygon stays valid.
Expected: geometry persists after reload; restore leaves the layout identical (this layout drives the real Luxor screens).
A6BothProfiles tab: inspect the display profile's logical→physical panel mapping.
Expected: every logical panel maps to exactly one physical panel β€” no gaps or duplicates.
A7AgentDuplicate a scene, rename the copy, delete it, reopen the show.
Expected: duplicate is a real copy; delete leaves no orphan in the scene list or timeline.
A8BothEdit your Vote scene's effect with the multi-screen preview open.
Expected: preview updates live, no refresh.

Flow B Β· Performance console

B1BothOpen funfirst.fun/comedy-loco/performance. Find Comedy Loco β€” Luxor Night 1. Open the create-performance modal.
Expected: team fields prefill Banana Peels / Comedy Clubtrotters; seeded performance shows the 12-round card.
B2AgentCreate PairTest Agent Perf bound to your PairTest Agent Smoke show. MikeCreate PairTest Mike Perf bound to the seeded show.
Expected: console opens; bound show name displays; scene buckets list the show's scenes.
B3BothVerify the template contract: 12 rounds β€” Intro; then Bucket, Choice, Audience, Line, Music, Challenge, Volunteer, Guessing, Line, Music, Joke β€” all scored. Scoreboard 0–0 Bananas vs Clubtrotters (short names).
Expected: round list, types, scored flags, and team names all match.
B4BothBegin round 1 (Top This / Intro), then cue Game Instructions from the game grid.
Expected: wall/player shows your bound show's designed scene β€” cue matched by exact scene title.
B5BothRun a Vote β€” agent taps Bananas, Mike taps Clubtrotters β€” then cue the winner scene for the winning side.
Expected: vote overlay Bananas vs Clubtrotters with live counts; after a Bananas win the console must resolve Winner Banana Peels β€” the nickname scene Winner Bananas (built in A4b) must never play for the correct side, never the wrong one.
B6AgentManually score round 2 (a Bucket round) for Bananas, then Clubtrotters; confirm totals. MikeScore using the Win / Rotation controls instead.
Expected: scoreboard updates live on console + wall; Score / Score Rotation overlays render; math sums.
B7BothOpen Box Score, start a soundtrack track, play an SFX, stop both.
Expected: per-round history correct; audio starts and stops cleanly β€” no double-play or orphaned track.
B8AgentMid-show: rebind your PairTest performance from your show to the seeded show via the console selector, then cue a scene. MikeRebind the opposite direction and cue.
Expected: behavior undocumented β€” record exactly what happens; the issue defines the wanted behavior.

Flow C Β· Screens & preview wall

C1BothOpen funfirst.fun/preview while your performance is live; find the Comedy row + scene strip.
Expected: every screen in the Luxor layout paints; strip shows the current scene; row marked β€” LIVE.
C2AgentCue each overlay in sequence: Game Instructions, Vote, Score, Box Score, and the Suggestions overlay from the shared set.
Expected: overlays composite over wall panels (Instructions full-screen, Vote team-vs-team, Score partial) β€” matching the player.
C3BothOpen one screen full-bleed via funfirst.fun/screens/<id> and the player in a second window (Mike: on his phone). Cue a scene.
Expected: wall, screen page, and player react within a beat of each other, no refresh, identical visuals.
C4AgentEnd the show (status β†’ ended) from the console.
Expected: wall stops painting your screens immediately; "Go live or tap a scene below." returns.
C5AgentDraft gate: set your PairTest show back to draft, bind + go live, cue a scene.
Expected: wall refuses to paint the draft show β€” fallback card only (documented gating rule).
C6Agent390px viewport: wall, player, one screen page. MikeDo C3 on your phone, both orientations.
Expected: overlays readable, strip usable, no horizontal-scroll breakage, no console errors.

Flow E Β· Hardening

E1AgentRe-run seed.comedyLocoLuxor from the Convex dashboard.
Expected: inserted = 0; updates in place via sourceKey β€” no duplicate shows or scenes.
E2AgentRun the cue-contract self-check (sceneCues.ts) against the Comedy seeded show; record any error strings.
Expected: zero contract errors (winner-cue, full-overlay, score-overlay rules); any error filed verbatim.
E3AgentDouble-cue race: tap two game buttons as fast as possible, twice.
Expected: undocumented β€” record wall behavior (last-write-wins? flicker? stuck overlay?).
E4BothThrottle to Slow 3G, load console + wall.
Expected: loading/empty states render, never a blank screen; normal once data arrives.

Results & issue log

"Match" = agent and Mike saw the same behavior. Every ⚠/βœ– row needs an issue link: [pair-test FLOW<STEP>][battle] … in microspaces/linkall, label pair-test.

StepAgentMikeMatchIssueNotes
A128 scenes
A2draft invisible on wall
A3
A4winner-name contract
A5restore Luxor layout
A6
A7
A8
B1Bananas/Clubtrotters prefill
B2
B312-round card
B4
B5Winner-name contract
B6
B7audio stops cleanly
B8rebind undocumented
C1
C2Suggestions overlay
C3
C4
C5draft gating
C6
E1idempotency
E2cue contract
E3undocumented
E4

Session cleanup