Skip to content

Elemental Showdown: review findings (#158) - #181

Merged
jacobcheatley merged 16 commits into
feat/169-coverfrom
fix/158-showdown-review-findings
Sep 22, 2026
Merged

jacobcheatley merged 16 commits into
feat/169-coverfrom
fix/158-showdown-review-findings

Conversation

@jacobcheatley

@jacobcheatley jacobcheatley commented Sep 22, 2026 •

Copy link
Copy Markdown
Owner

Part of #158. Fixes from a two-axis review (standards and spec) of the whole Elemental Showdown stack, one commit each.

Behaviour

  • An IPv4-mapped IPv6 address (::ffff:a.b.c.d) is rate-limited as its IPv4 address; before, every one of them shared the 0:0:0:0 bucket.
  • The Voter cookie is set only when a Vote landed, not on a rate-limited attempt.
  • The unlock's roster comes from the reloaded aggregate, so the Active filter exists in exactly one place.
  • A Matchup reaches the browser as ShownElement (id, name, emoji, colour): Common/Rare never leaves the server.
  • Arrow keys move the seam the way they point (Down: the top Element takes ground); aria-valuenow is the seam's height so Up still increases it.
  • A browser with no navigator.clipboard logs and leaves the share label alone instead of throwing.
  • A drag that starts on the pill is still a drag; a tap on it at rest casts 0 exactly once.

Tidy

  • Comments trimmed to what the code cannot say; the reveal's types and revealFor in vote-reveal.ts (no more type cycle); Voter is a branded uuid; matchupKey takes the pair; one Mosaic; one percent, one met colour, one shared test Element factory.

Verification

Every behaviour fix has a test that failed on the old code. bun run check and bun run test green (46 files, 605 tests); the e2e suite passes against the production Docker image; keyboard, drag, pill-tap and reveal driven in headless Chromium against the local database.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH

@jacobcheatley
jacobcheatley added this pull request to stack #182 September 22, 2026 00:37
@jacobcheatley jacobcheatley changed the title fix/158 showdown review findings Elemental Showdown: review findings (#158) Sep 22, 2026
@jacobcheatley
jacobcheatley marked this pull request as ready for review September 22, 2026 00:38
jacobcheatley and others added 13 commits September 22, 2026 13:08
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
…ress

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
…empt

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
…once

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
…shows

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
The pill sits dead centre, where a thumb naturally goes down, and it kept
its own pointerdown from the slider so that its tap could cast a draw. A
drag from there moved nothing.

The pill lets the press through and the gesture casts on release, as one
that starts anywhere else does: the draw when the press went down on the
pill and the seam never left the middle, nothing when a drag came back to
it. Chrome still sends the tap's click to the pill after the slider has
taken the pointer, so the click casts only when no pointer is behind it,
which is how an assistive technology's activation arrives.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AVEtgjCoEbaNHrYfzyCRNH
jacobcheatley and others added 3 commits September 22, 2026 18:00
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Each Story field is capped at a phone's width, so several sit side by side
on a desktop, and beside a fine pointer the row grows a button at each end
because a mouse has no swipe.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A paper ring and a press on the pill say it can be tapped, and the first
Matchup's hint says what the tap casts.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@jacobcheatley
jacobcheatley merged commit c2022f8 into main Sep 22, 2026
13 checks passed
@jacobcheatley
jacobcheatley deleted the fix/158-showdown-review-findings branch September 22, 2026 06:13

This branch was successfully deployed

1 active deployment
staging — 9a6ed07a Deployed Sep 22, 2026 by jacobcheatley via deploy-staging #169
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.

1 participant