Mark every Cult document [MessagePackObject]

PlayerData, CultMeshSimulationFact, the Networking interop peer's
CultNetInteropNote, the cultnet-py benchmark item and the Caching test
documents lacked [MessagePackObject]. Only the generated codec could
serialize them; MessagePackSerializer refuses such types. Non-public test
documents take [MessagePackObject(AllowPrivate = true)], as consumer
internal documents already do, and ConditionalCommitTests.Slow marks its
private backing fields [IgnoreMember].

Same [Key]s, so payloads are unchanged: a pre/post probe over the
Networking assembly and both interop peers showed identical schema id,
content hash and payload bytes for all 9 documents, PlayerData equal once
its Guid.NewGuid() default id is masked.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-09-13 23:38:08 +02:00
commit a5d1be650d
8 changed files with 19 additions and 2 deletions

View file

@ -94,6 +94,7 @@ internal sealed record BenchmarkResult(string Runtime, int Records, IReadOnlyLis
internal sealed record BenchmarkMetric(string Name, int Operations, double ElapsedMs, double OpsPerSecond);
[CultDocument("bench.item", "bench.item.v1")]
[MessagePackObject(AllowPrivate = true)]
internal sealed class BenchItem
{
[Key(0)] [CultName]

View file

@ -13,6 +13,7 @@ namespace GameCult.Mesh
/// Committed simulation fact derived from witness consensus.
/// </summary>
[CultDocument("gamecult.mesh.simulation_fact", "gamecult.mesh.simulation_fact.v1")]
[MessagePackObject]
public sealed class CultMeshSimulationFact
{
/// <summary>

View file

@ -8,6 +8,7 @@ namespace GameCult.Networking
/// Basic player account document used by the sample networking stack.
/// </summary>
[CultDocument("gamecult.player_data", "gamecult.player_data.v2")]
[MessagePackObject]
public class PlayerData
{
/// <summary>

View file

@ -911,6 +911,7 @@ namespace GameCult.Caching.Tests
}
[CultDocument("tests.conditional_counter", "tests.conditional_counter.v1")]
[MessagePackObject(AllowPrivate = true)]
internal sealed class Counter
{
[Key(0)]
@ -922,6 +923,7 @@ namespace GameCult.Caching.Tests
}
[CultDocument("tests.conditional_tally", "tests.conditional_tally.v1")]
[MessagePackObject(AllowPrivate = true)]
internal sealed class Tally
{
[Key(0)]
@ -931,14 +933,15 @@ namespace GameCult.Caching.Tests
// Loading a record with Blocks set waits on Pause, which parks a directory pull inside its page load.
[CultDocument("tests.conditional_slow", "tests.conditional_slow.v1")]
[MessagePackObject(AllowPrivate = true)]
internal sealed class Slow
{
internal static volatile ManualResetEventSlim? Pause;
internal static readonly ManualResetEventSlim Entered = new();
internal static volatile bool Paused;
internal static volatile bool ReadWhilePaused;
private bool _blocks;
private string _name = string.Empty;
[IgnoreMember] private bool _blocks;
[IgnoreMember] private string _name = string.Empty;
[Key(0)]
[CultName]

View file

@ -228,6 +228,7 @@ namespace GameCult.Caching.Tests
Path.Combine(_records, BitConverter.ToString(identity).Replace("-", string.Empty).ToLowerInvariant() + ".msgpack");
[CultDocument("tests.durability_page", "tests.durability_page.v1")]
[MessagePackObject(AllowPrivate = true)]
internal sealed class Page
{
[Key(0)]

View file

@ -4,6 +4,7 @@ using MessagePack;
namespace GameCult.Caching.Tests
{
[CultDocument("fixtures.precut2.item", "fixtures.precut2.item.v1")]
[MessagePackObject(AllowPrivate = true)]
internal sealed class PreCut2FixtureItem
{
[Key(0)]
@ -15,6 +16,7 @@ namespace GameCult.Caching.Tests
}
[CultDocument("fixtures.precut2.note", "fixtures.precut2.note.v1")]
[MessagePackObject(AllowPrivate = true)]
internal sealed class PreCut2FixtureNote
{
[Key(0)]

View file

@ -707,6 +707,7 @@ namespace GameCult.Caching.Tests
}
[CultDocument("tests.routing_note", "tests.routing_note.v1")]
[MessagePackObject(AllowPrivate = true)]
internal sealed class RoutingNote
{
[Key(0)]
@ -718,6 +719,7 @@ namespace GameCult.Caching.Tests
}
[CultDocument("tests.routing_other", "tests.routing_other.v1")]
[MessagePackObject(AllowPrivate = true)]
internal sealed class RoutingOther
{
[Key(0)]
@ -729,6 +731,7 @@ namespace GameCult.Caching.Tests
}
[CultDocument("tests.routing_gear", "tests.routing_gear.v1")]
[MessagePackObject]
public class RoutingGear
{
[Key(0)]
@ -736,6 +739,7 @@ namespace GameCult.Caching.Tests
}
[CultDocument("tests.routing_weapon", "tests.routing_weapon.v1")]
[MessagePackObject]
public sealed class RoutingWeapon : RoutingGear
{
[Key(1)]
@ -747,6 +751,7 @@ namespace GameCult.Caching.Tests
}
[CultDocument("tests.routing_leaf", "tests.routing_leaf.v1")]
[MessagePackObject(AllowPrivate = true)]
internal sealed class RoutingLeaf : RoutingBase
{
[Key(0)]
@ -755,6 +760,7 @@ namespace GameCult.Caching.Tests
}
[CultDocument("tests.routing_leaf_twin", "tests.routing_leaf_twin.v1")]
[MessagePackObject(AllowPrivate = true)]
internal sealed class RoutingLeafTwin : RoutingBase
{
[Key(0)]
@ -767,6 +773,7 @@ namespace GameCult.Caching.Tests
}
[CultDocument("tests.routing_global", "tests.routing_global.v1")]
[MessagePackObject(AllowPrivate = true)]
[CultGlobal]
internal sealed class RoutingGlobal : RoutingGlobalBase
{

View file

@ -1490,6 +1490,7 @@ static class InteropPeerShared
}
[CultDocument(InteropPeerShared.InteropDocumentType, InteropPeerShared.InteropSchemaVersion)]
[MessagePackObject]
public sealed class CultNetInteropNote
{
[Key(0)] public string SchemaVersion { get; set; } = InteropPeerShared.InteropSchemaVersion;