Remove the Eve surface from Ymir.Core (parked at parked/ymir-eve-surface)

Eve is deprecated; per thing2:ruling:eve-dashboards-quarantined the surface builders, EveSurfaceDocument publication, GameCult.Eve.Surface reference and EveRoot are gone. YmirOperatorStateDocument and its publication stay.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-22 20:02:38 +02:00
commit 21e7c43777
5 changed files with 7 additions and 90 deletions

View file

@ -23,7 +23,7 @@ installing a second solver.
- Ymir owns the pinned Box3D version, stable GameCult entity ids, - Ymir owns the pinned Box3D version, stable GameCult entity ids,
native ABI isolation, public in-process retained sessions, explicit mutation native ABI isolation, public in-process retained sessions, explicit mutation
receipts, typed contact facts, snapshot lowering, deterministic result receipts, typed contact facts, snapshot lowering, deterministic result
ordering, versioned CultCache snapshots, and a diagnostic Eve publication. ordering, versioned CultCache snapshots.
- An optional Ymir daemon may own named session routing, durable command receipts, - An optional Ymir daemon may own named session routing, durable command receipts,
checkpoint reconstruction, CultMesh command/fact publication, and process checkpoint reconstruction, CultMesh command/fact publication, and process
supervision for worlds it hosts. It is not part of Aetheria's gameplay path. supervision for worlds it hosts. It is not part of Aetheria's gameplay path.

View file

@ -64,8 +64,8 @@ public Aetheria frame last. The public frame is the only commit marker. Orphaned
private records cannot advance gameplay truth, and restart fails closed once private records cannot advance gameplay truth, and restart fails closed once
the persistence capability has been activated. Complete replay history is not the persistence capability has been activated. Complete replay history is not
product state and never rides in public client frames. The current CLI still product state and never rides in public client frames. The current CLI still
has no named session registry or CultMesh command lowerings; its CultCache and has no named session registry or CultMesh command lowerings; its CultCache
Eve output remains a regenerated diagnostic projection. output remains a regenerated diagnostic projection.
## Target Inputs ## Target Inputs
@ -98,7 +98,6 @@ not alter their membership or invent missing contacts.
are not a second live solver. are not a second live solver.
- SoA body documents are transport and inspection projections over the live - SoA body documents are transport and inspection projections over the live
session. session.
- Eve surfaces are presentation projections over Ymir state and receipts.
- Unity GameObjects and Electron objects are render state only. - Unity GameObjects and Electron objects are render state only.
- Aetheria damage, loot, capacity, faction, and scoring consequences are - Aetheria damage, loot, capacity, faction, and scoring consequences are
derived from Ymir facts plus Aetheria policy. derived from Ymir facts plus Aetheria policy.

View file

@ -1,15 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<EveRoot Condition="'$(EveRoot)' == ''">$(MSBuildThisFileDirectory)..\..\..\Eve</EveRoot>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Ymir.Box3D\Ymir.Box3D.csproj" /> <ProjectReference Include="..\Ymir.Box3D\Ymir.Box3D.csproj" />
<ProjectReference Include="$(CultLibRoot)\src\GameCult.Caching\GameCult.Caching.csproj" /> <ProjectReference Include="$(CultLibRoot)\src\GameCult.Caching\GameCult.Caching.csproj" />
<ProjectReference Include="$(CultLibRoot)\src\GameCult.Caching.MessagePack\GameCult.Caching.MessagePack.csproj" /> <ProjectReference Include="$(CultLibRoot)\src\GameCult.Caching.MessagePack\GameCult.Caching.MessagePack.csproj" />
<ProjectReference Include="$(EveRoot)\packages\org.gamecult.eve.surface\GameCult.Eve.Surface.csproj"
AdditionalProperties="CultLibRoot=$(CultLibRoot)" />
<ProjectReference Include="$(CultLibRoot)\packages\cultmath\src\CultMath\CultMath.csproj" /> <ProjectReference Include="$(CultLibRoot)\packages\cultmath\src\CultMath\CultMath.csproj" />
</ItemGroup> </ItemGroup>

View file

@ -1,6 +1,5 @@
using GameCult.Caching; using GameCult.Caching;
using GameCult.Caching.MessagePack; using GameCult.Caching.MessagePack;
using GameCult.Eve.Surface;
using MessagePack; using MessagePack;
namespace Ymir.Core; namespace Ymir.Core;
@ -91,8 +90,7 @@ public static class YmirServicePublication
"Box3D-backed circle overlap and cast queries over submitted bodies", "Box3D-backed circle overlap and cast queries over submitted bodies",
"deterministic result ordering", "deterministic result ordering",
"checksummed replay checkpoint reconstruction bound to the pinned native build", "checksummed replay checkpoint reconstruction bound to the pinned native build",
"CultCache world snapshot v2 with explicit v1/v0 read migration", "CultCache world snapshot v2 with explicit v1/v0 read migration"
"diagnostic Eve publication"
], ],
DoesNotOwn = DoesNotOwn =
[ [
@ -121,31 +119,11 @@ public static class YmirServicePublication
UpdatedAtUtc = FormatUtc(now) UpdatedAtUtc = FormatUtc(now)
}; };
public static EveSurfaceDocument EveSurface(YmirOperatorStateDocument diagnostics) =>
GameCult.Eve.Surface.EveSurface.Create("ymir.physics.operator")
.Provider(diagnostics.ProviderId, "physics.operator")
.Title("Ymir Physics")
.UpdatedAtUtc(diagnostics.UpdatedAtUtc)
.RootColumn("ymir.physics.operator.root", root => root
.Metric("ymir.physics.operator.status", "Status", diagnostics.Status)
.Metric("ymir.physics.operator.owner", "State owner", diagnostics.StateOwner)
.Metric("ymir.physics.operator.math", "Numeric substrate", diagnostics.NumericSubstrate)
.Metric("ymir.physics.operator.batch", "Batch kernel", diagnostics.BatchKernel)
.Metric("ymir.physics.operator.persistence", "Persistence", diagnostics.Persistence))
.Build();
public static EveSurfaceDocument EveSurface(DateTimeOffset now)
{
return EveSurface(OperatorState(now));
}
private static string FormatUtc(DateTimeOffset value) => value.UtcDateTime.ToString("O"); private static string FormatUtc(DateTimeOffset value) => value.UtcDateTime.ToString("O");
} }
public static class YmirServicePublicationStore public static class YmirServicePublicationStore
{ {
public const string SurfaceRecordKey = "surface:ymir.physics.operator";
public static async Task RegenerateDerivedStoreAsync(string path, DateTimeOffset now) public static async Task RegenerateDerivedStoreAsync(string path, DateTimeOffset now)
{ {
DeleteDerivedStore(path); DeleteDerivedStore(path);
@ -174,10 +152,6 @@ public static class YmirServicePublicationStore
operatorState, operatorState,
new CultRecordHandle<YmirOperatorStateDocument>(new CultRecordKey("ymir:operator:ymir.physics"))) new CultRecordHandle<YmirOperatorStateDocument>(new CultRecordKey("ymir:operator:ymir.physics")))
.ConfigureAwait(false); .ConfigureAwait(false);
await cache.UpsertAsync(
YmirServicePublication.EveSurface(operatorState),
new CultRecordHandle<EveSurfaceDocument>(new CultRecordKey(SurfaceRecordKey)))
.ConfigureAwait(false);
await cache.FlushAsync().ConfigureAwait(false); await cache.FlushAsync().ConfigureAwait(false);
} }
} }

View file

@ -1,6 +1,5 @@
using GameCult.Caching; using GameCult.Caching;
using GameCult.Caching.MessagePack; using GameCult.Caching.MessagePack;
using GameCult.Eve.Surface;
using Ymir.Core; using Ymir.Core;
namespace Ymir.Tests; namespace Ymir.Tests;
@ -30,53 +29,6 @@ public sealed class YmirServicePublicationTests
Assert.Equal("box3d-retained-session", diagnostics.Status); Assert.Equal("box3d-retained-session", diagnostics.Status);
} }
[Fact]
public void EveSurfaceUsesCanonicalDocumentAndOperatorMetrics()
{
var diagnostics = new YmirOperatorStateDocument
{
ProviderId = "ymir.physics",
Status = "ready",
StateOwner = "diagnostic-owner",
NumericSubstrate = "diagnostic-math",
BatchKernel = "diagnostic-batch",
Persistence = "diagnostic-persistence",
UpdatedAtUtc = "2026-07-13T12:00:00.0000000Z"
};
EveSurfaceDocument surface = YmirServicePublication.EveSurface(diagnostics);
Assert.Equal(EveSurfaceDocument.SchemaId, surface.Schema);
Assert.Equal("ymir.physics.operator", surface.Surface.Id);
Assert.Equal("partition", surface.Surface.Root.Kind);
Assert.Equal(diagnostics.UpdatedAtUtc, surface.UpdatedAtUtc);
Assert.Equal(
new[]
{
("Status", diagnostics.Status),
("State owner", diagnostics.StateOwner),
("Numeric substrate", diagnostics.NumericSubstrate),
("Batch kernel", diagnostics.BatchKernel),
("Persistence", diagnostics.Persistence)
},
surface.Surface.Root.Children
.Select(child => (child.GetProp("label"), child.GetProp("value")))
.ToArray());
}
[Fact]
public void CombinedRegistryContainsExactlyOneCanonicalSurfaceDescriptor()
{
var registry = new CultDocumentRegistry();
var descriptors = registry.AllDescriptors
.Where(descriptor => descriptor.SchemaVersion == EveSurfaceDocument.SchemaId)
.ToArray();
var descriptor = Assert.Single(descriptors);
Assert.Equal(typeof(EveSurfaceDocument), descriptor.DocumentType);
}
[Fact] [Fact]
public async Task PublicationPersistsAndReopensWithCombinedRegistry() public async Task PublicationPersistsAndReopensWithCombinedRegistry()
{ {
@ -91,10 +43,8 @@ public sealed class YmirServicePublicationTests
UseDirectoryStore = true UseDirectoryStore = true
}); });
var surface = cache.Get<EveSurfaceDocument>(new CultRecordKey(YmirServicePublicationStore.SurfaceRecordKey)); Assert.NotNull(cache.Get<YmirOperatorStateDocument>(new CultRecordKey("ymir:operator:ymir.physics")));
Assert.NotNull(surface); Assert.Single(cache.GetAll<YmirOperatorStateDocument>());
Assert.Equal("ymir.physics.operator", surface.Surface.Id);
Assert.Single(cache.GetAll<EveSurfaceDocument>());
} }
finally finally
{ {
@ -121,7 +71,7 @@ public sealed class YmirServicePublicationTests
Registry = new CultDocumentRegistry(), Registry = new CultDocumentRegistry(),
UseDirectoryStore = true UseDirectoryStore = true
}); });
Assert.NotNull(cache.Get<EveSurfaceDocument>(new CultRecordKey(YmirServicePublicationStore.SurfaceRecordKey))); Assert.NotNull(cache.Get<YmirOperatorStateDocument>(new CultRecordKey("ymir:operator:ymir.physics")));
Assert.False(File.Exists(Path.Combine(recordsPath, "legacy.msgpack"))); Assert.False(File.Exists(Path.Combine(recordsPath, "legacy.msgpack")));
} }
finally finally