Conversation
🚦 CI StatusWindows and Mac built successfully in Unity Cloud.
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)Lint run · full InspectCode report · took 19m 25s
Tests time sums the test cases; Job time is the job's wall clock including checkout, licensing and asset import. Slowest tests
Full report: run summary · results + editor logs: editmode · playmode 🏁 Bare-metal benchmark finished — run #34918922040. Full reportPR #10060, run #34918922040 Overall: ✅ no significant changes Builds: Windows change, Windows baseline, macOS change, macOS baseline How to read this table
Apple M1
Intel Core i5
On demand — comment |
decentraland-bot
left a comment
There was a problem hiding this comment.
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
.csfiles outsideComms.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 (
Jmarkers), 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 patternExplorerUi.EuItemPurchase(enum value 7)OpenExplorerUiRequest.RequestIdandItemPurchaseparams — clean request-response correlation patternPBExplorerUiEventsResult.RequestIdfieldTeleportToRequest.Realmoptional 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 protocolmainbranch) - 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, | ||
| } | ||
| } |
There was a problem hiding this comment.
[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.
decentraland-bot
left a comment
There was a problem hiding this comment.
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/protocolto1.0.0-34906351243.commit-688d92c(taggednext, published from protocolmain) - Regenerating all protobuf C# code
- Updating all documentation and tooling references from
experimentaltomain/@next - Preserving the
AvatarEmoteMaskenum (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 patternExplorerUi.EuItemPurchase(enum value 7)OpenExplorerUiRequest.RequestIdandItemPurchaseparams — clean request-response correlation patternPBExplorerUiEventsResult.RequestIdfieldTeleportToRequest.Realmoptional 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 betweenpackage-lock.jsonand npm registry - SLSA provenance attestation present — built by GitHub Actions from
decentraland/protocol@maincommit688d92c, workflow.github/workflows/build-and-publish.yml - npm registry signatures present (standard registry signing key)
- Tagged as
next(maps to protocolmainbranch) — confirmed vianpm 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, | ||
| } | ||
| } |
There was a problem hiding this comment.
[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 | |||
There was a problem hiding this comment.
[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.
| guid: c1c3da3c6672b4188a4d021d71a32b7e | |
| fileFormatVersion: 2 | |
| guid: c1c3da3c6672b4188a4d021d71a32b7e |
Adapted Explorer to protocol
main(after adapting protocolmainwith a few changes from experimental)QA TEST STEPS
Do a general smoke test with the build.