chore: back-merge main → dev (post badge-platform, 2026-08-07) - #2643
chore: back-merge main → dev (post badge-platform, 2026-08-07)#2643Hugo0 wants to merge 5 commits into
Conversation
Settle typed campaign claims across invite, signup, and send-link paths; preserve published links and normal-app fallbacks; and honor badge capabilities independently of public/internal provenance.
badge.utils.ts carried 48 hand-written badge-code -> asset-path entries, a parallel catalog that could drift from the backend silently. It now reads src/types/badge-assets.json, generated from the API badge catalog. That turns the existing "every fallback asset is checked in" test into the UI half of a cross-repo contract: peanut-api-ts CI asserts the manifest still matches its catalog, and this test asserts every path in it resolves to a real file. Adding a badge without its artwork now fails CI in the repo that can fix it, without API CI needing a checkout of this repo — which would have forced the API to merge before the UI and inverted the rollout order. utm_campaign values are still forwarded, but the backend now resolves only its own dated aliases (today just `offramp`, expiring 2026-09-07). A marketing link can no longer mint a badge as a side effect. Regenerates the vendored OpenAPI snapshot and client: badge claims no longer return 503, so the readiness error shape is gone.
main is 247 commits ahead of this branch's base and shipped two things that overlap it: a full i18n pass, and Konrad's own root-domain/stackable-campaign work (3e7dda6), which solved the same problem this platform replaces. 21 conflicts. GitHub was not running CI at all while the PR was CONFLICTING. campaign-maps.ts stays deleted — its multi-campaign resolution is superseded by badge-campaign-context + the typed claim queue. But three things it carried would have been lost silently, and are preserved: - comma-separated campaign values (`?campaign=a,b`). Our parser only read repeated params, so a published CSV link would have awarded just the first badge. Split at the URL boundary only: a stored queue identity may itself contain a comma and must round-trip unchanged. - the root-domain redirect's dead-bare-link guard, retargeted at the badge campaign namespace. - 42 per-badge `shareLine` strings, now their own frontend-owned map. Share copy is first-person English presentation and deliberately not backend catalog data, which owns third-person descriptions. InvitesPage had reverted to hardcoded English for its CTA, login label, title and description. main localized all four, and the existing invites keys map exactly — a bare badge-campaign link is the localized vanity-claim case. useZeroDev keeps emitting the singular `campaign_tag` alongside the plural so the INVITE_ACCEPTED funnel does not step at deploy. Typecheck clean, prettier clean, 2,820 tests passing across 222 suites.
feat(badges): consume the capability platform, generate the asset map
…into-dev-20260807b # Conflicts: # src/types/api.generated.ts # src/types/api.openapi.json
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
Code-analysis diffPainscore total: 7093.99 → 7141.94 (+47.95) 🆕 New findings (482)
…and 462 more. ✅ Resolved (459)
…and 439 more. 📈 Painscore deltas (top movers)
|
🧪 UI test report — ✅ all greenSuites
📊 Coverage (unit)
⏱ 10 slowest test cases
|
Second back-merge today — the badge-platform UI work (#2613) merged straight to
mainafter the first one, which made the release PR #2642 dirty.Conflict:
src/types/api.openapi.jsonandsrc/types/api.generated.ts. Both are generated artifacts, and both sides added endpoints — FX ondev, badges onmain. Hand-merging either would have dropped one side's paths, so instead the openapi snapshot was replaced with the merged backendopenapi.json(which already carries both) andpnpm gen:apiregenerated the types.Verified:
/fx/rateand the badge paths are both present, typecheck clean, 2890 tests pass.