diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index d9961d7e0..107d61eb5 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -8773,10 +8773,12 @@ static void RequireDaemonVersePublication(string root) "[CultDocument(\"gamecult.aetheria.daemon_command_boundary\", \"gamecult.aetheria.daemon_command_boundary.v1\")]", "[CultDocument(\"gamecult.aetheria.daemon_frame\", \"gamecult.aetheria.daemon_frame.v1\")]", "[CultDocument(\"gamecult.aetheria.daemon_command\", \"gamecult.aetheria.daemon_command.v1\")]", - "EveGuiSurfaceWitnessPath", - "EveTuiSurfaceWitnessPath", - "EditorGuiSurfaceWitnessPath", - "EditorTuiSurfaceWitnessPath" + "FrameRecordRef", + "SoaViewRecordRef", + "EveGuiSurfaceRecordRef", + "EveTuiSurfaceRecordRef", + "EditorGuiSurfaceRecordRef", + "EditorTuiSurfaceRecordRef" }; var missingDocumentSymbols = requiredDocumentSymbols .Where(symbol => !daemonDocuments.Contains(symbol, StringComparison.Ordinal)) @@ -8788,6 +8790,30 @@ static void RequireDaemonVersePublication(string root) string.Join(", ", missingDocumentSymbols)); } + var forbiddenDaemonProviderDocumentSymbols = new[] + { + "StateWitnessPath", + "FrameWitnessPath", + "SoaWitnessPath", + "HealthWitnessPath", + "CommandBoundaryWitnessPath", + "EveGuiSurfaceWitnessPath", + "EveTuiSurfaceWitnessPath", + "EditorGuiSurfaceWitnessPath", + "EditorTuiSurfaceWitnessPath", + "AssetManifestWitnessPath" + }; + var daemonProviderDocumentHits = forbiddenDaemonProviderDocumentSymbols + .Where(symbol => daemonDocuments.Contains(symbol, StringComparison.Ordinal) || + daemonEditorSurfaceBuilder.Contains(symbol, StringComparison.Ordinal)) + .ToArray(); + if (daemonProviderDocumentHits.Length > 0) + { + throw new InvalidOperationException( + "Daemon provider advertisement still exposes witness-path vocabulary instead of managed record refs: " + + string.Join(", ", daemonProviderDocumentHits)); + } + if (!daemonSoaDocuments.Contains("[CultDocument(\"gamecult.aetheria.daemon_soa_view\", \"gamecult.aetheria.daemon_soa_view.v1\")]", StringComparison.Ordinal)) { throw new InvalidOperationException("Daemon SoA view is no longer a registered CultCache/CultNet document."); @@ -9444,7 +9470,14 @@ static void RequireDaemonVersePublication(string root) "AetheriaRuntimeDaemonCommandBoundaryDocument commandBoundary", "\"editor.daemon\"", "\"Verse Provider\"", - "\"Witnesses\"", + "\"Managed Records\"", + "\"aetheria.daemon.editor.records\"", + "provider.FrameRecordRef", + "provider.SoaViewRecordRef", + "provider.HealthRecordRef", + "provider.CommandBoundaryRecordRef", + "provider.EveGuiSurfaceRecordRef", + "provider.EditorGuiSurfaceRecordRef", "\"Designer Surfaces\"", "AetheriaRuntimeSurfaceDocument", "\"Typed Commands\"", diff --git a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs index 7e49a61aa..a9b7d89a6 100644 --- a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs +++ b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs @@ -450,25 +450,26 @@ public class DaemonRuntimeDocumentTests Assert.AreEqual("aetheria.daemon", providerAdvertisement.ProviderId); Assert.AreEqual("test-daemon", providerAdvertisement.DaemonId); Assert.AreEqual("cultmesh://aetheria.test/eve/providers/aetheria.daemon", providerAdvertisement.CultMeshAddress); - Assert.AreEqual(AetheriaRuntimeDaemonFrameStore.GetFramePath(statePath), providerAdvertisement.FrameWitnessPath); - Assert.AreEqual(AetheriaRuntimeDaemonPublicationStore.GetHealthPath(statePath), providerAdvertisement.HealthWitnessPath); + Assert.AreEqual(AetheriaRuntimeVerseRecordKeys.DaemonFrameLatest.ToString(), providerAdvertisement.FrameRecordRef); + Assert.AreEqual(AetheriaRuntimeVerseRecordKeys.DaemonSoaViewLatest.ToString(), providerAdvertisement.SoaViewRecordRef); + Assert.AreEqual(AetheriaRuntimeVerseRecordKeys.DaemonHealth.ToString(), providerAdvertisement.HealthRecordRef); Assert.AreEqual( - AetheriaRuntimeDaemonPublicationStore.GetCommandBoundaryPath(statePath), - providerAdvertisement.CommandBoundaryWitnessPath); + AetheriaRuntimeVerseRecordKeys.DaemonCommandBoundary.ToString(), + providerAdvertisement.CommandBoundaryRecordRef); Assert.AreEqual( - AetheriaRuntimeDaemonPublicationStore.GetGameSurfacePath(statePath), - providerAdvertisement.EveGuiSurfaceWitnessPath); + AetheriaRuntimeVerseRecordKeys.DaemonGameSurface.ToString(), + providerAdvertisement.EveGuiSurfaceRecordRef); Assert.AreEqual( - AetheriaRuntimeDaemonPublicationStore.GetGameTuiSurfacePath(statePath), - providerAdvertisement.EveTuiSurfaceWitnessPath); + AetheriaRuntimeVerseRecordKeys.DaemonGameTuiSurface.ToString(), + providerAdvertisement.EveTuiSurfaceRecordRef); Assert.AreEqual(AetheriaRuntimeDaemonGameSurfaceBuilder.SurfaceId, providerAdvertisement.EveGuiSurfaceId); Assert.AreEqual(AetheriaRuntimeDaemonGameSurfaceBuilder.TuiSurfaceId, providerAdvertisement.EveTuiSurfaceId); Assert.AreEqual( - AetheriaRuntimeDaemonPublicationStore.GetEditorSurfacePath(statePath), - providerAdvertisement.EditorGuiSurfaceWitnessPath); + AetheriaRuntimeVerseRecordKeys.DaemonEditorSurface.ToString(), + providerAdvertisement.EditorGuiSurfaceRecordRef); Assert.AreEqual( - AetheriaRuntimeDaemonPublicationStore.GetEditorTuiSurfacePath(statePath), - providerAdvertisement.EditorTuiSurfaceWitnessPath); + AetheriaRuntimeVerseRecordKeys.DaemonEditorTuiSurface.ToString(), + providerAdvertisement.EditorTuiSurfaceRecordRef); Assert.AreEqual(AetheriaRuntimeDaemonEditorSurfaceBuilder.SurfaceId, providerAdvertisement.EditorGuiSurfaceId); Assert.AreEqual(AetheriaRuntimeDaemonEditorSurfaceBuilder.TuiSurfaceId, providerAdvertisement.EditorTuiSurfaceId); CollectionAssert.Contains(providerAdvertisement.PublishedSchemas, AetheriaRuntimeDaemonSchemas.Command); diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonDocuments.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonDocuments.cs index dc3aa71a6..a19266fb2 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonDocuments.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonDocuments.cs @@ -213,25 +213,25 @@ namespace GameCult.Aetheria.State.Verse public string PublishedAtUtc { get; set; } = ""; [Key(5)] - public string StateWitnessPath { get; set; } = ""; + public string StateRecordRef { get; set; } = ""; [Key(6)] - public string FrameWitnessPath { get; set; } = ""; + public string FrameRecordRef { get; set; } = ""; [Key(7)] - public string SoaWitnessPath { get; set; } = ""; + public string SoaViewRecordRef { get; set; } = ""; [Key(8)] - public string HealthWitnessPath { get; set; } = ""; + public string HealthRecordRef { get; set; } = ""; [Key(9)] - public string CommandBoundaryWitnessPath { get; set; } = ""; + public string CommandBoundaryRecordRef { get; set; } = ""; [Key(10)] - public string EveGuiSurfaceWitnessPath { get; set; } = ""; + public string EveGuiSurfaceRecordRef { get; set; } = ""; [Key(11)] - public string EveTuiSurfaceWitnessPath { get; set; } = ""; + public string EveTuiSurfaceRecordRef { get; set; } = ""; [Key(12)] public string EveGuiSurfaceId { get; set; } = "aetheria.game"; @@ -240,10 +240,10 @@ namespace GameCult.Aetheria.State.Verse public string EveTuiSurfaceId { get; set; } = "aetheria.game.tui"; [Key(14)] - public string EditorGuiSurfaceWitnessPath { get; set; } = ""; + public string EditorGuiSurfaceRecordRef { get; set; } = ""; [Key(15)] - public string EditorTuiSurfaceWitnessPath { get; set; } = ""; + public string EditorTuiSurfaceRecordRef { get; set; } = ""; [Key(16)] public string EditorGuiSurfaceId { get; set; } = "aetheria.daemon.editor"; @@ -261,7 +261,7 @@ namespace GameCult.Aetheria.State.Verse public string CultMeshAddress { get; set; } = "cultmesh://aetheria.local/eve/providers/aetheria.daemon"; [Key(21)] - public string AssetManifestWitnessPath { get; set; } = ""; + public string AssetManifestRecordRef { get; set; } = ""; public static AetheriaRuntimeDaemonProviderAdvertisementDocument Create( string stateFilePath, @@ -274,18 +274,18 @@ namespace GameCult.Aetheria.State.Verse VerseId = string.IsNullOrWhiteSpace(verseId) ? "aetheria.local" : verseId, DaemonId = string.IsNullOrWhiteSpace(daemonId) ? "aetheria-daemon" : daemonId, PublishedAtUtc = DateTime.UtcNow.ToString("O"), - StateWitnessPath = stateFilePath ?? "", - FrameWitnessPath = AetheriaRuntimeStateBoundary.GetDaemonFramePath(stateFilePath ?? ""), - SoaWitnessPath = AetheriaRuntimeStateBoundary.GetDaemonSoaViewPath(stateFilePath ?? ""), - HealthWitnessPath = AetheriaRuntimeStateBoundary.GetDaemonHealthPath(stateFilePath ?? ""), - AssetManifestWitnessPath = AetheriaRuntimeStateBoundary.GetDaemonAssetManifestPath(stateFilePath ?? ""), - CommandBoundaryWitnessPath = AetheriaRuntimeStateBoundary.GetDaemonCommandBoundaryPath(stateFilePath ?? ""), - EveGuiSurfaceWitnessPath = AetheriaRuntimeStateBoundary.GetDaemonGameSurfacePath(stateFilePath ?? ""), - EveTuiSurfaceWitnessPath = AetheriaRuntimeStateBoundary.GetDaemonGameTuiSurfacePath(stateFilePath ?? ""), + StateRecordRef = stateFilePath ?? "", + FrameRecordRef = AetheriaRuntimeVerseRecordKeys.DaemonFrameLatest.ToString(), + SoaViewRecordRef = AetheriaRuntimeVerseRecordKeys.DaemonSoaViewLatest.ToString(), + HealthRecordRef = AetheriaRuntimeVerseRecordKeys.DaemonHealth.ToString(), + AssetManifestRecordRef = AetheriaRuntimeVerseRecordKeys.DaemonAssetManifest.ToString(), + CommandBoundaryRecordRef = AetheriaRuntimeVerseRecordKeys.DaemonCommandBoundary.ToString(), + EveGuiSurfaceRecordRef = AetheriaRuntimeVerseRecordKeys.DaemonGameSurface.ToString(), + EveTuiSurfaceRecordRef = AetheriaRuntimeVerseRecordKeys.DaemonGameTuiSurface.ToString(), EveGuiSurfaceId = AetheriaRuntimeDaemonGameSurfaceBuilder.SurfaceId, EveTuiSurfaceId = AetheriaRuntimeDaemonGameSurfaceBuilder.TuiSurfaceId, - EditorGuiSurfaceWitnessPath = AetheriaRuntimeStateBoundary.GetDaemonEditorSurfacePath(stateFilePath ?? ""), - EditorTuiSurfaceWitnessPath = AetheriaRuntimeStateBoundary.GetDaemonEditorTuiSurfacePath(stateFilePath ?? ""), + EditorGuiSurfaceRecordRef = AetheriaRuntimeVerseRecordKeys.DaemonEditorSurface.ToString(), + EditorTuiSurfaceRecordRef = AetheriaRuntimeVerseRecordKeys.DaemonEditorTuiSurface.ToString(), EditorGuiSurfaceId = AetheriaRuntimeDaemonEditorSurfaceBuilder.SurfaceId, EditorTuiSurfaceId = AetheriaRuntimeDaemonEditorSurfaceBuilder.TuiSurfaceId, CultMeshAddress = string.IsNullOrWhiteSpace(cultMeshAddress) diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonEditorSurfaceBuilder.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonEditorSurfaceBuilder.cs index 1cdd7c663..058659487 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonEditorSurfaceBuilder.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonEditorSurfaceBuilder.cs @@ -45,17 +45,17 @@ namespace GameCult.Aetheria.State.Verse Metric("aetheria.daemon.editor.provider.provider", "Provider", provider.ProviderId), Metric("aetheria.daemon.editor.provider.daemon", "Daemon", provider.DaemonId), Metric("aetheria.daemon.editor.provider.transport", "CultMesh", provider.CultMeshAddress), - Metric("aetheria.daemon.editor.provider.state", "State Witness", provider.StateWitnessPath)), + Metric("aetheria.daemon.editor.provider.state", "State", provider.StateRecordRef)), Node( - "aetheria.daemon.editor.witnesses", + "aetheria.daemon.editor.records", "card", - new[] { ("title", "Witnesses") }, - Metric("aetheria.daemon.editor.witnesses.frame", "Frame", provider.FrameWitnessPath), - Metric("aetheria.daemon.editor.witnesses.soa", "SoA", provider.SoaWitnessPath), - Metric("aetheria.daemon.editor.witnesses.health", "Health", provider.HealthWitnessPath), - Metric("aetheria.daemon.editor.witnesses.commands", "Command Boundary", provider.CommandBoundaryWitnessPath), - Metric("aetheria.daemon.editor.witnesses.game", "Game Surface", provider.EveGuiSurfaceWitnessPath), - Metric("aetheria.daemon.editor.witnesses.editor", "Editor Surface", provider.EditorGuiSurfaceWitnessPath)), + new[] { ("title", "Managed Records") }, + Metric("aetheria.daemon.editor.records.frame", "Frame", provider.FrameRecordRef), + Metric("aetheria.daemon.editor.records.soa", "SoA", provider.SoaViewRecordRef), + Metric("aetheria.daemon.editor.records.health", "Health", provider.HealthRecordRef), + Metric("aetheria.daemon.editor.records.commands", "Command Boundary", provider.CommandBoundaryRecordRef), + Metric("aetheria.daemon.editor.records.game", "Game Surface", provider.EveGuiSurfaceRecordRef), + Metric("aetheria.daemon.editor.records.editor", "Editor Surface", provider.EditorGuiSurfaceRecordRef)), Node( "aetheria.daemon.editor.health", "card", diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeVerseClient.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeVerseClient.cs index 85689ba92..b88ebff9c 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeVerseClient.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeVerseClient.cs @@ -27,6 +27,9 @@ namespace GameCult.Aetheria.State.Verse public static CultRecordKey DaemonCommandBoundary { get; } = new CultRecordKey("daemon:aetheria.command_boundary.v1"); + public static CultRecordKey DaemonAssetManifest { get; } = + new CultRecordKey("daemon:aetheria.asset_manifest.v1"); + public static CultRecordKey VerseAuthorityPolicy { get; } = new CultRecordKey(AetheriaRuntimeVerseAuthorityPolicyDocument.DocumentKey);