Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
9161ea4
chore: renamed character preview positioning constants (#7090)
davidejensen Feb 17, 2026
22d54ed
fix: additional field's info overlaps title in the passport (#7121)
RominaMarchetti Feb 17, 2026
37e1756
fix: trigger area race condition (#7076)
mihakrajnc Feb 18, 2026
35cc1ab
feat: skybox global time & storage for time set by user (#7021)
lorux0 Feb 18, 2026
2b74c62
Merge pull request #7124 from decentraland/chore/sync
m3taphysics Feb 18, 2026
3dcc56e
Transform DecentralandUrls to the gateway (#6918)
mikhail-dcl Feb 18, 2026
41d5d0a
style: update controls panel (#7129)
RominaMarchetti Feb 18, 2026
d401c82
feat: Multi-scene world registry fetch (#7037)
dalkia Feb 18, 2026
83e2b2d
fix: movePlayerTo() with Duration (#7089)
pravusjif Feb 18, 2026
f35dda9
feat: [Re-Discover] Analytics implementation (#7086)
sandrade-dcl Feb 18, 2026
cf5ae4e
feat: Multi-scene worlds gatekeeper change (#7049)
dalkia Feb 18, 2026
6c5ecd6
fix: normal texture color through gltf node modifiers (#7145)
lorux0 Feb 18, 2026
ce0b7a1
feat: [Re-Discover] Live Events counter (#7125)
sandrade-dcl Feb 18, 2026
cea99ee
fix: load system base race condition (#7137)
lorenzo-ranciaffi Feb 19, 2026
9c62a48
fix: prevent build cancelation on labels other than force-build or cl…
charly-bg Feb 19, 2026
8cbfee7
UpdateRemoteIK query (and the other two queries) were missing [None(t…
m3taphysics Feb 19, 2026
e6b28d5
chore: remove QThund from auto-assign configuration (#7164)
aixaCode Feb 19, 2026
b599b7f
Merge pull request #7168 from decentraland/chore/sync
aixaCode Feb 19, 2026
f8f8880
fix: Multi-scene teleport command (#7166)
dalkia Feb 20, 2026
8362e25
chore: enrich unity diagnostics with custom metadata (#7161)
davidejensen Feb 20, 2026
b8aeb0a
fix: Make lsd non-scene work again when not in 0,0 (#7175)
dalkia Feb 22, 2026
13e32be
fix: World generation fix (#7083)
dalkia Feb 23, 2026
86d48f8
chore: Implement Claude Review workflow for QA-approved PR (#7184)
m3taphysics Feb 23, 2026
f1c53f0
fix: reenable saturation and value slider in backpack. (#7192)
alejandro-jimenez-dcl Feb 23, 2026
ee5d3be
Chore: adapter for thirdweb http client (#7180)
popuz Feb 23, 2026
faf381b
fix: overlapping chat messages (#7190)
lorenzo-ranciaffi Feb 23, 2026
7007a60
fix: Add id-token permission to PR review workflow (#7207)
m3taphysics Feb 23, 2026
929ca01
chore: Upgrade checkout action and refine Claude review settings (#7208)
m3taphysics Feb 23, 2026
d445ab4
Add issue deduplication workflow (#7209)
m3taphysics Feb 23, 2026
f6a7bcf
fix: track identities resolved through token file as new login (not c…
lorux0 Feb 23, 2026
455da93
style: update map filters to match Discover (#7193)
RominaMarchetti Feb 23, 2026
29cf522
Fix: Sentry authentication metrics not send (#7091)
popuz Feb 23, 2026
90c3909
fix: Multi-scene worlds donations (#7174)
dalkia Feb 23, 2026
1704f8c
chore: Force backface by button (#7196)
dalkia Feb 23, 2026
7692310
Remove CameraReelLink from gatewaying
mikhail-dcl Feb 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/auto_assign_config_dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ reviewGroups:
- pravusjif
- fcolarich
- NickKhalow
- QThund
- lorenzo-ranciaffi
- mihakrajnc
- AnsisMalins
Expand Down
8 changes: 7 additions & 1 deletion .github/workflows/build-unitycloud.yml
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,13 @@ on:

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-${{ inputs.install_source }}
cancel-in-progress: true
cancel-in-progress: >-
${{
github.event_name != 'pull_request' ||
github.event.action != 'labeled' ||
github.event.label.name == 'force-build' ||
github.event.label.name == 'clean-build'
}}

jobs:
prebuild:
Expand Down
74 changes: 74 additions & 0 deletions .github/workflows/claude-pr-review-auto.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
name: Claude Review (On QA Approval)
on:
pull_request_review:
types: [submitted]

concurrency:
group: claude-qa-review-pr-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
review-on-qa-approval:
if: |
${{ github.event.review.state == 'approved' &&
!contains(github.event.pull_request.labels.*.name, 'no QA needed') &&
!contains(github.event.pull_request.labels.*.name, 'no review') &&
!contains(github.event.pull_request.labels.*.name, 'auto-pr') }}
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
pull-requests: write
issues: write
steps:
- name: Check if reviewer is in QA team
id: check-team
run: |
MEMBER=$(gh api \
/orgs/${{ github.repository_owner }}/teams/qa/memberships/${{ github.event.review.user.login }} \
--jq '.state' 2>/dev/null || echo "not_found")
echo "is_member=$([[ "$MEMBER" == "active" ]] && echo true || echo false)" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ secrets.ORG_ACCESS_TOKEN }}

- name: Checkout repository
if: steps.check-team.outputs.is_member == 'true'
uses: actions/checkout@v6
with:
fetch-depth: 1

- name: Claude Review (QA Approval Triggered)
if: steps.check-team.outputs.is_member == 'true'
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
track_progress: true
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.pull_request.number }}

This PR has been approved by QA and requires automated analysis.

Review the PR diff, then post a review with your findings.

Review Focus — report ONLY issues that require fixes:
1. Code quality violations per CLAUDE.md standards
2. Bugs or potential runtime errors
3. Security vulnerabilities
4. Performance issues
5. Bad practices or anti-patterns
6. Missing error handling
7. Unclear or problematic logic

For each issue found:
- Location: File and line number
- Problem: What is wrong (be specific)
- Fix: Exact change needed
- Why: Brief explanation of the impact

Use mcp__github_inline_comment__create_inline_comment for specific line issues.
Use Bash(gh pr comment) for a top-level summary comment.
Do NOT include praise, style preferences, or nice-to-have suggestions.
claude_args: |
--allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*)"
--max-turns 20
63 changes: 63 additions & 0 deletions .github/workflows/issue-deduplication.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: Issue Deduplication

on:
issues:
types: [opened]

jobs:
deduplicate:
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: read
issues: write
id-token: write

steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 1

- name: Check for duplicate issues
uses: anthropics/claude-code-action@v1
with:
prompt: |
Analyze this new issue and check if it's a duplicate of existing issues in the repository.

Issue: #${{ github.event.issue.number }}
Repository: ${{ github.repository }}

Your task:
1. Use mcp__github__get_issue to get details of the current issue (#${{ github.event.issue.number }})
2. Search for similar existing issues using mcp__github__search_issues with relevant keywords from the issue title and body
3. Compare the new issue with existing ones to identify potential duplicates

Criteria for duplicates:
- Same bug or error being reported
- Same feature request (even if worded differently)
- Same question being asked
- Issues describing the same root problem

If you find duplicates:
- Add a comment on the new issue linking to the original issue(s)
- Apply a "duplicate" label to the new issue
- Be polite and explain why it's a duplicate
- Suggest the user follow the original issue for updates

If it's NOT a duplicate:
- Don't add any comments
- You may apply appropriate topic labels based on the issue content

Use these tools:
- mcp__github__get_issue: Get issue details
- mcp__github__search_issues: Search for similar issues
- mcp__github__list_issues: List recent issues if needed
- mcp__github__create_issue_comment: Add a comment if duplicate found
- mcp__github__update_issue: Add labels

Be thorough but efficient. Focus on finding true duplicates, not just similar issues.

anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
claude_args: |
--allowedTools "mcp__github__get_issue,mcp__github__search_issues,mcp__github__list_issues,mcp__github__create_issue_comment,mcp__github__update_issue,mcp__github__get_issue_comments"
2 changes: 1 addition & 1 deletion Explorer/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -85,5 +85,5 @@ Assets/AddressableAssetsData/link.xml.meta
Assets/Resources/PerformanceTestRunInfo.*
Assets/Resources/PerformanceTestRunSettings.*

# Disk caching
# Disk caching
DiskCache/
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
using DCL.Input;
using DCL.Input.Component;
using DCL.Multiplayer.Connections.DecentralandUrls;
using DCL.PerformanceAndDiagnostics;
using DCL.PerformanceAndDiagnostics.Analytics;
using DCL.Profiles.Self;
using DCL.SceneLoadingScreens.SplashScreen;
Expand All @@ -34,15 +33,18 @@ public class AuthenticationScreenController : ControllerBase<AuthenticationScree
{
public enum AuthStatus
{
Init = 0,
None = 0,

LoginRequested = 1,
VerificationInProgress = 2,
FetchingProfile = 3,
LoggedIn = 4,
LoginSelectionScreen = 1,
LoginRequested = 2,

FetchingProfileCached = 5,
LoggedInCached = 6,
VerificationRequested = 3,

ProfileFetching = 4,
LoggedIn = 5,

ProfileFetchingCached = 6,
LoggedInCached = 7,
}

internal const int ANIMATION_DELAY = 300;
Expand Down Expand Up @@ -73,10 +75,9 @@ public enum AuthStatus
private CancellationTokenSource? loginCancellationTokenSource;

public override CanvasOrdering.SortingLayer Layer => CanvasOrdering.SortingLayer.Fullscreen;
public ReactiveProperty<AuthStatus> CurrentState { get; } = new (AuthStatus.Init);
public ReactiveProperty<AuthStatus> CurrentState { get; } = new (AuthStatus.None);
public string CurrentRequestID { get; internal set; } = string.Empty;
public LoginMethod CurrentLoginMethod { get; internal set; }
public AuthProvider CurrentProvider => web3Authenticator.CurrentProvider;

public event Action DiscordButtonClicked;
public event Action<string, bool> OTPVerified;
Expand Down Expand Up @@ -168,7 +169,6 @@ protected override void OnViewInstantiated()
otpVerificationState.OTPResend += () => OTPResend?.Invoke();

fsm.AddStates(
new ProfileFetchingOTPAuthState(fsm, viewInstance, this, CurrentState, selfProfile),
otpVerificationState,
new LobbyForNewAccountAuthState(fsm, viewInstance, this, CurrentState, characterPreviewController, selfProfile, wearablesProvider, webBrowser, webRequestController, decentralandUrlsSource)
);
Expand Down Expand Up @@ -196,7 +196,6 @@ protected override void OnBeforeViewShow()
}
else
{
SentryTransactionNameMapping.Instance.EndCurrentSpan(LOADING_TRANSACTION_NAME);
fsm.Enter<LoginSelectionAuthState, int>(UIAnimationHashes.IN, true);
}
}
Expand All @@ -208,10 +207,9 @@ private async UniTaskVoid TryAutoLoginAndProceedAsync(IWeb3Identity storedIdenti
bool autoLoginSuccess = await web3Authenticator.TryAutoLoginAsync(ct);

if (autoLoginSuccess)
fsm.Enter<ProfileFetchingAuthState, (IWeb3Identity identity, bool isCached, CancellationToken ct)>((storedIdentity, true, ct));
fsm.Enter<ProfileFetchingAuthState, ProfileFetchingPayload>(new (storedIdentity, storedIdentity.Source != IWeb3Identity.Web3IdentitySource.TokenFile, ct));
else
{
SentryTransactionNameMapping.Instance.EndCurrentSpan(LOADING_TRANSACTION_NAME);
fsm.Enter<LoginSelectionAuthState, int>(UIAnimationHashes.IN, true);
}
}
Expand All @@ -221,7 +219,6 @@ private async UniTaskVoid TryAutoLoginAndProceedAsync(IWeb3Identity storedIdenti
catch (Exception e)
{
ReportHub.LogException(e, new ReportData(ReportCategory.AUTHENTICATION));
SentryTransactionNameMapping.Instance.EndCurrentSpan(LOADING_TRANSACTION_NAME);
fsm.Enter<LoginSelectionAuthState, int>(UIAnimationHashes.IN, true);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

namespace DCL.AuthenticationScreenFlow
{
public class ProfileNotFoundException : Exception
{
public class ProfileNotFoundException : Exception { }

public class NotAllowedUserException : Exception
{
public NotAllowedUserException(string message) : base(message)
{
}
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,64 @@
using MVC;
using DCL.PerformanceAndDiagnostics;
using MVC;
using System;
using static DCL.AuthenticationScreenFlow.AuthenticationScreenController;

namespace DCL.AuthenticationScreenFlow
{
public abstract class AuthStateBase : IExitableState
{
protected const int STATE_SPAN_DEPTH = 1;

protected readonly AuthenticationScreenView viewInstance;

protected SpanErrorInfo? spanErrorInfo;

protected AuthStateBase(AuthenticationScreenView viewInstance)
{
this.viewInstance = viewInstance;
}

public virtual void Exit() {}
protected void Enter()
{
spanErrorInfo = null;

SentryTransactionNameMapping.Instance.StartSpan(LOADING_TRANSACTION_NAME, new SpanData
{
SpanName = GetDefaultSpanName(),
SpanOperation = "auth.state",
Depth = STATE_SPAN_DEPTH,
});
}

public virtual void Exit()
{
if (spanErrorInfo is { } error)
SentryTransactionNameMapping.Instance.EndSpanOnDepthWithError(LOADING_TRANSACTION_NAME, STATE_SPAN_DEPTH, error.message, error.exception);
else
SentryTransactionNameMapping.Instance.EndSpanOnDepth(LOADING_TRANSACTION_NAME, STATE_SPAN_DEPTH);
}

private string GetDefaultSpanName()
{
const string SUFFIX = "AuthState";

string typeName = GetType().Name;

return typeName.EndsWith(SUFFIX, StringComparison.Ordinal)
? typeName[..^SUFFIX.Length]
: typeName;
}

protected struct SpanErrorInfo
{
internal string message;
internal Exception? exception;

internal SpanErrorInfo(string message, Exception? exception = null)
{
this.message = message;
this.exception = exception;
}
}
}
}
Loading
Loading