From 2647f10d20f37ea61d45708dd71802ddd58987bb Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 30 Sep 2026 07:02:06 +0200 Subject: [PATCH] C#: a rewrite keeps the catalog entry that publishes a record's schema as a compatible id The single-file and directory writers dropped an entry whose own id no record carried, leaving a record under a compatible id with no catalog entry that publishes it: the same store nothing could open. An entry now stays while it publishes any id a record carries. The conditional-commit readability test over compatible-id-only-v3 pins it. Co-Authored-By: Claude Sonnet 5.5 --- .../DirectoryMessagePackBackingStore.cs | 2 +- src/GameCult.Caching/CultCache.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/GameCult.Caching.MessagePack/DirectoryMessagePackBackingStore.cs b/src/GameCult.Caching.MessagePack/DirectoryMessagePackBackingStore.cs index dff49c50..15f4423c 100644 --- a/src/GameCult.Caching.MessagePack/DirectoryMessagePackBackingStore.cs +++ b/src/GameCult.Caching.MessagePack/DirectoryMessagePackBackingStore.cs @@ -259,7 +259,7 @@ public sealed class DirectoryMessagePackBackingStore : CacheBackingStore .ToArray(); var usedSchemaIds = currentIndex.Values.Select(record => record.SchemaId).ToHashSet(StringComparer.Ordinal); var targetCatalog = catalogCandidates - .Where(entry => usedSchemaIds.Contains(entry.SchemaId)) + .Where(entry => usedSchemaIds.Contains(entry.SchemaId) || entry.CompatibleSchemaIds.Any(usedSchemaIds.Contains)) .OrderBy(entry => entry.SchemaName, StringComparer.Ordinal) .ToArray(); var keysToWrite = _dirtyKeys.Keys diff --git a/src/GameCult.Caching/CultCache.cs b/src/GameCult.Caching/CultCache.cs index f40d2d26..2a695857 100644 --- a/src/GameCult.Caching/CultCache.cs +++ b/src/GameCult.Caching/CultCache.cs @@ -3640,7 +3640,8 @@ namespace GameCult.Caching SchemaCatalog = catalog .GroupBy(entry => entry.SchemaId, StringComparer.Ordinal) .Select(group => group.First()) - .Where(entry => used.Contains(entry.SchemaId)) + // An entry stays while it publishes a schema id some record carries, as its own id or a compatible one. + .Where(entry => used.Contains(entry.SchemaId) || entry.CompatibleSchemaIds.Any(used.Contains)) .OrderBy(entry => entry.SchemaName, StringComparer.Ordinal) .ToArray(), Records = ordered