CultLib/tests/GameCult.Mesh.Tests
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Meta Vens 568e8e356f CultNet selection cut1, commit 2 fix batch: door, shard-via-evaluator, Mesh v0 refusal, dead Reconcile code, mutation harness crash handling
Soul found commit 2 didn't pass (docs/cultnet-selection-cut.md, 2026-09-22):
empty/blank schemas-keys still reached the evaluator, the shard snapshot ran
its own loop instead of the evaluator, Mesh's v0 wire silently dropped v1-only
selection terms, the Mesh one-pass read could return the wrong schema's
record at a shared key, two decode rules for a foreign schema id disagreed,
dead identity-comparison code from the _projectRecord removal was still live,
and a disposed-socket race could abort a mutation run instead of recording
NO VERDICT. This is Self's fix batch for all of it.

- CultNetSelection.Validate now refuses a blank/whitespace entry inside
  schemas or keys, not just an empty array. CultNetSelectionEvaluator no
  longer treats [] as "no filter" (the door already refuses it before
  evaluation). CultNetV0SelectionLowering is the one place that lowers an
  empty or all-blank v0 list to null; CreateRawSnapshotResponse and
  CreateShardSnapshotResponse both route through it, and CultMesh's own
  Clean() now delegates to it instead of duplicating the rule.
- CreateShardSnapshotResponse no longer carries a private loop or its own
  schema/key matching: it builds a CultNetSelection and answers through
  CultNetDocumentRegistry.SelectPage (the same evaluator path as the
  non-shard snapshot), with the shard's own membership check as a row
  filter. Binding-alias expansion now runs on both paths identically.
- ResolveDefaultSelection decides "no schema filter" from the cleaned
  recordKeys, not the raw array length. OverlaySelection stops deciding what
  a missing override means: any explicit schemaIds/recordKeys override
  replaces the default selection wholesale; no override keeps the default
  untouched.
- CultMeshSnapshotRequestOptions.Selection is now checked by
  EnsureV0Compatible before every send: fields, cites, cited, limit, cursor,
  descending, and any non-default projection are refused typed
  (CultNetSelectionInvalidException), never silently dropped from the v0
  wire message. Mesh sending v1 is FU-Mesh-v1, not this cut.
- CultMeshHotBodySubscription.Selection returns a defensive copy on every
  read so its arrays can't be mutated out from under the stored selection.
- ReadDocumentFromSnapshotResponse now searches candidates at one recordKey
  in one order - exact schema, then alias, then a foreign schema id decoded
  from the payload - instead of one OR'd condition where a case-insensitive
  or structurally-lucky candidate could win first. The foreign-id decode
  reads the payload's embedded schema version with the registry's shared
  CultNetDocumentRegistry.TryReadSchemaVersion and alias-matches it against
  the caller's own descriptor directly, rather than resolving to "whichever
  registered type owns this schema string" - that resolution is ambiguous
  when two document types alias the same schema id (MeshNoteDocument and
  MeshNoteAliasDocument in the existing fixtures), which is what broke on
  the first pass; TryResolveDescriptorByPayloadSchema stays for its existing
  caller (ResolveDescriptorForRawDocument) with a note on when not to use it.
  DecodeSnapshotDocuments and the Mesh copy of the payload-schema decode
  (RawSnapshotPayloadMatchesSchema/TryReadSchemaVersion) are deleted in
  favour of the shared one.
- CultNetDatabaseSubscriptionServer: the dead RecordKey/SchemaId identity
  comparisons in Reconcile and ApplyProjectedChange, and the duplicate-key
  throw in CreateProjectedSnapshot, are deleted - they can no longer fire
  now that a projection's dictionary key is always the record's own key.
  A new test flips authorizeRecord per key while the whole request stays
  authorized (so DemandActive never toggles) and proves both halves of the
  remaining diff: the removal of a now-unauthorized key and the add loop
  picking up a newly-authorized one.
- Every NetworkingTests.cs test that starts an IsBackground poll thread now
  joins it before its server disposes (about 20 tests; one already did).
- scripts/mutate-dotnet.ps1: a dotnet-test-host crash writing to stderr no
  longer throws the whole run away under PowerShell 5.1's
  $ErrorActionPreference = 'Stop' (2>&1 on a native command wraps stderr in
  a terminating NativeCommandError); Run-Tests catches it and the entry loop
  records NO VERDICT instead of aborting every remaining entry.
- Two probe tests: CultNetDatabase_ShardAndNonShardSnapshot_Agree{On
  UnfilteredRequest,OnBindingSchemaIdOverride} prove the shard and non-shard
  snapshot paths agree, including shard-membership exclusion of a document
  outside the shard's key prefix and a binding schema-id override matching
  on both paths.
- Mutation entries updated/added to match: the stale NET-D4-FourthMatcher
  entry (its anchor was the private loop this batch deleted, not refactored)
  is replaced by NET-D4-ShardMembership-Revert; the Mesh entries file's
  header miscount ("two of three" loosening entries when there are only
  two) is corrected and both previously-surviving loosening mutants
  (MESH-DEFAULT-Loosening, MESH-KEY-Loosening) now have killing fixtures;
  scripts/mutate-cultnet-selection-fixbatch2.entries.ps1 is new, covering
  Reconcile's remaining two mutants.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 06:13:15 +02:00
..
CultMeshAuthorityProofTests.cs Pin the TypeScript-signed direction of the authority parity check 2026-09-16 16:27:06 +02:00
CultMeshAuthorityResolverTests.cs Centralize CultMesh authority resolution 2026-07-13 14:00:26 +01:00
CultMeshBodyPublicationTests.cs Keep exact live subscriptions active before publication 2026-07-19 11:49:18 +01:00
CultMeshBodySessionTests.cs Authenticate CultMesh authority routes and replay operations 2026-08-18 19:02:46 +02:00
CultMeshBodyTransportTests.cs CultNet selection cut1, commit 2d: the CultMesh collapse 2026-09-22 03:38:56 +02:00
CultMeshCdnTests.cs Add CultMesh distributed asset packages 2026-06-28 07:54:00 +01:00
CultMeshClientTests.cs Authenticate CultMesh authority routes and replay operations 2026-08-18 19:02:46 +02:00
CultMeshContentSessionTests.cs Authenticate CultMesh authority routes and replay operations 2026-08-18 19:02:46 +02:00
CultMeshContentTransferTests.cs Stream CDN artifacts in coarse durable windows 2026-07-19 20:29:07 +01:00
CultMeshDeterministicNetwork.cs Establish CultMesh reliability failure harness 2026-07-12 19:56:20 +01:00
CultMeshDiscoveryServiceTests.cs Bind CultMesh authority identity to physical routes 2026-08-18 17:21:58 +02:00
CultMeshEntityPrefabTests.cs Add CultMesh distributed asset packages 2026-06-28 07:54:00 +01:00
CultMeshFrameBodyTests.cs Support mapped frame bodies on Unix 2026-08-18 04:18:46 +02:00
CultMeshProviderSessionWireTests.cs Fence provider RUDP connection generations 2026-07-19 00:50:20 +01:00
CultMeshRealtimeWireProtocolTests.cs Encode a CultMesh realtime frame in TypeScript 2026-09-16 19:20:41 +02:00
CultMeshReliabilityDiagnosticsTests.cs Establish CultMesh reliability failure harness 2026-07-12 19:56:20 +01:00
CultMeshSessionManagerTests.cs Authenticate CultMesh authority routes and replay operations 2026-08-18 19:02:46 +02:00
CultMeshStreamingTests.cs CultNet selection cut1, commit 2 fix batch: door, shard-via-evaluator, Mesh v0 refusal, dead Reconcile code, mutation harness crash handling 2026-09-22 06:13:15 +02:00
CultMeshTestTrust.cs Authenticate CultMesh authority routes and replay operations 2026-08-18 19:02:46 +02:00
CultMeshTransportModularityTests.cs Bind CultMesh application ingress to session identity 2026-08-18 23:08:59 +02:00
GameCult.Mesh.Tests.csproj Bind CultMesh application ingress to session identity 2026-08-18 23:08:59 +02:00