Skip to content

chore: upgrade to Unity 6000.5.9f1 - #9871

Merged
mikhail-dcl merged 29 commits into
devfrom
chore/unity-6-5
Sep 2, 2026
Merged

chore: upgrade to Unity 6000.5.9f1#9871
mikhail-dcl merged 29 commits into
devfrom
chore/unity-6-5

Conversation

@mikhail-dcl

@mikhail-dcl mikhail-dcl commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator

Pull Request Description

What does this PR change?

Upgrades the project to Unity 6000.5.9f1. Compile errors on this branch: 207 -> 0. Shader errors: 0. Assemblies built: 226.

6000.5 raises Object.GetInstanceID() from deprecation to a compile error, forwards UnityEngine.XR types to a module this project never shipped, and adds #include "LitInput.hlsl" to URP's LitForwardPass.hlsl.

Merge together with decentraland/unity-explorer-packages#62 — manifest.json pins six packages to its chore/unity-6-5 branch.

Packages

change errors cleared
GPU Instancer Pro 0.9.19 -> 0.12.18 (DCL fork ported via 3-way merge, 54 conflict hunks / 24 files) 84
AltTester SDK 2.3.2, pinned to a fork branch carrying alttester/AltTester-Unity-SDK#1984 57 + a runtime NLog TypeLoadException
AVPro Video Ultra 3.3.6 -> 3.4.2 (pristine drop, 0 GUID changes) 15
com.unity.modules.xr added — AVPro's UpdateMultiPassStereo.cs needs UnityEngine.XRModule 33
RenderFeatures + FileBrowserPro EntityId migration 18

Project code

  • Obsolete API migration (from the API subset of chore: upgrade to Unity 6000.5.5f1 #9478): Physics.BakeMesh(x.GetInstanceID()) -> GetEntityId(); NativeArray<int> -> NativeArray<EntityId> for baked mesh ids; GetInstanceID() equality -> object comparison.
  • SceneContentStatsSystem: obsolete EntityId -> int cast replaced with GetEntityId().GetHashCode() (value only feeds a hash key).
  • DCL_Toon.shader: pre-claims URP's UNIVERSAL_LIT_INPUT_INCLUDED so 6000.5's new self-include no-ops, fixing _BaseMap redefinition. Symptom was magenta avatars. Ported from fix: restore DOTS-instanced material props and Unity 6000.5 shader compat unity-shared-dependencies#95 item 4.
  • Removed 10 stale Nethereum 4.12 assemblies. The folder held a split set (4.12 from the 2023 auth-chain drop, 5.0 from ThirdWeb Feat: email-OTP authentication method via ThirdWeb provider #6738); Nethereum.Accounts 4.12 referenced Nethereum.Signer 4.12 but the shipped Signer is 5.0, where Transaction1559 moved out. 6000.5's Mono resolves eagerly, so MetricsRegistry's reflection scan threw TypeLoadException and killed app start. Removed set is unreachable from both DCL source and Thirdweb.dll; NBitcoin and Nethereum.Siwe.Core kept (imported directly).
  • GPUI shaders re-imported with original GUIDs — 0.12.18 moved them to optional Editor/Extras packages, 3 are still referenced here.
  • DCLInput.cs regenerated for Input System 1.20.0 (generated output).

Avatar Preview Renderer

Upgraded to the same editor. com.unity.modules.vr does not exist in 6000.5 and blocked package resolution outright; Cinemachine 3.1.4 -> 3.1.7 for the EntityId migration; URP + VFX Graph 17.4 -> 17.5; Input System 1.19 -> 1.20; renderfeatures repointed from packages main to the same chore/unity-6-5 revision Explorer uses. Its own 63 scripts needed no changes.

Test Instructions

Steps (standard run):

metaforge explorer run XXXX  # ← replace with this PR number

Expected result: client starts, reaches the login screen, authenticates and loads Genesis City. Avatars are toon-shaded (not magenta), terrain shows grass/trees/detail, and you do not fall through the ground.

Steps (fresh account):

metaforge account create --clear
metaforge explorer run XXXX  # ← replace with this PR number

Expected result: account creation and wallet signing both complete. This is the run that exercises the Nethereum removal.

Automation (if applicable):

metaforge explorer test XXXX

Steps (Avatar Preview Renderer): open the Preview URL from the Avatar Preview Renderer — Vercel Preview is ready! comment on this PR.

Expected result: the avatar renders toon-shaded (not magenta) in every mode.

Prerequisites

  • Run on Windows and macOS — the shader fix has only been validated against d3d11
  • Do one cached run and one --clear run
  • Do one run on an existing account and one on a fresh account
  • Have a scene with mesh colliders and a scene with video available to visit
  • For the Avatar Preview Renderer, use the Preview link posted on this PR in a WebGPU-capable browser

Test Steps

  1. metaforge explorer run <PR> — client reaches the login screen with no error toasts.
  2. Log in with an existing account. Repeat later with a fresh account (metaforge account create --clear).
  3. Enter Genesis City. Check own and remote avatars are toon-shaded, not magenta or untextured.
  4. Walk across terrain and parcel borders: grass/trees/detail render, and the ground collides.
  5. Enter an SDK scene with mesh colliders: you collide with geometry and can click it.
  6. Play a video texture in-world.
  7. Open the map, hover and click the home marker.
  8. Run the automation suite: metaforge explorer test <PR>.
  9. Avatar Preview Renderer: open <preview>/?profile=default5 — the avatar loads toon-shaded, not magenta or untextured.
  10. Avatar Preview Renderer: check each mode — ?mode=marketplace, ?mode=authentication, ?mode=profile, ?mode=builder, ?mode=configurator&username=test.
  11. Avatar Preview Renderer: ?profile=default3&emote=dance — the emote plays and loops.
  12. Avatar Preview Renderer: ?profile=default2&urn=<wearable urn>&type=avatar, then the same with &type=wearable — the wearable loads in both views. Add &background=ff00ff and &skinColor=b8814c and confirm both apply.

Additional Testing Notes

QA focus — changed code paths, by risk:

# Area Risk Watch for
1 Login / wallet signing 10 Nethereum assemblies deleted by static reachability analysis Auth-chain signing, ephemeral keys, fresh-account creation, re-login, SIWE. A wrong removal throws TypeLoadException at signing time, not at startup
2 Avatar rendering DCL_Toon.shader include order Magenta/untextured avatars, outlines, highlights, all LODs, remote avatars, wearables, emotes
3 Terrain collision BakeColliderMeshes + CollideTerrainSystem now NativeArray<EntityId> Falling through terrain, invisible walls, collision lagging the visual mesh at parcel borders
4 Landscape / GPUI 3 minor versions + hand-merged fork, 54 hunks Missing/flickering grass, trees, rocks; LOD transitions; tree billboards; detail density; fast parcel traversal
5 SDK scene colliders BakeMesh calls in GLTFContainer/Utils.cs, ConfigureGltfContainerColliders.cs Walking through geometry, un-clickable meshes, broken pointer events
6 Video playback AVPro 3.4.2 + XR module now present Black/frozen textures, audio desync, multiple simultaneous players
7 Text / fonts UIToolkit fonts on dynamic multi-atlas; chat fallback loading reworked Missing glyphs as boxes/blanks — CJK and emoji in chat, nametags, channel names
8 Input DCLInput.cs regenerated (Input System 1.20.0) Movement, camera, jump/sprint, emote wheel, shortcuts, UI navigation, gamepad
9 Prefabs Reassigned/unpacked scripts DestinationMarker (map destination pin), SidebarUI.UpperLayout, SceneLoadingScreen, both Authentication screens — missing visuals, layout shifts
10 Map home marker HomeMarkerController identity comparisons Highlight, de-highlight, click
11 Login screen audio AuthenticationScreenAudio identity comparison Background music start/stop, mute toggle
12 Automation AltTester on fork branch; prefab and asmdef touched Instrumented builds connect, driver commands work
13 Scene content debug SceneContentStatsSystem hash key changed Material/shader counts in the debug panel — plausible but not identical
14 Avatar Preview Renderer — shading Shares DCL_Toon and Scene shaders with the client, but renders through WebGPU; the shader fix was validated only against d3d11 Magenta or untextured avatars, wrong outlines/highlights, broken transparent background
15 Avatar Preview Renderer — modes and camera URP 17.5 + Cinemachine 3.1.7 Framing/zoom per mode, avatar off-centre, projection=orthographic vs perspective, emote playback, wearable switcher

Not covered by pre-merge verification:

  • Runtime behaviour is unexercised. CI is green — Lint, EditMode, PlayMode, and the Windows and macOS player builds all pass — but no built client has been driven by hand, so every row above is unverified at runtime.
  • The Avatar Preview Renderer's Web output was not built locally — no WebGL module is installed for 6000.5.9f1 on the upgrading machine, so only its C# surface was verified (0 errors, 0 shader errors). CI performs the actual Web build, and the Preview is the first exercise of the WebGPU shader variants.
  • DOTS-instancing shader variants are not addressed. fix: restore DOTS-instanced material props and Unity 6000.5 shader compat unity-shared-dependencies#95 carries 3 further fixes (UNITY_ACCESS_DOTS_INSTANCED_PROP_FROM_MACRO in Scene/URP/LitInput.hlsl + UnlitInput.hlsl, DCL_ToonHighlight/DCL_ToonOutline, unity_ObjectToWorld -> GetObjectToWorldMatrix()). Those variants are compiled only for player builds, so nothing so far has exercised them, and that PR calls the first a live bug on main today. If instanced materials or avatar shading show artefacts in a build, port those next.
  • AltTester resolves from a personal fork pending Fix Unity 6000.5 compile errors, deprecation warnings, and NLog initialization alttester/AltTester-Unity-SDK#1984. Must not reach dev as-is.
  • Package pins are branch refs — repoint the six #chore/unity-6-5 entries once packages#62 merges to main.

Quality Checklist

  • Changes have been tested locally
  • Documentation has been updated (if required)
  • Performance impact has been considered
  • For SDK features: Test scene is included

Code Review Reference

Please review our Branch & PR Standards before submitting.

mikhail-dcl and others added 15 commits August 25, 2026 12:35
The 2.3.2 package regenerated 336 of 340 .meta GUIDs, breaking every
project reference into it (AltId.cs, AltRunner, sprites, shader, panel
prefab). Rebuilt the old->new map by matching relative paths between the
two PackageCache folders and remapped the 24 GUIDs the project actually
referenced.

Sub-asset fileIDs are unchanged: 11500000 (MonoScript), 21300000
(single-sprite textures — the new metas carry an empty nameFileIdTable),
4800000 (shader), and 1422609480502334 for AltTester_Panel.prefab, which
is byte-identical between versions. The four files 2.3.2 drops (Examples
and Resources folder metas) were not referenced, so nothing is orphaned.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ports the API-migration subset of PR #9478 (chore/unity-6000.5.2f1-upgrade)
onto this branch. Only the obsolete-API changes are taken; that PR's TMP
fallback-loading refactor, the DCL.Plugins.asmdef GUID-to-name swap and
the asset/ProjectSettings churn are deliberately left out.

- Physics.BakeMesh(x.GetInstanceID(), ...) -> x.GetEntityId()
  (GLTFContainer Utils + ConfigureGltfContainerColliders, RoadAssetGenerator)
- NativeArray<int> -> NativeArray<EntityId> for baked mesh ids
  (BakeColliderMeshes job, CollideTerrainSystem)
- GetInstanceID() equality checks -> direct object comparison
  (AuthenticationScreenAudio, HomeMarkerController x3)

SceneContentStatsSystem is not part of #9478: it used the obsolete
EntityId -> int cast. The value is only XORed into a shader/keyword hash
key, so it now uses GetEntityId().GetHashCode(), matching the pattern
used by AVPro 3.4.2 and unity-explorer-packages#60.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
GPU Instancer Pro 0.12.18 no longer ships the legacy Built-in and Shader
Graph shaders inside the package; they are now optional imports under
Editor/Extras/*.unitypackage. Three of them are still referenced by this
project, so they are imported here with their original GUIDs intact and
every existing reference resolves unchanged:

- Foliage_SG.shadergraph (78f1b5ae9238ef140869bdba4aef19db) -- used by
  DefaultDetailMaterial.mat and DefaultDetailMaterialDesc.asset
- Standard_GPUIPro.shader (7835c6b3cbd1dd24bb8cf791f83b3ec9) -- an
  addressable entry ("GPUInstancerPro/Standard") in the Landscape group
  and a replacement shader in GPUIShaderBindings

The two billboard Shader Graph shaders come along because GPUI imports
the Shader Graph extras package as a unit for non-Built-in pipelines, so
this matches what the editor would generate on first launch anyway.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
com.unity.modules.xr is a real fix and should stay: AVPro's
UpdateMultiPassStereo.cs uses UnityEngine.XR types (XRSettings, XRNode,
InputDevice, InputDevices) which Unity 6000.5 forwards to
UnityEngine.XRModule. AVProVideo.Runtime declares no assembly references
and this project has never included the XR module -- the module list is
identical on dev -- so those 33 CS1069 errors only appear on 6000.5.
Adding the module pulls in jsonserialize and subsystems transitively.

com.alttester.sdk is redirected from the OpenUPM registry to
mikhail-dcl/AltTester-Unity-SDK#1983-unity-6000-5-getinstanceid-obsolete,
which clears its 57 EntityId errors.

WARNING -- the following are temporary local-validation wiring and MUST
be rewired to git URLs before this branch merges anywhere:

  com.dcl.gpui-assets, com.gurbu.gpui-pro, com.gurbu.gpui-pro.terrain,
  com.renderheads.avpro.video-ultra, com.decentraland.filebrowserpro,
  decentraland.renderfeatures  -> file:../../../unity-explorer-packages/...

They point at the local unity-explorer-packages checkout (branch
chore/unity-6-5), which is committed but not yet pushed. test.yml also
needs its find-and-replace updated to match whatever these end up
pointing at, or CI will fail resolving packages.

This commit also carries pre-existing manifest work from this branch that
was already uncommitted (softmask 3.6.4, collections 6.5, cinemachine
2.10.7, serializereference-extensions 1.7.0, UniTask pinned, and others).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Generated output, not hand-written: Unity regenerated this file during
the batch reimport after the Input System package bump on this branch
(header goes 1.19.0 -> 1.20.0, and every binding gains "priority": 0).

Committed so it stops reappearing as a dirty file on every import. Drop
this commit if you would rather regenerate it yourself.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Replaces the temporary local file: wiring from 33a241c now that
decentraland/unity-explorer-packages#62 is open and the branch is pushed.
All six entries are pinned to #chore/unity-6-5:

  com.dcl.gpui-assets, com.gurbu.gpui-pro, com.gurbu.gpui-pro.terrain,
  com.renderheads.avpro.video-ultra, com.decentraland.filebrowserpro,
  decentraland.renderfeatures

The git@github.com: form is deliberate: test.yml rewrites those to HTTPS
with REPOS_READ_ONLY_TOKEN, so CI resolves them directly. No workflow
change is needed -- docs/working-with-explorer-packages.md still
describes an older find-and-replace step that no longer exists.

Verified with Unity 6000.5.9f1: packages resolve into Library/PackageCache
from the remote branch (not the local checkout) and the project compiles
with 0 errors.

Still branch-pinned, so these must be repointed once #62 merges to main.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
# Conflicts:
#	Explorer/Packages/manifest.json
Ports item 4 of decentraland/unity-shared-dependencies#95 into this repo,
now that unity-shared-dependencies has been migrated here and that PR
targets a repo whose contents moved.

Unity 6000.5's URP added #include "LitInput.hlsl" to LitForwardPass.hlsl.
DCL_Toon's ForwardLit pass is the one DCL translation unit that includes
URP's real LitForwardPass, so that new self-include drags
ShaderLibrary/SurfaceInput.hlsl in and collides with DCL_ToonInput.hlsl
on _BaseMap, Alpha and UnityPerMaterial members:

  Shader error in 'DCL/DCL_Toon': redefinition of '_BaseMap' at
  .../universal/ShaderLibrary/SurfaceInput.hlsl(10) (on d3d11)

Visible symptom is magenta avatars.

Pre-claims URP's UNIVERSAL_LIT_INPUT_INCLUDED guard so the self-include
no-ops -- the same guard-reuse pattern already used in
Scene/URP/LitInput.hlsl -- and inlines the parameterless
IsSurfaceTypeTransparent() that 6000.5's LitForwardPass calls, under the
real file's own guard because Shaders/Utils/SurfaceType.hlsl does not
exist in 6000.4's URP. _Surface is #define _Surface 0.0f in
DCL_ToonVariables.hlsl, so it returns false and matches 6000.4 exactly.

Only item 4 of #95 is ported here. Its other three fixes (the removed
UNITY_ACCESS_DOTS_INSTANCED_PROP_FROM_MACRO in Scene/URP LitInput and
UnlitInput, DCL_ToonHighlight/DCL_ToonOutline, and unity_ObjectToWorld ->
GetObjectToWorldMatrix() in Avatar_CelShading_DepthNormalsPass) address
DOTS-instancing variants that editor compiles skip, and are not ported.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Fixes a TypeLoadException that took down application start on Unity
6000.5:

  Could not load type of field
  'Nethereum.Web3.Accounts.ExternalAccountSignerTransactionManager+
  <SignTransactionExternallyAsync>d__8:<transaction1559>5__2' due to:
  Could not resolve type with token 01000043 (expected class
  'Nethereum.Signer.Transaction1559' in assembly 'Nethereum.Signer,
  Version=4.12.0.0')

Root cause: the Nethereum plugin folder shipped a split version set. The
2023 auth-chain drop (780e04d) added Nethereum 4.12; the ThirdWeb
email-OTP PR (18224ff, #6738) upgraded only the assemblies ThirdWeb
needed to 5.0 and left the rest at 4.12. Nethereum.Accounts 4.12
references Nethereum.Signer 4.12, but the shipped Signer is 5.0 where
Transaction1559 no longer lives in that assembly, so the typeref dangles.

It surfaced only now because 6000.5's Mono resolves these eagerly where
6000.4 tolerated the dangling reference lazily. MetricsRegistry's static
ctor reflects over every type in every loaded assembly and calls
IsAssignableFrom, which forces full type loading -- so an unused broken
type took out the whole request-metrics subsystem, and with it
WebRequestsContainer and BootstrapContainer.

Fix removes the 4.12 assemblies rather than papering over the scan.
Reachability was computed from the actual roots -- the Nethereum
namespaces DCL source imports, plus Thirdweb.dll's referenced assemblies
-- and these ten are unreachable from both:

  Accounts, BlockchainProcessing, GnosisSafe, HdWallet,
  JsonRpc.RpcClient, KeyStore, Signer.EIP712, Unity, Unity.Metamask,
  Web3

None is referenced by DCL source, by any asmdef, by GUID anywhere in the
project, or by a link.xml. What remains is a coherent 5.0 set plus
Nethereum.Siwe.Core 4.12, which DCL uses and which only needs
Nethereum.Util. NBitcoin is kept: it is unreachable from the Nethereum
graph but two DCL files import it directly.

Verified with Unity 6000.5.9f1: 0 compile errors, 0 shader errors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Unity 6.5 makes the Advanced Text Generator the default UI Toolkit text
system, and it cannot render static font assets. Both Inter font assets
referenced from the CommonStyles.uss :root rule were Static, so every
UITK text element logged "Advanced text system cannot render using
static font asset Inter 18pt" on every frame.

Switch both to Dynamic atlas population, wire the retained source font
GUID back into m_SourceFontFile, and make the atlas textures readable so
glyphs can be rasterized at runtime. These are the same three mutations
Unity's own font asset inspector performs when switching the mode, and
the configuration AzeretMono-Medium SDF in the same folder already used.

This also lifts a latent limitation: each atlas held only 99 baked ASCII
characters and both fallback tables were empty, so non-Latin text could
not render in UI Toolkit at all.

Guarded by UiToolkitFontAssetsMustNotBeStatic. It compares against
Dynamic/DynamicOS rather than naming Static, which Unity 6.5 deprecated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
7c5b65b switched the two Inter font assets to Dynamic atlas population
but left m_IsMultiAtlasTexturesEnabled at 0. A Static atlas never grew, so
the flag never mattered; once Dynamic, the first character outside the
baked set overflows the single atlas page and Unity logs "Atlas is full,
consider enabling multi-atlas textures in the Font Asset". Both Inter
atlases bake at 145pt and 140pt into 1024x1024 and already hold 99
glyphs, so they overflow on the first addition.

AzeretMono-Medium SDF carried the same latent defect: already Dynamic
with multi-atlas off, healthy-looking only because nothing had pushed it
past its baked glyphs. It was the reference used for the earlier
migration, which is how the incomplete recipe propagated.

Extend UiToolkitFontAssetsMustNotBeStatic to assert atlas growth so the
Dynamic contract is covered end to end: population mode, source font,
readable atlas, and multi-atlas.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DebugUtilitiesStyle pointed -unity-font-definition at a font sub-asset in
Assets/DCL/UIToolkit/UnityDefaultRuntimeTheme.tss, a file that does not
exist in the project, so resolving the stylesheet logged "Missing font
asset reference ... The font asset may have been deleted or moved" on
every pass.

The dead reference already resolved to nothing, leaving the element to
inherit Inter Regular from the :root rule in CommonStyles.uss, so naming
that font through --dcl-font-inter-regular keeps the rendered result
identical while silencing the error. This is also how DebugMenu.uss
selects its fonts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The provider awaited all five fallback fonts sequentially inside a single
try block and assigned TMP_Settings.fallbackFontAssets only after the loop
finished, so one unresolvable reference left TMP with no fallbacks at all
rather than four out of five. Fonts that provided a null value were
dropped with no log line, and OperationCanceledException was reported
through the same handler as real errors, which made a genuine failure
indistinguishable from a normal shutdown.

Provide each font in its own try block, append it to the global fallback
list as it arrives so it starts covering characters immediately, name the
asset GUID when a font provides nothing or throws, and ignore cancellation
separately as the project's async convention requires.

This does not on its own explain CJK glyphs still missing from chat text.
The handles cached on the shared serialized AssetReferences can outlive a
release, and Dispose leaves released fonts registered in TMP's global
list, so a chat re-initialisation can hand back a released handle. Those
paths now surface in the log instead of failing silently.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@mikhail-dcl
mikhail-dcl requested review from a team as code owners August 26, 2026 14:27
# Conflicts:
#	Explorer/Packages/manifest.json
#	Explorer/Packages/packages-lock.json
@github-actions

github-actions Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

🚦 CI Status

Build

Windows and Mac built successfully in Unity Cloud.

Name Links & timing
Build 55bb9ac · Logs · built 2026-09-02T12:10:09Z
Windows GitHub job · Unity log · Download .zip · .zip via S3
Mac GitHub job · Unity log · Download .zip · .zip via S3

Lint

Warnings count reduced: 12178 => 12162

Warnings/errors in files changed by this PR (205)
Assets/DCL/Roads/Data/Editor/RoadAssetGenerator.cs:31  AccessToStaticMemberViaDerivedType  Access to a static member of a type via a derived type
Assets/DCL/AvatarRendering/Emotes/Helpers/DTO/EmoteDTO.cs:24  ArrangeAccessorOwnerBody  Code body does not conform to code style settings: use expression body
Assets/DCL/AvatarRendering/Loading/DTO/AvatarAttachmentDTO.cs:47  CSharpWarnings::CS0108,CS0114  The keyword 'new' is required on 'name' because it hides field 'string DCL.AvatarRendering.Loading.DTO.TrimmedAvatarAttachmentDTO.TrimmedMetadataBase<TDataBase>.name'
Assets/DCL/AvatarRendering/Wearables/Helpers/DTO/WearableDTO.cs:109  CSharpWarnings::CS8601  Possible null reference assignment
Assets/DCL/PerformanceAndDiagnostics/Diagnostics/ReportsHandling/Sentry/SentryBuildTimeConfiguration.cs:179  CSharpWarnings::CS8601  Possible null reference assignment
Assets/DCL/PerformanceAndDiagnostics/Diagnostics/ReportsHandling/Sentry/SentryBuildTimeConfiguration.cs:181  CSharpWarnings::CS8601  Possible null reference assignment
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenAudio.cs:30  CSharpWarnings::CS8602  Dereference of a possibly null reference
Assets/DCL/AuthenticationScreenFlow/AuthenticationScreenAudio.cs:45  CSharpWarnings::CS8602  Dereference of a possibly null reference
Assets/DCL/Infrastructure/ECS/Unity/GLTFContainer/Systems/ConfigureGltfContainerColliders.cs:57  CSharpWarnings::CS8602  Dereference of a possibly null reference
Assets/DCL/AvatarRendering/Loading/DTO/AvatarAttachmentDTO.cs:76  CSharpWarnings::CS8603  Possible null reference return
Assets/DCL/AvatarRendering/Loading/DTO/TrimmedAvatarAttachmentDTO.cs:44  CSharpWarnings::CS8603  Possible null reference return
Assets/DCL/Backpack/AvatarSection/Outfits/Models/OutfitsResponse.cs:27  CSharpWarnings::CS8618  Non-nullable field 'Content' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/Backpack/AvatarSection/Outfits/Models/OutfitsResponse.cs:13  CSharpWarnings::CS8618  Non-nullable field 'Id' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/Backpack/AvatarSection/Outfits/Models/OutfitsResponse.cs:22  CSharpWarnings::CS8618  Non-nullable field 'Pointers' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/Backpack/AvatarSection/Outfits/Models/OutfitsResponse.cs:16  CSharpWarnings::CS8618  Non-nullable field 'Type' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/Backpack/AvatarSection/Outfits/Models/OutfitsResponse.cs:10  CSharpWarnings::CS8618  Non-nullable field 'Version' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesInfo.cs:11  CSharpWarnings::CS8618  Non-nullable field 'achieved' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:16  CSharpWarnings::CS8618  Non-nullable field 'achieved' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:47  CSharpWarnings::CS8618  Non-nullable field 'achievedTiers' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:29  CSharpWarnings::CS8618  Non-nullable field 'assets' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:72  CSharpWarnings::CS8618  Non-nullable field 'baseColor' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Loading/DTO/TrimmedAvatarAttachmentDTO.cs:36  CSharpWarnings::CS8618  Non-nullable field 'category' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Wearables/Helpers/DTO/WearableDTO.cs:46  CSharpWarnings::CS8618  Non-nullable field 'category' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:26  CSharpWarnings::CS8618  Non-nullable field 'category' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:28  CSharpWarnings::CS8618  Non-nullable field 'completedAt' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:54  CSharpWarnings::CS8618  Non-nullable field 'completedAt' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Emotes/Helpers/DTO/EmoteDTO.cs:56  CSharpWarnings::CS8618  Non-nullable field 'contents' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:10  CSharpWarnings::CS8618  Non-nullable field 'data' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Loading/DTO/AvatarAttachmentDTO.cs:52  CSharpWarnings::CS8618  Non-nullable field 'description' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:25  CSharpWarnings::CS8618  Non-nullable field 'description' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Emotes/Helpers/DTO/EmoteDTO.cs:18  CSharpWarnings::CS8618  Non-nullable field 'emoteDataADR74' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Wearables/Helpers/DTO/WearableDTO.cs:47  CSharpWarnings::CS8618  Non-nullable field 'entity' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Loading/DTO/AvatarAttachmentDTO.cs:60  CSharpWarnings::CS8618  Non-nullable field 'hides' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/MapRenderer/MapLayers/HomeMarker/HomeMarkerController.cs:38  CSharpWarnings::CS8618  Non-nullable field 'homeMarker' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:71  CSharpWarnings::CS8618  Non-nullable field 'hrm' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Loading/DTO/AvatarAttachmentDTO.cs:49  CSharpWarnings::CS8618  Non-nullable field 'i18n' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Loading/DTO/TrimmedAvatarAttachmentDTO.cs:27  CSharpWarnings::CS8618  Non-nullable field 'id' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:23  CSharpWarnings::CS8618  Non-nullable field 'id' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Wearables/Helpers/DTO/WearableDTO.cs:48  CSharpWarnings::CS8618  Non-nullable field 'individualData' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:44  CSharpWarnings::CS8618  Non-nullable field 'lastCompletedTierAt' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:46  CSharpWarnings::CS8618  Non-nullable field 'lastCompletedTierImage' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:45  CSharpWarnings::CS8618  Non-nullable field 'lastCompletedTierName' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Loading/DTO/AvatarAttachmentDTO.cs:9  CSharpWarnings::CS8618  Non-nullable field 'metadata' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Loading/DTO/TrimmedAvatarAttachmentDTO.cs:9  CSharpWarnings::CS8618  Non-nullable field 'metadata' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Loading/DTO/AvatarAttachmentDTO.cs:47  CSharpWarnings::CS8618  Non-nullable field 'name' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Loading/DTO/TrimmedAvatarAttachmentDTO.cs:29  CSharpWarnings::CS8618  Non-nullable field 'name' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/AvatarRendering/Wearables/Helpers/DTO/WearableDTO.cs:45  CSharpWarnings::CS8618  Non-nullable field 'name' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:24  CSharpWarnings::CS8618  Non-nullable field 'name' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/BadgesAPIService/BadgesResponse.cs:70  CSharpWarnings::CS8618  Non-nullable field 'normal' is uninitialized. Consider adding th

…truncated; see the linked run for the full report.

Tests

All Unity tests passed ✅

TESTS SUITE Result Passed Failed Skipped Tests time Job time
EditMode ✅ Passed 25531 0 13 14m 54s
PlayMode ✅ Passed 248 0 37 12m 27s

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

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

Performance

🏁 Bare-metal benchmark finished — run #33628499742.

Full report

PR #9871, run #33628499742

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.

Intel Core i5

Metric Baseline Change Δ Result
Samples 4247 (×3) 4460 (×3)
CPU average 21.1 ms (19.6–21.1) 20.1 ms (15.4–20.8) -1.0 ms ⚪ within noise
CPU 1% worst 403.1 ms (350.8–409.6) 378.6 ms (203.8–404.6) -24.5 ms ⚪ within noise
CPU 0.1% worst 432.6 ms (407.3–494.5) 409.2 ms (290.0–466.5) -23.4 ms — informational
GPU average 13.5 ms (12.5–13.6) 12.2 ms (8.9–13.1) -1.3 ms ⚪ within noise
GPU 1% worst 223.5 ms (196.3–229.2) 192.0 ms (92.0–221.5) -31.5 ms ⚪ within noise
GPU 0.1% worst 430.4 ms (405.7–494.9) 410.1 ms (286.8–461.7) -20.3 ms — informational
Exceptions per run 0 0 0 ⚪ no significant change

Apple M1

Metric Baseline Change Δ Result
Samples 3938 (×3) 3632 (×3)
CPU average 22.8 ms (22.6–22.8) 24.6 ms (24.6–24.7) 1.9 ms 🔴 8% slower
CPU 1% worst 219.1 ms (219.1–220.0) 218.9 ms (218.2–219.7) -0.2 ms ⚪ within noise
CPU 0.1% worst 227.8 ms (223.2–228.6) 223.7 ms (223.4–230.0) -4.1 ms — informational
GPU average 40.3 ms (39.9–40.8) 41.6 ms (41.6–42.5) 1.3 ms 🔴 3% slower
GPU 1% worst 49.3 ms (48.3–49.6) 53.4 ms (53.1–53.7) 4.0 ms 🔴 8% slower
GPU 0.1% worst 51.4 ms (49.6–52.2) 55.5 ms (55.2–55.8) 4.1 ms — informational
Exceptions per run 0 0 0 ⚪ no significant change

@claude

This comment has been minimized.

mikhail-dcl and others added 2 commits August 26, 2026 18:07
The branch upgraded packages and code but never committed the engine bump
itself, so ProjectVersion.txt still read 6000.4.0f1 and anyone checking it
out would open the project in the old editor.

Engine:
- ProjectVersion.txt      6000.4.0f1 -> 6000.5.9f1
- VirtualProjectsConfig.json version string follows

Format migrations written by 6000.5:
- VFXManager             m_RuntimeVersion 39 -> 40 (visualeffectgraph 17.5)
- EditorBuildSettings    drops m_UseUCBPForAssetBundles, removed in 6.5
- ProjectAuditorSettings ProjectAuditor moved into the editor module;
                         m_Script -> m_EditorClassIdentifier, m_Rules -> rules
- PackageManagerSettings m_Registries -> m_MainRegistry/m_ScopedRegistries,
                         m_UserModificationsInstanceId -> ...EntityId
- URP global settings + ForwardRenderer High: URP 17.4 -> 17.5,
                         m_UseNativeRenderPass -> m_TileOnlyMode

New settings files 6000.5 generates:
- PhysicsCoreProjectSettings2D.asset
- TimelineSettings.asset
- Packages/com.unity.services.core/Settings.json

Package upgrades in this branch:
- UISoftMaskProjectSettings gains m_PreLoadSettingsInBuild and the
  registered-shader list (SoftMask 3.5.0 -> 3.6.4)
- GPUIEditorSettings records 0.9.19 -> 0.12.18 and the new strip flags

Main.unity and the TextMesh Pro font assets are still dirty and are
deliberately not included here: the scene is stored as binary so its change
cannot be reviewed in a diff, and the two TMP atlases have been emptied
(m_Height 1024 -> 1), which needs confirming as intended rather than
batch-import churn.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@claude

This comment has been minimized.

@github-actions

github-actions Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

badge

Avatar Preview Renderer — Vercel Preview is ready!

Field Value
Preview https://unity-explorer-9ohgj0df0-decentraland1.vercel.app
Commit 55bb9ac25cb15f8a82a444cdaa53fbe8c5ea7bdf
Logs https://github.com/decentraland/unity-explorer/actions/runs/33624731513

mikhail-dcl and others added 3 commits August 27, 2026 14:13
… hash)

IL2CPP fails converting Sentry 4.0.0's aliased BCL shims. Sentry.System.Memory.dll
defines its own System.Span<T> with the netstandard2.0 Pinnable/_byteOffset layout,
and Sentry.dll, Sentry.System.Text.Json.dll and Sentry.System.Text.Encodings.Web.dll
all bind to it. 6000.5's IntrinsicRemap.SpanGetItemArguments remaps Span<T>::get_Item
by type name and then cannot find the field it expects, throwing "Sequence contains no
matching element" 36 times and failing the player export. Sentry 4.6.0 stopped aliasing
those assemblies and 4.7.0 dropped them entirely, so Span<T> resolves to mscorlib again.

packages-lock.json also pinned com.alttester.sdk to the commit before the NLog
ConfigurationItemFactory fix. UPM honours the locked hash over the branch tip, so cloud
builds ran the pre-fix SDK and hit "IOException: The parameter is incorrect" from
AltRunner's static constructor during BuildPlayer. The hash has to be refreshed whenever
the fork branch moves.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Repoints the six unity-explorer-packages pins from ea81c43 to 4426b06, which gates
the unused AVPro Extensions/VideoPlayer module behind DCL_AVPRO_VIDEOPLAYER_EXTENSION.

Its editor script assigns to VideoPlayer_AVPro.audioOutputModeAVPro, whose setter is
declared only for Android/OpenHarmony/WebGL/iOS/macOS/tvOS/visionOS and Windows. A
Linux editor matches none of those, so the property is get-only there and the
assignment fails with CS0200, aborting batchmode before any test runs. That took out
Test (editmode), Test (playmode) and Lint, all of which run in the Linux GameCI
container; the Windows and macOS build agents were never affected.

Only AVPro's content changed between the two revisions, so the other five pins move
with it purely to keep every pin on one revision of the repo.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Conflict: Explorer/Packages/packages-lock.json, decentraland.renderfeatures hash.

dev (#9869) pinned renderfeatures to packages 1691b33 — PR #63's skybox cubemap
regeneration gate, one commit on top of packages main, pinned deliberately for
testing. This branch needs the packages chore/unity-6-5 branch instead, which
carries the RenderFeatures EntityId migration required to compile on 6000.5, so
the pin stays at 4426b06.

Consequence: the SkyboxToCubemapRendererFeature regeneration gate is NOT on this
branch — regenerationInterval does not exist at 4426b06, and 1691b33 is not an
ancestor of it. The skybox pass runs every frame here, as it did before #9869. It
returns once packages #63 lands on packages main and chore/unity-6-5 merges main.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@claude

This comment has been minimized.

Unity 6000.5 ships a serialization-rules analyzer that did not exist in 6000.4, so
this branch added 85 warnings over dev's InspectCode baseline (12608 vs 12546, and
the ratchet requires strictly less). Diffing the two SARIF reports by content
fingerprint shows the delta is 83 UAC1001/UAC1002/UAC1009 plus one CS0618 and one
redundant using; 23 warnings also disappeared, mostly CS0618 from the obsolete-API
migration.

Root causes, in order of leverage:

- ComponentReference<TComponent> was missing [Serializable], which UAC1002 reported
  at all 49 of its derived XxxRef declarations. Its siblings in the same folder
  (AssetReferenceComputeShader, AssetReferenceMaterial, AssetReferenceTextAsset) all
  already carry it, and its own doc comment says a concrete child is required for
  serialization to work. The class declares no fields, so this changes nothing about
  what Unity serializes - no asset format change.

- AvatarAttachmentDTO<T> and TrimmedAvatarAttachmentDTO<T> likewise. These do declare
  a `metadata` field, so Unity would now include it - verified that no Unity-serialized
  root reaches those four DTOs, so the runtime effect is nil today.

- Sentry 4.9.0 deprecated DisableAnrIntegration(); its message names the replacement.
  EnableAppHangTracking = false preserves the intent (DclAnrIntegration does this job).

- The remaining UAC1001/UAC1009 sit on Newtonsoft-only wire DTOs where Unity
  serialization never runs, so Nullable<T>/object/Dictionary<,> fields are correct as
  written. Each is suppressed with a #pragma scoped to the field, naming the serializer
  actually in use. RenderParamsArray gets [NonSerialized] instead, matching the
  [field: NonSerialized] idiom already used in SceneMetadataScene.cs, since it holds a
  live Camera and MaterialPropertyBlock and must never round-trip through the asset.

SceneMetadata's 8 warnings are deliberately NOT suppressed. That type is deserialized
twice onto the same object - Newtonsoft first, then JsonUtility.FromJsonOverwrite from
scene.json on every scene load - and SpawnPoint.Position.Coordinate has no
[Serializable] and stores only in auto-properties, so the Unity pass cannot populate
what Newtonsoft parsed. Suppressing would bury that; it is tracked separately and is
pre-existing rather than upgrade fallout. The ratchet clears without those 8: 77
warnings cleared puts the count at 12531.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The previous commit added `using System;` so the class could carry [Serializable],
which made the unqualified `Object` in the ValidateAsset override ambiguous with
System.Object — CS0104, aborting batchmode before any test ran. The sibling
AssetReference* files take the same using without trouble because none of them names
Object unqualified.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@claude

This comment has been minimized.

@claude

This comment has been minimized.

@decentraland-bot

This comment has been minimized.

Brings the renderer onto the same editor as Explorer. Validated with a 6000.5.9f1
batch compile: exit 0, "Exiting batchmode successfully now!", 0 error CS, 0 shader
errors.

- com.unity.modules.vr no longer exists in 6000.5 (the editor ships only
  com.unity.modules.xr, which the renderer already had). Leaving it in makes package
  resolution fail outright, so the editor terminates before compiling anything.
- Cinemachine 3.1.4 does not compile on 6000.5 - CinemachineSettings.cs uses
  EditorApplication.hierarchyWindowItemOnGUI and EditorUtility.InstanceIDToObject(int),
  neither of which carries an (UnityUpgradable) hint, so the API Updater cannot rewrite
  them. 3.1.7 has the EntityId migration.
- decentraland.renderfeatures had no branch ref, so it resolved packages main, which
  lacks the EntityId migration 6.5 needs. Pinned to #chore/unity-6-5 at 4426b06, the
  same revision Explorer uses.
- URP and VFX Graph 17.4.0 -> 17.5.0, Input System 1.19.0 -> 1.20.0, test-framework
  1.6.0 -> 1.7.0. Unity resolved the rest transitively and rewrote packages-lock,
  pulling in com.unity.modules.physicscore2d and mathematics 1.4.0.
- URP_GlobalSettings and EditorBuildSettings carry 6.5 format migrations. The two
  previously untracked ProjectSettings files are added to match Explorer, which tracks
  both; their contents are stock defaults.

The renderer's own 63 .cs files needed no changes, and it has no #if UNITY_WEBGL
blocks, so the standalone-target compile covers its whole C# surface. The WebGL link
step and GLES shader variants remain unverified locally - no WebGL module is installed
for 6000.5.9f1 here - so CI is the first real test of those.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@claude

This comment has been minimized.

@decentraland-bot

This comment has been minimized.

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

✅ QA Approved

Platforms tested: Windows & macOS
Verified:

  • Account creation via metaforge (fresh account) — wallet/identity/profile deploy all completed correctly.
  • Email OTP authentication flow — completed successfully.
  • Livestream via OBS in a scene — stream displayed correctly, including after reloading the scene (no freeze/black texture).
  • Backpack — working correctly.
  • Teleport in Genesis City and in Worlds — working correctly.
  • Multiplayer — working correctly, no issues observed.
    ✅Smoke test performed:
  • ✔️ 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
  • ✔️ Camera
  • ✔️ Skybox
  • ✔️ Settings

Result: No blockers found across the above. Approving from QA side.

newOTPaccount.mp4
newaccount.mp4
Image
homeEvi.mp4
Image Image

Unity 6000.5 makes the Advanced Text Generator the default UI Toolkit text system,
and ATG cannot render static font assets. Every label re-logged "Advanced text system
cannot render using static font asset Inter 18pt" from
UITKTextHandle.ConvertUssToNativeTextGenerationSettings on each layout pass, so the
web console filled with thousands of identical errors. AtlasPopulationMode.Static is
[Obsolete] in the engine, so migrating is the only forward path - the Enable Advanced
Text opt-out exists but Unity says it will be removed.

Converting an asset by hand touches four serialized fields, not one:

- m_AtlasPopulationMode 0 -> 1, the Static -> Dynamic switch itself.
- m_SourceFontFile, which Static left at {fileID: 0}; Dynamic needs the source face to
  rasterize from. The guid was already retained in m_SourceFontFileGUID.
- the atlas Texture2D's m_IsReadable 0 -> 1. Easy to miss, and without it dynamic glyph
  population has nowhere to write.
- m_IsMultiAtlasTexturesEnabled 0 -> 1. A static atlas never grew, so this never
  mattered; once dynamic, the first glyph outside the baked set overflows the single
  page and logs "Atlas is full".

All four assets are converted, not just the two the console named - the other two are
equally static and would spam identically once a label used them. Preconditions hold:
every m_SourceFontFileGUID resolves to a font file in the same folder, and all four
importers have forceTextureCase -2 and includeFontData 1, which is what Unity's own
converter requires for Font.dynamic.

Verified with a 6000.5.9f1 batch import: exit 0, 0 compile errors, and zero static-font
or atlas-full messages. The assets stay Dynamic across re-import, and the edits are
byte-exact so the diff is 4 lines per file rather than a full reserialization.

ConfiguratorPanelSettings still has m_ICUDataAsset {fileID: 0}, matching all five
Explorer PanelSettings. ATG wants ICU data for line-breaking and bidi, but nothing warns
about it in this run, so it is left alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@claude

This comment has been minimized.

@decentraland-bot

This comment has been minimized.

@decentraland-bot

This comment has been minimized.

@decentraland-bot

This comment has been minimized.

@claude

This comment has been minimized.

@decentraland-bot

This comment has been minimized.

@eordano

eordano commented Sep 1, 2026

Copy link
Copy Markdown
Member

M4, Genesis City, 5120x2880, vsync and fps-cap off, dev builds

editor renderfeatures package frame time
6000.4.0f1 gated (what main resolves to today) 18.0 ms
6000.4.0f1 ungated 21.2 ms
6000.5.9f1 ungated (chore/unity-6-5, i.e. this PR) 24.3 ms
6000.5.9f1 gated 20.7 ms

Two independent effects, cleanly separated:

  • the skybox gating is worth ~3.2–3.6 ms on both editors (21.2→18.0 on 6.4, 24.3→20.7 on 6.5). So SkyboxToCubemapRendererFeature is not the engine regression — it costs about the same on 6.4 and 6.5. It is a straight package regression that this PR introduces by pinning a branch without 1691b33df;
  • the editor step is real and survives the fix: +3.1 ms ungated (21.2→24.3), +2.7 ms gated (18.0→20.7).

decentraland.renderfeatures is pinned with no ref on dev/main, and the default branch tip of unity-explorer-packages is 1691b33df. So main runs at 18.0 ms today.

Against what main actually runs:

  • this PR as-is: 24.3 ms — +6.3 ms / +35%;
  • this PR with the package branch refreshed: 20.7 ms — +2.7 ms / +15%.

So the cherry-pick removes 3.6 ms of the 6.3 ms.

Where that leaves things

  1. Merge main into chore/unity-6-5 (or cherry-pick 1691b33df) regardless. It is a pure regression against a merged optimization, worth 3.6 ms on Mac, and it is not up for debate on its own merits.
  2. A ~2.7 ms (~15%) Apple-silicon cost remains after that, attributable to the 6.4→6.5 engine/URP step and reproducible with identical feature code on both sides. That is the part worth a Unity bug report, and it is the number the merge decision should actually be weighed against.

@claude

This comment has been minimized.

@decentraland-bot

This comment has been minimized.

@claude

claude Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Claude finished @mikhail-dcl's task in 3m 40s —— View job


Security-focused dependency review — chore: upgrade to Unity 6000.5.9f1

Re-run on new head 55bb9ac25, diffed against origin/dev (merge-base 01dd1454b).

  • Gather context (delta since previous run at a82cdcb13)
  • Step 1 — enumerate dependency changes
  • Step 1.5 — registry metadata lookup (blocked — see note)
  • Step 2 — provenance / capability / shipping impact / maintenance / transitive
  • Step 3 — risk classification
  • Step W — workflow & prompt files: git diff --name-only origin/dev...HEAD -- .github/ returns 0 files, section N/A
  • Step 4 — summary + verdict

What changed since my previous run. One commit — 55bb9ac25 "Repoint packages to main (after the merge)" — touching only Explorer/Packages/manifest.json and Explorer/Packages/packages-lock.json. packages#62 has merged, and all six Explorer entries dropped their #chore/unity-6-5 ref and re-resolved to the default branch at 04b022e9.

This closes items 5 and 18 for the Explorer project, and it is the right change. No binary, no .asmdef, no auto-executing script, no workflow or prompt file. The 6.5 invariants are intact by construction and re-verified on this head: GetInstanceID()0 hits in Explorer/Assets, ProjectVersion.txt = 6000.5.9f1 (b57deb96f08d), DCL_Toon.shader:375 unchanged, .github/ untouched.

It also splits item 18 in two: the Explorer half is fixed, and the renderer half is now worse than it was — see item 19, which is the one thing I would fix before anything else on this PR.

Tooling limitation (unchanged across all eleven runs): WebFetch is loaded but not permitted in this job, and gh api is likewise denied. Registry metadata is [UNKNOWN] throughout. unity-explorer-packages is SSH-sourced and unreachable here, so I cannot diff 4426b066..04b022e9 — every statement about what moved inside those packages is [Inference]. All Nethereum .dlls are unfetched git-LFS pointers; no claim below rests on binary inspection.


19. HIGH (new / escalated from 14+18) — the renderer is now stranded on a branch that has just been merged away

avatar-preview-renderer/Packages/manifest.json:12
  "decentraland.renderfeatures": "…unity-explorer-packages.git?path=/RenderGraphs/RenderFeatures#chore/unity-6-5"
avatar-preview-renderer/Packages/packages-lock.json:198-202
  hash: 4426b066d2c5e44c5938d395739384be58c5e81b

[PR] 55bb9ac25 repointed six Explorer entries off #chore/unity-6-5; the renderer's single entry was not included. Its manifest still names the branch and its lock still holds 4426b066 — two commits behind Explorer (4426b066958192e504b022e9), and pre-skybox-fix.

The commit message says "after the merge", so chore/unity-6-5 has served its purpose in unity-explorer-packages. Three consequences:

  1. [Inference] If that branch is deleted — the default on a merged GitHub PR — the renderer stops resolving. Not on this PR: on dev, on the release path. avatar-preview-renderer-release.yml:7-11 auto-cuts avatar-preview-renderer/v3.X.0 and avatar-preview-renderer-build.yml:228-236 runs vercel pull --environment=production on every merge to dev touching avatar-preview-renderer/**, with no human in the loop, into an artifact embedded on the authentication screen. And if packages#62 was squash-merged, 4426b066 is unreachable even by SHA.
  2. Two builds of one package from one repo. The desktop client resolves 04b022e9, the WebGL preview 4426b066. SkyboxToCubemapRendererFeature is Explorer-only (grep -rn SkyboxToCubemap → 1 hit, Explorer/Assets/Rendering/ForwardRenderer - High.asset), so the renderer is unlikely to be slower for it — but the divergence is unintentional and unreviewed.
  3. This is the exact failure the author already hit once. 0af958d6f's commit message records UPM honouring a stale locked hash over the branch tip, so cloud builds compiled a pre-fix AltTester SDK.

The Avatar Preview Renderer Build job on this head is in_progress right now — it is the empirical answer to whether the branch still exists. A green build means the branch survived the merge; it does not make the pin correct. Fix this →


20. MEDIUM (new) — five packages changed content in this repoint, and nobody has diffed them

[PR] 55bb9ac25 moved com.dcl.gpui-assets, com.decentraland.filebrowserpro, com.gurbu.gpui-pro, com.gurbu.gpui-pro.terrain and com.renderheads.avpro.video-ultra from 4426b066 to 04b022e9. The PR presents this as a repoint, and for decentraland.renderfeatures the intent is documented (@eordano's skybox fix). For the other five, [Inference] 04b022e9 is the tip of main after packages#62 merged, which means it also carries whatever else landed on packages main while this branch was open — the diff is not necessarily empty, and it is [UNKNOWN] here because the repo is SSH-only.

That set is rows 4 (GPUI — a hand-merged fork, 54 conflict hunks) and 6 (AVPro 3.4.2) of the author's own QA table. One git log --oneline 4426b066..04b022e9 -- GPUInstancerPro AVProVideo FileBrowserPro on the packages repo closes this in a sentence; it is worth running rather than assuming a no-op merge.


5 / 18 ✅ RESOLVED for Explorer — 6 → 0 branch refs

Recorded because it was the standing ask across ten runs. Explorer/Packages/manifest.json no longer contains a single #chore/unity-6-5, and the six entries now agree on one commit. What replaces it is no ref at all, i.e. the default branch — mutable at the manifest level, immutable only via the lockfile hash. That is not the SHA pin I recommended, but it is this repo's prevailing convention for unity-explorer-packages (grassshader, superscrollview) and for pulse, renum, richtypes, nsubstitute, livekit-web and gltfast. Consistency with the house pattern is a defensible call; I am downgrading this from MEDIUM to a note and folding the residual into item 6.

6. MEDIUM (widened) — eight entries from one repo, three different locked commits, all resolving main

entry locked commit
com.dcl.gpui-assets, com.decentraland.filebrowserpro, com.gurbu.gpui-pro, com.gurbu.gpui-pro.terrain, com.renderheads.avpro.video-ultra, decentraland.renderfeatures 04b022e9
decentraland.grassshader (packages-lock.json:511) c35c10aa
superscrollview (:557) 8e1478ec

All eight declare no git ref, so all eight resolve main; the lock merely records when each was last resolved. grassshader and superscrollview are therefore pinned behind their own default branch and will jump silently — no manifest.json diff — the next time anyone deletes the lockfile, resolves a merge conflict in it, or lets the editor re-resolve. Cheap to close while already in these files.

17 ✅ mechanically resolved, substantively still open

Enforce QA and DEV Approvals is success on this head (dalkia approved 11:22Z). The check no longer blocks. The underlying gap does: Ludmilafantaniella's QA pass (2026-08-28) ran against a build of 9422309e5; bb8584835 then merged 14 dev commits / 171 files on top (StaticContainer.cs, DynamicWorldContainer.cs, CharacterEmoteSystem.cs, EmotePlayer.cs, AvatarBase.cs, LoadGLTFSystem.cs, the GltFast*DownloadProvider set), and the last two pushes changed six resolved package commits — which no compile-time check covers. The three findings I closed on QA evidence (item 7 Nethereum, magenta avatars, AVPro 3.4.2) remain the best evidence available but are evidence about an ancestor. One scoped smoke re-run on this head — avatar rendering, emotes, glTF loading, terrain/GPUI, video — is the ask, and item 20 makes GPUI and AVPro the priority within it.

Also still open from last run: Unity Performance Test is skipped on this head, so the branch's only published number is @eordano's pre-fix 🔴 one plus the a82cdcb13 bot run (M1 CPU average +8%). The post-fix figure the merge decision needs — expected ~20.7 ms vs main's 18.0 ms, +2.7 ms / +15 % on Apple silicon, the residual engine cost — has still not been measured on a head carrying the fix.


Findings carried over (all re-verified on this head)

1. HIGH — com.alttester.sdk resolves from a personal fork on a branch ref. Unchanged; this is the blocker. Explorer/Packages/manifest.json:4github.com/mikhail-dcl/AltTester-Unity-SDK.git?path=/Assets/AltTester#1983-unity-6000-5-getinstanceid-obsolete, lock 3c644489…. A runtime-instrumentation SDK with in-process RPC, reflection-driven method invocation and component read/write, resolving from an account outside the decentraland org. Mutability is demonstrated, not hypothetical — the branch moved mid-PR (4cd550ae…3c644489…). The gated surface grew during this PR via merged dev commit efb8a2e1e (#9899: AltTesterViewProbe.cs, ViewBase.AltTester.cs, ViewBase.cs:14) — all correctly #if ALTTESTER-gated, so not a defect in dev's commit, but every new call site raises the cost of the swap-back. ALTTESTER is in the default Standalone define set (ProjectSettings.asset:931), removed only by CloudBuild.cs:69 on the release path, so every metaforge/QA build compiles the fork in, and [Inference] a UPM package's editor-side code also executes on CI machines holding build secrets, before any runtime gate applies. Mitigation, re-confirmed: DeepLinkAllowlist.cs:48 places alttester in the "Never permitted" tier — the flag is not remotely triggerable, which narrows runtime exposure, not supply-chain exposure. Author states "Must not reach dev as-is" — still true. Fix: wait for alttester/AltTester-Unity-SDK#1984 and return to a registry version, or fork into decentraland/ and pin to a 40-char SHA. Note that with 55bb9ac25 this is now the only branch-ref pin left in the Explorer manifest — the cleanup made it the sole outlier.

15. MEDIUM — com.atteneder.gltfast unpinned in both projects, and the locks already disagree. No git ref at Explorer/Packages/manifest.json:7 and avatar-preview-renderer/Packages/manifest.json:3; locks resolve b9f9f75c… vs a different commit. The desktop client and the auth-adjacent WebGL preview deserialize the same user-uploaded wearable and avatar glTF through two different builds of the same parser, and neither is declared. Strongest case in the graph for pinning — binary deserialization of third-party content. Not introduced by this PR. [UNKNOWN] whether the divergence is intentional.

3. MEDIUM — Sentry ANR migration not proven equivalent. SentryBuildTimeConfiguration.cs:29-33 replaces DisableAnrIntegration() with EnableAppHangTracking = false. Those coincide only if AnrIntegration consults the flag; if it gates native app-hang tracking, Sentry's managed watchdog now runs alongside DclAnrIntegration. SentryOptions.asset:60-61 still serializes <AnrDetectionEnabled>k__BackingField: 1. Incoherent either way — one source lookup or one ANR repro closes it.

4. MEDIUM — io.sentry.unity 4.0.0 → 4.9.0. Official upstream (getsentry/unity.git#4.9.0, lock ef9830bd…), tag-pinned, provenance fine. Ships native crash handlers (Windows/Macos/LinuxNativeSupportEnabled all 1). Privacy flags that existed at 4.0.0 stay correctly off (AttachScreenshot: 0, SendDefaultPii: 0), but anything introduced between 4.1 and 4.9 is absent from the asset and deserializes to a compiled default, unreviewed. Open SentryOptions in the 6000.5 editor once and diff.

8. MEDIUM — com.brunomikoski.animationsequencer removed without mention, plus two stale scopedRegistries scopes (manifest.json:85-91 still scopes com.brunomikoski and com.alttester.sdk). The git URL wins today, so no live ambiguity; the hazard is that reverting the AltTester manifest line alone silently re-resolves it from OpenUPM rather than failing loudly — and item 1's fix is exactly that revert. Residual risk of the removal is a prefab holding a bare m_Script GUID, which fails silently.

9. MEDIUM — FallbackFontsProvider handle leak + dangling global fallbacks. Lines 47-48 append to the live static TMP_Settings.fallbackFontAssets; Dispose() (78-82) releases handles without removing entries. Log out during chat font load → log back in → TMP resolves against destroyed assets. Separately, lines 37-43 continue without provided.Dispose(), and 53-54 should use ReportHub.LogException per CLAUDE.md §9.

10. MEDIUM — Main.unity + TMP atlases deliberately uncommitted. Right call for reviewability, but the tree is not the tree the author validated, and the "0 errors / 226 assemblies" figure was measured against a working copy that differs from HEAD.

11. LOW–MED — BillboardHDRP_GPUIPro.shadergraph has no referrer. GUID 268a2d2b… matches only its own .meta. URP-only project; 2 733 droppable lines.

12. LOW–MED — DCL_Toon.shader:375 uncommented. Pre-claiming UNIVERSAL_LIT_INPUT_INCLUDED suppresses all of URP's LitInput.hlsl. Hard dependency on a URP-internal guard name — if URP renames it, magenta avatars return with no compile error. Add a comment naming the URP version and unity-shared-dependencies#95 item 4.

16. LOW — renderer font Dynamic-atlas invariant unguarded. UiToolkitFontAssetsMustNotBeStatic (ValidationTests.cs:169) is hardcoded to Assets/DCL/UIToolkit/Fonts and lives in the Explorer project; the renderer has no .asmdef, no test assembly and no test job, so its four assets can regress to Static on any re-import with nothing catching it. Worth an issue, not a blocker.

7. LOW — Nethereum removal. Source side re-confirmed on the merged tree: every using Nethereum.* resolves to a retained assembly (Signer, ABI, Hex, Siwe.Core, Util); no source file references any of the 10 removed ones; all 13 EIP712/Eip712 hits in Explorer/Assets/DCL are string literals, JSON keys, config constants or comments. QA's fresh-account + OTP run is the runtime evidence, now three pushes stale. SIWE and the Thirdweb in-app-wallet path (Nethereum.KeyStore / Nethereum.HdWallet) remain the two removals reachable only by reflection and are still unnamed in the QA list. NethereumMetamask.jslib remains orphaned.

13. LOW ✅ — previously verified, unchanged. ComponentReference CS0104 fix; d67dd0064's attribute/pragma-only sweep (no auth-chain wire field added, removed, renamed or retyped); DCLInput.cs diffed key-by-key — 217/109 lines are exactly 108 × "priority" + 108 × "initialStateCheck" reordered, no action, binding, map, composite or control scheme changed; GetInstanceID()GetEntityId() migrations mechanical and Burst-valid; AVPro VideoPlayer extension compiled out (surface reduction); two nits on the new validation test (undisposed SerializedObject at line 213, NRE-on-rename at FindProperty).

Also carried: [PR] com.mackysoft.serializereference-extensions 1.3.1 → 1.7.0 — third-party, single-maintainer, OpenUPM, four-minor jump; registry-pinned so immutable, and OpenUPM forbids republishing a version, so provenance is adequate; [UNKNOWN] license, advisories, popularity, last-published. LOW. [PR] com.unity.modules.physicscore2d added, com.unity.modules.vr removed, com.unity.modules.xr added — all first-party, all forced by 6.5's module split. LOW. Credit where due: com.cysharp.unitask went from an unpinned git URL to #2.5.11, and com.coffee.softmask-for-ugui 3.5.0 → #3.6.4 — the treatment items 6 and 15 are still asking for.

Also carried (lead, not a finding). Explorer/Assets/Rendering/ForwardRenderer - High.asset lost m_UseNativeRenderPass: 0 and gained m_TileOnlyMode: 0 in the URP 17.5 re-serialization. [Inference] a serialized field disappearing means the field no longer exists on the type — URP 17.5 removed the native-render-pass opt-out this project had explicitly turned off. Both fields are squarely about tile-based GPUs, which Apple silicon is and the Intel i5 (⚪ on every metric) is not — consistent with the asymmetry in the perf table. [UNKNOWN] whether either is causal. Investigate →


Summary

# item risk conf.
1 com.alttester.sdk → personal fork, branch ref; now the only branch-ref pin left in the Explorer manifest HIGH HIGH (PR) / UNKNOWN (fork contents)
19 renderer still on #chore/unity-6-5 @ 4426b066 after that branch merged and Explorer moved off it — auto-release + Vercel production deploy on merge; branch deletion or a squash-merge orphans the pin HIGH (new) HIGH (PR) / INFERENCE (branch fate)
20 5 packages (GPUI ×3, AVPro, FileBrowserPro) moved 4426b06604b022e9 in the repoint; content delta undiffed MEDIUM (new) HIGH (PR) / UNKNOWN (delta)
15 com.atteneder.gltfast unpinned in both projects — locks resolve to different commits of a parser fed untrusted glTF MEDIUM HIGH
6 8 entries from one repo, all resolving main, locked at 3 different commits; grassshader + superscrollview will jump silently MEDIUM HIGH
17 approvals check now green; QA evidence still covers 9422309e5, 3 pushes and 171 files back — and 6 package commits moved since MEDIUM HIGH
3 Sentry ANR migration not proven equivalent; asset still holds AnrDetectionEnabled: 1 MEDIUM MEDIUM
4 io.sentry.unity 4.0.0 → 4.9.0 — shipped native crash handlers, asset not re-serialized MEDIUM HIGH (PR) / UNKNOWN (package)
8 animationsequencer removed undocumented; two stale scopedRegistries scopes — reverting item 1 re-resolves AltTester from OpenUPM MEDIUM MEDIUM
9 FallbackFontsProvider handle leak + dangling global fallbacks MEDIUM HIGH
10 Main.unity + TMP atlases uncommitted MEDIUM HIGH
11 BillboardHDRP_GPUIPro.shadergraph unreferenced LOW–MED HIGH
12 DCL_Toon.shader URP-guard hack, uncommented LOW–MED HIGH
16 renderer font Dynamic-atlas invariant unguarded — no asmdef, no test assembly, no test job LOW HIGH
7 Nethereum removal — source side re-confirmed; SIWE / Thirdweb wallet path still unnamed LOW MEDIUM
serializereference-extensions 1.3.1 → 1.7.0; physicscore2d / xr added, vr removed LOW HIGH (PR) / UNKNOWN (registry)
13 Unity first-party bumps, module churn, settings migrations, code migrations, DCLInput.cs, AVPro gate-out, font-asset migration LOW HIGH
5 / 18 ✅ resolved for Explorer — 6 branch refs removed, 6 entries now agree on 04b022e9 HIGH
(unverifiable) contents of 04b022e9 and the 4426b066..04b022e9 delta — SSH-only repo, WebFetch/gh api denied n/a UNKNOWN
(lead) m_UseNativeRenderPass dropped / m_TileOnlyMode added — tile-GPU-specific, matches the Apple-silicon-only regression n/a INFERENCE
(mitigation) alttester deny-listed for deep links (DeepLinkAllowlist.cs:48) — flag not remotely triggerable n/a HIGH
(op flag) Unity Performance Test skipped on this head; no post-fix number exists yet. UCB editor version lives outside the repo — set the renderer target to 6000.5.9f1 in lockstep n/a HIGH

Step W raises nothing — 0 files under .github/. This push adds no dependency declaration, no binary, no .asmdef and no auto-executing script; its only supply-chain effect is the repoint itself.

Bottom line. 55bb9ac25 is a genuine improvement and closes the item I have been raising for ten runs — the Explorer manifest is now free of branch refs. It is also half a pass: the renderer was left on the branch that was just merged away, which turns a reviewability concern into a plausible build break on the auto-deploying release path (item 19), and it moved five packages' content without a diff (item 20). Both are minutes of work in the same files. The verdict itself is unchanged and rests where the author put it: com.alttester.sdk on a personal-account branch, on a PR targeting dev. While in the manifests, pin gltfast, grassshader and superscrollview too.

DEPENDENCY_REVIEW: BLOCK
· branch chore/unity-6-5

@mikhail-dcl
mikhail-dcl enabled auto-merge (squash) September 2, 2026 12:11
@mikhail-dcl
mikhail-dcl merged commit 7870599 into dev Sep 2, 2026
35 of 38 checks passed
@mikhail-dcl
mikhail-dcl deleted the chore/unity-6-5 branch September 2, 2026 12:28
mikhail-dcl added a commit that referenced this pull request Sep 2, 2026
…ration (#9942)

The Unity 6.5 upgrade (#9871) bumped io.sentry.unity 4.0.0 -> 4.9.0, which deprecated
DisableAnrIntegration(). That call was replaced with EnableAppHangTracking = false on the
strength of the deprecation message, but the two are not equivalent:

- DisableAnrIntegration() was literally options.RemoveIntegration<AnrIntegration>() - it
  removed Sentry's managed C# watchdog.
- EnableAppHangTracking only feeds NativeAppHangTrackingEnabled, i.e. the NATIVE app-hang
  detector in sentry-native / sentry-cocoa. It does nothing to the managed integration.

ScriptableSentryUnityOptions adds AnrIntegration when AnrDetectionEnabled is set, and it
does so before OptionsConfiguration runs - so Configure() never had a chance to prevent
it, only to remove it after the fact. With the removal gone, Sentry's watchdog has been
running alongside DclAnrIntegration: two watchdog threads and duplicate ANR events.

EnableAppHangTracking is also not serialized in SentryOptions.asset, so it was already
false by compiled default - the replacement line was a no-op as well as the wrong lever.

Fix at the source instead: clear AnrDetectionEnabled so the integration is never added.
This avoids re-introducing the obsolete API (the property is [Obsolete] in code, but
setting the serialized field raises no CS0618), and PersistIntoAssetFile only writes
Enabled/Release/Dsn/Environment, so it will not silently revert the flag.

EnableAppHangTracking = false is kept deliberately - we do not want Sentry's native
app-hang detector either, since DclAnrIntegration already reports ANRs with minidumps and
callstacks - and the comment now says what the property actually gates.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants