Skip to content

chore: migrate to 'main' protocol - #10060

Merged
pravusjif merged 9 commits into
devfrom
chore/migrate-to-protocol-main
Sep 16, 2026
Merged

pravusjif merged 9 commits into
devfrom
chore/migrate-to-protocol-main

Conversation

@pravusjif

@pravusjif pravusjif commented Sep 10, 2026 •

Copy link
Copy Markdown
Member

Adapted Explorer to protocol main (after adapting protocol main with a few changes from experimental)

QA TEST STEPS

Do a general smoke test with the build.

@pravusjif pravusjif self-assigned this Sep 10, 2026
@pravusjif pravusjif moved this to In Progress in Creators Tools Sep 10, 2026
@github-actions

github-actions Bot commented Sep 10, 2026 •

Copy link
Copy Markdown
Contributor

🚦 CI Status

Build

Windows and Mac built successfully in Unity Cloud.

Name Links & timing
Build 1f38324 · Logs · built 2026-09-16T00:00:53Z
Windows GitHub job · Unity Cloud #3 · Unity log · ⏱ 24m 27s build + 7m 3s queue · Download .zip · .zip via S3
Mac GitHub job · Unity Cloud #4 · Unity log · ⏱ 25m 44s build + 2m 1s queue · Download .zip · .zip via S3

Lint

Warnings not reduced: 11910 => 11910 — remove at least 1 warning to merge.

No warnings in files changed by this PR — showing general ones you can remove to unblock (50 of 11910)
Assets/DCL/MarketplaceCredits/Purchase/UI/CreditPurchaseModalController.cs:685  ArrangeRedundantParentheses  Redundant parentheses
Assets/DCL/Rendering/GPUInstanceBatcher/ComputeShaders/DrawArgsInstanceCountTransfer.compute:1  CppUnusedIncludeDirective  Possibly unused #include directive
../render-features/AvatarOutline/RenderFeature_AvatarOutline.RenderPass_OutlineDraw.cs:75  RedundantArgumentDefaultValue  The parameter 'flags' has the same default value
Assets/DCL/Communities/CommunitiesCard/Events/EventListController.cs:156  RedundantArgumentDefaultValue  The parameter 'parcelToTeleport' has the same default value
Assets/DCL/Friends/UI/FriendPanel/Sections/Friends/FriendListSectionUtilities.cs:57  RedundantArgumentDefaultValue  The parameter 'parcelToTeleport' has the same default value
../render-features/ObjectHighlight/RenderFeature_ObjectHighlight.RenderPass_DrawObjects.cs:226  RedundantArgumentDefaultValue  The parameter 'shaderPassId' has the same default value
../render-features/ObjectHighlight/RenderFeature_ObjectHighlight.RenderPass_DrawObjects.cs:236  RedundantArgumentDefaultValue  The parameter 'shaderPassId' has the same default value
Assets/DCL/Chat/_Refactor/ChatReactions/Tests/LocalPlayerWorldReactorShould.cs:141  RedundantArgumentDefaultValue  The parameter 'walletId' has the same default value
Assets/DCL/Chat/_Refactor/ChatReactions/Tests/LocalPlayerWorldReactorShould.cs:156  RedundantArgumentDefaultValue  The parameter 'walletId' has the same default value
Assets/DCL/Chat/_Refactor/ChatReactions/Tests/LocalPlayerWorldReactorShould.cs:171  RedundantArgumentDefaultValue  The parameter 'walletId' has the same default value
Assets/DCL/MapRenderer/MapLayers/HomeMarker/HomeMarkerController.cs:135  RedundantArgumentDefaultValue  The parameter 'worldName' has the same default value
Assets/DCL/Infrastructure/ECS/Unity/Materials/Tests/CreateBasicMaterialSystemShould.cs:76  RedundantAssignment  The value passed to the method is never used because it is overwritten in the method body before being read
Assets/DCL/Infrastructure/ECS/Unity/Materials/Tests/CreatePBRMaterialSystemShould.cs:85  RedundantAssignment  The value passed to the method is never used because it is overwritten in the method body before being read
Assets/DCL/RealmNavigation/RetrieveSceneFromFixedRealm.cs:46  RedundantAssignment  The value passed to the method is never used because it is overwritten in the method body before being read
Assets/DCL/AvatarRendering/Emotes/Editor/EmbeddedEmotesEditor.cs:37  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/AvatarRendering/Emotes/Editor/EmbeddedEmotesEditor.cs:38  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Backpack/AvatarSection/Outfits/OutfitsPresenter.cs:193  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Chat/History/ChatHistoryEncryptor.cs:25  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Infrastructure/ECS/Unity/Materials/Systems/StartMaterialsLoadingSystem.cs:167  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Infrastructure/Global/Editor/DebugSettingsDrawer.cs:73  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Infrastructure/Global/Editor/RealmLaunchSettingsDrawer.cs:248  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Infrastructure/Utility/Primitives/BoxFactory.cs:64  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Infrastructure/Utility/Primitives/BoxFactory.cs:100  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Infrastructure/Utility/Primitives/BoxFactory.cs:136  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Infrastructure/Utility/Primitives/BoxFactory.cs:172  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Infrastructure/Utility/Primitives/BoxFactory.cs:219  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Infrastructure/Utility/Primitives/CylinderVariantsFactory.cs:137  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Landscape/Jobs/NoiseJob.cs:68  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/PluginSystem/Global/VoiceChatDebugContainer.cs:164  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/SDKComponents/AudioAnalysis/AudioAnalysisSystem.cs:75  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/SDKComponents/AvatarAttach/Systems/AvatarAttachHandlerSystem.cs:87  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Translation/Processors/AngleBracketSegmentationRule.cs:29  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Translation/Processors/AngleBracketSegmentationRule.cs:38  RedundantAssignment  Value assigned is not used in any execution path
Assets/DCL/Multiplayer/Connections/Archipelago/Rooms/ArchipelagoIslandRoom.cs:53  RedundantBaseConstructorCall  Redundant base constructor call
../render-features/SkyboxEnvironmentProbe/SkyboxToCubemapRendererPass.cs:259  RedundantCast  Type cast is redundant
../render-features/SkyboxEnvironmentProbe/SkyboxToCubemapRendererPass.cs:310  RedundantCast  Type cast is redundant
Assets/DCL/AvatarRendering/AvatarShape/Tests/EditMode/FinishAvatarMatricesCalculationSystemShould.cs:154  RedundantCast  Type cast is redundant
Assets/DCL/AvatarRendering/AvatarShape/Tests/EditMode/FinishAvatarMatricesCalculationSystemShould.cs:155  RedundantCast  Type cast is redundant
Assets/DCL/AvatarRendering/AvatarShape/Tests/EditMode/FinishAvatarMatricesCalculationSystemShould.cs:156  RedundantCast  Type cast is redundant
Assets/DCL/AvatarRendering/AvatarShape/Tests/EditMode/FinishAvatarMatricesCalculationSystemShould.cs:157  RedundantCast  Type cast is redundant
Assets/DCL/AvatarRendering/AvatarShape/Tests/EditMode/FinishAvatarMatricesCalculationSystemShould.cs:158  RedundantCast  Type cast is redundant
Assets/DCL/AvatarRendering/AvatarShape/Tests/EditMode/FinishAvatarMatricesCalculationSystemShould.cs:159  RedundantCast  Type cast is redundant
Assets/DCL/AvatarRendering/Wearables/Helpers/WearablePolymorphicBehaviour.cs:135  RedundantCast  Type cast is redundant
Assets/DCL/MarketplaceCredits/Purchase/Tests/CreditsTopUpServiceShould.cs:36  RedundantCast  Type cast is redundant
Assets/DCL/SDKComponents/AvatarAttach/Tests/AvatarAttachHandlerSystemShould.cs:588  RedundantCast  Type cast is redundant
Assets/DCL/SDKComponents/Billboard/Tests/BillboardTest.cs:173  RedundantCast  Type cast is redundant
Assets/DCL/SDKComponents/MediaStream/YouTube/HlsManifestBuilder.cs:191  RedundantCast  Type cast is redundant
Assets/DCL/SpringBones/SpringBoneService.cs:185  RedundantCast  Type cast is redundant
Assets/DCL/VoiceChat/NearbyVoiceChat/Tests/EditMode/NearbyAudioStreamRegistryShould.cs:506  RedundantCast  Type cast is redundant
Assets/DCL/WebRequests/CustomDownloadHandlers/PartialDownloadHandler.cs:26  RedundantCast  Type cast is redundant

Lint run · full InspectCode report · took 23m 30s

Tests

All Unity tests passed ✅

TESTS SUITE Result Passed Failed Skipped Tests time Job time
EditMode ✅ Passed 25972 0 13 4m 23s 18m 16s
PlayMode ✅ Passed 248 0 37 45s 12m 25s

Tests time sums the test cases; Job time is the job's wall clock including checkout, licensing and asset import.

Slowest tests
  • [editmode] 22.4s DCL.Tests.Editor.ValidationTests.CheckUnityObjectsForMissingReferences
  • [editmode] 16.5s DCL.AuthenticationScreenFlow.Tests.ProfileFetchingAuthStateShould.CancelStalledFetchOnTimeout
  • [editmode] 12.7s DCL.Tests.Editor.ValidationTests.CheckForDebugUsage
  • [editmode] 10.0s DCL.Notifications.Tests.NotificationsRequestControllerShould.ReuseSingleListInstanceAcrossPollIterations
  • [editmode] 6.0s DCL.Tests.Editor.ValidationTests.SettingsAreValid
  • [editmode] 5.0s DCL.Friends.Tests.FriendsConnectivityStatusTrackerShould.RaiseOnlineEventWhenSameStatusIsRebroadcastAfterReset
  • [editmode] 5.0s CrdtEcsBridge.WorldSynchronizer.Tests.CrdtWorldSynchronizerShould.ThrowIfSyncBufferIsAlreadyRented
  • [editmode] 4.3s SceneRunner.Tests.SceneFacadeShould.ContinueUpdateLoopOnBackgroundThread(20,4000)
  • [editmode] 4.2s SceneRunner.Tests.SceneFacadeShould.ContinueUpdateLoopOnBackgroundThread(90,4000)
  • [editmode] 4.1s SceneRunner.Tests.SceneFacadeShould.ContinueUpdateLoopOnBackgroundThread(30,4000)
  • [playmode] 4.4s Global.Tests.PlayMode.CubeWaveSceneShould.EmitECSComponents
  • [playmode] 3.1s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.ContinuousTweensRunIndefinitelyWhenDurationIsZero
  • [playmode] 2.4s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TextureMoveSequenceUpdatesMaterial
  • [playmode] 2.3s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TweenSequenceWithoutLoopCompletesOnce
  • [playmode] 2.3s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.TextureMoveContinuousOffsetCompletesAndUpdatesMaterial
  • [playmode] 2.3s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.RotateContinuousCompletesAfterDuration
  • [playmode] 2.3s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.MoveContinuousMovesAndCompletesAfterDuration
  • [playmode] 1.7s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TweenSequenceWithMoveRotateScaleWithOmittedScale_ResolvesScaleFromCurrentTransform
  • [playmode] 1.6s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.RotateContinuousPositiveAndNegativeYDirectionsAreOpposite
  • [playmode] 1.6s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.RotateContinuousAroundXAxisRotatesAroundXNotZ

Full report: run summary · results + editor logs: editmode · playmode

Performance

🏁 Bare-metal benchmark finished — run #35038198513.

Full report

PR #10060, run #35038198513

Overall: ✅ no significant changes

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

How to read this table
  • Each build is measured 3 times, interleaved with the other build (change, baseline, change, baseline, ...) in the same session, so both see the same world content and machine state. The values are the median, and (min–max) is the lowest and highest of those runs.
  • Δ is Change minus Baseline (a negative Δ means Change is faster).
  • 🟢 faster / 🔴 slower — a difference that passed every check: the runs are fully separated (every run of one build faster than every run of the other), and the median difference is at least 3% and at least 0.5 ms.
  • ⚪ within noise — the builds' runs overlap, or the difference is tiny; it cannot be told apart from random variation. Treat it as no change.
  • — informational — the 0.1% worst metrics average only the few worst frames of a run, so a single OS hiccup swings them by a lot; they are shown for context and never earn a verdict.
  • ⚠️ no verdict — the two builds' sessions were not comparable (very different sample counts, or too few usable runs), so no conclusion is drawn from them.
  • Exceptions per run — the average number of exceptions in a run's log, not counting teardown ones logged while the app quits. Flagged only on a difference of at least 2 per run and 1.5× the other build; exception kinds the baseline never threw are called out under the table. The Exception breakdown groups all of 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.
  • The Overall line at the top only reacts to a metric that moved on two or more machines, or by 10% or more on one — a single modest 🟢/🔴 cell can still be a statistical fluke.

Apple M1

Metric Baseline Change Δ Result
Samples 4016 (×3) 4005 (×3)
CPU average 22.2 ms (21.5–23.5) 22.4 ms (21.6–22.7) 0.2 ms ⚪ within noise
CPU 1% worst 230.9 ms (190.8–232.7) 230.2 ms (229.8–230.8) -0.7 ms ⚪ within noise
CPU 0.1% worst 238.9 ms (232.8–240.6) 237.4 ms (234.3–237.6) -1.5 ms — informational
GPU average 35.1 ms (35.0–36.3) 35.7 ms (34.2–36.2) 0.6 ms ⚪ within noise
GPU 1% worst 45.2 ms (44.3–46.9) 45.3 ms (43.2–45.9) 0.1 ms ⚪ within noise
GPU 0.1% worst 46.0 ms (45.1–48.0) 46.1 ms (44.4–47.0) 0.1 ms — informational
Exceptions per run 0 0 0 ⚪ no significant change

Intel Core i5

Metric Baseline Change Δ Result
Samples 4458 (×3) 4284 (×3)
CPU average 20.1 ms (18.7–21.7) 20.7 ms (17.1–21.9) 0.5 ms ⚪ within noise
CPU 1% worst 307.4 ms (290.6–426.1) 351.8 ms (250.4–405.8) 44.5 ms ⚪ within noise
CPU 0.1% worst 422.3 ms (383.7–459.6) 403.6 ms (286.9–433.8) -18.8 ms — informational
GPU average 13.0 ms (11.5–13.8) 13.3 ms (10.3–13.9) 0.3 ms ⚪ within noise
GPU 1% worst 156.2 ms (148.2–256.0) 202.2 ms (126.3–244.8) 45.9 ms ⚪ within noise
GPU 0.1% worst 418.9 ms (386.2–457.8) 402.9 ms (276.5–429.7) -16.0 ms — informational
Exceptions per run 0 0 0 ⚪ no significant change

Automation

On demand — comment /visual-tests on this PR to run the visual regression suite against its build.

@pravusjif
pravusjif marked this pull request as ready for review September 14, 2026 23:20
@pravusjif
pravusjif requested review from a team as code owners September 14, 2026 23:20
@github-actions
github-actions Bot requested a review from DafGreco September 14, 2026 23:21
@decentraland-bot
decentraland-bot self-requested a review September 14, 2026 23:21

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

Review: chore: migrate to 'main' protocol

Inspected commits: base 879d54fa → head 6f50b82c


Step 2 — Root-cause check: PASS ✅

The protocol repo has consolidated its branching model — main is now the canonical source for all components, and the experimental branch is deprecated. This PR correctly addresses the root cause by updating the @dcl/protocol dependency, regenerating protobuf code, updating all documentation/tooling references, and preserving the AvatarEmoteMask enum that was removed from auto-generated output but is still consumed by the explorer.

Step 3 — Design & integration: PASS ✅

No new long-lived units (systems, plugins, managers) are introduced.

Manual AvatarEmoteMask enum (Explorer/Assets/DCL/Infrastructure/ProtobufPartialClasses/AvatarEmoteMask.cs):

  • Same namespace (DCL.ECSComponents), same values (AemFullBody = 0, AemUpperBody = 1)
  • ~30+ consumers across emotes, multiplayer, and avatar rendering reference this enum — no consumer code needs to change
  • Wire-format integers preserved; comms and Pulse encoding remain compatible
  • The [pbr::OriginalName] attributes were dropped (only needed for protobuf JSON serialization, which this enum is not used for) — no impact

Removed PlayerEmote fields (IsRepeating, InteractionId, SocialEmoteOutcome, IsReacting, SocialEmoteInitiator, TargetAvatar):

  • Searched all .cs files outside Comms.gen.cs — zero consumers access any of these fields
  • Existing emote consumers (LiveKitEmotesMessageBus, MessageWrap, MessagePipe) only use retained fields (IncrementalId, Urn, Timestamp, IsStopping, Mask)
  • Field numbers 5–10 are properly reserved in the proto descriptor (J markers), preventing accidental reuse and ensuring wire compatibility with older clients

New protocol additions (not yet wired to any system — implementation expected in future PRs):

  • PBExplorerItemPurchaseResult (component ID 1222, main range, GOVS) — follows the established grow-only result pattern
  • ExplorerUi.EuItemPurchase (enum value 7)
  • OpenExplorerUiRequest.RequestId and ItemPurchase params — clean request-response correlation pattern
  • PBExplorerUiEventsResult.RequestId field
  • TeleportToRequest.Realm optional field

Step 4 — Member audit: N/A

No new public members in manually-authored code. The AvatarEmoteMask enum is a 1:1 replacement.

Step 5 — Line-level review

[P2] TeleportToRequest.WorldCoordinates became optional — WorldCoordinates moved from being the sole always-present field to an optional one (to support realm-only teleports). Since WorldCoordinates is a protobuf message (reference type in C#), it was already nullable in practice, and the handler (RestrictedActionsAPIWrapper.TeleportTo) decomposes it into (int x, int y) before forwarding. No handler code is changed in this PR, and no explorer code references the new Realm field yet, so this is purely a protocol-level evolution. When the Realm-based teleport feature is implemented, the handler will need to null-check WorldCoordinates. Not blocking.

[P2] PBExplorerItemPurchaseResult.Failed carries no error detail — All three status subtypes (Purchased, Dismissed, Failed) are empty marker messages. The Failed case provides no mechanism to communicate failure reasons (insufficient funds, item unavailable, network error, etc.). This is an upstream protocol design choice, not a bug in this PR — noted for future protocol iteration.

Step 8 — Non-blocking warnings: None

Main scene not modified.

Security Review

Credential exposure: None. No secrets, keys, or tokens in the diff.

Supply chain: @dcl/protocol@1.0.0-34906351243.commit-688d92c verified:

  • Integrity hash matches npm registry (sha512-gj7kpdg...)
  • Package has SLSA provenance attestation and npm registry signatures
  • Resolved from official registry.npmjs.org
  • Tagged as next (maps to protocol main branch)
  • Dev-time dependency only (code generation in scripts/), not shipped in the Unity build

New protocol inputs: TeleportToRequest.Realm (string) and ItemPurchaseParams.Urn (string) are new string fields in restricted-action proto definitions. These follow established patterns (ChangeRealmRequest.Realm, OpenNftDialogRequest.Urn). Handler-side input validation is expected when these features are implemented.

Binaries / plugins / hooks: None added. All new files are C# source, Unity .meta, documentation, or npm manifests.

Meta files: AvatarEmoteMask.cs.meta uses standard MonoImporter with default settings. ExplorerItemPurchaseResult.gen.cs.meta is a minimal meta file (missing trailing newline — cosmetic only).

DEPENDENCY_REVIEW: PASS

REVIEW_RESULT: PASS ✅
COMPLEXITY: SIMPLE
COMPLEXITY_REASON: Documentation updates and auto-generated protocol code from a dependency bump; no runtime logic changes
QA_REQUIRED: NO


Reviewed by Jarvis 🤖 · Requested by decentraland-bot via GitHub

@github-actions github-actions 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.

Auto-approved based on Jarvis review — simple fix/chore with no blocking issues. No QA needed (non-runtime changes only).

@github-actions github-actions Bot added claude-approved no QA needed Used to tag pull requests that does not require QA validation labels Sep 14, 2026
@pravusjif pravusjif moved this from In Progress to QA in Creators Tools Sep 15, 2026
@pravusjif pravusjif added the no-warning-ratchet Prevent CI linting checks label Sep 15, 2026
@decentraland-bot
decentraland-bot self-requested a review September 15, 2026 01:07

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

Review: chore: migrate to 'main' protocol

Inspected commits: base 06de13e1 → head 594eff2c


Step 2 — Root-cause check: PASS ✅

The protocol repo has consolidated its branching model — main is now the canonical source for all components, and the experimental branch is deprecated. This PR correctly addresses the root cause by:

  • Bumping @dcl/protocol to 1.0.0-34906351243.commit-688d92c (tagged next, published from protocol main)
  • Regenerating all protobuf C# code
  • Updating all documentation and tooling references from experimental to main/@next
  • Preserving the AvatarEmoteMask enum (removed from generated output) as a hand-maintained partial class

Step 3 — Design & integration: PASS ✅

No new long-lived units (systems, plugins, managers) are introduced.

Manual AvatarEmoteMask enum (Explorer/Assets/DCL/Infrastructure/ProtobufPartialClasses/AvatarEmoteMask.cs):

  • Same namespace (DCL.ECSComponents), same values (AemFullBody = 0, AemUpperBody = 1)
  • Consumers across emotes, multiplayer, and avatar rendering reference this enum — no consumer code needs to change
  • Wire-format integers preserved; comms and Pulse encoding remain compatible
  • Placed in ProtobufPartialClasses/ — appropriate location for hand-maintained protocol extensions

Removed PlayerEmote fields (IsRepeating, InteractionId, SocialEmoteOutcome, IsReacting, SocialEmoteInitiator, TargetAvatar):

  • Field numbers 5–10 are properly reserved in the proto descriptor, preventing accidental reuse and ensuring wire compatibility with older clients
  • Existing emote consumers (LiveKitEmotesMessageBus, MessageWrap, MessagePipe) only use retained fields (IncrementalId, Urn, Timestamp, IsStopping, Mask)

New protocol additions (not yet wired to any system — implementation expected in future PRs):

  • PBExplorerItemPurchaseResult (component ID 1222, main range, GOVS) — follows the established grow-only result pattern
  • ExplorerUi.EuItemPurchase (enum value 7)
  • OpenExplorerUiRequest.RequestId and ItemPurchase params — clean request-response correlation pattern
  • PBExplorerUiEventsResult.RequestId field
  • TeleportToRequest.Realm optional field

Step 4 — Member audit: N/A

No new public members in manually-authored code. The AvatarEmoteMask enum is a 1:1 replacement of the auto-generated version.

Step 5 — Line-level review

[P2] TeleportToRequest.WorldCoordinates became optional — WorldCoordinates moved from being the sole always-present field to an optional one (to support realm-only teleports). Since WorldCoordinates is a protobuf message (reference type in C#), it was already nullable in practice, and the handler (RestrictedActionsAPIWrapper.TeleportTo) decomposes it into (int x, int y) before forwarding. No handler code is changed in this PR, and no explorer code references the new Realm field yet. When the Realm-based teleport feature is implemented, the handler will need to null-check WorldCoordinates and validate/sanitize the Realm string (it originates from scene/JS-runtime-controlled input). Not blocking.

[P2] PBExplorerItemPurchaseResult.Failed carries no error detail — All three status subtypes (Purchased, Dismissed, Failed) are empty marker messages. The Failed case provides no mechanism to communicate failure reasons. This is an upstream protocol design choice, not a bug in this PR — noted for future protocol iteration.

[P2] ExplorerItemPurchaseResult.gen.cs.meta missing trailing newline — The file ends without a newline (\ No newline at end of file). Cosmetic only; does not affect Unity import.

Step 8 — Non-blocking warnings: None

Main scene not modified.

Security Review

Credential exposure: None. Full diff scanned — no secrets, keys, or tokens.

Supply chain: @dcl/protocol@1.0.0-34906351243.commit-688d92c verified:

  • Integrity hash sha512-gj7kpdg... matches between package-lock.json and npm registry
  • SLSA provenance attestation present — built by GitHub Actions from decentraland/protocol@main commit 688d92c, workflow .github/workflows/build-and-publish.yml
  • npm registry signatures present (standard registry signing key)
  • Tagged as next (maps to protocol main branch) — confirmed via npm view
  • Published by GitHub Actions <npm-oidc-no-reply@github.com>
  • Dev-time dependency only (code generation in scripts/), not shipped in the Unity build
Item Old New Integrity Risk
@dcl/protocol 1.0.0-33874985952.commit-4f4e0ab 1.0.0-34906351243.commit-688d92c sha512 pinned, SLSA-attested Low — verified provenance, build-tool scope

New protocol inputs: TeleportToRequest.Realm (string) and ItemPurchaseParams.Urn (string) are new string fields in restricted-action proto definitions. These follow established patterns (ChangeRealmRequest.Realm, OpenNftDialogRequest.Urn). No consumer code in this PR — handler-side input validation expected when features are implemented.

Binaries / plugins / hooks: None added. All new files are C# source, Unity .meta, documentation, or npm manifests.

Meta files: AvatarEmoteMask.cs.meta uses standard MonoImporter with default settings — no execution hooks. ExplorerItemPurchaseResult.gen.cs.meta is a minimal meta file (cosmetic: missing trailing newline).

DEPENDENCY_REVIEW: PASS

REVIEW_RESULT: PASS ✅
COMPLEXITY: SIMPLE
COMPLEXITY_REASON: Documentation updates and auto-generated protocol code from a dependency bump; no runtime logic changes
QA_REQUIRED: NO


Reviewed by Jarvis 🤖 · Requested by decentraland-bot via GitHub

Comment thread .claude/agents/dcl-sdk-feature-implementation/README.md Outdated
Comment thread Explorer/Assets/Protocol/DecentralandProtocol/AvatarShape.gen.cs

@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:

  • On boarding with new account
  • [ ✔️] Log In/Log Out
  • [ ✔️] Backpack and wearables in world
  • [ ✔️] Emotes in world and in backpack
  • [ ✔️] Teleport with map/coordinates/Jump In
  • [ ✔️] Chat and multiplayer
  • [ ✔️] Profile card
  • [ ✔️] Skybox

No new issues were spotted during this sanity check

@pravusjif
pravusjif removed the request for review from popuz September 15, 2026 23:09
@pravusjif
pravusjif merged commit 34bab01 into dev Sep 16, 2026
32 of 34 checks passed
@pravusjif
pravusjif deleted the chore/migrate-to-protocol-main branch September 16, 2026 10:24
@github-project-automation github-project-automation Bot moved this from QA to To Release in Creators Tools Sep 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

claude-approved no QA needed Used to tag pull requests that does not require QA validation no-warning-ratchet Prevent CI linting checks

Projects

Status: To Release

Development

Successfully merging this pull request may close these issues.

4 participants