Skip to content

fix(shhhhh): list the full waitlist-skip badge set - #2698

Merged
jjramirezn merged 3 commits into
mainfrom
hotfix/shhhhh-badge-list
Aug 14, 2026
Merged

fix(shhhhh): list the full waitlist-skip badge set#2698
jjramirezn merged 3 commits into
mainfrom
hotfix/shhhhh-badge-list

Conversation

@0xkkonrad

@0xkkonrad 0xkkonrad commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Summary

The /shhhhh landing page ("How to get in" → door 01) listed only 3 of the 12 badges that skip the card queue. The set drifted as new skip badges shipped (country launches, creator collab, offramp, events). This PR lists the complete set and stops the icon paths from drifting separately.

Source of truth: SKIP_BADGE_CODES in peanut-api-ts (src/card/waitlist.ts) — the union of every badge granting skip:card-queue in either launch phase, pinned by src/card/waitlist.test.ts on origin/main (the post badge-registry world; the pre-registry seed-definitions.ts checkout is stale). All 12 codes are now on the page: OG_2025_10_12, DEVCONNECT_BA_2025, ARBIVERSE_DEVCONNECT_BA_2025, SEEDLING_DEVCONNECT_BA_2025, EVENT_ALUMNI, CARD_PIONEER, OFFRAMP_USER, NAIJA, TERERE, ACAI_POWERED, NITA, WAITLIST_SKIP.

Second commit: icon paths now come from getBadgeIcon() / the generated badge-asset manifest instead of a hand-copied list — all 12 resolved paths verified byte-identical, but future art re-cuts can no longer strand this page.

Third commit (Konrad's review): the grid collapses to the original 3 tiles with a "+9 more" toggle so door 01 doesn't tower over door 02, and door 02 no longer stretches to match door 01's height (md:self-start). Toggle copy is localized (en / es-419 / pt-BR; es-AR inherits).

Design notes / accepted trade-offs

  • NITA is labeled "Nita" — the registry name "Nita's Recommendation" clips on the 375px tile (screenshot-verified before shortening). Page convention already shortens names ("Arbiverse", "Devconnect BA").
  • Launch-phase nuance: pre-launch, only the plain skip:card-queue badges (Skip Pass, Devconnect, Seedling, Offramp User) skip right now; the @postlaunch ones skip from public launch. The page advertised the union before this PR too (OG and Arbiverse are @postlaunch) — this PR keeps that stance. If you'd rather list only the 4 currently-active codes, say so and I'll trim.
  • ARBIVERSE_DEVCONNECT_BA_2025 is active: false (grandfathered — existing holders keep the skip, no new awards). It was already on the page; kept deliberately.
  • WAITLIST_SKIP (Skip Pass) included for completeness; holders skip in every phase. Drop it if listing it publicly reads as circular.
  • Names stay hardcoded English (proper nouns, same as the existing 3 entries; matches the page's current i18n stance).
  • Follow-up idea (not this PR): extend the peanut-api-ts manifest generator (badge:check --write-manifest) to also emit the skip-code list, so this array becomes generated instead of transcribed.

Task

TASK-21506 — Sprint 180, tagged BLOCKED pending human review.

Risks / breaking changes

None. Static data + one accessor reuse on one landing page; no logic, routes, or API changes. Base is main (hotfix path — prod page fix); back-merge debt main→dev after merge.

QA

  • Local gate ran twice (after each commit): npm run typecheck, full npm test (228 suites / 2925 tests), prettier — all green.
  • Rendered locally (webpack dev) and screenshotted at 375×667 and 1280×900 at commit b286496: 12 tiles in the §4 grid, every icon loads (incl. the one .png, offramp_user), labels fit without clipping. The follow-up commit resolves the exact same 12 paths (verified programmatically), so the screenshots remain accurate.
  • Prod sanity: peanut.me serves these SVGs raw (no /_next/image wrapper), so the 9 new SVG tiles render the same way the existing 3 do.

Screenshots

Assets live on pr-assets-2698 (delete the branch post-merge).

Desktop — collapsed (default) Desktop — expanded
Mobile — collapsed Mobile — expanded

Summary by CodeRabbit

  • New Features

    • Expanded the available skip-badge list on the Shhhhh landing page.
    • Added controls to show or hide the full badge list, with three badges displayed initially.
    • Improved responsive alignment for the second badge card.
  • Localization

    • Added show-more and show-less translations in English, Spanish (Latin America), and Brazilian Portuguese.

The /shhhhh landing page showed 3 of the 12 badges that skip the card
queue. The API's badge registry (SKIP_BADGE_CODES) is the source of
truth; the page now shows all of them. NITA is labeled 'Nita' because
'Nita's Recommendation' clips on the 375px tile.
@vercel

vercel Bot commented Aug 14, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
peanut-wallet Ready Ready Preview Aug 14, 2026 4:16pm

Request Review

@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: edf3d4b3-2b9e-4409-b40a-4d7058af2f6e

📥 Commits

Reviewing files that changed from the base of the PR and between b286496 and c0a4b23.

📒 Files selected for processing (4)
  • src/app/shhhhh/ShhhhhLandingPage.tsx
  • src/i18n/app/messages/en.json
  • src/i18n/app/messages/es-419.json
  • src/i18n/app/messages/pt-BR.json

📝 Walkthrough

Walkthrough

The landing page now uses the complete skip-badge registry, resolves badge icons through getBadgeIcon, initially shows three badges, and provides localized controls to expand or collapse the full list.

Changes

Skip badge access

Layer / File(s) Summary
Badge registry and rendering
src/app/shhhhh/ShhhhhLandingPage.tsx
The page defines the complete skip-badge registry, resolves badge icons through getBadgeIcon, and initially renders three badges.
Badge list controls and localization
src/app/shhhhh/ShhhhhLandingPage.tsx, src/i18n/app/messages/en.json, src/i18n/app/messages/es-419.json, src/i18n/app/messages/pt-BR.json
The page adds accessible expand and collapse controls, remaining-badge counts, and responsive alignment. English, Spanish (Latin America), and Portuguese-Brazilian labels support both states.

Estimated code review effort: 2 (Simple) | ~10 minutes

Suggested reviewers: innolope-dev, kushagrasarathe

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: listing the complete waitlist-skip badge set on the Shhhhh landing page.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch hotfix/shhhhh-badge-list

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Code-analysis diff

Painscore total: 7118.07 → 7118.54 (+0.47)
Findings: 0 net (+17 new, -17 resolved)

🆕 New findings (17)

  • critical complexity — src/app/shhhhh/ShhhhhLandingPage.tsx — CC 52, MI 56.57, SLOC 331
  • high hotspot — src/app/shhhhh/ShhhhhLandingPage.tsx — 31 commits, +1120/-466 lines since 6 months ago
  • medium react-long-component — src/app/shhhhh/ShhhhhLandingPage.tsx:153 — ShhhhhLandingPage is 468 lines — split it
  • medium high-mdd — src/app/shhhhh/ShhhhhLandingPage.tsx:153 — ShhhhhLandingPage: MDD 182.8 (uses across many lines from declarations)
  • medium high-dlt — src/app/shhhhh/ShhhhhLandingPage.tsx:153 — ShhhhhLandingPage: DLT 32 (calls 32 distinct functions — high context load)
  • medium structural-dup — app/shhhhh/ShhhhhLandingPage.tsx:112 — 28 duplicate lines / 159 tokens with components/LandingPage/StickyMobileCTA.tsx:27
  • medium react-effect-derives-state — src/app/shhhhh/ShhhhhLandingPage.tsx:87 — useEffect with empty deps + setState — derived state anti-pattern
  • medium react-effect-derives-state — src/app/shhhhh/ShhhhhLandingPage.tsx:108 — useEffect with empty deps + setState — derived state anti-pattern
  • low high-mdd — src/app/shhhhh/ShhhhhLandingPage.tsx:29 — WaitlistJoined: MDD 12.3 (uses across many lines from declarations)
  • low high-mdd — src/app/shhhhh/ShhhhhLandingPage.tsx:102 — StickyShhhhhCTA: MDD 10.2 (uses across many lines from declarations)
  • low structural-dup — app/m/[slug]/MerchantLandingPage.tsx:67 — 9 duplicate lines / 67 tokens with app/shhhhh/ShhhhhLandingPage.tsx:283
  • low structural-dup — app/m/[slug]/MerchantLandingPage.tsx:76 — 9 duplicate lines / 72 tokens with app/shhhhh/ShhhhhLandingPage.tsx:292
  • low structural-dup — app/m/[slug]/MerchantLandingPage.tsx:85 — 9 duplicate lines / 63 tokens with app/shhhhh/ShhhhhLandingPage.tsx:301
  • low structural-dup — app/m/[slug]/MerchantLandingPage.tsx:127 — 9 duplicate lines / 72 tokens with app/shhhhh/ShhhhhLandingPage.tsx:340
  • low structural-dup — app/m/[slug]/MerchantLandingPage.tsx:461 — 9 duplicate lines / 68 tokens with app/shhhhh/ShhhhhLandingPage.tsx:568
  • low structural-dup — app/m/[slug]/MerchantLandingPage.tsx:470 — 9 duplicate lines / 71 tokens with app/shhhhh/ShhhhhLandingPage.tsx:577
  • low missing-return-type — src/app/shhhhh/ShhhhhLandingPage.tsx:153 — ShhhhhLandingPage: exported fn missing return type annotation

✅ Resolved (17)

  • src/app/shhhhh/ShhhhhLandingPage.tsx — CC 48, MI 56.68, SLOC 304
  • src/app/shhhhh/ShhhhhLandingPage.tsx:140 — ShhhhhLandingPage is 457 lines — split it
  • src/app/shhhhh/ShhhhhLandingPage.tsx:140 — ShhhhhLandingPage: MDD 175.8 (uses across many lines from declarations)
  • app/shhhhh/ShhhhhLandingPage.tsx:99 — 28 duplicate lines / 159 tokens with components/LandingPage/StickyMobileCTA.tsx:27
  • src/app/shhhhh/ShhhhhLandingPage.tsx — 28 commits, +1078/-448 lines since 6 months ago
  • src/app/shhhhh/ShhhhhLandingPage.tsx:74 — useEffect with empty deps + setState — derived state anti-pattern
  • src/app/shhhhh/ShhhhhLandingPage.tsx:95 — useEffect with empty deps + setState — derived state anti-pattern
  • src/app/shhhhh/ShhhhhLandingPage.tsx:140 — ShhhhhLandingPage: DLT 29 (calls 29 distinct functions — high context load)
  • src/app/shhhhh/ShhhhhLandingPage.tsx:28 — WaitlistJoined: MDD 12.3 (uses across many lines from declarations)
  • src/app/shhhhh/ShhhhhLandingPage.tsx:89 — StickyShhhhhCTA: MDD 10.2 (uses across many lines from declarations)
  • app/m/[slug]/MerchantLandingPage.tsx:67 — 9 duplicate lines / 67 tokens with app/shhhhh/ShhhhhLandingPage.tsx:269
  • app/m/[slug]/MerchantLandingPage.tsx:76 — 9 duplicate lines / 72 tokens with app/shhhhh/ShhhhhLandingPage.tsx:278
  • app/m/[slug]/MerchantLandingPage.tsx:85 — 9 duplicate lines / 63 tokens with app/shhhhh/ShhhhhLandingPage.tsx:287
  • app/m/[slug]/MerchantLandingPage.tsx:127 — 9 duplicate lines / 72 tokens with app/shhhhh/ShhhhhLandingPage.tsx:326
  • app/m/[slug]/MerchantLandingPage.tsx:461 — 9 duplicate lines / 68 tokens with app/shhhhh/ShhhhhLandingPage.tsx:544
  • app/m/[slug]/MerchantLandingPage.tsx:470 — 9 duplicate lines / 71 tokens with app/shhhhh/ShhhhhLandingPage.tsx:553
  • src/app/shhhhh/ShhhhhLandingPage.tsx:140 — ShhhhhLandingPage: exported fn missing return type annotation

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

🧪 UI test report — ✅ all green

Suites

  • unit: 2928 ran, 0 failed, 0 skipped, 52.8s

📊 Coverage (unit)

metric %
statements 66.1%
branches 51.2%
functions 56.3%
lines 66.9%
⏱ 10 slowest test cases
time test
3.7s src/components/Card/share-asset/__tests__/shareAssetLayout.test.ts › never places two stickers in heavy overlap (broad seed sweep)
1.1s src/utils/__tests__/demo-api.test.ts › isDemoMode() is false when not running under Capacitor
0.4s src/utils/__tests__/auth-token.test.ts › authReady does not park — hydrates the plain token without an unlock
0.3s src/utils/__tests__/sentry.utils.test.ts › defaults to the client budget under a browser global
0.3s src/app/(mobile-ui)/withdraw/__tests__/withdraw-states.test.tsx › Bank withdrawal keeps the $1 minimum for sub-$1 amounts
0.3s src/components/Card/share-asset/__tests__/shareAssetLayout.test.ts › every sticker stays within canvas at any count
0.3s src/hooks/__tests__/useCrispTokenId.test.ts › retries then stays undefined when the endpoint keeps failing (no fallback token)
0.3s src/utils/__tests__/sentry.utils.test.ts › still lets a per-call timeoutMs win over the default
0.3s src/utils/__tests__/auth-token.test.ts › is none — never guarded — when only the guarded marker is present
0.3s src/app/actions/__tests__/api-headers.test.ts › should include Content-Type in validateInviteCode
📍 Inline annotations are in the **Unit test report** check above. Coverage artifact: `coverage-unit`. Generated by `.github/workflows/tests.yml`.

@0xkkonrad

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Hand-copied /badges/* paths duplicate badge-assets.json and drift when
art is re-cut. getBadgeIcon() is the accessor every other badge surface
uses; it also gives fallback art for free.
@0xkkonrad

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@0xkkonrad

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Twelve tiles made door 01 four rows tall against door 02's two
paragraphs. Collapsed shows the original 3 with '+9 more'; door 02 no
longer stretches to match door 01's height (md:self-start).
0xkkonrad added a commit that referenced this pull request Aug 14, 2026
@jjramirezn
jjramirezn marked this pull request as ready for review August 14, 2026 16:41
@jjramirezn
jjramirezn merged commit 4815188 into main Aug 14, 2026
27 of 28 checks passed
@0xkkonrad

Copy link
Copy Markdown
Contributor Author

Heads-up from the badge work in #2701 / peanut-api-ts#1351: once those land, the full waitlist-skip set gains SPLITTER and TRON (and this branch's list is already missing SURF_UP). The pinned source of truth is SKIP_BADGE_CODES in peanut-api-ts src/card/waitlist.test.ts — worth syncing the ShhhhhLandingPage array against it before this merges.

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