Docs: Unity 6.5 upgrade validation (342/342 green, clean netcode boot)

Validated the 6.5 upgrade: 342/342 EditMode tests pass, no compile/Burst/
source-gen errors, and a clean netcode Play boot (ServerWorld+ClientWorld
connect, NetworkId handshake, in-game, ghost replication synced 23==23,
player owned-ghost spawned) -> the 6.6.0a6 "invalid wrapped network
interface" transport bug does NOT affect 6.5-stable. URP 17.5 render clean
(magenta scan 0/1564). The MaterialLocation.External FBX-import warnings are
benign 6.5 deprecation noise (2737 importers), import-time only.

Updates the CLAUDE.md stack table to 6.5.0 (net -13 bytes, under budget) and
adds the full session log.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-17 00:34:45 -07:00
parent dc7a86fca4
commit 4a6b7b6d2a
2 changed files with 75 additions and 12 deletions
+12 -12
View File
@@ -9,24 +9,24 @@ Multiplayer game on **Unity DOTS (Entities) + Netcode for Entities** — server-
- **Size check** — bash: `wc -c CLAUDE.md` · PowerShell: `(Get-Item CLAUDE.md).Length`. Must be `< 40960`. - **Size check** — bash: `wc -c CLAUDE.md` · PowerShell: `(Get-Item CLAUDE.md).Length`. Must be `< 40960`.
- **Archive, don't delete.** When trimming, append the verbose / least-hot detail to the obsidian reference note `Docs/Vault/_Meta/CLAUDE_Build_Gotchas_Archive.md` under a **new dated heading** (never overwrite an older snapshot), and leave a one-line pointer + the relevant `[[DR-###]]` link here. Design rationale already lives in the per-milestone DRs (`Docs/Vault/07_Sessions/_Decisions/DR-###`). - **Archive, don't delete.** When trimming, append the verbose / least-hot detail to the obsidian reference note `Docs/Vault/_Meta/CLAUDE_Build_Gotchas_Archive.md` under a **new dated heading** (never overwrite an older snapshot), and leave a one-line pointer + the relevant `[[DR-###]]` link here. Design rationale already lives in the per-milestone DRs (`Docs/Vault/07_Sessions/_Decisions/DR-###`).
- **Net-zero rule:** every addition is paid for by a condensation elsewhere. Keep only the hottest, highest-recurrence operational rules inline (flag them **★**); depth lives in the archive + DRs. - **Net-zero rule:** every addition is paid for by a condensation elsewhere. Keep only the hottest, highest-recurrence operational rules inline (flag them **★**); depth lives in the archive + DRs.
- Condensation history: 2026-06-04 (first pass, M1M6 long-form → archive) · 2026-06-07 (M7+/HUD/animation tightened) · 2026-06-08 (inventory pointer; persistence + world-collision detail → archive) · 2026-06-13 (END-2 line added net-zero; EB-1/EB-2/END-1/M7/inventory/build-grid trimmed). - Condensation history: 2026-06-04 · 06-07 · 06-08 · 06-13 (M1END-2 long-form → archive); 06-17 (6.5 stack swap).
## Stack — Unity 6.4.7 (`6000.4.7f1`, stable) as of 2026-05-30 ## Stack — Unity 6.5.0 (`6000.5.0f1`, stable) as of 2026-06-17
| Package | Version | Notes | | Package | Version | Notes |
|---|---|---| |---|---|---|
| `com.unity.entities` | **6.4.0** | Entities/Collections/Graphics track the **Editor** version (6.x). | | `com.unity.entities` | **6.5.0** | Entities/Collections/Graphics track the **Editor** version (6.x). |
| `com.unity.entities.graphics` | **6.4.0** | Renders entities under URP 17.4. | | `com.unity.entities.graphics` | **6.5.0** | Renders entities under URP 17.5. |
| `com.unity.collections` | 6.4.0 | (transitive) | | `com.unity.collections` | 6.5.0 | (transitive) |
| `com.unity.netcode` | **1.13.2** | Netcode **for Entities** (ECS). NOT `com.unity.netcode.gameobjects`. Independent 1.x line. | | `com.unity.netcode` | **6.5.0** | Netcode **for Entities** (ECS). NOT `com.unity.netcode.gameobjects`. Unified 6.x since 6.5 (was 1.x). |
| `com.unity.physics` | **1.4.6** | Unity Physics (DOTS). Independent 1.x line. | | `com.unity.physics` | **6.5.0** | Unity Physics (DOTS). Unified 6.x since 6.5 (was 1.x). |
| `com.unity.charactercontroller` | **1.4.2** | DOTS kinematic collide-and-slide. Declares entities/physics 1.3.15 but resolves on 6.4.0/1.4.6 via SemVer floor (no downgrade). | | `com.unity.charactercontroller` | **1.4.2** | DOTS kinematic collide-and-slide. Declares entities/physics 1.3.15, resolves on 6.5.0 via SemVer floor; compiles+bakes on 6.5. |
| `com.unity.transport` | 2.7.2 | (transitive) | | `com.unity.transport` | 6.5.0 | (transitive) |
| `com.unity.burst` | 1.8.29 | (transitive) | | `com.unity.burst` | 1.8.29 | (transitive) |
| `com.unity.mathematics` | 1.3.3 | (transitive) | | `com.unity.mathematics` | 1.4.0 | (transitive) |
| `com.rukhanka.animation` | **2.9.0** | Local pkg (`Packages/com.rukhanka.animation`). ECS skeletal animation (Burst CPU/GPU skinning). Resolves on 6.4.0 via SemVer floor. Netcode replication **OFF** → client-derived. See [[DR-022_Animation_Pipeline_Rukhanka_Synty]]. | | `com.rukhanka.animation` | **2.9.0** | Local pkg (`Packages/com.rukhanka.animation`). ECS skeletal animation (Burst CPU/GPU skinning). Resolves on 6.5.0 via SemVer floor. Netcode replication **OFF** → client-derived. See [[DR-022_Animation_Pipeline_Rukhanka_Synty]]. |
Values match `packages-lock.json` (reconciled 2026-06-02; URP 17.4.0, test-framework 1.6.0, ugui 2.0.0, multiplayer.center 1.0.1). **History:** 6.6.0a6 was tried + reverted (Netcode/Transport runtime engine bug "invalid wrapped network interface"); returning to 6.6 means a package renumber + runtime re-test. See [[DR-002_Unity66_Alpha_Netcode_Transport]] + the gotchas archive. Values match `packages-lock.json` (reconciled 2026-06-17; URP 17.5.0, test-framework 1.7.0, ugui 2.5.0, multiplayer.center 1.0.1). **History:** 6.4.7→6.5.0 (2026-06-17) put DOTS on unified 6.5 versioning (netcode/physics/transport left their old 1.x/2.x lines) — validated green (342/342 EditMode + a clean netcode Play boot: connect/ghost-sync/player-spawn), so the 6.6.0a6 "invalid wrapped network interface" transport bug does NOT hit 6.5-stable. See [[DR-002_Unity66_Alpha_Netcode_Transport]] + the gotchas archive.
## Namespaces & assembly split ## Namespaces & assembly split
@@ -0,0 +1,63 @@
---
date: 2026-06-17
type: session
tags:
- session
- upgrade
- unity-6-5
- dots
- netcode
- validation
permalink: gamevault/07-sessions/2026/2026-06-17-unity-6-5-upgrade-validation
---
# Unity 6.4.7 → 6.5.0 upgrade — validation pass
> Operator upgraded the editor **6000.4.7f1 → 6000.5.0f1** (and the package set) and asked to run all tests + confirm the project is healthy. Also flagged "a lot of console noise" — `MaterialLocation.External is obsolete` from FBX imports — unsure if it was the in-progress asset reindex. This session is validation-only: **no `.cs` / scene / asset edits** (only `CLAUDE.md` + this log). Follows [[2026-06-13_SL1_SL4_Visual_Cohesion_Dark_Frontier]].
## What the upgrade changed (from the git diff of `manifest.json` / `packages-lock.json`)
The headline is that the **DOTS stack left its independent 1.x/2.x lines and joined unified 6.5.0 versioning** (matching the editor):
| Package | 6.4 | 6.5 |
|---|---|---|
| entities / entities.graphics / collections | 6.4.0 | **6.5.0** |
| **netcode** (for Entities) | **1.13.2** | **6.5.0** |
| **physics** (DOTS) | **1.4.6** | **6.5.0** |
| transport | 2.7.2 | **6.5.0** (builtin) |
| mathematics | 1.3.3 | **1.4.0** (builtin) |
| burst | 1.8.29 | 1.8.29 (unchanged; satisfies the new 1.8.25/26 mins) |
| URP / ShaderGraph / VFX | 17.4.0 | **17.5.0** |
| ugui | 2.0.0 | **2.5.0** · test-framework 1.6→**1.7** · ai.navigation 2.0.12→2.0.13 |
| **charactercontroller** | 1.4.2 | **1.4.2** (unchanged — declares physics 1.3.15, resolves on 6.5.0 via SemVer floor) |
| **com.rukhanka.animation** | 2.9.0 | **2.9.0** (local pkg, unchanged — resolves on 6.5.0) |
The two highest-risk pins were CharacterController 1.4.2 and the local Rukhanka 2.9.0 now sitting on a 6.5 foundation, plus Netcode/Transport runtime stability (CLAUDE.md records a **6.6.0a6** revert for an "invalid wrapped network interface" transport bug).
## Validation results — all green
1. **Compile / Burst / source-gen**: clean. Console filter for `CS` errors → 0; for `Burst` → 0. The framework **discovered + ran 342 project tests**, which can only happen if every referenced assembly compiled — incl. `ProjectM.Simulation` (CC 1.4.2 + Physics 6.5 `KinematicCharacterBody` source-gen) and Rukhanka 2.9.0 against Entities 6.5. So both risky pins survived the major jump **at compile time**.
2. **EditMode tests**: `ProjectM.Tests.EditMode`**342 / 342 passed, 0 failed, 0 skipped** in 4.2 s. (The discovery resource shows 356 = 342 project + ~14 non-project package tests; project has a single Editor-only test asmdef, no PlayMode/parameterized tests — `[Test]` count is exactly 342.)
3. **Netcode runtime (Play-mode smoke check)** — the real test of the Netcode 1.13.2→6.5.0 jump that unit tests can't cover. First Play after the upgrade triggered the expected ~90 s subscene + Rukhanka **re-bake** (looks like a hang, isn't). Once booted, both worlds were healthy and **in sync**:
| | ServerWorld | ClientWorld |
|---|---|---|
| connections / NetworkId (handshake) | 1 / 1 | 1 / 1 |
| NetworkStreamInGame | 1 | 1 |
| ghosts replicated | **23** | **23** |
| owned (player) ghosts | 1 | 1 |
Connection + NetworkId handshake + in-game + **ghost replication synchronized (server 23 == client 23)** + the player's owned ghost present. → **The 6.6-alpha "invalid wrapped network interface" transport bug does NOT affect 6.5-stable.** Player owned-ghost spawning also confirms CC 1.4.2 bakes + runs against Physics 6.5.
4. **Render (URP 17.4→17.5)**: game-view screenshot is clean — HUD intact, Meadow biome ground, player + Synty foliage + structures render; an automated magenta scan found **0 / 1564** missing-shader pixels. No broken materials.
## The console noise — triaged (benign)
`MaterialLocation.External is obsolete. External Material Location is no longer supported.` (logged at *Exception* severity from `ModelImporter.cpp:981`). Root cause confirmed: **2737 art FBX importers** (BefourStudios + Synty) are set to the now-deprecated `materialLocation: 1` (External) mode; Unity 6.5 dropped that mode, so each logs the warning **once on reimport**. The 6.5 upgrade forced a full asset reimport → the flood. It is **import-time only**: materials still resolve (render is clean), and it has no effect on tests/builds/runtime. It won't recur once the import queue drains (it has) — only on a forced reimport / `Library` wipe.
- **Recommendation: leave it** (lowest risk; self-quiets). Permanently silencing it means bulk-editing 2737 `.fbx.meta` importers (set Material Creation Mode = None / a supported location), which forces another full reimport and risks disturbing the curated `EnvArtTools`-converted env materials + Synty atlas assignments. Offered as an optional follow-up, not done unprompted.
Also seen once at boot (benign): one `PackageManagerImmutableAssets` "immutable packages were unexpectedly altered" warning (generic upgrade-migration artifact, non-recurring) and the usual transient "Server Tick Batching" warnings during the heavy boot frames (which actually confirm the server world is ticking).
## Docs
- `CLAUDE.md` Stack table + reconcile/history line rewritten to 6.5.0 (net **-13 bytes** → 40497, under the 40960 budget; net-zero rule honored by trimming the condensation-history line).
## Deferred / operator follow-ups
- **Optional**: bulk-silence the 2737 FBX `MaterialLocation.External` warnings (reimport cost + curated-material risk — only if the noise bothers you).
- **Recommended quick manual look**: I confirmed the player ghost spawns + the character renders, but a static screenshot can't verify **Rukhanka animation playback** (walk/idle blend, no T-pose/collapse) on 6.5 — worth a few seconds of eyes-on movement next time you're in Play. CLAUDE.md notes skinned-mesh visual bugs need the operator's eyes (bone/bounds reads lie).
- The pre-existing `URPGlobalSettings.asset` version-stamp gotcha (blocks *player builds*, not editor Play) wasn't exercised here — if you make a standalone build, watch for `URPPreprocessBuild` "not at last version" and reset `m_AssetVersion` per the CLAUDE.md art-import note.