Skip to content

fix(debates): say which side each debater is on in the video UI (GEO-3022) - #2560

Merged
jwalkingjew merged 3 commits into
masterfrom
preston/geo-3022-restore-participant-position
Sep 24, 2026
Merged

jwalkingjew merged 3 commits into
masterfrom
preston/geo-3022-restore-participant-position

Conversation

@jwalkingjew

@jwalkingjew jwalkingjew commented Sep 24, 2026 •

Copy link
Copy Markdown
Collaborator

GEO-3022

Problem

The debate feed player names both debaters over their video but no longer says what either of them is arguing. Dropping into the middle of a debate, nothing in the picture tells you who is on which side.

What removed it

#2439 (197f88a7d, GEO-2909), which moved claims onto the video. That change deliberately took the "Winner?" pill off the tile — winner voting now lives in the scorecard and the claims panel — and the position chip went with it because the two shared the flex row being torn out. The chip's removal reads as collateral, not as the intent: the commit's own comment records the pill and the chip leaving together and then gives the band back to the name alone.

Change

debate-feed-player.tsx — the position chip is back in the bottom band, beside the name, on both tiles, for the whole debate.

It sits beside the profile button rather than inside it (where #2021 had it):

  • The button is capped at 55% of the tile so the name cannot run its full width. A chip inside that cap would be taken out of the name's share at exactly the gallery widths where the name is already truncating. Outside it, the name keeps its 55% and the chip takes its own width from the remaining 45%.
  • The chip is not a link. Inside the button it behaved like one.

The band is now a pointer-events-none row with the button opting back in, since the row spans the band rather than hugging the name — everything it covers and does not use still belongs to the pause/play surface underneath.

debate-video-tile.tsx — new DebatePositionChip, and the room tile now renders through it too.

The recipe for "a debater's side, over their video" was DebateTileChip + tileChipSurface + the truncation classes, written out at each call site. Restoring it to the feed player would have been the second copy, so it is one component instead — which also keeps the bg-white/85 fill with the contrast note that justifies it (tileChipSurface exists precisely so a call site does not pick its own background over arbitrary video), and puts the labels' provenance in one docblock.

shrink-0 rather than letting the chip give up space: the labels are short and bounded — responsePositionLabel yields "Agree"/"Disagree", or "Verify"/"Dispute" on a factual claim — and half of "Disagree" is worse than a shortened name beside it. max-w-full still caps it where the column is narrower than the word, which is the case the room tile's grid is written around, so that tile's behaviour is unchanged.

Deliberately not in scope

The claim ticker's attribution line also names a speaker over the video, but what it carries beside the name is the claim's aggregate ("65% agree"), not that speaker's own side. A second chip there would say something different from what it looks like it says.

Processed / shared video

Only the in-app player is changed. The processed and shared videos are composited server-side and reach the app as a finished artifact via useDebateMediaArtifactUrl (geo-chat), so nothing in this repo can burn the position into them. The share card is unaffected — debate-og-image.tsx already prints each speaker's stance in its pill, from this same position_label.

Tests

Two new cases in debate-feed-player.test.tsx: both debaters' positions render beside their names and outside the profile link, and a participant whose position_label is empty draws no bare pill. Scoped with within(container) — this suite has no automatic cleanup, matching debate-claims-panel.test.tsx next door.

  • vitest run core/debates — 1921 passed. Three files fail only in the full-directory parallel run (network-stub interference); each passes in isolation, and master fails the same way with a different set.
  • vitest run core/debates/browse partials/explore/debate-explore-feed-card.test.tsx 'app/space/[id]/(space)/debates/[debateId]' — 410 passed
  • tsc --noEmit clean, eslint clean on the changed files

…3022)

The feed player names both debaters over their video but no longer says
what either of them is arguing for. Dropping into the middle of a debate,
there is nothing in the picture that tells you who is on which side — you
have to infer it from what is being said.

The chip that carried it came off the tile in #2439, alongside the
"Winner?" pill. Removing the pill was the point of that change — winner
voting moved to the scorecard and the claims panel — and the position
chip went with it because the two shared the flex row that was being
torn out.

Put it back beside the name, not inside the profile button: the button
is capped at 55% of the tile so the name cannot run its full width, and
a chip inside that cap would eat the name's share at exactly the widths
where the name is already truncating. It is also not a link, which the
old placement implied it was.

The processed/shared video is composited outside this repo, so nothing
here can burn the position into it.
@vercel

vercel Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
geogenesis Ready Ready Preview Sep 24, 2026 5:20pm UTC

Request Review

…layer

Review follow-up on the restore.

The recipe for "a debater's side, over their video" was written out twice
— `DebateTileChip` plus `tileChipSurface` plus the truncation classes —
once in the room tile and once in the feed player. It is the same fact
about the same person in the same corner of the same picture, so it is
one component now, and the fill stays with the contrast note that
justifies it rather than being re-picked at each call site.

`shrink-0` rather than letting the chip give up space: the labels are
short and bounded ("Agree"/"Disagree", "Verify"/"Dispute" on a factual
claim), and half of "Disagree" is worse than a shortened name beside it.
`max-w-full` still caps it where the column is narrower than the word,
which is the case the room tile's grid is written around.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The focused implementation matches the described behavior and includes appropriate regression coverage.

Review effort: Balanced
Findings: None

What changed in this PR

Restores each debater’s position label in the debate feed video UI while sharing chip styling with room tiles.

Changes:

  • Adds a reusable DebatePositionChip.
  • Displays position chips beside profile buttons.
  • Adds rendering and empty-label tests.
File Description
debate-video-tile.tsx Adds and adopts the shared position chip.
browse/​debate-feed-player.tsx Restores position labels in feed tiles.
browse/​debate-feed-player.test.tsx Tests placement and empty labels.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@jwalkingjew
jwalkingjew marked this pull request as ready for review September 24, 2026 17:17
@jwalkingjew
jwalkingjew merged commit a762d68 into master Sep 24, 2026
5 checks passed
@jwalkingjew
jwalkingjew deleted the preston/geo-3022-restore-participant-position branch September 24, 2026 17:34

This branch was successfully deployed

1 active deployment
Preview — 4ed96b7c Deployed Sep 24, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants