refactor(runtime): publish canonical entity object deltas

Issue stable Runtime identities at canonical registration, publish entity and inventory commits through one generation-stamped synchronous stream, and make graphical adapters borrow the same direct views and events as a no-window host. Preserve exact projection teardown and retail mutation order while removing App-side event reconstruction.

Make the hard-recenter ordering fixture independent of the production two-millisecond frame budget so its injected-failure gate is deterministic.

Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-26 06:42:13 +02:00
parent d3e96ff912
commit ce3ac310d9
23 changed files with 2352 additions and 666 deletions

View file

@ -1656,7 +1656,7 @@ public sealed class LiveEntityRuntimeTests
Assert.False(runtime.TryGetRecord(spawn.Guid, out _));
RuntimeEntityRecord canonical = CurrentCanonical(runtime, spawn.Guid);
Assert.Null(canonical.LocalEntityId);
Assert.NotNull(canonical.LocalEntityId);
Assert.Equal(0, runtime.MaterializedCount);
Assert.Empty(runtime.VisibleRecords);
Assert.Empty(spatial.Entities);
@ -1901,7 +1901,7 @@ public sealed class LiveEntityRuntimeTests
Assert.NotNull(replacement.PriorGenerationCleanupFailure);
RuntimeEntityRecord canonical = CurrentCanonical(runtime, guid);
Assert.Equal((ushort)2, canonical.Generation);
Assert.Null(canonical.LocalEntityId);
Assert.NotNull(canonical.LocalEntityId);
Assert.False(runtime.TryGetRecord(guid, out _));
WorldEntity installed = runtime.MaterializeLiveEntity(
guid,
@ -2459,7 +2459,7 @@ public sealed class LiveEntityRuntimeTests
&& exception.Message.Contains("active logical-lifetime transition", StringComparison.Ordinal));
RuntimeEntityRecord current = CurrentCanonical(runtime, guid);
Assert.Equal((ushort)2, current.Generation);
Assert.Null(current.LocalEntityId);
Assert.NotNull(current.LocalEntityId);
Assert.False(runtime.TryGetRecord(guid, out _));
Assert.Empty(spatial.Entities);
Assert.DoesNotContain(
@ -2493,7 +2493,7 @@ public sealed class LiveEntityRuntimeTests
Assert.False(outer.LogicalRegistrationCreated);
RuntimeEntityRecord current = CurrentCanonical(runtime, guid);
Assert.Equal((ushort)3, current.Generation);
Assert.Null(current.LocalEntityId);
Assert.NotNull(current.LocalEntityId);
Assert.False(runtime.TryGetRecord(guid, out _));
Assert.Empty(spatial.Entities);
Assert.Equal(1, resources.RegisterCount);
@ -2524,8 +2524,8 @@ public sealed class LiveEntityRuntimeTests
Assert.True(outer.LogicalRegistrationCreated);
RuntimeEntityRecord replacement = CurrentCanonical(runtime, guid);
Assert.Equal((ushort)2, replacement.Generation);
Assert.Null(replacement.LocalEntityId);
Assert.Null(CurrentCanonical(runtime, unrelatedGuid).LocalEntityId);
Assert.NotNull(replacement.LocalEntityId);
Assert.NotNull(CurrentCanonical(runtime, unrelatedGuid).LocalEntityId);
Assert.False(runtime.TryGetRecord(guid, out _));
Assert.False(runtime.TryGetRecord(unrelatedGuid, out _));
Assert.Equal(2, runtime.Count);
@ -2587,7 +2587,7 @@ public sealed class LiveEntityRuntimeTests
Assert.False(outer.LogicalRegistrationCreated);
RuntimeEntityRecord current = CurrentCanonical(runtime, guid);
Assert.Equal((ushort)3, current.Generation);
Assert.Null(current.LocalEntityId);
Assert.NotNull(current.LocalEntityId);
Assert.False(runtime.TryGetRecord(guid, out _));
Assert.Equal(1, resources.RegisterCount);
Assert.Equal(1, resources.UnregisterCount);
@ -2619,7 +2619,7 @@ public sealed class LiveEntityRuntimeTests
&& exception.Message == "old incarnation cleanup failed");
RuntimeEntityRecord current = CurrentCanonical(runtime, guid);
Assert.Equal((ushort)3, current.Generation);
Assert.Null(current.LocalEntityId);
Assert.NotNull(current.LocalEntityId);
Assert.False(runtime.TryGetRecord(guid, out _));
Assert.Equal(1, resources.RegisterCount);
Assert.Equal(1, resources.UnregisterCount);
@ -2671,7 +2671,7 @@ public sealed class LiveEntityRuntimeTests
Assert.Contains("atomic resource registration", error.Message, StringComparison.Ordinal);
RuntimeEntityRecord current = CurrentCanonical(runtime, guid);
Assert.Equal((ushort)1, current.Generation);
Assert.Null(current.LocalEntityId);
Assert.NotNull(current.LocalEntityId);
Assert.False(runtime.TryGetRecord(guid, out _));
Assert.Equal(1, resources.RegisterCount);
Assert.Equal(1, resources.UnregisterCount);
@ -2695,7 +2695,7 @@ public sealed class LiveEntityRuntimeTests
Assert.Contains("atomic resource registration", error.Message, StringComparison.Ordinal);
RuntimeEntityRecord current = CurrentCanonical(runtime, guid);
Assert.Null(current.LocalEntityId);
Assert.NotNull(current.LocalEntityId);
Assert.False(runtime.TryGetRecord(guid, out _));
Assert.Equal(1, resources.RegisterCount);
Assert.Equal(1, resources.UnregisterCount);