Skip to content

feat: register referral attribution from the launcher referrer argument - #9488

Merged
lorux0 merged 16 commits into
devfrom
feat/referral-referrer-arg
Aug 17, 2026
Merged

feat: register referral attribution from the launcher referrer argument#9488
lorux0 merged 16 commits into
devfrom
feat/referral-referrer-arg

Conversation

@braianj

@braianj braianj commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Consumes the --referrer launch argument the launcher passes and uses it to register the referral for new accounts.

  • New referrer app arg (AppArgsFlags.REFERRER) plus a validated ReferrerArg normalizer (0x + 40 hex, lowercased).
  • DeepLinkSignInUrl (extracted from DappDeepLinkAuthenticator so it is unit-testable) appends the referrer to the signature web app URL, so wallet users carry attribution into the web setup flow.
  • LobbyForNewAccountAuthState — which runs only for new accounts — registers the referral against social-api with a signed fetch, covering the email/OTP onboarding that never opens the browser. Time-boxed and best-effort: it never blocks or fails onboarding.

Please note before merging:

  • The registration is awaited before the user proceeds to the world, but the LoggedIn status transition happens earlier when the lobby is entered, so registration is not strictly ordered ahead of the LOGGED_IN analytics event. With an idempotent create on the backend and the multi-day finalization rule, the worst case is one login day not counted rather than a lost referral; closing the ordering gap fully would mean moving the status transition, which is left out of scope here.
  • Durable cross-session retry is not implemented: a failed registration retries only on re-entry to this state.
  • The added tests cover normalization and URL construction, not the ordering or retry behavior, and this branch has not been compiled or run locally — it needs a CI run to validate.

Tests instruction

This PR is tied directly with: decentraland/launcher-rust#308
Follow the test instructions there and place this build into the latest/ folder at the launcher (mac: ~/Library/Application Support/DecentralandLauncherLight/latest`)

@braianj
braianj requested review from a team as code owners July 27, 2026 13:28
@github-actions
github-actions Bot requested a review from anicalbano July 27, 2026 13:28
@decentraland-bot decentraland-bot added the ext-contribution Identifies a contribution which was not initiated by a Unity Developer label Jul 27, 2026
@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

badge

Warnings not reduced: 13729 => 13730 — remove at least 2 warnings to merge.

Warnings/errors in files changed by this PR (32)
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:124  CSharpWarnings::CS8602  Dereference of a possibly null reference
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:143  CSharpWarnings::CS8602  Dereference of a possibly null reference
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:168  CSharpWarnings::CS8604  Possible null reference argument for parameter 'identityCache' in 'DCL.PerformanceAndDiagnostics.Analytics.AnalyticsContainer.CreateAsync'
Assets/DCL/AuthenticationScreenFlow/Views/LobbyForNewAccountAuthView.cs:68  CSharpWarnings::CS8618  Non-nullable field 'animator' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AuthenticationScreenFlow/Views/LobbyForNewAccountAuthView.cs:69  CSharpWarnings::CS8618  Non-nullable field 'canvasGroup' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:41  CSharpWarnings::CS8618  Non-nullable field 'reportHandlingSettings' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AuthenticationScreenFlow/States/LobbyForNewAccountAuthState.cs:58  CSharpWarnings::CS8618  Non-nullable fields 'newUserProfile', 'userEmail' must contain non-null values when exiting constructor. Consider adding the 'required' modifiers or declaring the fields as nullable.
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenController.cs:96  CSharpWarnings::CS8618  Non-nullable members 'DiscordButtonClicked', 'OTPVerified', 'OTPResend', 'ProfileFinalized', 'fsm', 'audio' must contain non-null values when exiting constructor. Consider adding the 'required' modifiers or declaring the members as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:56  CSharpWarnings::CS8618  Non-nullable property 'Analytics' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:60  CSharpWarnings::CS8618  Non-nullable property 'AppArgs' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:283  CSharpWarnings::CS8618  Non-nullable property 'BuildData' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:57  CSharpWarnings::CS8618  Non-nullable property 'DebugSettings' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:45  CSharpWarnings::CS8618  Non-nullable property 'DecentralandUrlsSource' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:44  CSharpWarnings::CS8618  Non-nullable property 'DiagnosticsContainer' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:61  CSharpWarnings::CS8618  Non-nullable property 'LaunchMode' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:281  CSharpWarnings::CS8618  Non-nullable property 'ReportHandlingSettingsDevelopment' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:282  CSharpWarnings::CS8618  Non-nullable property 'ReportHandlingSettingsProduction' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:58  CSharpWarnings::CS8618  Non-nullable property 'VolumeBus' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:47  CSharpWarnings::CS8618  Non-nullable property 'Web3AccountFactory' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:46  CSharpWarnings::CS8618  Non-nullable property 'WebBrowser' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:66  CSharpWarnings::CS8618  Non-nullable property 'WebRequestsContainer' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenController.cs:91  ConditionalAccessQualifierIsNonNullableAccordingToAPIContract  Conditional access qualifier expression is never null according to nullable reference types' annotations
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenController.cs:181  ConditionalAccessQualifierIsNonNullableAccordingToAPIContract  Conditional access qualifier expression is never null according to nullable reference types' annotations
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenController.cs:182  ConditionalAccessQualifierIsNonNullableAccordingToAPIContract  Conditional access qualifier expression is never null according to nullable reference types' annotations
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenController.cs:298  ConditionalAccessQualifierIsNonNullableAccordingToAPIContract  Conditional access qualifier expression is never null according to nullable reference types' annotations
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:72  ConditionalAccessQualifierIsNonNullableAccordingToAPIContract  Conditional access qualifier expression is never null according to nullable reference types' annotations
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:78  ConditionalAccessQualifierIsNonNullableAccordingToAPIContract  Conditional access qualifier expression is never null according to nullable reference types' annotations
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenController.cs:76  InconsistentNaming  Name 'CurrentRequestID' does not match rule 'members_should_be_pascal_case'. Suggested name is 'CurrentRequestId'.
Assets/DCL/AuthenticationScreenFlow/States/LobbyForNewAccountAuthState.cs:175  InconsistentNaming  Name 'OpenClickableURL' does not match rule 'members_should_be_pascal_case'. Suggested name is 'OpenClickableUrl'.
Assets/DCL/AuthenticationScreenFlow/Views/LobbyForNewAccountAuthView.cs:79  InconsistentNaming  Name 'UpdateBodyTypeUI' does not match rule 'members_should_be_pascal_case'. Suggested name is 'UpdateBodyTypeUi'.
Assets/DCL/Web3/Abstract/Web3Address.cs:51  RedundantCast  Type cast is redundant
Assets/DCL/AuthenticationScreenFlow/States/LobbyForNewAccountAuthState.cs:44  UnusedMember.Local  Constant 'REFERRAL_REGISTRATION_TIMEOUT_SECONDS' is never used

@decentraland-bot decentraland-bot 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.

STEP 2 — Root-cause check

PASS. This PR adds a new feature (referral attribution from a launcher argument), not a bug fix. The diff correctly implements two referral consumption paths: URL construction for wallet sign-ups and API registration for new-account onboarding.

STEP 3 — Design & integration

PASS with notes.

Owner search — RegisterReferralAsync: The referral API call runs inside LobbyForNewAccountAuthState.PublishNewProfileAsync, which executes only when a new account completes onboarding. The lifecycle owner for new-account finalization is LobbyForNewAccountAuthState itself (it owns the profile publish, newsletter subscription, and transition to the world). Placing the referral registration here is correct — no other existing owner manages this lifecycle step. Files checked: AuthenticationScreenController.cs (state machine wiring), LobbyForExistingAccountAuthState (existing-account path — correctly excluded), InitAuthState, LoginSelectionAuthState.

Owner search — DeepLinkSignInUrl: Extracted from inline URL construction in DappDeepLinkAuthenticator.LoginAsync. The extraction is justified: it makes URL-building logic independently testable without instantiating the full authenticator. The split pays for itself in test coverage (CLAUDE.md §11 "Extracting when you should merge").

Owner search — ReferrerArg: Shared static utility consumed by both DeepLinkSignInUrl.Build and LobbyForNewAccountAuthState. Two independent consumers → extraction justified.

Referrer flow: The referrer enters via appArgs at two composition-root sites (BootstrapContainer.CreateWeb3Dependencies and Web3AuthenticationPlugin.InitializeAsync), feeding two separate dependency chains. This is noted as P2 below.

Teardown / consumption trace: No subscriptions, event hookups, connections, or persistent resources introduced. RegisterReferralAsync is awaited inline. No teardown needed.

STEP 4 — Member audit

  • DeepLinkSignInUrl.Build() — public static, 1 production caller (DappDeepLinkAuthenticator.LoginAsync), 4 test callers. Independently tested. Acceptable single-caller extraction.
  • ReferrerArg.Normalize() — public static, 2 production callers. Appropriate.
  • AppArgsFlags.REFERRER — public const, 3 usage sites. Appropriate.
  • DecentralandUrl.ReferralProgress — enum member, 2 usage sites. Appropriate.

No single-use predicates, absent-equals-false, or redundant-guard issues.

STEP 5 — Findings

See inline comments below for suggestion blocks.

# Sev Location Issue
1 P1 PR settings PR targets main instead of dev (repo default branch is dev)
2 P1 LobbyForNewAccountAuthState.cs:346–382 Combined referral timeout up to 10s blocks user with no feedback
3 P2 DappDeepLinkAuthenticator.cs:57 Raw referrer stored; inconsistent with LobbyForNewAccountAuthState which normalizes at construction

[P1] PR targets main instead of dev. This repo's default branch is dev (origin/HEAD → origin/dev). Per the branch model, feature PRs should target dev. Please retarget this PR before merge.

Security review: No security issues found. Input validation via ReferrerArg.Normalize (^0x[a-fA-F0-9]{40}$) is strict and correctly prevents injection in both URL and JSON interpolation paths. API requests use signed fetch. No secrets or sensitive data in the diff.

Git conventions (ADR-6): PASS. Title follows feat: ... format. Branch follows feat/... convention.

STEP 6 — Complexity

COMPLEX — Modifies authentication/onboarding flow, adds signed-fetch web requests during new-account finalization, touches DI wiring in BootstrapContainer and Web3AuthenticationPlugin, adds a new DecentralandUrl enum member, and spans 17 files across multiple assemblies.

STEP 7 — QA assessment

QA_REQUIRED: YES — Changes affect the runtime authentication/onboarding flow. New-account registration now includes a server round-trip (POST + PATCH) between profile creation and entering the world. Wallet sign-ups get a modified browser URL. Both paths need manual verification.

STEP 8 — Non-blocking warnings

None.

REVIEW_RESULT: FAIL ❌
COMPLEXITY: COMPLEX
COMPLEXITY_REASON: Modifies auth onboarding flow, adds signed-fetch web requests, touches DI wiring in BootstrapContainer/Web3AuthenticationPlugin, and spans 17 files across multiple assemblies.
QA_REQUIRED: YES


Reviewed by Jarvis 🤖 · Requested by braianj via Slack

@lorux0 lorux0 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Great work! Added small comments

Comment thread Explorer/Assets/DCL/Web3/Authenticators/Implementations/Dapp/DeepLinkSignInUrl.cs Outdated
Comment thread Explorer/Assets/DCL/Web3/ReferrerArg.cs Outdated
@braianj
braianj changed the base branch from main to dev July 27, 2026 16:19
@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

badge

All Unity tests passed ✅

TESTS SUITE Result Passed Failed Skipped
EditMode ✅ Passed 24482 0 13
PlayMode ✅ Passed 236 0 5

# Conflicts:
#	Explorer/Assets/DCL/Infrastructure/Global/AppArgs/AppArgsFlags.cs
#	Explorer/Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs
#	Explorer/Assets/DCL/Infrastructure/Utility/DecentralandUrls/DecentralandUrl.cs
#	Explorer/Assets/DCL/Web3/Abstract/Web3Address.cs
#	Explorer/Assets/DCL/Web3/Authenticators/Implementations/Dapp/DappDeepLinkAuthenticator.cs

@decentraland-bot decentraland-bot 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.

STEP 1 — Context loaded

Read CLAUDE.md, docs/README.md, review-instructions.md, and the relevant source files. Cloned the repo at the PR head and inspected:

  • LobbyForNewAccountAuthState.cs (core new logic)
  • DappDeepLinkAuthenticator.cs (URL path)
  • DeepLinkSignInUrl.cs (new helper)
  • Web3Address.cs (new FromUntrusted)
  • AuthenticationScreenController.cs (passthrough)
  • Web3AuthenticationPlugin.cs (referrer extraction)
  • BootstrapContainer.cs (referrer extraction)
  • LobbyForNewAccountAuthView.cs (UI properties)
  • SignedWebRequestControllerExtensions.cs (HTTP helpers)

STEP 2 — Root-cause check: PASS

New feature, not a fix. The PR adds referral attribution by consuming an untrusted --referrer launch argument, validating it, and routing it through two disjoint paths (browser URL for wallet sign-ups, HTTP registration for email/OTP sign-ups). The approach addresses the actual requirement.

STEP 3 — Design & integration: PASS

No new long-lived units with lifecycle management. RegisterReferralAsync is a one-shot private method in the existing LobbyForNewAccountAuthState finalization flow. DeepLinkSignInUrl is a stateless static helper (pure function). Web3Address.FromUntrusted is a factory method on an existing struct.

Owner search: The referral registration runs during new-account finalization (FinalizeNewUserPublishNewProfileAsync), which is owned by LobbyForNewAccountAuthState. This is the correct home — the state already orchestrates profile creation and analytics events for new accounts.

Teardown trace: No subscriptions, events, callbacks, or persistent resources are opened by the new code. The HTTP requests are awaited to completion or caught. No leak.

Security review: Input validation is solid. Web3Address.FromUntrusted validates format (0x + 40 hex chars) and lowercases. DeepLinkSignInUrl.Build re-validates before URL interpolation (defense-in-depth). The validated referrer is safe for both JSON string interpolation (hex-only charset — no escape characters) and URL query parameter interpolation (no reserved URI characters). No injection risk. No secrets in logs.

STEP 4 — Member audit

  • Web3Address.FromUntrusted: 3 call sites (2 production constructors + tests). Multi-use, justified.
  • DeepLinkSignInUrl.Build: 1 production caller + 5 test cases. Extracted for testability; tests prove the value.
  • JumpInIcon / FinalizeLoading: Serialized view properties. Toggled in Enter() (reset) and FinalizeNewUser() (swap). Enter() always resets on re-entry, so the error-path exit → re-enter flow is safe.
  • REFERRAL_REGISTRATION_TIMEOUT_SECONDS: 0 consumers. Dead code — see findings below.

STEP 5 — Line-level findings

See inline comments.

STEP 6 — Complexity: COMPLEX

Touches authentication FSM states, async web request patterns, web3 address handling, URL construction, new HTTP endpoints, and cross-assembly dependency wiring (AppArgs → BootstrapContainer → Authenticator, AppArgs → Plugin → Controller → State).

STEP 7 — QA: YES

Modifies runtime authentication/onboarding code that affects what the user experiences during sign-up.

STEP 8 — Non-blocking warnings

None. Main scene not modified.

⚠️ CI note: Windows build (Build (windows64)) and Lint (Enforce warning reduction) are failing. Tests (edit mode + play mode) pass. Worth confirming the build failure is not caused by this branch.

REVIEW_RESULT: FAIL ❌
COMPLEXITY: COMPLEX
COMPLEXITY_REASON: Touches authentication FSM states, async web request patterns, web3 address validation, and cross-assembly dependency wiring across multiple assemblies.
QA_REQUIRED: YES


Reviewed by Jarvis 🤖 · Requested by lorux0 via GitHub

Comment thread Explorer/Assets/DCL/PluginSystem/Global/Web3AuthenticationPlugin.cs
@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

🚦 CI Status

Build

New build in progress, come back later!

Lint

Warnings count reduced: 13156 => 13151

Warnings/errors in files changed by this PR (22)
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:181  CSharpWarnings::CS8604  Possible null reference argument for parameter 'identityCache' in 'DCL.PerformanceAndDiagnostics.Analytics.AnalyticsContainer.CreateAsync'
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:41  CSharpWarnings::CS8618  Non-nullable field 'reportHandlingSettings' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AuthenticationScreenFlow/States/LobbyForNewAccountAuthState.cs:55  CSharpWarnings::CS8618  Non-nullable fields 'newUserProfile', 'userEmail' must contain non-null values when exiting constructor. Consider adding the 'required' modifiers or declaring the fields as nullable.
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenController.cs:96  CSharpWarnings::CS8618  Non-nullable members 'DiscordButtonClicked', 'OTPVerified', 'OTPResend', 'ProfileFinalized', 'fsm', 'audio' must contain non-null values when exiting constructor. Consider adding the 'required' modifiers or declaring the members as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:56  CSharpWarnings::CS8618  Non-nullable property 'Analytics' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:60  CSharpWarnings::CS8618  Non-nullable property 'AppArgs' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:57  CSharpWarnings::CS8618  Non-nullable property 'DebugSettings' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:45  CSharpWarnings::CS8618  Non-nullable property 'DecentralandUrlsSource' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:44  CSharpWarnings::CS8618  Non-nullable property 'DiagnosticsContainer' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:61  CSharpWarnings::CS8618  Non-nullable property 'LaunchMode' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:58  CSharpWarnings::CS8618  Non-nullable property 'VolumeBus' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:47  CSharpWarnings::CS8618  Non-nullable property 'Web3AccountFactory' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:46  CSharpWarnings::CS8618  Non-nullable property 'WebBrowser' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/Infrastructure/Global/Dynamic/BootstrapContainer.cs:74  CSharpWarnings::CS8618  Non-nullable property 'WebRequestsContainer' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenController.cs:91  ConditionalAccessQualifierIsNonNullableAccordingToAPIContract  Conditional access qualifier expression is never null according to nullable reference types' annotations
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenController.cs:181  ConditionalAccessQualifierIsNonNullableAccordingToAPIContract  Conditional access qualifier expression is never null according to nullable reference types' annotations
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenController.cs:182  ConditionalAccessQualifierIsNonNullableAccordingToAPIContract  Conditional access qualifier expression is never null according to nullable reference types' annotations
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenController.cs:298  ConditionalAccessQualifierIsNonNullableAccordingToAPIContract  Conditional access qualifier expression is never null according to nullable reference types' annotations
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenController.cs:76  InconsistentNaming  Name 'CurrentRequestID' does not match rule 'members_should_be_pascal_case'. Suggested name is 'CurrentRequestId'.
Assets/DCL/AuthenticationScreenFlow/States/LobbyForNewAccountAuthState.cs:172  InconsistentNaming  Name 'OpenClickableURL' does not match rule 'members_should_be_pascal_case'. Suggested name is 'OpenClickableUrl'.
Assets/DCL/AuthenticationScreenFlow/Views/LobbyForNewAccountAuthView.cs:79  InconsistentNaming  Name 'UpdateBodyTypeUI' does not match rule 'members_should_be_pascal_case'. Suggested name is 'UpdateBodyTypeUi'.
Assets/DCL/AuthenticationScreenFlow/Views/LobbyForExistingAccountAuthView.cs:35  UnusedMember.Local  Method 'Awake' is never used

Tests

All Unity tests passed ✅

TESTS SUITE Result Passed Failed Skipped
EditMode ✅ Passed 25017 0 13
PlayMode ✅ Passed 236 0 37

@decentraland-bot

Copy link
Copy Markdown
Contributor

PR #9488, run #31854118446

Builds: Windows change, Windows baseline, macOS change, macOS baseline

How to read this table
  • Each build is measured 3 times. The values are the median, and (min–max) is the lowest and highest of those runs — a wide range means the metric is noisy and small differences are not trustworthy.
  • Δ is Change minus Baseline (a negative Δ means Change is faster).
  • 🟢 faster / 🔴 slower — a real difference: larger than both 3% and the run-to-run range.
  • ⚪ within noise — the difference is smaller than how much the build varies between its own runs, so it cannot be told apart from random variation. Treat it as no change.
  • Exceptions per run — the average number of exceptions in a run's log; more than the baseline is flagged 🔴 even when frame times look fine. The Exception breakdown under each table groups them by the explorer's report category and exception type (as totals across the runs).
  • A run that logged unusually many exceptions (at least 10 and 5× the median of its build's runs — e.g. a service was down during it) is excluded from all numbers and called out under the table.

Intel Core i5

Metric Baseline Change Δ Result
Samples 2701 (×3) 2367 (×3)
CPU average 33.2 ms (33.2–34.6) 37.8 ms (33.9–38.0) 4.6 ms 🔴 14% slower
CPU 1% worst 34.3 ms (33.5–184.5) 287.3 ms (102.2–295.8) 253.0 ms 🔴 738% slower
CPU 0.1% worst 41.4 ms (33.7–332.0) 303.6 ms (290.6–328.3) 262.2 ms ⚪ within noise
GPU average 9.3 ms (9.2–9.4) 9.4 ms (9.4–9.7) 0.2 ms ⚪ within noise
GPU 1% worst 20.7 ms (19.8–26.9) 31.0 ms (23.1–31.1) 10.3 ms 🔴 50% slower
GPU 0.1% worst 36.3 ms (31.6–37.7) 37.3 ms (36.9–38.0) 0.9 ms ⚪ within noise
Exceptions per run 66 66.67 +0.67 🔴 more errors
Exception breakdown
Exception Baseline (3 runs) Change (3 runs)
[UI] DllNotFoundException 192 192
[ENGINE] ObjectDisposedException 3 4
[ENGINE] NullReferenceException 3 3
[UNKNOWN] ScriptEngineException 0 1

Apple M1

Metric Baseline Change Δ Result
Samples 4368 (×3) 4088 (×3)
CPU average 20.5 ms (20.3–21.6) 22.0 ms (21.4–23.0) 1.5 ms ⚪ within noise
CPU 1% worst 34.7 ms (33.9–34.7) 220.5 ms (122.6–225.2) 185.8 ms 🔴 536% slower
CPU 0.1% worst 34.9 ms (34.9–35.3) 230.5 ms (219.0–231.1) 195.5 ms 🔴 560% slower
GPU average 1.0 ms (0.1–1.6) 2.5 ms (1.1–2.7) 1.5 ms ⚪ within noise
GPU 1% worst 34.2 ms (7.7–34.8) 35.2 ms (34.9–36.4) 1.0 ms ⚪ within noise
GPU 0.1% worst 35.9 ms (35.1–37.2) 37.4 ms (36.8–38.9) 1.5 ms ⚪ within noise
Exceptions per run 0 0 0 ⚪ none new

@DafGreco DafGreco left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✔️ PR reviewed and approved by QA on both platforms following instructions playing both happy and un-happy path

Regressions for this ticket had been performed in order to verify that the normal flow is working as expected:

Image

@lorux0

lorux0 commented Aug 17, 2026

Copy link
Copy Markdown
Collaborator
2026-08-15.00-38-07.mp4

@lorux0
lorux0 enabled auto-merge (squash) August 17, 2026 13:28
@lorux0
lorux0 merged commit 1ae6efa into dev Aug 17, 2026
24 of 25 checks passed
@lorux0
lorux0 deleted the feat/referral-referrer-arg branch August 17, 2026 14:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ext-contribution Identifies a contribution which was not initiated by a Unity Developer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants