Skip to content

chore: migrate to 'main' protocol - #10060

Open
pravusjif wants to merge 7 commits into
devfrom
chore/migrate-to-protocol-main
Open

pravusjif wants to merge 7 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 594eff2 · Logs · built 2026-09-15T01:50:59Z
Windows GitHub job · Unity Cloud #2 · Unity log · ⏱ 26m 34s build + 13m 7s queue · Download .zip · .zip via S3
Mac GitHub job · Unity Cloud #2 · Unity log · ⏱ 25m 41s build + 2m 0s queue · Download .zip · .zip via S3

Lint

Warnings not reduced: 11951 => 11951 — 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 11951)
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 19m 25s

Tests

⚠️ EditMode produced no results — the run likely crashed or timed out before finishing. Check the Unity Test / Test (editmode) job.

TESTS SUITE Result Passed Failed Skipped Tests time Job time
EditMode ⚠️ No results 30m 16s
PlayMode ✅ Passed 248 0 37 38s 9m 49s

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

Slowest tests
  • [playmode] 3.4s Global.Tests.PlayMode.CubeWaveSceneShould.EmitECSComponents
  • [playmode] 2.7s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.ContinuousTweensRunIndefinitelyWhenDurationIsZero
  • [playmode] 2.2s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TextureMoveSequenceUpdatesMaterial
  • [playmode] 2.2s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.TextureMoveContinuousOffsetCompletesAndUpdatesMaterial
  • [playmode] 2.0s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.RotateContinuousCompletesAfterDuration
  • [playmode] 2.0s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TweenSequenceWithoutLoopCompletesOnce
  • [playmode] 2.0s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.MoveContinuousMovesAndCompletesAfterDuration
  • [playmode] 1.5s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.RotateContinuousAroundXAxisRotatesAroundXNotZ
  • [playmode] 1.4s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TweenSequenceWithMoveRotateScaleWithOmittedScale_ResolvesScaleFromCurrentTransform
  • [playmode] 1.4s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TweenSequenceCompletesAllTweens

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

Performance

🏁 Bare-metal benchmark finished — run #34918922040.

Full report

PR #10060, run #34918922040

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 3950 (×3) 3961 (×3)
CPU average 22.7 ms (22.2–22.8) 22.6 ms (22.3–22.7) -0.1 ms ⚪ within noise
CPU 1% worst 231.8 ms (231.1–232.5) 227.7 ms (209.1–228.1) -4.2 ms ⚪ within noise
CPU 0.1% worst 238.6 ms (235.7–239.0) 234.0 ms (232.4–236.3) -4.6 ms — informational
GPU average 35.2 ms (35.1–35.9) 35.1 ms (35.0–35.5) -0.1 ms ⚪ within noise
GPU 1% worst 45.0 ms (44.5–46.2) 45.2 ms (45.0–46.4) 0.2 ms ⚪ within noise
GPU 0.1% worst 45.9 ms (45.7–47.1) 46.0 ms (46.0–47.5) 0.1 ms — informational
Exceptions per run 0 0 0 ⚪ no significant change

Intel Core i5

Metric Baseline Change Δ Result
Samples 4620 (×3) 4662 (×3)
CPU average 19.4 ms (17.9–20.0) 19.2 ms (16.0–19.5) -0.3 ms ⚪ within noise
CPU 1% worst 360.6 ms (308.2–390.1) 353.2 ms (213.7–362.5) -7.4 ms ⚪ within noise
CPU 0.1% worst 430.9 ms (397.7–455.8) 421.4 ms (299.6–450.2) -9.5 ms — informational
GPU average 12.3 ms (10.9–12.5) 12.0 ms (9.3–12.4) -0.2 ms ⚪ within noise
GPU 1% worst 210.8 ms (182.5–223.0) 217.5 ms (87.8–222.6) 6.6 ms ⚪ within noise
GPU 0.1% worst 431.6 ms (399.3–457.4) 422.5 ms (290.8–451.0) -9.1 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.cszero 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 optionalWorldCoordinates 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

AemFullBody = 0,
AemUpperBody = 1,
}
}

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.

[P2] Minor observation: The previous auto-generated version included [pbr::OriginalName("AEM_FULL_BODY")] and [pbr::OriginalName("AEM_UPPER_BODY")] attributes on each member. These are used by protobuf's JsonFormatter to map enum values to their proto-canonical string names. Since this enum is used only for numeric comparison against the uint32 mask wire field (not serialized to JSON via protobuf), the omission is correct. The XML doc comment explaining wire-format stability is good.

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

AemFullBody = 0,
AemUpperBody = 1,
}
}

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.

[P2] Dropped [pbr::OriginalName] attributes. The previous auto-generated version had [pbr::OriginalName("AEM_FULL_BODY")] and [pbr::OriginalName("AEM_UPPER_BODY")] on each member. These attributes are only used by protobuf's JsonFormatter for JSON serialization of enum values, which this enum is not used for in the explorer (it carries wire-format integers via comms/Pulse). No impact on runtime behavior — noted for completeness.

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c1c3da3c6672b4188a4d021d71a32b7e No newline at end of file

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.

[P2] Missing trailing newline. This .meta file does not end with a newline character. While this doesn't affect Unity import, it is inconsistent with other .meta files in the repo.

Suggested change
guid: c1c3da3c6672b4188a4d021d71a32b7e
fileFormatVersion: 2
guid: c1c3da3c6672b4188a4d021d71a32b7e

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

Development

Successfully merging this pull request may close these issues.

2 participants