diff --git a/Aetheria.State.Daemon/Program.cs b/Aetheria.State.Daemon/Program.cs index 24fa5df81..02f775814 100644 --- a/Aetheria.State.Daemon/Program.cs +++ b/Aetheria.State.Daemon/Program.cs @@ -199,10 +199,9 @@ static async Task TickAsync( authorityLeases).ConfigureAwait(false); } - AetheriaRuntimeDaemonFrameStore.PublishFrame(node.StatePath, result.Frame); - if (publishWitnesses) { + AetheriaRuntimeDaemonFrameStore.PublishFrame(node.StatePath, result.Frame); await PublishDaemonApiDocumentsAsync(node, result).ConfigureAwait(false); await PublishStateSurfacesAsync(node, options, result.Frame.PublishedAtUtc).ConfigureAwait(false); } diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index a8f068845..080a3773f 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -9190,6 +9190,29 @@ static void RequireDaemonVersePublication(string root) "Daemon tick must pass the typed health document through surface builders instead of reopening its witness file."); } + var daemonTickStart = daemonHostSource.IndexOf( + "static async Task TickAsync(", + StringComparison.Ordinal); + var daemonTickEnd = daemonTickStart >= 0 + ? daemonHostSource.IndexOf("static async Task PublishCommittedCommandFactsAsync", daemonTickStart, StringComparison.Ordinal) + : -1; + var daemonTickBlock = daemonTickStart >= 0 && daemonTickEnd > daemonTickStart + ? daemonHostSource.Substring(daemonTickStart, daemonTickEnd - daemonTickStart) + : ""; + var publishWitnessBlockStart = daemonTickBlock.IndexOf( + "if (publishWitnesses)", + StringComparison.Ordinal); + var frameWitnessPublishIndex = daemonTickBlock.IndexOf( + "AetheriaRuntimeDaemonFrameStore.PublishFrame(node.StatePath, result.Frame)", + StringComparison.Ordinal); + if (frameWitnessPublishIndex < 0 || + publishWitnessBlockStart < 0 || + frameWitnessPublishIndex < publishWitnessBlockStart) + { + throw new InvalidOperationException( + "Daemon ticks must keep legacy frame witness writes inside the API publication cadence; managed frames carry per-tick state."); + } + var snapshotHandlerStart = daemonHostSource.IndexOf( "server.OnCultNet", StringComparison.Ordinal);