diff --git a/Aetheria.State.Daemon.Smoke/Program.cs b/Aetheria.State.Daemon.Smoke/Program.cs index 94ef2664a..e1c8f298b 100644 --- a/Aetheria.State.Daemon.Smoke/Program.cs +++ b/Aetheria.State.Daemon.Smoke/Program.cs @@ -953,6 +953,8 @@ internal sealed class AetheriaDaemonYmirSmokeChecks node.Kind is "feedback.event" or "shot.receipt"), "the static pilot surface must not retain mutable gameplay facts"); var reactive = AetheriaRuntimeDaemonGameSurfaceBuilder.BuildReactiveGameplay(tick.Frame); + Require(reactive.Version == interruption.FrameId, + "reactive Eve surfaces and command receipts must share daemon frame-version semantics"); Require(Flatten(reactive.Surface.Root).Any(node => node.Kind == "feedback.event" && node.Props["eventKind"] == "simulation.interrupted" && node.Props["reason"] == "entity.damaged" && diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonGameSurfaceBuilder.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonGameSurfaceBuilder.cs index e4d41fa4f..808104267 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonGameSurfaceBuilder.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonGameSurfaceBuilder.cs @@ -206,12 +206,11 @@ namespace GameCult.Aetheria.State.Verse .Concat(receipts.Select(value => value.FrameId)) .DefaultIfEmpty(0) .Max(); - var version = checked(lastFrame * 100000L + events.Length * 100L + receipts.Length); return new AetheriaRuntimeSurfaceDocument( AetheriaRuntimeProviderIdentity.ProviderId, "game.daemon", "Aetheria Pilot Reactive State", - version, + lastFrame, frame.PublishedAtUtc, new AetheriaRuntimeSurfaceTree( "aetheria.daemon.game.reactive",